commit f4aabcb9b15fa4c79da2cb2461769d58fde6865c Author: Laurent LE CORRE Date: Thu Nov 21 12:25:31 2019 +0100 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..fdde0ab5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/web/cache/ +/cache/ +/core/ +/log/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..285e104d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,951 @@ +# 2.3.1 + +- (related to #2150) Fix form and validator translations +- (related to #2147) Fixed help text display if show_label is false +- (related to #2145) Fix for taxes & tax rules description display in Taxes rules page +- (related to #2144) Fix automatic configuration for the sql_mode +- (related to #2142) Force utf8 on thelia update +- (related to #2139) Start page correction for the loops +- (related to #2135) Fix ressources check for translation view +- (related to #2132) Fix change default category and default folder. Since the pull request #2066, it's no longer possible to change the default category of a product or the default folder of a content. +- (related to #2129) Fix order export date interval +- (related to #2128) Fix address state check in delivery cost estimation and fix login error due to symfony update +- (related to #2127) Fix 2.3.0 major BC break in Thelia\Core\Event\Order\OrderPaymentEvent +- (related to #2125) Fix construct in GenerateRewrittenUrlEvent + +# 2.3.0 + +- #2121 Fix possible Compile Error in delivery loop +- #2117 Fix Admin update, the password is no longer required for update of an admin +- #2118 Module TinyMCE, fix the path for the Java uploader +- #2120 Fix {count} in search context, {count} doesn't work when searching (since 2.3.0 alpha-1) +- #2116 Updated translations from Crowdin +- #2110 Added a way to set specific date/time format for lang, fixed date/time format for fr_FR + +# 2.3.0-beta2 + +- #2030 Fix ziparchive not found, add a message to prevent that the zip extension was not found on the server +- #2104 Fixed update function issue in Colissimo module +- #2096 #2103 Fix currency change, an exception was thrown if the currency does not exist +- #2097 Fixed and improved cancel order processing +- #2095 Updated translations from Crowdin +- #2092 Fix Module TheliaSmarty, replace the request service by requestStack service +- #2091 Fixed NO_ENGINE_SUBSTITUTION setting for MariaDB +- #2090 Fix GenerateRewrittenUrlEvent, add getters and setters +- #2084 Check if customer exist in coupon builder + +# 2.3.0-beta1 + +- #2062 Remove composer dependency leafo/lessphp +- #2060 Fix BC, TaxRule action introduces a compatibility break +- #2080 Fix missing function `addoutputfields` in the loops +- #2078 Fixed checkbox and radio automatic rendrering. The "checked" status of checkboxes and radios was not correctly managed by form-field-attributes-renderer.html +- #2079 BackOffice : UX improvements on tablets, the right menu was too broad +- #2067 Fix esi render. The sub-request was not a Thelia request +- #2066 Fix the problem of position if a product or content in several sections and folders +- #2073 Use template default fallback in View Listener. Module views was not properly processed when the active front template is not "default" +- #2068 Fix customer edit view ACL, replace `update` by `view` for edit a customer +- #2063 Fix, when deleting a product with a free text feature value, the free text feature value was not removed +- #2058 Fix bug when sending the attribute combination builder form if the user had not selected attribute +- #2056 Fix UX bug on product list in the frontOffice, the grid icon or the list icon do not lock +- #2040 Fix bug when change image position on the module config page. The trait `PositionManagementTrait` was missing in `ModuleImage` +- #2054 Fix the update process for the Collissimo module + +# 2.3.0-alpha2 + +- #1985 Add delivery and payment events `MODULE_PAYMENT_IS_VALID`, `MODULE_PAYMENT_MANAGE_STOCK`, `MODULE_DELIVERY_GET_POSTAGE` +- #2045 Moves the backOffice statistics in the new module HookAdminHome +- #2044 Add possibility to change number by default of results per page for the product list, the order list and the customer list in the backOffice +- #2042 Avoid having too many results in the backOffice search page +- #2021 Fixes hooks `mini-cart`, `sale.top`, `sale.bottom`, `sale.main-top`, `sale.main-bottom`, `sale.content-top`, `sale.content-bottom`, `sale.stylesheet`, `sale.after-javascript-include`, `sale.javascript-initialization`, `account-order.invoice-address-bottom`, `account-order.delivery-address-bottom` +- #2041 Fix possible circular reference for category tree and folder tree +- #2039 Disable the output of the url by the loops on the BackOffice +- #2034 Add column position in attribute combination table +- #2028 Fixed translation regexp prefix for templates +- #2027 Confirmation email when subscribing to newsletter, and subscription cancel page +- #2017 Add constraint of unicity in create and update hook form +- #2012 Checking MySQL version to set sql_mode automatically, this fixed the compatibility with MySQL > 5.6 for modes `STRICT_TRANS_TABLES`, `NO_ENGINE_SUBSTITUTION` +- #2009 Display PSE ref in backOffice order edit for the product list +- #2001 Check PHP version before trying to do anything in install process +- #1999 Fix Folder breadcrumb, the parent url was not good if you edit a picture in a folder or a content +- #1998 Add not blank constraint on zipcode in address create form +- #1988 Fix hide module-install if auth are not right in the BackOffice +- #1907 Administrators should now have an email address. They may use login name or email to log in the back-office. They could now create a new a password if they forgot it. New minimum_admin_password_length and enable_lost_admin_password_recovery configuration variable. +- #1962 Fix exception when cloning a product if the i18n in specific locale does not exist +- #1933 #2006 #2016 #2033 Upgrade Symfony 2.3 to Symfony 2.8 +- #1995 Added order search options, improved search page in the backOffice +- #1994 Allow coupon in first cart step +- #1993 Fix the default language isocode link in backOffice languages page +- #1992 Add method to find category path `Thelia/Model/CategoryQuery::getPathToCategory` +- #1977 Fixed translation domain in NewsletterController +- #1980 Update database schema to increase module version field to 25 chars. +- #1971 #1973 Adds an address email to the administrator profile and adds the password lost functionality for administrators +- #1970 Add `CartDuplicationEvent` which provide both original and duplicated cart to listeners +- #1967 Module Colissimo : Replace country title by isoalpha2 in export for expeditor +- #1964 Fixed cart not deleted after an order placed +- #1960 Add events `CART_ITEM_CREATE_BEFORE` and `CART_ITEM_UPDATE_BEFORE` +- #1959 Add the ability to format an address by country +- #1907 Administrator email management and features + - adds an address email to the administrator profile + - This address email can now be used to login just like the login name + - An administrator could now recover a lost password, just like a regular customer +- #1958 Fix missing success_url on Brand SEO update +- #1956 Fix UX right class in brand products pagination in the frontOffice +- #1948 Allow to define custom delimiter and enclosure char for CSV serializer +- #1947 Added a way to get category/product from related content ID +- #1946 Fix l'inclusion automatique of the TaxType class only if extension == php +- #1939 Add `visible` and `visible_reverse` values in Product Loop order argument +- #1936 Fixed the module name vefication for command `module:position` +- #1931 Add a optional parameters CC and BCC in method `\Thelia\Mailer\MailerFactory::sendEmailMessage` +- #1929 Mod: BaseController useFallbackTemplate set to true by default +- #1928 Hook DI alert messages thrown as exceptions in dev. mode +- #1926 Fix redirection after coupon consume +- #1923 Re enabled functional tests for back office +- #1922 Colissimo Move the prices from a json to a config +- #1921 Modules 'configuration' and 'hook' buttons behavior fix +- #1920 Fixed coupons conditions label translation +- #1917 Fixed translations bug in user mode with view only missing translations activated +- #1916 Fix upload document. The document title is missing after upload +- #1914 The module list in the translation page is now ordered by module code instead of module title +- #1913 Conservation the emails after unsubscribe on newsletter +- #1911 Add 'admin_current_location' arg for 'main.in-top-menu-items' Hook +- #1908 A fix for "terms & conditions" bootbox height +- #1906 Fix coupon create form data +- #1904 Update tinyMCE +- #1903 Added missing generateErrorRedirect() +- #1895 Add a link to the contact page in the front footer and update bootstrap +- #1881 Display only the zones affected to Colissimo in the backOffice +- #1853 Coupon, add condition match for cart item include quantity +- #1815 #1963 #1984 #1989 #1997 #2013 #2019 Import/export complete rework + +# 2.3.0-alpha1 + +- #1907 Administrators should now have an email address. They may use login name or email to log in the back-office. They could now create a new a password if they forgot it. New ```minimum_admin_password_length``` and ```enable_lost_admin_password_recovery``` configuration variable. +- #1902 Update Colissimo export, add link to order and to customer, add package weight +- #1801 Fixed cart duplication conditions at user login/logout +- #1892 Add a name verification when creating a module with a command +- #1891 Add primary key in ```coupon_customer_count``` and ```ignored_module_hook``` tables. +- #1701 This PR improves the Order::createOrder() so that the method could be used to duplicate an order by re-using the delivery and invoice addresses defined in the original order. +- #1823 Add states/provinces concept. The objective of this PR is to separate states/provinces of countries. For now, the concept of states/provinces was managed in country model which was not the best way. +- #1878 Add module code in the lists of the BackOffice for a better understanding. +- #1832 Language improvement. Add the possibility to disable a language. It's possible to disable the language only for the front. +- #1851 Add in the module Tinymce, the possibility to choose in which text areas the editor will be used. +- #1840 Add the possibility to generate an url with the arguments ```router``` and ```route_id``` in the smarty function ```url```. Documentation ```http://doc.thelia.net/en/documentation/templates/urls-and-paths.html``` +- #1872 Add next/prev buttons for orders and customers. Modify the loops of brands, categories, folders and contents so that the queries to get the next and previous objects are sent only when it is needed. +- #1850 #1859 Add hooks for email template +- #1845 Add price including taxes in the combination creation pop-up in the BackOffice +- #1868 Allow to open order-edit.html template with a specific module tab +- #1861 Add links to the appropriate pages +- #1860 Change version of Symfony Yaml components +- #1843 Fix smarty form_collection_field, a performance problem was introduced after this PR: #1613 because ​the Form::createView() method create all form view on each call. +- #1856 Convert order.invoice_date to datetime column +- #1852 Add the possibility to disable the generation of url for the loops, adds argument ```return_url``` in loops, the default value for argument ```return_url``` is ```true``` +- #1857 Fix of hookblack : order.tab +- #1792 Update module Carousel, change the location of saving of the images +- #1844 #1848 Added hooks in the right column part of the edtion form of brand, content, category folder and product templates : + - ```brand.modification.form-right.top```, ```brand.modification.form-right.bottom``` + - ```category.modification.form-right.top```, ```category.modification.form-right.bottom``` + - ```content.modification.form-right.top```, ```content.modification.form-right.bottom``` + - ```folder.modification.form-right.top```, ```folder.modification.form-right.bottom``` + - ```product.modification.form-right.top```, ```product.modification.form-right.bottom``` +- #1835 Add the product combination in PDF delivery +- #1788 Remove all the AdminIncludes from the core modules. +- #1841 Add the possibility to create a product combination with several same attribute inside (2 colors in one product sales elements). +- #1830 Fix attribute title in the modal "create a new combination" +- #1780 Currency improvements. Add the possibility to disable a currency. Add the possibility to change the position of the currency symbol. Resolve #1446 +- #1825 Add message if thelia project is not installed +- #1714 #1839 #1833 Hook improvements + - Add new syntax to hook on a hook. Documentation ```http://doc.thelia.net/en/documentation/modules/hooks/index.html``` + - Add command ```php Thelia hook``` +- #1824 #1829 Fix the admin home stats, On page load, the month sent to Thelia was bad +- #1821 Fix the value for constant ```AdminForm::LANG_DEFAULT_BEHAVIOR```, Resolve ##1820 +- #1818 Fix BackOffice menu, hook block to integrate main link if it's used +- #1816 Fix the total price of cart if the items have a quantity greater than one, Resolve #1772, add new methods ```getTotalRealTaxedPrice```, ```getTotalTaxedPrice```, ```getTotalTaxedPromoPrice``` in the model ```Thelia\Model\CartItem``` +- #1783 Fix product price exports. Resolve #1078 #1610 +- #1808 Add customer's company in order mails and PDF +- #1780 Adds the ability to disable a currency and change the position of the currency symbol +- #1806 Fix the event dispatched before decoding of the import, ```TheliaEvents::IMPORT_AFTER_DECODE``` to ```TheliaEvents::IMPORT_BEFORE_DECODE``` +- #1799 Fixed the redirection to rewritten URL +- #1725 Added new attributes and some aliases to the {cart} substitution + - A new `weight` attribute is added, to get the cart total weight. + - A new `total_price_without_discount` attribute is added, to get the cart total amount without taxes, excluding discount. + - The following aliases of existing attributes are added, to provide a better english syntax, or a more accurate name : + - `product_count`, alias of `count_product` + - `item_count`, alias of `count_item` + - `total_price_with_discount` alias of `total_price` + - `total_taxed_price_with_discount` alias of `total_taxed_price` + - `contains_virtual_product` alias of `is_virtual` + - `total_tax_amount` alias of `total_vat` +- #1802 After upload, The image file name is no longer the default image title +- #1805 Add a new parameter ```locale``` for the module_config smarty plugin +- #1796 Fix regression in OrderAddressEvent cell phone can not be required in the constructor +- #1787 Add loop Overriding, Documentation ```http://doc.thelia.net/en/documentation/loop/extend.html``` +- #1785 Fix undesirable carts, persist only non empty carts +- #1790 Update the default PSE ref when the product ref is updated +- #1778 #1797 Add ```manual``` and ```manuel_reverse``` order in attributeCombination loop +- #1766 Add order by ```id``` and ```id_reverse``` in product_sale_element loop +- #1760 Set order status as paid when the FreeOrder module is used to "pay" an order +- #1751 Fix for undefined currency exchange rate, add error message in the currency configuration page when an exchange rate could not be found +- #1769 Increase API key size to 48 +- #1771 Add argument ```customer_id``` for hook customer.edit-js +- #1753 Fix the rounding of prices in the order product loop +- #1768 Update composer.lock file, update of the dependency thelia/currency-converter to version 1.0.1 +- #1752 Add addValues method in EnumListType +- #1746 Removes deprecated classes and methods for the version 2.3 +- #1745 Fix output value IS_DEFAULT in the product_sale_elements loop +- #1754 Add homepage redirection on /admin/login if the admin is already authenticate. Before this change, there was a render +- #1765 Fix for prev/next queries in Category and Content loops, and add prev/next in Product and Folder loop +- #1759 Fix for parent attribute and new exclude_parent attribute of Category loop +- #1750 Add EQUAL to product loop filter by min or max +- #1727 Add template & stock inputs on product creation +- #1722 Replaced parameter "locale" with "lang" in generated URL +- #1732 Update sql constraint for table product_sale_elements_product_image and product_sale_elements_product_document +- #1730 Change layout to only cache assets/dist +- #1734 Fix critical performance issue on ProductController HydrateObjectForm +- #1733 Fix order attribute in BaseHook +- #1729 Fix all useless DIRECTORY_SEPARATOR +- #1726 Fix method setRangeDate variable +- #1718 Autocomplete combination generation form with default pse values +- #1699 Fix missing use for BirthdayType +- #1713 Add more options for content, folder and order in search results +- #1706 Fix form coupon not found in frontOffice order invoice +- #1700 Fix source priority in ```ParserContext::getForm``` +- #1588 Add document tab in frontOffice product page +- #1668 Add height limit for the select fields in the Attributes and Features tab of the admin product edit page +- #1669 Add options ```exclude_status, status_code, exclude_status_code``` and output value ```STATUS_CODE``` in Order loop +- #1674 Add options ```free_text, exclude_free_text``` in FeatureValue loop +- #1725 Add `weight` and `total_price_without_discount` attributes to the `{cart}` substitution, and some aliases to provide a better english syntax, or a more accurate name to existing attributes : `product_count`, alias of `count_product`, `item_count`, alias of `count_item`, `total_price_with_discount` alias of `total_price`, `total_taxed_price_with_discount` alias of `total_taxed_price`, `contains_virtual_product` alias of `is_virtual`, `total_tax_amount` alias of `total_vat` + +# 2.2.3 + +- (related to #2147) Fixed help text display if show_label is false +- (related to #2144) Fix automatic configuration for the sql_mode +- (related to #2142) Force utf8 on thelia update +- (related to #2139) Start page correction for the loops +- (related to #2135) Fix ressources check for translation view +- (related to #2125) Fix construct in GenerateRewrittenUrlEvent +- (related to #2118) Module TinyMCE, fix the path for the Java uploader +- (related to #2096) Fix currency change, an exception was thrown if the currency does not exist +- (related to #2090) Fix GenerateRewrittenUrlEvent, add getters and setters +- (related to #2084) Check if customer exist in coupon builder +- (related to #2080) Fix missing function `addoutputfields` in the loops +- (related to #2078) Fixed checkbox and radio automatic rendrering. The "checked" status of checkboxes and radios was not correctly managed by form-field-attributes-renderer.html +- (related to #2068) Use template default fallback in View Listener. Module views was not properly processed when the active front template is not "default" +- (related to #2068) Fix customer edit view ACL, replace `update` by `view` for edit a customer +- (related to #2058) Fix bug when sending the attribute combination builder form if the user had not selected attribute +- (related to #2052) Fix #2040 Missing trait PositionManagementTrait in ModuleImage +- (related to #2041) Fix possible circular reference for category tree and folder tree +- (related to #2017) Add constraint of unicity in create and update hook form +- (related to #2012) Checking MySQL version to set sql_mode automatically, this fixed the compatibility with MySQL > 5.6 for modes `STRICT_TRANS_TABLES`, `NO_ENGINE_SUBSTITUTION` +- (related to #2010) Improve product price edition tab +- (related to #2005) Use a wider version requirement on thelia/installer for setup/ +- (related to #1999) Fix Folder breadcrumb, the parent url was not good if you edit a picture in a folder or a content +- (related to #1980) Update database schema to increase module version field to 25 chars. +- (related to #1967) Module Colissimo : Replace country title by isoalpha2 in export for expeditor +- (related to #1962) Fix exception when cloning a product if the i18n in specific locale does not exist +- (related to #1958) Fix missing success_url on Brand SEO update +- (related to #1956) Fix UX right class in brand products pagination in the frontOffice +- (related to #1946) Fix the automatic inclusion of the TaxType class only if extension == php +- (related to #1939) Add `visible` and `visible_reverse` values in Product Loop order argument +- (related to #1936) Fixed the module name verification for command `module:position` +- (related to #1928) Hook DI alert messages thrown as exceptions in dev. mode +- (related to #1921) Modules 'configuration' and 'hook' buttons behavior fix +- (related to #1920) Fixed coupons conditions label translation +- (related to #1917) Fixed translations bug in user mode with view only missing translations activated +- (related to #1914) The module list in the translation page is now ordered by module code instead of module title +- (related to #1908) A fix for "terms & conditions" bootbox height +- (related to #1906) Fix coupon create form data +- (related to #1799) Fixed the redirection to rewritten URL +- (related to #1797) Fix order manual and manual_reverse in AttributeCombination loop +- #1901 Update Colissimo export, add link to order and to customer, add package weight + +# 2.2.2 + +- #1901 Update Colissimo export, add link to order and to customer, add package weight +- (related to #1857) Fix of hookblack : order.tab +- (related to #1843) Fix smarty form_collection_field, a performance problem was introduced after this PR: #1613 because ​the Form::createView() method create all form view on each call. +- (related to #1830) Fix attribute title in the modal "create a new combination" +- (related to #1825) Add message if thelia project is not installed +- (related to #1824 #1829) Fix the admin home stats, On page load, the month sent to Thelia was bad +- (related to #1821) Fix the value for constant AdminForm::LANG_DEFAULT_BEHAVIOR, Resolve ##1820 +- (related to #1818) Fix menu hook block to integrate main link if it's used #1818 +- (related to #1806) Fix the event dispatched before decoding of the import, TheliaEvents::IMPORT_AFTER_DECODE to TheliaEvents::IMPORT_BEFORE_DECODE +- (related to #1796) Fix regression in OrderAddressEvent cell phone can not be required in the constructor +- (related to #1790) Update the default PSE ref when the product ref is updated +- (related to #1783) Fix product price exports. Resolve #1078 #1610 +- (related to #1771) Add argument customer_id for hook customer.edit-js +- (related to #1769) Increase API key size to 48 +- (related to #1768) Update composer.lock file, update of the dependency thelia/currency-converter to version 1.0.1 +- (related to #1760) Set order status as paid when the FreeOrder module is used to "pay" an order +- (related to #1753) Fix the rounding of prices in the order product loop +- (related to #1751) Fix for undefined currency exchange rate, add error message in the currency configuration page when an +- (related to #1750) Add EQUAL to product loop filter by min or max +- (related to #1747) Fixed success_url check for contact form +- (related to #1745) Fix output value IS_DEFAULT in the product_sale_elements loop + +# 2.2.1 + +- (related to #1699) Fix missing use for BirthdayType +- (related to #1700) Fix form retrieving +- (related to #1706) Fix coupon form +- (related to #1713) Add more options for content, folder and order in search results +- (related to #1722) Replaced parameter "locale" with "lang" in URL generated +- (related to #1724) Fix customer update input ID and indentation +- (related to #1726) Fix method setRangeDate variable in ExportHandler +- (related to #1729) Fix all useless DIRECTORY_SEPARATOR +- (related to #1730) Change layout to only cache assets/dist +- (related to #1732) Update sql constraint for table product_sale_elements_product_image and product_sale_elements_product_document +- (related to #1733) Fix order attribute in BaseHook +- (related to #1734) Fix critical performance issue on ProductController HydrateObjectForm +- (related to #1727) Add template & stock inputs on product creation + +# 2.2.0 + +- #1692 Fix amounts displayed on the PDF invoice when a postage with tax is used (fixes #1693 and #1694) +- #1692 Fix translations for HookNavigation module +- #1692 Update hooktest-template and hooktest-module to prevent thelia-installer conflicts +- #1692 Update French, German, Italian translations +- #1692 Add Turkish translation +- #1688 Fix the permission messages in Thelia installer +- #1686 Use createForm method for front forms ```thelia.coupon.code, thelia.order.delivery, thelia.order.payment``` +- #1667 Fix #1666 Display an error when trying to delete a customer which has orders +- #1665 Fix form field type date in Smarty plugin form, checks if the field type is a BirthdayType for assign a smarty variable [years, month, days] +- #1659 Fix Administrator edit action in the BackOffice, it was impossible to edit an administrator + +# 2.2.0-beta3 + +- #1653 Remove ```AdminIncludes``` folder in the module generation +- #1649 Add index in table rewriting_url +- #1644 Allow relative path use with Tlog +- #1640 Add docker and docker-compose configuration +- #1637 Fix admin API edit button +- #1635 Add unit tests for the routing files (admin, api, front) +- #1634 Remove leftover uncallable routes (admin) +- #1631 Remove duplicate route (admin) +- #1629 Fix errors reporting of admin hooks +- #1632 Fix pagination infinite URL ; redirect on page 1 when changing products per page limit to avoid having no product on the page +- #1616 Improve statistic on homepage, add datetimepicker and fix first order +- #1601 Add set error in TheliaFormValidator when form is not valid +- #1585 Add parameters in frontOffice hooks +- #1587 Fix redirect url for the folder image and folder document +- #1590 Fix Thelia request initialization +- #1593 Fix form serialization in session that contain uploaded files +- #1594 update symfony/validator version to 2.3.31 +- #1598 composer.json update dependency fzaninotto/faker to stable version 1.5 +- #1583 Add German translations +- #1615 New TheliaEvents::CART_FINDITEM event to improve cart management flexibility +- #1618 Configurable faker +- #1581 Fix the prices precision + - Not round the prices without tax in back office + - Change the type for the price columns in database. New type : decimal(16,6) + +##DEPRECATED + +- Deprecated AdminIncludes, it's better to use the hooks + +# 2.2.0-beta2 + +- Add module image edition in backoffice +- The language change links should now use the locale instead of the language code, e.g. http://www.yourshop/some-page?lang=fr_FR instead if http://www.yourshop/some-page?lang=fr. Backward compatibility is provided. +- Order status added by modules have their CSS label color handled or have a default color +- New login page style +- New general style of backoffice +- New dashboard arrangement + +# 2.2.0-beta1 + +- Fix currency create action to set the by_default field properly. +- Add missing column default_template_id in category_version table +- The product parameter of the feature_value loop is no longer mandatory +- The product parameter new $PRODUCT variable is deprecated. $PRODUCT_ID should be used instead. +- Fix smarty `format_date` function to use consistent format when `locale` attribute is used. +- A product and all it's dependencies can now be cloned +- Fix index form error information session cleaning +- Feature's free text values now handle i18n +- URLs now have no problem with accents or case +- Add order by ```weight``` and ```weight_reverse``` in product sale elements loop +- Add the ability to remove arguments in loops. +- new back-office is enhanced with a group button actions and a new layout +- Added an optional 'ajax-view' parameter to card add form +- Add validation groups in form from parser context +- Feature value are not translatable +- Allow multiple authors in module.xml file. Fixed #1459 +- Display the mini cart with a hook. Fixed #1233 +- Add date range for order export +- Klik&Pay is no more a submodule + +# 2.2.0-alpha2 + +- Add a front office way to make an address the default one +- New translation domain that allows to redefine translation strings globally or specifically to a domain. By the way, we can safely update Thelia, modules, templates without overwriting specific translations. +- Remove ```currency_rate_update_url``` in ```setup/insert.sql``` +- Add Cellphone to order address +- Add AnyListTypeArgument for loop argument +- New command ```module:position```. This command can changes module position +- Fix session serialisation +- Create a template context +- Allow relative path for the file logger from THELIA_ROOT constant +- Form error information are stored in the user session +- Fix redirection with slash ended uri. Fix #1331 +- Config ```images_library_path``` and ```documents_library_path``` are now used everywhere +- Messages dispatched before and after content creation +- Add link to open pdf directly in browser in BO order/update +- Added wysiwyg.js hook where it was missing. +- Fix hook attribute in pdf template. The hook was never called. +- Cellphone column Added in order_address table +- Default front office template revamped : + - bower and grunt can be used (but not mandatory, you can still use assetic) + - less than 4095 css selectors (IE9 compatibility) + - bootstrap is now fully used + - this template is documented in its readme +- Force locale in session when loading a rewriten url +- Thelia is now fully usable with HTTPS protocol +- Do not delete the default product_sale_elements when the template of a product change +- Added standard 'error_url' parameter, like 'success_url' +- controller type can be found in the request (#1238) +- new helper to get order weight +- update selected delivery address in order process when customer change it +- new hooks for delivery modules in backoffice and pdf to add extra information + +# 2.2.0-alpha1 + +- Add module code ($CODE variable) into payment loop outputs +- Add the 'images-folder' tag into module.xml file to deploy the modules images +- Add the 'module:list' command, that shows the modules state +- Update Admin Logs to add the resource ID when available. +- Add render smarty function, that executes the controller given in the action parameter. +- Allow modules to use document and image loop with the ```query_namespace``` argument +- Enable image zoom in image loop before cropping to guarantee that the resulting image will match the required size, even if the original image is smaller. This feature is active only if the ```allow_zoom``` parameter is true. +- When in development mode, an exception is thrown when an error occurs when processing assets, thus helping to diagnose missing files, LESS syntax errors, and the like. +- Change default order for cart loop +- New module_config Smarty function: {module_config module="module-code" key="parameter-name} +- Do not register previous url on XmlHttpRequest +- Add ACL on documents and images tabs. +- Add confirmation modal on documents deletion +- Add shop language choice on install wizard +- Remove redundant * on product-edit +- Add parameter "page_param_name" for template admin pagination.html. if "page_param_name" is empty, then the name of the parameter is "page" +- Add "Refunded" order status +- Add environment specific config file loading in modules +- Add the possibility for customers to change their email, backoffice configuration variables customer_change_email +- Add confirmation email for customers, backoffice configuration variables customer_confirm_email +- Refactor ```Thelia\Controller\BaseController::createForm``` into a factory service ```Thelia\Core\Form\TheliaFormFactory``` +- Refactor ```Thelia\Controller\BaseController::validateForm``` and ```Thelia\Controller\BaseController::getErrorMessages``` into a service ```Thelia\Core\Form\TheliaFormValidator``` +- Add the `failsafe=[true|false]` parameter to the assets Smarty functions (stylesheets, images, javascripts). +- A country could belong to more than one shipping zone. +- Add the `exclude_area` parameter to the Country loop. +- The Country loop now returns a proper country ISO code, left-padded with zeros, e.g. '004' instead of '4' +- The Country::getAreaId() method is DEPRECATED. +- Add the `country` and `order` parameters to Area loop +- Add the `area` parameter to Module loop +- Improved Shipping zones management +- Add cache on the graph of the home page, possibility to disable cache or change ttl cache, with the configuration variable admin_cache_home_stats_ttl +- New feature: a default product template could be defined in categories. Products created in this category will get this default product template. If no default product template is defined in a given category, it will be searched in parent categories. +- New main navigation style and position +- jquery.ui.datepicker is now DEPRECATED and will be REMOVED in 2.3. Please use boostrap-datepicker +- Add ```thelia.logger``` service to prepare the transition with another logger. +- Add 62 new admin hook +- Add stacked current form into parser context. It allows to have nested forms while using the new way to write forms. +- Module information and documentation could be viewed directly from the module list +- Add the possibility to translate text in the sql files (insert.sql, update/sql/\*.sql). to generate sql files use command `php Thelia generate:sql`. Translation can be made in the back office, in the translation page. +- format_date smarty function now handle symfony form type ```date```, ```datetime``` and ```time``` view value. +- Allow BaseController::generateOrderPdf to generate a pdf without having the rights +- SHOW_HOOK now displays parameters +- Add fallback for email template for mails sent from a module. If the template file does not exist in the current email template, it will use the one that comes with the module. +- Add dispatch of console events +- Refactor VirtualProductDelivery module. The email sending is now triggered from a new event to gain more flexibility. Now, email messages use smarty file templates located in `templates/email/default`. +- Added capability to use translator in module functions `preActivation` and `postActivation` +- Add environment aware database connection +- new 'asset' Smarty function, to get the URL of an arbitrary file from template assets, such as a video or a font. +- Imagine package is updated to 0.6.2, which provides a better support for transparency. +- Default border color of images resized with resize_mode="border" is now transparent instead of opaque white. +- The TemplateHelper class is deprecated. You should now use the thelia.template_helper service. TemplateHelperInterface has been introduced, so that modules may implement alternate versions + +# 2.1.9 + +- (related to #2144) Fix automatic configuration for the sql_mode +- (related to #2139) Start page correction for the loops +- (related to #2135) Fix ressources check for translation view +- (related to #2125) fix construct in GenerateRewrittenUrlEvent +- (related to #1920) Fixed coupons conditions label translation +- (related to #1946) Fix TaxType class only if extension == php +- (related to #1958) Missing success_url on Brand SEO update +- (related to #1967) Replace country title by isoalpha2 in export for expeditor +- (related to #1999) Update FolderBreadcrumbTrait.php +- (related to #2005) Use a wider version requirement on thelia/installer for setup +- (related to #2091) Checking MySQL version to set sql_mode automatically +- (related to #2041) Fix possible circular reference for category tree and folder tree +- (related to #2058) Fix Bug on submit combination builder empty form +- (related to #2068) Fix customer edit access +- (related to #2073) Use template default fallback in View Listener + +# 2.1.8 + +- Fix Colissimo module external-schema (related to #1838) +- Fix attribute title in the modal "create a new combination" (related to #1830) +- Add message if thelia project is not installed (related to #1825) +- Fix the event dispatched before decoding of the import, TheliaEvents::IMPORT_AFTER_DECODE to TheliaEvents::IMPORT_BEFORE_DECODE (related to #1806) +- Update the default PSE ref when the product ref is updated (related to #1790) +- Sanitize the get arguments for admin stats (related to #1782) +- Add argument customer_id for hook customer.edit-js (related #1771) +- Increase API key size to 48 (related #1769) +- Fix for undefined currency exchange rate, add error message in the currency configuration page when an exchange rate could not be found (related #1751) +- Fix the rounding of prices in the order product loop (related to #1753) +- Add EQUAL to product loop filter by min or max (related to #1750) +- Fix output value IS_DEFAULT in the product_sale_elements loop (related to #1745) + +# 2.1.7 + +- Fix all useless DIRECTORY_SEPARATOR (related to #1729) +- Update sql constraint for table product_sale_elements_product_image and product_sale_elements_product_document (related to #1732) +- Fix order attribute in BaseHook (related to #1733) +- Fix critical performance issue on ProductController HydrateObjectForm (related to #1734) +- Replaced parameter "locale" with "lang" in URL generated (related to #1722) + +# 2.1.6 + +- Fix amounts displayed on the PDF invoice when a postage with tax is used (fixes #1693 and #1694). +- Check virtualProducts of order before send mail ```mail_virtualproduct``` +- Add 'step' to input type number to be able to create and edit weight slices price +- Fix pagination infinite URL ; redirect on page 1 when changing products per page limit to avoid having no product on the page +- Allow relative path use with Tlog +- Prevent obscure "[] this value cannot be null" messages. +- Prevent short research and keep research in input +- Fix meta return array +- Fix hook position +- Fix Protocol-relative URL for HTTPS +- Update Copyright +- Fix translations and standardize Import and Export texts +- Fix the prices precision + +# 2.1.5 + +- Klik&Pay is no more a submodule +- default category's parent is now 0 +- check specific role in security module instead of checking if a user is logged in +- add a customer page parameter for the order loop on the customer page +- keep break line in ACE editor + +# 2.1.4 + +- Add ```export.top``` and ```export.bottom``` hooks +- Fix slash ended rewritten url redirection +- Remove ```currency_rate_update_url``` in ```setup/insert.sql``` +- Allow relative path for the file logger from THELIA_ROOT +- Fixed product loop behavior when category_default is set +- Force locale in session when loading a rewriten url +- Add port parameter for installing thelia with cli tools +- Change default param of the isPaid function, true is the good default parameter. + +# 2.1.3 + +- Add ```\Thelia\Model\OrderProduct::setCartItemId``` and ```\Thelia\Model\OrderProduct::getCartItemId``` to remove the typo with ```cartIemId``` +- A notice is displayed when the product's template is changed +- Security fix on authentication +- Rename cookie related config variables. They were prefixed with "thelia_" on insert, but not in the code + +## DEPRECATED + +- ```\Thelia\Model\OrderProduct::setCartIemId``` Because of a typo +- ```\Thelia\Model\OrderProduct::getCartIemId``` Because of a typo too + +# 2.1.2 + +- Add the possibility to delete a coupon from the backoffice. +- module list is now reversed. Delivery modules appear first, then payment and finally classic modules. +- display a loader when a module is uploaded +- Change product prices export and import format to be compatible, now using product_sale_elements id as key to identify PSE. +- Fix unused variable in ```Thelia\Controller\Api\CustomerController::getDeleteEvent``` +- change default order for cart loop. +- Add missing static keyword for ```Thelia\Core\HttpFoundation\JsonResponse::createError``` +- Do not register previous url on XmlHttpRequest +- Fix deploy image directory destination +- Fix redirect response if a AuthenticationException is catched +- The PaymentModule log default level is now INFO instead of ERROR +- Direct instantiations of Thelia forms is deprecated. BaseController::createForm() should be used instead. +- Prevent XSS injection in error.html template +- The hook method is now stored in the ignored_module_hook table +- Allow to hardlink TinyMCE rather than symlink +- Add bootstrap paths for thelia-project +- Enlarge order dropdown menu to prevent wrapping in some languages +- Fixed langugage when previewing e-mails + +# 2.1.1 + +- Fix update process from Thelia 2.0.* to 2.1.* + +# 2.1.0 + +- abilities to translate email and pdf templates in modules +- support of taxes for postage amount +- sales modify price on update only if the sale is currently active +- cart can be used without thelia cart cookie. Set cart.use_persistent_cookie to 0 in your config variable panel. +- hook contains more information like the id of the current object you are working on. +- fix module skeleton location + + +# 2.1.0-beta2 + +- config : + - environment variable can be used in the database.yml file. See [https://github.com/thelia/thelia/pull/968](https://github.com/thelia/thelia/pull/968) + - Allow other projects to override thelia directories constants by using composer "autoload"["file"] entries +- smarty: + - Add the "current" argument on smarty "url" function that allows you to get the same page but with differant url parameters +- new method ```manageStockOnCreation``` in PaymentModuleInterface. If return false, the stock will be decreased on paid status instead of order creation. +- Thelia: + - Split Thelia on multiple repositories to allow a better version management with composer. For creating a new project, see [https://github.com/thelia/thelia-project] + - Extract all the default modules into other repositories + - Field type : + - added area_id, category_id, folder_id, content_id + - thelia type support render_form_field +- loop `product_sale_elements` : added `ref` argument and implemented `SearchLoopInterface` +- Updated `hasVirtualProduct` in `Order` model to not test the presence of filename, as modules could implement the process differently +- new method ```Thelia\Model\Module::getDeliveryModuleInstance()``` return the delivery module instance for the current record. +- 'freesans' is now the default font of PDF documents +- Anonymous cart is no longer duplicated on customer login + + +# 2.1.0-beta1 + +- Autoload : the autoloader can be cached with Apc or XCache. See new index.php file. +- Update : add missing API table creation +- The default Tlog level is now TLog::ERROR instead of Tlog::DEBUG +- Add error message pages instead of white pages. But you can disable them by setting 0 into the config variable "error_message.show". +- Front Office Template: new page to display the details of an order +- email can be previewed in the back office +- some smarty classes are still present in the core of thelia not to break backward compatibility. Those classes will be deleted in version 2.3 : + * Thelia\Core\Template\Smarty\AbstractSmartyPlugin + * Thelia\Core\Template\Smarty\SmartyPluginDescriptor +- the default address label is now translated +- fixed "strictly use the requested language" +- new config variable : + * session_config.lifetime : Life time of the session cookie in the customer browser, in seconds + * error_message.show : Show error message instead of a white page on a server error + * error_message.page_name : Filename of the error page. Default : error.html +- All cs issues are fixed, Thelia is now fully PSR2 compliant +- Allow possibility to upload a module with github suffix (eg : paypal-master.zip) +- Added a fallback for template to use the default template. it's useful for modules that are used on a website that doesn't use the default template + +# 2.1.0-alpha2 + +- Update Process : + - update command has been removed and replaced by a php script and a web wizard. Read the UPDATE.md file +- Templating : + - Smarty is now a dedicated Module and no more present in the core of Thelia + - All the template logic works now with abstracted class or interface, so it is possible to create a new Module for +an other template engine + - A new interface has been introduced, the ParserHelperInterface : its purpose is to parse a string and get all +parser's function and block with theirs arguments. + - A new service has been introduced : thelia.parser.helper and it must be the implementation of ParserHelperInterface + - If you want to create a new Template module, you must declare those services : + - thelia.parser : the class that implements ParserInterface + - thelia.parser.helper : the class that implements ParserHelperInterface + - thelia.parser.asset.resolver : the class that implements AssetResolverInterface +- Routing : + - new notation ```a:b:c``` => ```Foo:Bar:Baz``` will execute ```Foo\Controller\BarController::BazAction``` method +- Module : + - New schema for modules + - Module installation from back office + - Dependency check to Thelia version and other modules during installation, activation, deactivation and deletion +- Smarty : + - new plugin ```flash``` to support symfony flash message. + - new plugin ```default_locale```. This function is used for forcing the usage of a specific locale in all your template. Useful for email and pdf. eg : ```{default_locale locale="en_US"}``` + - function ```intl``` has a new argument : ```locale```. If used, this locale will be used instead of session's locale +- Loop : + - new method addOutputFields in order to add custom fields in an overridden loop +- Tests: + - Move tests from ```core/lib/Thelia/Tests``` to ```tests/phpunit/Thelia/Tests``` + - Update PHPUnit from 4.1.3 to 4.1.6 +- Symfony components: + - Update from 2.3.* to 2.3.21 +- REST API: + - Implement the first version of the REST API. You can find the documentation [here](http://doc.thelia.net/en/documentation/api/authentication.html) +- Forms: New implementation of Symfony form component that now handles form types, form extensions and form type extensions + - You can use the tags ```thelia.form.type```, ```thelia.form.extension``` and ```thelia.form.type_extension``` to declare yours + - Implementation of many form types for thelia, see the namespace Thelia\Core\Form\Type + +## DEPRECATED + +- ```\Thelia\Core\HttpFoundation\Session\Session::getCart``` is deprecated. Use ```getSessionCart``` instead. +- ```\Thelia\Cart\CartTrait``` trait is deprecated. Use ```\Thelia\Core\HttpFoundation\Session\Session::getSessionCart``` for retrieving a valid cart. + +#2.1.0-alpha1 + +- Added sale management feature +- Added `module_id` parameter to Area loop +- Added "Shipping configuration" button to the delivery module list, with a warning if no shipping zone is assigned to the module. +- Added the `show_label` parameter to the `render_form_field Smarty` function. +- Added the `exclude` parameter to `form_hidden_field` function. +- Added the `product` parameter to the `attribute_availability` loop. +- Added the `sale` parameter to the `product` loop. +- Added visible argument to image/document classes +- Added `new`, `promo` and `default` parameters to `product_sale_elements` loop +- Added `store_notification_emails`, which contains the recipients of shop notification (such as order placed) +- Added admin notification e-mail for order placed +- Improved other emails (specially text versions) +- Added ORDER_SEND_NOTIFICATION_EMAIL event +- class-loader component is removed, it was not used anymore. +- Updating stock when changing order : canceled status +- Added virtual products feature. + - Added new delivery module for virtual products. +- Added meta data feature to associate core elements and various data. +- Added `allow_negative_stock` configuration variable to allow negative stock or not (default is no) +- Added the ModuleConfig table, to provide modules an easy way to store their configuration parameters, with I18n if required. +- Added the `module-config` loop +- Added getConfigValue() and setConfigValue() static helper methods to BaseModule to offer an easy way to get/set a module parameters +- Refactored the Cheque module, to use the new ModuleConfig, and send an email to the customer when its payment is received. +- Added the wysywig.js hook to official hooks, so that any page which needs a WYSYWIG editor will only have to put this hook in the JS section to get one. +- Refactored Tynimce module according to wysywig.js hook +- Moved cart and order flush in the Order action, triggered by the ORDER_CART_CLEAR event. Payment modules which redirects to a non-strandard route (e.g., not /order/placed/{order_id}) should fire this event. +- Refactored assets generation. +- `file` parameter of asset related smarty functions (`stylesheets`, `javascripts`, ìmages`, ...) should not contains ../ +- Added remember me feature for customer sign in process + +##DEPRECATED + +Redirect methods are deprecated. You have now two ways for generating a redirect response : +- Throwing a Thelia\Core\HttpKernel\Exception\RedirectException with a given URL +- If you are in a controller, return an instance of \Symfony\Component\HttpFoundation\RedirectResponse +- Never ever send a response. Only the HttpKernel class is allowed to do that. + +### Deprecated methods : + +- Thelia\Controller\BaseController::redirect +- Thelia\Controller\BaseController::redirectSuccess +- Thelia\Controller\BaseController::redirectToRoute + +# 2.0.12 + +- Sanitize the get arguments for admin stats (related to #1782) +- Add EQUAL to product loop filter by min or max (related to #1750) +- Fix output value IS_DEFAULT in the product_sale_elements loop (related to #1745) + +# 2.0.11 + +- Fix critical performance issue on ProductController HydrateObjectForm (related to #1734) + +# 2.0.10 + +- Add 'step' to input type number to be able to create and edit weight slices price +- Fix pagination infinite URL ; redirect on page 1 when changing products per page limit to avoid having no product on the page +- Allow relative path use with Tlog +- Prevent obscur "[] this value cannot be null" messages. +- Prevent short research and keep research in input +- Fix Protocol-relative URL for HTTPS +- Fix fatal error that occurs when store does not use the default order_configuration email + +# 2.0.9 + +- Klik&Pay is no more a submodule + +# 2.0.8 + +- Allow relative path from thelia root for the file logger (by default log/log-thelia.txt) +- Force rediction on admin login even when connected to the front + +# 2.0.7 + +- Change TokenProvider behavior to be more flexible +- More secure csrf token +- Fix ```templates/backOffice/default/includes/inner-form-toolbar.html``` change currency destination +- Fix install bug if the admin password doesn't match + +# 2.0.6 + +- Do not register previous url on XmlHttpRequest + +# 2.0.5 + +- add new function to smarty ```set_previous_url```. The parameter ```ignore_current``` allows you to ignore the current url and it will not be store as a previous url +- 'freesans' is now the default font of PDF documents +- fix bug with cart foreign key constraint #926 +- fix typo with '}' #999 +- add missing 'admin.search' resource +- add default translation for '/ajax/mini-cart' +- fix product add to cart +- fix form firewall variable name +- add more module includes in order-edit.html +- do not allow failure anymore on travis php5.6 + +#2.0.4 + +- Updating stock when changing order : canceled status +- order table is versionnable now. +- product_sale_elements_id is added to order_product table. + +#2.0.3 + +- Fix js syntax in order-delivery template +- price are now save without any round. + /!\ Check in your templates if you are using format_money or format_number function. Don't display prices directly. +- change Argument type for ref parameter in Product loop +- Fix export template +- [Tinymce]fix invisible thumb in file manager + +#2.0.3-beta2 + +- fix update process +- fix coupons trait +- update schema adding new constraints on foreign keys +- previous url is now saved in session. use ```{navigate to="previous"}``` in your template + +#2.0.3-beta + +- New coupon type: Free product if selected products are in the cart. +- New feature: Product Brands / Suppliers management +- New 'brand' loop and substitution. product, image and document loop have been updated. +- Images and document processing have been refactored. +- Added store description field for SEO +- Added code editor on textarea on email templates page +- Fixed issues on position tests +- Fixed issues on RSS feed links +- Update SwiftMailer +- Fix bugs on customer change password form and module "order by title" +- Add the ability to place a firewall on forms. To use this in a module, extend Thelia\Form\FirewallForm instead of BaseForm +- Add Exports and Imports management +- Default front office template: + - Display enhancement + - Optimization of the uses of Thelia loops to gain performances and consistency + - Optimization for SEO : meta description fallback, title on category page, ... + - new PSE layout in product page, attributes are separated + - Support of 'check-available-stock' config variable + - Terms and conditions agreement is now in the order process +- Default pdf template: + - Added list of amount by tax rule + - Display enhancement + - Added legal information about the store +- Demo: + - Support for brand + - Added folders and contents data. + +#2.0.2 + +- Coupon UI has been redesigned. +- New coupon types: + - Constant discount on selected products + - Constant discount on products of selected categories + - Percentage discount on selected products + - Percentage discount on products of selected categories +- New coupon conditions : + - Start date + - Billing country + - Shipping country + - Cart contains product + - Cart contains product from category + - For specific customers +- Free shipping can now be restricted to some countries and/or shipping methods +- session initialization use now event dispatcher : + - name event : thelia_kernel.session (see Thelia\Core\TheliakernelEvents::SESSION + - class event : Thelia\Core\Event\SessionEvent + - example : Thelia\Core\EventListener\SessionListener +- Creation of Thelia\Core\TheliakernelEvents class for referencing kernel event +- Add new command line that refresh modules list `Thelia module:refresh` +- Coupon internals have been simplified and improved. +- Error messages are displayed in install process +- Add pagination on catalog page in Back-Office +- Add Hong Kong to country list +- Fixed issue #452 when installing Thelia on database with special characters +- implement search on content, folder and category loop. +- all form are documented +- template exists for managing google sitemap : sitemap.html + +#2.0.1 + +- possibility to apply a permanent discount on a customer +- display estimated shipping on cart page +- export newsletter subscribers list +- Fix redirect issues +- enhancement of coupon UI +- enhancement of admin menu. Coupon is now in Tools menu +- front office, email and pdf templates are translated in Russian and Czech +- fix bugs : https://github.com/thelia/thelia/issues?milestone=4&page=1&state=closed + +#2.0.0 + +- Coupons values are re-evaluated when a product quantity is changed in the shopping cart +- You can declare new compilerPass in modules. See Thelia\Module\BaseModule::getCompilers phpDoc +- Add ability to load assets from another template. See https://gist.github.com/lunika/9365180 +- allow possibility to use Dependency Injection compiler in Thelia modules +- Add Deactivate Module Command Line +- Add indexes to database to improve performance +- Order and customer references are more human readable than before +- Refactor intl process. A domain is created for each templates and modules : + - core => for thelia core translations + - bo.template_name (eg : bo.default) => for each backoffice template + - fo.template_name (eg : fo.default) => for each frontoffice template + - pdf.template_name (eg : pdf.default) => for each pdf template + - email.template_name (eg : email.default) => for each email template + - modules : + - module_code (eg : paypal) => fore module core translations + - module_code.ai (eg : paypal.ai) => used in AdminIncludes templates + - bo.module_code.template_name (eg : bo.paypal.default) => used in back office template + - fo.module_code.template_name (eg : fo.paypal.default) => used in front office template +- new parameter for smarty ```intl``` function. The parameter ```d``` allow you to specify the translation domain (as explain before). This parameter is optional +- the ```d``` can be omitted if you use ```{default_translation_domain domain='bo.default'}``` in your layout. If you use this smarty function, the ```d``` parameter is automatically set with the domain specify in ```default_translation_domain``` function +- We changed Thelia's license. Thelia is published under the LGPL 3.0+ License + + +#2.0.0-RC1 + +- Remove container from BaseAction. +- fix sending mail on order creation +- less files in default templates are already compiled in css. +- all validator message are translated +- type argument is now a default argument and used for generating loop cache +- fix total amount without discount in backoffice. Fix #235 +- description is not required anymore in coupon form. Fix #233 +- Do not allow to cumulate the same coupon many times. Fix #217 +- colissimo module is now fully configurable +- test suite are executed on PHP 5.4, 5.5, 5.6 and HHVM. Thelia is not fully compatible with HHVM +- add new attributes to loop pager (http://doc.thelia.net/en/documentation/loop/index.html#page-loop) +- we created a new github repo dedicated for modules : https://github.com/thelia-modules + +#2.0.0-beta4 + +- Tinymce is now a dedicated module. You need to activate it. +- Fix PDF creation. Bug #180 +- Fix many translation issues. +- The TaxManager is now a service +- Loop output is now put in cache for better performance +- loop count is refactored. It used now count propel method instead of classic loop method +- UTF-8 is used during install process, no more encoding problem in database now +- an admin can now choose a prefered locale and switch language in admin panel +- module repository is available on github : https://github.com/thelia-modules +- import module from Thelia 1 is available. It works from Thelia 1.4.2 : https://github.com/thelia-modules/importT1 + +#2.0.0-beta3 + +- Coupon effect inputs are now more customisable (input text, select, ajax, etc.. are usable) and unlimited amount of input for coupon effect are now possible too +- when a category is deleted, all subcategories are deleted +- delete products when categories are removed. Works only when the category is the default one for this product +- Manager update exists now. Run ```php Thelia thelia:update``` +- Coupon works now +- Improved tax rule configuration + +#2.0.0-beta2 + +- http://doc.thelia.net is available in beta. +- Increase performance in prod mode. +- Front part (routes and controller) are now a dedicated module. +- allow to create a customer in admin panel +- translation is implemented : + - I18n directory in template or module. + - multiple extensions are available. We choose to use php but you can use other. + - You can translate your template or module from the admin. +- Admin hooks exist. With this hooks, a module can insert code in admin pages +- Admin hooks can be display using SHOW_INCLUDE=1 in your query string and in dev mode (http://doc.thelia.net/en/documentation/modules/hook.html) +- change memory_limit parameter in installation process. 128M is now needed +- assets can be used from template directory and from module +- Product, Category, Folder and Content have a dedicated SEO panel +- Allow to configure store information like email, address, phone number, etc. +- email management : http://doc.thelia.net/en/documentation/templates/emails.html +- "How to contribute ?" see http://doc.thelia.net/en/documentation/contribute.html +-Cache http (use it carefully, default template is not compatible with this cache) : + - if you don't know http specification, learn it first http://www.w3.org/Protocols/rfc2616/rfc2616.html + - esi tag integrated, use {render_esi path="http://your-taget.tld/resource"} + - if no reverse proxy detected, html is render instead of esi tag + - if you can't install a reverse proxy like varnish, use the HttpCache (just uncomment line 14 in web/index.php file) + - resources : + - http://www.mnot.net/cache_docs/ (fr) + - http://tomayko.com/writings/things-caches-do (en) + - http://symfony.com/doc/current/book/http_cache.html#http-cache-introduction (en and fr) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 00000000..fac1790f --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,51 @@ +CONTRIBUTORS +============ + +If you contributes or contributed to this project and do not appear in this list below, +please email us (info@thelia.net) or fork this file on GitHub and send a pull-request. + + - Manuel Raynaud (lunika) + - Franck Allimant (roadster31) + - Etienne Roudeix (etienneroudeix) + - Benjamin Perche (lovenunu) + - Julien Chanseaume (bibich) + - Christophe Laffont (touffies) + - Michaël Espeche (mespeche) + - Gilles Bourgeat (gillesbourgeat) + - Guillaume Morel (gmorel) + - Yochima (Yochima) + - Goleo Bruno (badsuricate) + - (zzuutt) + - Jérôme Billiras (bilhackmac) + - Emmanuel Nurit (enurit) + - (Asturyan) + - Etienne Perriere (Mertiozys) + - (griotteau) + - Alban Baixas (Alban-io) + - Christophe (InformatiqueProg) + - (jodeq) + - (nicolasleon) + - Chevrier (AnthonyMeedle) + - Romain Ducher (air-dex) + - Antony Penalver (Soldras) + - David Rimbault (Id4v) + - Stéphanie Pinet (stephaniepinet) + - Damien Foulhoux (Lucanis) + - Vincent Lopes-Vicente (lopes-vincent) + - (alex63530) + - Arnault Pachot (apachot) + - Cédric Sibaud (csibaud) + - Stéphane Calisti (csteph85) + - Alex Rock Ancelet (Pierstoval) + - Baptiste Cabarrou (bcabarrou) + - Adrien Bourroux (driou) + - (AdeDidou) + - DirtyF (DirtyF) + - (xockduo) + - Michaël Marinetti (Asenar) + - Mickaël (Kira-kyuukyoku) + - Quentin Dufour (superboum) + - Lespes (knjeurope) + - Tarun Garg (tarun1793) + - poum (poum) + - Luis Cordova (cordoval) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt new file mode 100644 index 00000000..68ed34bf --- /dev/null +++ b/COPYRIGHT.txt @@ -0,0 +1,4 @@ +THELIA +Copyright (C) 2005-2015 OpenStudio + +THELIA application uses externals components and libraries which are released under their own LGPL compatible license terms. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/Readme.md b/Readme.md new file mode 100644 index 00000000..f7c0efd7 --- /dev/null +++ b/Readme.md @@ -0,0 +1,196 @@ +Readme +====== + +## Warning +### This is the development repository of Thelia. If you want to create a project, please take a look at [thelia/thelia-project](https://github.com/thelia/thelia-project) + +Thelia +------ +[![Build Status](https://travis-ci.org/thelia/thelia.png?branch=2.3)](https://travis-ci.org/thelia/thelia) [![License](https://poser.pugx.org/thelia/thelia/license.png)](https://packagist.org/packages/thelia/thelia) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/thelia/thelia/badges/quality-score.png?s=61e3e04a69bffd71c29b08e5392080317a546716)](https://scrutinizer-ci.com/g/thelia/thelia/) + +[Thelia](http://thelia.net/) is an open source tool for creating e-business websites and managing online content. This software is published under LGPL. + +This is the new major version of Thelia. + +A repository containing all thelia modules is available at this address : https://github.com/thelia-modules + +Requirements +------------ + +* PHP 5.4 + * Required extensions : + * PDO_Mysql + * mcrypt + * intl + * gd + * curl + * safe_mode off + * memory_limit at least 128M, preferably 256. + * post\_max\_size 20M + * upload\_max\_filesize 2M + * date.timezone must be defined +* Web Server Apache 2 or Nginx +* MySQL 5 + + +### MySQL 5.6 + +As of MySQL 5.6, default configuration sets the sql_mode value to + +``` +STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION +``` + +This 'STRICT_TRANS_TABLES' configuration results in SQL errors when no default value is defined on NOT NULL columns and the value is empty or invalid. + +You can edit this default config in ` /etc/my.cnf ` and change the sql_mode to remove the STRICT_TRANS_TABLES part + +``` +[mysqld] +sql_mode=NO_ENGINE_SUBSTITUTION +``` + +Assuming your sql_mode is the default one, you can change the value directly on the run by running the following SQL Command + +```sql +SET @@GLOBAL.sql_mode='NO_ENGINE_SUBSTITUTION', @@SESSION.sql_mode='NO_ENGINE_SUBSTITUTION' +``` + +For more information on sql_mode you can consult the [MySQL doc](http://dev.mysql.com/doc/refman/5.0/fr/server-sql-mode.html "sql Mode") + +## Archive builders +Thelia's archive builder's needs external libraries. +For zip archives, you need PECL zip. See [PHP Doc](http://php.net/manual/en/zip.installation.php) + +For tar archives, you need PECL phar. Moreover, you need to deactivate php.ini option "phar.readonly": +```ini +phar.readonly = Off +``` + +For tar.bz2 archives, you need tar's dependencies and the extension "bzip2". See [PHP Doc](http://php.net/manual/fr/book.bzip2.php) + +For tar.gz archives, you need tar's dependencies and the extension "zlib". See [PHP Doc](http://fr2.php.net/manual/fr/book.zlib.php) + +## Download Thelia 2 and install its dependencies + +You can get the sources from git and then let composer install dependencies, or use composer to install the whole thelia project into a specific directory + +### Using git for download and composer for dependencies +``` bash +$ git clone --recursive https://github.com/thelia/thelia path +$ cd path +$ git checkout 2.3.1 (2.2.3 or 2.1.9) +$ curl -sS https://getcomposer.org/installer | php +$ php composer.phar install +``` + +### Using composer for both download and dependencies +``` bash +$ curl -sS https://getcomposer.org/installer | php +$ php composer.phar create-project thelia/thelia path/ 2.3.1 (2.2.3 or 2.1.9) +``` + +## Install it + +You can install Thelia by two different way + +### Using install wizard + +Installing thelia with the web install wizard allow to create an administrator, add some informations about your shop, etc + +First of all, you have to configure a vhost as describe in [configuration](http://doc.thelia.net/en/documentation/configuration.html) section. + +The install wizard in accessible with your favorite browser : + +``` bash +http://yourdomain.tld/[/subdomain_if_needed]/install +``` + +For example, I have thelia downloaded at http://thelia.net and my vhost is correctly configured, I have to reach this address : + +``` bash +http://thelia.net/install +``` + +### Using cli tools + +``` bash +$ php Thelia thelia:install +``` + +You just have to follow all instructions. + +### Docker and docker compose + +This repo contains all the configuration needed to run Thelia with docker and docker-compose. + +It requires obviously [docker](https://docker.com/) and [docker-compose](http://docs.docker.com/compose/) + +How to start the configuration : + +``` +docker-compose up -d +``` + +tip : create an alias for docker-compose, it's boring to write it all the time + +All the script are launched through docker. For examples : + +``` +docker exec -it thelia_web_1 php Thelia cache:clear +docker exec -it thelia_web_1 php setup/faker.php +docker exec -it thelia_web_1 unit-tests.sh +docker exec -it thelia_web_1 php composer.phar install +``` + +Database information : + +* host : mariaDB +* login : root +* password : toor + +Once started, you can access it with your browser at this url : http://127.0.0.1:8080 and phpmyadmin : http://127.0.0.1:8081 + +What is missing : + +* confguration for export compression (zip, gzip, etc) + +Obviously you can modify all the configuration for your own case, for example the php version or add environment variable for the database configuration. Each time you modify the configuration, you have to rebuild it : + +``` +docker-compose build --no-cache +``` + +Documentation +------------- + +Thelia documentation is available at http://doc.thelia.net + + +Roadmap +------- + +The Roadmap is available at http://thelia.net/community/roadmap + + +Contribute +---------- + +see the documentation : http://doc.thelia.net/en/documentation/contribute.html + +If you submit modifications that adds new data or change the structure of the database, take a look to http://doc.thelia.net/en/documentation/contribute.html#sql-scripts-modification + +Usage +----- + +Consult the page : http://localhost/thelia/web/index_dev.php + +You can create a virtual host and choose web folder for root directory. + +To run tests (phpunit required) : + +``` bash +$ phpunit +``` + +We still have lot of work to achieve but enjoy this part. \ No newline at end of file diff --git a/Thelia b/Thelia new file mode 100644 index 00000000..33cbe879 --- /dev/null +++ b/Thelia @@ -0,0 +1,5 @@ +#!/usr/bin/env php + +- Extract the zip in a temporary directory +- Then you should replace (not only copy) all the files from the new Thelia version : + - all files from root directory + - bin (*optional*) + - core (**mandatory**) + - setup (**mandatory**) +- Then, you have to merge (copy in your existent directories) these other directories. Normally, + you haven't modify files inside these directories (just created new ones - like your frontOffice template). + But If you have modified files, you should proceed carefully and try to report all your changes. + - local/config + - local/modules + - templates + - web + + +## 2. Update database + +Then you have 2 different ways to proceed. In each method, a backup of your database can be automatically +performed if you want to. If an error is encountered, then your database will be restored. +But if your database is quite large, it's better to make a backup manually. + +### 2.1. use the update script + +In a command shell, go to the root directory of your installation, run and follow instructions : + +```bash +php setup/update.php +``` + +### 2.2. use the update wizard + +An update wizard is available in the ```web/install``` directory. It's the same directory used by the install wizard. + +**You have to protect the web folder if your site is public (htaccess, List of allowed IP, ...).** + +The update wizard in accessible with your favorite browser : + +```bash +http://yourdomain.tld/[/subdomain_if_needed]/install +``` + +Note: + +- the wizard is available only if your Thelia is not already in the latest version. +- at the end of the process, the install directory will be removed. + + +## 3. Clear cache + +Once the update is done successfully, you have to clear all caches : + +- clear all caches in all environment : + - ```php Thelia cache:clear``` + - ```php Thelia cache:clear --env=prod``` + +If the command fails, you can do it manually. Just delete the content of +the ```cache``` and ```web/cache``` directories. \ No newline at end of file diff --git a/UPGRADE-2.3.md b/UPGRADE-2.3.md new file mode 100644 index 00000000..e5620ec5 --- /dev/null +++ b/UPGRADE-2.3.md @@ -0,0 +1,131 @@ + +UPGRADE FROM 2.2 to 2.3 +======================= + + +EventDispatcher +---------------- + + * The `getDispatcher()` and `getName()` methods from `Symfony\Component\EventDispatcher\Event` + are deprecated, the event dispatcher instance and event name can be received in the listener call instead. + + Before: + + ```php + use Symfony\Component\EventDispatcher\Event; + + class Foo + { + public function myFooListener(Event $event) + { + $dispatcher = $event->getDispatcher(); + $eventName = $event->getName(); + $dispatcher->dispatch('log', $event); + + // ... more code + } + } + ``` + + After: + + ```php + use Symfony\Component\EventDispatcher\Event; + use Symfony\Component\EventDispatcher\EventDispatcherInterface; + + class MyListenerClass + { + public function myListenerMethod(Event $event, $eventName, EventDispatcherInterface $dispatcher) + { + $dispatcher->dispatch('log', $event); + + // ... more code + } + } + ``` + + While this above is sufficient for most uses, **if your module must be compatible with versions less than 2.3, or if your module uses multiple EventDispatcher instances,** you might need to specifically inject a known instance of the `EventDispatcher` into your listeners. This could be done using constructor or setter injection as follows: + + ```php + use Symfony\Component\EventDispatcher\EventDispatcherInterface; + + class MyListenerClass + { + protected $dispatcher = null; + + public function __construct(EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + } + ``` + +Request and RequestStack +---------------- + + * The `Request` service are deprecated, you must now use the `RequestStack` service. + + ##### In your loops + The way to recover the request does not change. + + To get the current request + + ```php + class MyLoopClass extends BaseLoop implements PropelSearchLoopInterface + { + public function buildModelCriteria() + { + // Get the current request + $request = $this->getCurrentRequest(); + // Or + $request = $this->requestStack->getCurrentRequest(); + + // ... more code + } + } + ``` + + ##### In your controllers + It's not recommended to use `getRequest()` and `getSession()`, the Request instance can be received in the action method parameters. + However, the `getRequest()` method returns the current request. + **Warning !!** This is not compatible with Thelia 2.0, because it uses Symfony 2.2 + + To get the current request + + ```php + use Thelia\Core\HttpFoundation\Request; + + class MyControllerClass extends ... + { + public function MyActionMethod(Request $request, $query_parameters ...) + { + $session = $request->getSession(); + // ... more code + } + } + ``` + +Container Scopes +---------------- + + * The "container scopes" concept no longer exists in Thelia 2.3. + For backward compatibility, the attributes `scope` is automatically removed of the xml configuration files. + **Warning !!** The attributes `scope` are always needed for your modules compatible with Thelia < 2.3. + [See the Symfony documentation for more information](http://symfony.com/doc/2.8/cookbook/service_container/scopes.html) + + +Unit Test +---------------- + + * The `SecurityContext`, `ParserContext`, `TokenProvider`, `TheliaFormFactory`, `TaxEngine` services are no longer dependent on "Request", but "RequestSTack". + This may break your unit tests. + +For more information about the upgrade from Symfony 2.3 to Symfony 2.8 +---------------- + +[Upgrade from Symfony 2.3 to 2.4](https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.4.md) +[Upgrade from Symfony 2.4 to 2.5](https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.5.md) +[Upgrade from Symfony 2.5 to 2.6](https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.6.md) +[Upgrade from Symfony 2.6 to 2.7](https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.7.md) +[Upgrade from Symfony 2.7 to 2.8](https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.8.md) +[Upgrade from Symfony 2.8 to 3.0](https://github.com/symfony/symfony/blob/2.8/UPGRADE-3.0.md) diff --git a/bin/lessc b/bin/lessc new file mode 100644 index 00000000..fa1fb958 --- /dev/null +++ b/bin/lessc @@ -0,0 +1,191 @@ +#!/usr/bin/env php + false, 'relativeUrls' => false); +$silent = false; +$watch = false; +$rootpath = ''; + +// Check for arguments +array_shift($argv); +if (!count($argv)) { + $argv[] = '-h'; +} + +// parse arguments +foreach ($argv as $key => $arg) { + if (preg_match('/^--?([a-z][0-9a-z-]*)(?:=([^\s]+))?$/i', $arg, $matches)) { + $option = $matches[1]; + $value = isset($matches[2]) ? $matches[2] : false; + unset($argv[$key]); + + switch ($option) { + case 'h': + case 'help': + echo << 1) { + $output = array_pop($argv); + $inputs = $argv; +} +else { + $inputs = $argv; + $output = false; +} + +if (!count($inputs)) { + echo("lessc: no input files\n"); + exit; +} + +if ($watch) { + if (!$output) { + echo("lessc: you must specify the output file if --watch is given\n"); + exit; + } + + $lastAction = 0; + + echo("lessc: watching input files\n"); + + while (1) { + clearstatcache(); + + $updated = false; + foreach ($inputs as $input) { + if ($input == '-') { + if (count($inputs) == 1) { + echo("lessc: during watching files is not possible to watch stdin\n"); + exit; + } + else { + continue; + } + } + + if (filemtime($input) > $lastAction) { + $updated = true; + break; + } + } + + if ($updated) { + $lastAction = time(); + $parser = new Less_Parser($env); + foreach ($inputs as $input) { + try { + $parser->parseFile($input, $rootpath); + } + catch (Exception $e) { + echo("lessc: " . $e->getMessage() . " \n"); + continue; // Invalid processing + } + } + + file_put_contents($output, $parser->getCss()); + echo("lessc: output file recompiled\n"); + } + + sleep(1); + } +} +else { + $parser = new Less_Parser($env); + foreach ($inputs as $input) { + if ($input == '-') { + $content = file_get_contents('php://stdin'); + $parser->parse($content); + } + else { + try { + $parser->parseFile($input); + } + catch (Exception $e) { + if (!$silent) { + echo("lessc: " . ((string)$e) . " \n"); + } + } + } + } + + if ($output) { + file_put_contents($output, $parser->getCss()); + } + else { + echo $parser->getCss(); + } +} diff --git a/bin/phpunit b/bin/phpunit new file mode 100644 index 00000000..8948f6e6 --- /dev/null +++ b/bin/phpunit @@ -0,0 +1,47 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (version_compare('5.3.3', PHP_VERSION, '>')) { + fwrite( + STDERR, + 'This version of PHPUnit requires PHP 5.3.3; using the latest version of PHP is highly recommended.' . PHP_EOL + ); + + die(1); +} + +if (!ini_get('date.timezone')) { + ini_set('date.timezone', 'UTC'); +} + +foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) { + if (file_exists($file)) { + define('PHPUNIT_COMPOSER_INSTALL', $file); + + break; + } +} + +unset($file); + +if (!defined('PHPUNIT_COMPOSER_INSTALL')) { + fwrite(STDERR, + 'You need to set up the project dependencies using the following commands:' . PHP_EOL . + 'wget http://getcomposer.org/composer.phar' . PHP_EOL . + 'php composer.phar install' . PHP_EOL + ); + + die(1); +} + +require PHPUNIT_COMPOSER_INSTALL; + +PHPUnit_TextUI_Command::main(); diff --git a/bin/propel b/bin/propel new file mode 100644 index 00000000..9301b057 --- /dev/null +++ b/bin/propel @@ -0,0 +1,4 @@ +#!/usr/bin/env php +=5.4", + "ircmaxell/password-compat": "1.0.*", + "psr/log": "1.0", + "symfony/config": "2.8.*", + "symfony/console": "2.8.*", + "symfony/dependency-injection": "2.8.*", + "symfony/event-dispatcher": "2.8.*", + "symfony/http-kernel": "2.8.*", + "symfony/routing": "2.8.*", + "symfony/filesystem": "2.8.*", + "symfony/yaml": "2.8.*", + "symfony/translation": "2.8.*", + "symfony-cmf/routing": "1.3.*", + "symfony/validator": "2.8.*", + "symfony/options-resolver": "2.8.*", + "symfony/security": "2.8.*", + "symfony/expression-language": "2.8.*", + "symfony/process": "2.8.*", + "symfony/dom-crawler": "2.8.*", + "symfony/property-access": "2.8.*", + "symfony/serializer": "2.8.*", + "ensepar/html2pdf": "1.0.1", + "symfony/finder": "2.8.*", + "symfony/browser-kit": "2.8.*", + "symfony/http-foundation": "2.8.*", + "symfony/form": "2.8.*", + "symfony/class-loader": "2.8.*", + "symfony/icu": "1.0", + "stack/builder": "1.0.*", + "thelia/currency-converter": "~1.0", + "doctrine/cache": "1.5.*", + "kriswallsmith/assetic": "1.3.*", + "ptachoire/cssembed": "1.0.*", + "simplepie/simplepie": "1.3.*", + "imagine/imagine": "0.6.*", + "swiftmailer/swiftmailer": "5.4.*", + "oyejorge/less.php": "1.7.*", + "michelf/php-markdown": "1.6.*", + "smarty/smarty": "3.1.20", + "ramsey/array_column": "~1.1", + "propel/propel": "dev-thelia-2.3", + "commerceguys/addressing": "0.8.*", + "thelia/paypal-module": "~2.0.0", + "thelia/take-customer-account-module": "~1.0", + "thelia/order-creation-module": "~1.0" + }, + "require-dev": { + "fzaninotto/faker": "1.5.*", + "thelia/hooktest-module": "~1.1", + "thelia/hooktest-template": "~1.1", + "phpunit/phpunit": "4.8.*" + }, + "minimum-stability": "stable", + "config": { + "vendor-dir": "core/vendor", + "bin-dir": "bin" + }, + "autoload": { + "psr-4": { + "Thelia\\": "core/lib/Thelia" + }, + "psr-0": { + "": "local/modules/" + }, + "files": [ + "core/bootstrap.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Thelia\\Tests\\" : "tests/phpunit/Thelia/Tests" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..763ad764 --- /dev/null +++ b/composer.lock @@ -0,0 +1,4344 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "3ce4f9f2d0b61f10ae68436b457457c1", + "content-hash": "c9d254f8817a0e7a6db9cdacb6be6bba", + "packages": [ + { + "name": "commerceguys/addressing", + "version": "v0.8.2", + "source": { + "type": "git", + "url": "https://github.com/commerceguys/addressing.git", + "reference": "93ddf176d7dd851edb0bb05694ed1614c5c67ef8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/commerceguys/addressing/zipball/93ddf176d7dd851edb0bb05694ed1614c5c67ef8", + "reference": "93ddf176d7dd851edb0bb05694ed1614c5c67ef8", + "shasum": "" + }, + "require": { + "commerceguys/enum": "~1.0", + "doctrine/collections": "~1.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mikey179/vfsstream": "1.*", + "phpunit/phpunit": "~4.0", + "symfony/intl": ">=2.3", + "symfony/validator": ">=2.3" + }, + "suggest": { + "commerceguys/intl": "to use it as the source of country data", + "symfony/form": "to generate Symfony address forms", + "symfony/intl": "to use it as the source of country data", + "symfony/validator": "to validate addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.x-dev" + } + }, + "autoload": { + "psr-4": { + "CommerceGuys\\Addressing\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bojan Zivanovic" + }, + { + "name": "Damien Tournoud" + } + ], + "description": "Addressing library powered by Google's address data.", + "keywords": [ + "address", + "internationalization", + "localization", + "postal" + ], + "time": "2015-12-24 23:07:20" + }, + { + "name": "commerceguys/enum", + "version": "v1.0", + "source": { + "type": "git", + "url": "https://github.com/commerceguys/enum.git", + "reference": "1d9db2dbeb1a02500e7a14589ae2f9cb402c5c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/commerceguys/enum/zipball/1d9db2dbeb1a02500e7a14589ae2f9cb402c5c95", + "reference": "1d9db2dbeb1a02500e7a14589ae2f9cb402c5c95", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "CommerceGuys\\Enum\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bojan Zivanovic" + } + ], + "description": "A PHP 5.4+ enumeration library.", + "time": "2015-02-27 21:36:56" + }, + { + "name": "doctrine/cache", + "version": "v1.5.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/47cdc76ceb95cc591d9c79a36dc3794975b5d136", + "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": ">=3.7", + "predis/predis": "~1.0", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2015-12-19 05:03:47" + }, + { + "name": "doctrine/collections", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2015-04-14 22:21:58" + }, + { + "name": "ensepar/html2pdf", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/OwlyCode/html2pdf.git", + "reference": "b53a27430cc35b29bbe2faaa55ed4a7d5c156cd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OwlyCode/html2pdf/zipball/b53a27430cc35b29bbe2faaa55ed4a7d5c156cd3", + "reference": "b53a27430cc35b29bbe2faaa55ed4a7d5c156cd3", + "shasum": "" + }, + "require": { + "ensepar/tcpdf": "5.0.003", + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTML2PDF": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Spipu", + "homepage": "http://sourceforge.net/users/spipu", + "role": "Developer" + }, + { + "name": "OwlyCode", + "homepage": "http://www.github.com/OwlyCode", + "role": "Developer" + } + ], + "description": "Unofficial fork of 'html2pdf' with Composer support. (Fixed composer dependency problem)", + "homepage": "https://github.com/jwronsky/html2pdf", + "keywords": [ + "html", + "html2pdf", + "pdf" + ], + "abandoned": "spipu/html2pdf", + "time": "2013-09-13 12:23:43" + }, + { + "name": "ensepar/tcpdf", + "version": "5.0.003", + "source": { + "type": "git", + "url": "https://github.com/OwlyCode/tcpdf.git", + "reference": "ae578409e9454fdf6c794cce6f063b0c95bfa518" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OwlyCode/tcpdf/zipball/ae578409e9454fdf6c794cce6f063b0c95bfa518", + "reference": "ae578409e9454fdf6c794cce6f063b0c95bfa518", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "fonts", + "config/lang", + "config", + "2dbarcodes.php", + "barcodes.php", + "htmlcolors.php", + "qrcode.php", + "tcpdf.php", + "unicode_data.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPLv3" + ], + "authors": [ + { + "name": "Nicola Asuni", + "email": "info@tecnick.com", + "homepage": "http://nicolaasuni.tecnick.com" + }, + { + "name": "Tristan Maindron", + "email": "tmaindron@gmail.com", + "homepage": "http://www.github.com/OwlyCode" + } + ], + "description": "TCPDF is a PHP class for generating PDF documents.", + "homepage": "http://www.tcpdf.org/", + "keywords": [ + "TCPDF", + "pdf" + ], + "abandoned": "tecnickcom/tcpdf", + "time": "2013-09-12 17:00:40" + }, + { + "name": "imagine/imagine", + "version": "v0.6.3", + "source": { + "type": "git", + "url": "https://github.com/avalanche123/Imagine.git", + "reference": "149041d2a1b517107bfe270ca2b1a17aa341715d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/avalanche123/Imagine/zipball/149041d2a1b517107bfe270ca2b1a17aa341715d", + "reference": "149041d2a1b517107bfe270ca2b1a17aa341715d", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "sami/sami": "dev-master" + }, + "suggest": { + "ext-gd": "to use the GD implementation", + "ext-gmagick": "to use the Gmagick implementation", + "ext-imagick": "to use the Imagick implementation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.7-dev" + } + }, + "autoload": { + "psr-0": { + "Imagine": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bulat Shakirzyanov", + "email": "mallluhuct@gmail.com", + "homepage": "http://avalanche123.com" + } + ], + "description": "Image processing for PHP 5.3", + "homepage": "http://imagine.readthedocs.org/", + "keywords": [ + "drawing", + "graphics", + "image manipulation", + "image processing" + ], + "time": "2015-09-19 16:54:05" + }, + { + "name": "ircmaxell/password-compat", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/ircmaxell/password_compat.git", + "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", + "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "files": [ + "lib/password.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthony Ferrara", + "email": "ircmaxell@php.net", + "homepage": "http://blog.ircmaxell.com" + } + ], + "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", + "homepage": "https://github.com/ircmaxell/password_compat", + "keywords": [ + "hashing", + "password" + ], + "time": "2014-11-20 16:49:30" + }, + { + "name": "kriswallsmith/assetic", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/kriswallsmith/assetic.git", + "reference": "9928f7c4ad98b234e3559d1049abd13387f86db5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/9928f7c4ad98b234e3559d1049abd13387f86db5", + "reference": "9928f7c4ad98b234e3559d1049abd13387f86db5", + "shasum": "" + }, + "require": { + "php": ">=5.3.1", + "symfony/process": "~2.1|~3.0" + }, + "conflict": { + "twig/twig": "<1.23" + }, + "require-dev": { + "cssmin/cssmin": "3.0.1", + "joliclic/javascript-packer": "1.1", + "kamicane/packager": "1.0", + "leafo/lessphp": "^0.3.7", + "leafo/scssphp": "~0.1", + "mrclay/minify": "~2.2", + "patchwork/jsqueeze": "~1.0|~2.0", + "phpunit/phpunit": "~4.8", + "psr/log": "~1.0", + "ptachoire/cssembed": "~1.0", + "symfony/phpunit-bridge": "~2.7|~3.0", + "twig/twig": "~1.8|~2.0" + }, + "suggest": { + "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", + "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", + "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", + "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", + "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", + "twig/twig": "Assetic provides the integration with the Twig templating engine" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-0": { + "Assetic": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com", + "homepage": "http://kriswallsmith.net/" + } + ], + "description": "Asset Management for PHP", + "homepage": "https://github.com/kriswallsmith/assetic", + "keywords": [ + "assets", + "compression", + "minification" + ], + "time": "2015-11-12 13:51:40" + }, + { + "name": "michelf/php-markdown", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/michelf/php-markdown.git", + "reference": "156e56ee036505ec637d761ee62dc425d807183c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/michelf/php-markdown/zipball/156e56ee036505ec637d761ee62dc425d807183c", + "reference": "156e56ee036505ec637d761ee62dc425d807183c", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-lib": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Michelf": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Michel Fortin", + "email": "michel.fortin@michelf.ca", + "homepage": "https://michelf.ca/", + "role": "Developer" + }, + { + "name": "John Gruber", + "homepage": "https://daringfireball.net/" + } + ], + "description": "PHP Markdown", + "homepage": "https://michelf.ca/projects/php-markdown/", + "keywords": [ + "markdown" + ], + "time": "2015-12-24 01:37:31" + }, + { + "name": "oyejorge/less.php", + "version": "v1.7.0.10", + "source": { + "type": "git", + "url": "https://github.com/oyejorge/less.php.git", + "reference": "a1e2d3c20794b37ac4d0baeb24613e579584033b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/a1e2d3c20794b37ac4d0baeb24613e579584033b", + "reference": "a1e2d3c20794b37ac4d0baeb24613e579584033b", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.18" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin Jantošovič", + "homepage": "https://github.com/Mordred" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org", + "homepage": "http://lessphp.gpeasy.com", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "time": "2015-12-30 05:47:36" + }, + { + "name": "paragonie/random_compat", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "b0e69d10852716b2ccbdff69c75c477637220790" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/b0e69d10852716b2ccbdff69c75c477637220790", + "reference": "b0e69d10852716b2ccbdff69c75c477637220790", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2016-02-06 03:52:05" + }, + { + "name": "propel/propel", + "version": "dev-thelia-2.3", + "source": { + "type": "git", + "url": "https://github.com/thelia/Propel2.git", + "reference": "06e832d0d5fd5255a36c1a42d81487dcf6519e04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia/Propel2/zipball/06e832d0d5fd5255a36c1a42d81487dcf6519e04", + "reference": "06e832d0d5fd5255a36c1a42d81487dcf6519e04", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/log": "~1.0", + "symfony/console": "~2.2", + "symfony/filesystem": "~2.2", + "symfony/finder": "~2.2", + "symfony/validator": "~2.2", + "symfony/yaml": "~2.2" + }, + "require-dev": { + "behat/behat": "~2.4", + "monolog/monolog": "~1.3", + "phpunit/phpunit": "3.7.*" + }, + "suggest": { + "monolog/monolog": "The recommended logging library to use with Propel." + }, + "bin": [ + "bin/propel" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-0": { + "Propel": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "william.durand1@gmail.com" + } + ], + "description": "Propel2 is an open-source Object-Relational Mapping (ORM) for PHP 5.4", + "homepage": "http://www.propelorm.org/", + "keywords": [ + "Active Record", + "ORM", + "persistence" + ], + "support": { + "source": "https://github.com/thelia/Propel2/tree/thelia-2.3" + }, + "time": "2016-01-26 14:41:16" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "ptachoire/cssembed", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/krichprollsch/phpCssEmbed.git", + "reference": "406c6d5b846cafa9186f9944a6210d0e6fed154b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/krichprollsch/phpCssEmbed/zipball/406c6d5b846cafa9186f9944a6210d0e6fed154b", + "reference": "406c6d5b846cafa9186f9944a6210d0e6fed154b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CssEmbed": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pierre Tachoire", + "email": "pierre.tachoire@gmail.com" + } + ], + "description": "Css url embed library.", + "homepage": "https://github.com/krichprollsch/phpCssEmbed", + "keywords": [ + "css", + "url" + ], + "time": "2013-07-22 20:01:48" + }, + { + "name": "ramsey/array_column", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/array_column.git", + "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/array_column/zipball/f8e52eb28e67eb50e613b451dd916abcf783c1db", + "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db", + "shasum": "" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "0.8.*", + "phpunit/phpunit": "~4.5", + "satooshi/php-coveralls": "0.6.*", + "squizlabs/php_codesniffer": "~2.2" + }, + "type": "library", + "autoload": { + "files": [ + "src/array_column.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "homepage": "http://benramsey.com" + } + ], + "description": "Provides functionality for array_column() to projects using PHP earlier than version 5.5.", + "homepage": "https://github.com/ramsey/array_column", + "keywords": [ + "array", + "array_column", + "column" + ], + "time": "2015-03-20 22:07:39" + }, + { + "name": "simplepie/simplepie", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/simplepie/simplepie.git", + "reference": "ce53709778bc1e2e4deda1651b66e5081398d5cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplepie/simplepie/zipball/ce53709778bc1e2e4deda1651b66e5081398d5cc", + "reference": "ce53709778bc1e2e4deda1651b66e5081398d5cc", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "SimplePie": "library" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Ryan Parman", + "homepage": "http://ryanparman.com/", + "role": "Creator, alumnus developer" + }, + { + "name": "Geoffrey Sneddon", + "homepage": "http://gsnedders.com/", + "role": "Alumnus developer" + }, + { + "name": "Ryan McCue", + "email": "me@ryanmccue.info", + "homepage": "http://ryanmccue.info/", + "role": "Developer" + } + ], + "description": "A simple Atom/RSS parsing library for PHP", + "homepage": "http://simplepie.org/", + "keywords": [ + "atom", + "feeds", + "rss" + ], + "time": "2012-10-30 17:54:03" + }, + { + "name": "smarty/smarty", + "version": "v3.1.20", + "source": { + "type": "git", + "url": "https://github.com/smarty-php/smarty.git", + "reference": "cef27602bba3acd00ae14a8804ebd086e75e65e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/cef27602bba3acd00ae14a8804ebd086e75e65e3", + "reference": "cef27602bba3acd00ae14a8804ebd086e75e65e3", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "libs/Smarty.class.php", + "libs/SmartyBC.class.php", + "libs/sysplugins/smarty_security.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + } + ], + "description": "Smarty - the compiling PHP template engine", + "homepage": "http://www.smarty.net", + "keywords": [ + "templating" + ], + "time": "2014-10-31 04:12:39" + }, + { + "name": "stack/builder", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/stackphp/builder.git", + "reference": "c1f8a4693b55c563405024f708a76ef576c3b276" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stackphp/builder/zipball/c1f8a4693b55c563405024f708a76ef576c3b276", + "reference": "c1f8a4693b55c563405024f708a76ef576c3b276", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "symfony/http-foundation": "~2.1", + "symfony/http-kernel": "~2.1" + }, + "require-dev": { + "silex/silex": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Stack": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Builder for stack middlewares based on HttpKernelInterface.", + "keywords": [ + "stack" + ], + "time": "2014-11-23 20:37:11" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421", + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1,<0.9.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2015-06-06 14:19:39" + }, + { + "name": "symfony-cmf/routing", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony-cmf/Routing.git", + "reference": "8e87981d72c6930a27585dcd3119f3199f6cb2a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/8e87981d72c6930a27585dcd3119f3199f6cb2a6", + "reference": "8e87981d72c6930a27585dcd3119f3199f6cb2a6", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "psr/log": "~1.0", + "symfony/http-kernel": "~2.2", + "symfony/routing": "~2.2" + }, + "require-dev": { + "symfony/config": "~2.2", + "symfony/dependency-injection": "~2.0@stable", + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "symfony/event-dispatcher": "DynamicRouter can optionally trigger an event at the start of matching. Minimal version ~2.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Cmf\\Component\\Routing\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony CMF Community", + "homepage": "https://github.com/symfony-cmf/Routing/contributors" + } + ], + "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers", + "homepage": "http://cmf.symfony.com", + "keywords": [ + "database", + "routing" + ], + "time": "2014-10-20 20:55:17" + }, + { + "name": "symfony/browser-kit", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "a93dffaf763182acad12a4c42c7efc372899891e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a93dffaf763182acad12a4c42c7efc372899891e", + "reference": "a93dffaf763182acad12a4c42c7efc372899891e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0" + }, + "require-dev": { + "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0", + "symfony/process": "~2.3.34|~2.7,>=2.7.6|~3.0.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony BrowserKit Component", + "homepage": "https://symfony.com", + "time": "2016-01-12 17:46:01" + }, + { + "name": "symfony/class-loader", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/class-loader.git", + "reference": "98e9089a428ed0e39423b67352c57ef5910a3269" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/98e9089a428ed0e39423b67352c57ef5910a3269", + "reference": "98e9089a428ed0e39423b67352c57ef5910a3269", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/finder": "~2.0,>=2.0.5|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ClassLoader\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ClassLoader Component", + "homepage": "https://symfony.com", + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/config", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "41ee6c70758f40fa1dbf90d019ae0a66c4a09e74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/41ee6c70758f40fa1dbf90d019ae0a66c4a09e74", + "reference": "41ee6c70758f40fa1dbf90d019ae0a66c4a09e74", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/filesystem": "~2.3|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/console", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d0239fb42f98dd02e7d342f793c5d2cdee0c478d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d0239fb42f98dd02e7d342f793c5d2cdee0c478d", + "reference": "d0239fb42f98dd02e7d342f793c5d2cdee0c478d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/process": "~2.1|~3.0.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2016-01-14 08:33:16" + }, + { + "name": "symfony/debug", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "386364a0e71158615ab9ae76b74bf84efc0bac7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/386364a0e71158615ab9ae76b74bf84efc0bac7e", + "reference": "386364a0e71158615ab9ae76b74bf84efc0bac7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.2|~3.0.0", + "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2016-01-13 10:28:07" + }, + { + "name": "symfony/dependency-injection", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "ba94a914e244e0d05f0aaef460d5558d5541d2b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ba94a914e244e0d05f0aaef460d5558d5541d2b1", + "reference": "ba94a914e244e0d05f0aaef460d5558d5541d2b1", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/expression-language": "<2.6" + }, + "require-dev": { + "symfony/config": "~2.2|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/yaml": "~2.1|~3.0.0" + }, + "suggest": { + "symfony/config": "", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2016-01-12 17:46:01" + }, + { + "name": "symfony/dom-crawler", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "650d37aacb1fa0dcc24cced483169852b3a0594e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/650d37aacb1fa0dcc24cced483169852b3a0594e", + "reference": "650d37aacb1fa0dcc24cced483169852b3a0594e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "~2.8|~3.0.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com", + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "ee278f7c851533e58ca307f66305ccb9188aceda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ee278f7c851533e58ca307f66305ccb9188aceda", + "reference": "ee278f7c851533e58ca307f66305ccb9188aceda", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2016-01-13 10:28:07" + }, + { + "name": "symfony/expression-language", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "720eb3405f14fddea22626cb69b64e6dac82a749" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/720eb3405f14fddea22626cb69b64e6dac82a749", + "reference": "720eb3405f14fddea22626cb69b64e6dac82a749", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ExpressionLanguage Component", + "homepage": "https://symfony.com", + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/filesystem", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "637b64d0ee10f44ae98dbad651b1ecdf35a11e8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/637b64d0ee10f44ae98dbad651b1ecdf35a11e8c", + "reference": "637b64d0ee10f44ae98dbad651b1ecdf35a11e8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2016-01-13 10:28:07" + }, + { + "name": "symfony/finder", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "c90fabdd97e431ee19b6383999cf35334dff27da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/c90fabdd97e431ee19b6383999cf35334dff27da", + "reference": "c90fabdd97e431ee19b6383999cf35334dff27da", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2016-01-14 08:26:52" + }, + { + "name": "symfony/form", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "7fd5e4034cb8e215887136f5e176430bbf5ef085" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/7fd5e4034cb8e215887136f5e176430bbf5ef085", + "reference": "7fd5e4034cb8e215887136f5e176430bbf5ef085", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/intl": "~2.4|~3.0.0", + "symfony/options-resolver": "~2.6", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "~2.3|~3.0.0" + }, + "conflict": { + "symfony/doctrine-bridge": "<2.7", + "symfony/framework-bundle": "<2.7", + "symfony/twig-bridge": "<2.7" + }, + "require-dev": { + "doctrine/collections": "~1.0", + "symfony/dependency-injection": "~2.3|~3.0.0", + "symfony/http-foundation": "~2.2|~3.0.0", + "symfony/http-kernel": "~2.4|~3.0.0", + "symfony/security-csrf": "~2.4|~3.0.0", + "symfony/translation": "~2.0,>=2.0.5|~3.0.0", + "symfony/validator": "~2.8|~3.0.0" + }, + "suggest": { + "symfony/framework-bundle": "For templating with PHP.", + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Form Component", + "homepage": "https://symfony.com", + "time": "2016-01-12 17:46:01" + }, + { + "name": "symfony/http-foundation", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "9194b33c71da8ef4d05d22964376f2f9c95a1bfd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9194b33c71da8ef4d05d22964376f2f9c95a1bfd", + "reference": "9194b33c71da8ef4d05d22964376f2f9c95a1bfd", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-php54": "~1.0", + "symfony/polyfill-php55": "~1.0" + }, + "require-dev": { + "symfony/expression-language": "~2.4|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2016-01-13 10:28:07" + }, + { + "name": "symfony/http-kernel", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "dbe146efdc040dc87cc730a926c7858bb3c3b3bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/dbe146efdc040dc87cc730a926c7858bb3c3b3bc", + "reference": "dbe146efdc040dc87cc730a926c7858bb3c3b3bc", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0", + "symfony/debug": "~2.6,>=2.6.2", + "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0", + "symfony/http-foundation": "~2.5,>=2.5.4|~3.0.0" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "symfony/browser-kit": "~2.3|~3.0.0", + "symfony/class-loader": "~2.1|~3.0.0", + "symfony/config": "~2.8", + "symfony/console": "~2.3|~3.0.0", + "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.8|~3.0.0", + "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0", + "symfony/expression-language": "~2.4|~3.0.0", + "symfony/finder": "~2.0,>=2.0.5|~3.0.0", + "symfony/process": "~2.0,>=2.0.5|~3.0.0", + "symfony/routing": "~2.8|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0", + "symfony/templating": "~2.2|~3.0.0", + "symfony/translation": "~2.0,>=2.0.5|~3.0.0", + "symfony/var-dumper": "~2.6|~3.0.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2016-01-14 12:00:59" + }, + { + "name": "symfony/icu", + "version": "v1.0.0", + "target-dir": "Symfony/Component/Icu", + "source": { + "type": "git", + "url": "https://github.com/symfony/icu.git", + "reference": "cac3fdfb111adbe590155f491594636d45129783" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/icu/zipball/cac3fdfb111adbe590155f491594636d45129783", + "reference": "cac3fdfb111adbe590155f491594636d45129783", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": "~2.3" + }, + "type": "library", + "autoload": { + "psr-0": { + "Symfony\\Component\\Icu\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Contains an excerpt of the ICU data and classes to load it.", + "homepage": "http://symfony.com", + "keywords": [ + "icu", + "intl" + ], + "abandoned": "symfony/intl", + "time": "2013-06-03 18:32:07" + }, + { + "name": "symfony/intl", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "045a1beea48d159e1f637c469640943637681794" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/045a1beea48d159e1f637c469640943637681794", + "reference": "045a1beea48d159e1f637c469640943637681794", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/polyfill-php54": "~1.0" + }, + "require-dev": { + "symfony/filesystem": "~2.1|~3.0.0" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "time": "2016-01-06 09:59:23" + }, + { + "name": "symfony/options-resolver", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "b98ca04f85240531b9ea8a0f00a21f2ecfbdfa51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b98ca04f85240531b9ea8a0f00a21f2ecfbdfa51", + "reference": "b98ca04f85240531b9ea8a0f00a21f2ecfbdfa51", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "66b0bb4abda229bc073eff6bbc8f2685bdaac165" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/66b0bb4abda229bc073eff6bbc8f2685bdaac165", + "reference": "66b0bb4abda229bc073eff6bbc8f2685bdaac165", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": "~2.3|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "1289d16209491b584839022f29257ad859b8532d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d", + "reference": "1289d16209491b584839022f29257ad859b8532d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-php54", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php54.git", + "reference": "74663d5a2ff3c530c1bc0571500e0feec9094054" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/74663d5a2ff3c530c1bc0571500e0feec9094054", + "reference": "74663d5a2ff3c530c1bc0571500e0feec9094054", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php54\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-php55", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php55.git", + "reference": "b4f3f07d91702f8f926339fc4fcf81671d8c27e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/b4f3f07d91702f8f926339fc4fcf81671d8c27e6", + "reference": "b4f3f07d91702f8f926339fc4fcf81671d8c27e6", + "shasum": "" + }, + "require": { + "ircmaxell/password-compat": "~1.0", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php55\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "4d891fff050101a53a4caabb03277284942d1ad9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/4d891fff050101a53a4caabb03277284942d1ad9", + "reference": "4d891fff050101a53a4caabb03277284942d1ad9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "8428ceddbbaf102f2906769a8ef2438220c5cb95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/8428ceddbbaf102f2906769a8ef2438220c5cb95", + "reference": "8428ceddbbaf102f2906769a8ef2438220c5cb95", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-25 08:44:42" + }, + { + "name": "symfony/polyfill-util", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", + "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/process", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "6f1979c3b0f4c22c77a8a8971afaa7dd07f082ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/6f1979c3b0f4c22c77a8a8971afaa7dd07f082ac", + "reference": "6f1979c3b0f4c22c77a8a8971afaa7dd07f082ac", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2016-01-06 09:59:23" + }, + { + "name": "symfony/property-access", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "f58bd65f1e985f4192eedbf0b2a818a220eccadc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/f58bd65f1e985f4192eedbf0b2a818a220eccadc", + "reference": "f58bd65f1e985f4192eedbf0b2a818a220eccadc", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/routing", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "5451a8a1874fd4e6a4dd347ea611d86cd8441735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/5451a8a1874fd4e6a4dd347ea611d86cd8441735", + "reference": "5451a8a1874fd4e6a4dd347ea611d86cd8441735", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~2.7|~3.0.0", + "symfony/expression-language": "~2.4|~3.0.0", + "symfony/http-foundation": "~2.3|~3.0.0", + "symfony/yaml": "~2.0,>=2.0.5|~3.0.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2016-01-11 16:43:36" + }, + { + "name": "symfony/security", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/security.git", + "reference": "c8503ac7d0e73a8c9594da174228375453acd329" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security/zipball/c8503ac7d0e73a8c9594da174228375453acd329", + "reference": "c8503ac7d0e73a8c9594da174228375453acd329", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/event-dispatcher": "~2.2|~3.0.0", + "symfony/http-foundation": "~2.1|~3.0.0", + "symfony/http-kernel": "~2.4|~3.0.0", + "symfony/polyfill-php55": "~1.0", + "symfony/polyfill-php56": "~1.0", + "symfony/polyfill-php70": "~1.0", + "symfony/polyfill-util": "~1.0", + "symfony/property-access": "~2.3|~3.0.0", + "symfony/security-acl": "~2.7" + }, + "replace": { + "symfony/security-core": "self.version", + "symfony/security-csrf": "self.version", + "symfony/security-guard": "self.version", + "symfony/security-http": "self.version" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/finder": "~2.3|~3.0.0", + "symfony/ldap": "~2.8|~3.0.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "~2.2|~3.0.0", + "symfony/validator": "~2.5,>=2.5.9|~3.0.0" + }, + "suggest": { + "symfony/expression-language": "For using the expression voter", + "symfony/form": "", + "symfony/ldap": "For using the LDAP user and authentication providers", + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component", + "homepage": "https://symfony.com", + "time": "2016-01-14 09:10:32" + }, + { + "name": "symfony/security-acl", + "version": "v2.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-acl.git", + "reference": "4a3f7327ad215242c78f6564ad4ea6d2db1b8347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-acl/zipball/4a3f7327ad215242c78f6564ad4ea6d2db1b8347", + "reference": "4a3f7327ad215242c78f6564ad4ea6d2db1b8347", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/security-core": "~2.4|~3.0.0" + }, + "require-dev": { + "doctrine/common": "~2.2", + "doctrine/dbal": "~2.2", + "psr/log": "~1.0", + "symfony/phpunit-bridge": "~2.7|~3.0.0" + }, + "suggest": { + "doctrine/dbal": "For using the built-in ACL implementation", + "symfony/class-loader": "For using the ACL generateSql script", + "symfony/finder": "For using the ACL generateSql script" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Acl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - ACL (Access Control List)", + "homepage": "https://symfony.com", + "time": "2015-12-28 09:39:09" + }, + { + "name": "symfony/serializer", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "60d6ea54abf865ab8efa9811e6c146e71f8bdbff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/60d6ea54abf865ab8efa9811e6c146e71f8bdbff", + "reference": "60d6ea54abf865ab8efa9811e6c146e71f8bdbff", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-php55": "~1.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "symfony/config": "~2.2|~3.0.0", + "symfony/property-access": "~2.3|~3.0.0", + "symfony/yaml": "~2.0,>=2.0.5|~3.0.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Serializer Component", + "homepage": "https://symfony.com", + "time": "2016-01-13 10:28:07" + }, + { + "name": "symfony/translation", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "bc0b666903944858f4ffec01c4e50c63e5c276c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/bc0b666903944858f4ffec01c4e50c63e5c276c0", + "reference": "bc0b666903944858f4ffec01c4e50c63e5c276c0", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8", + "symfony/intl": "~2.4|~3.0.0", + "symfony/yaml": "~2.2|~3.0.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2016-01-03 15:33:41" + }, + { + "name": "symfony/validator", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "7a325d73cb492d244d9107406fe40650ac070a04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/7a325d73cb492d244d9107406fe40650ac070a04", + "reference": "7a325d73cb492d244d9107406fe40650ac070a04", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/translation": "~2.4|~3.0.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "egulias/email-validator": "~1.2,>=1.2.1", + "symfony/config": "~2.2|~3.0.0", + "symfony/expression-language": "~2.4|~3.0.0", + "symfony/http-foundation": "~2.1|~3.0.0", + "symfony/intl": "~2.4|~3.0.0", + "symfony/property-access": "~2.3|~3.0.0", + "symfony/yaml": "~2.0,>=2.0.5|~3.0.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "symfony/config": "", + "symfony/expression-language": "For using the 2.4 Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For using the 2.4 Validator API", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "https://symfony.com", + "time": "2016-01-12 17:46:01" + }, + { + "name": "symfony/yaml", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "34c8a4b51e751e7ea869b8262f883d008a2b81b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/34c8a4b51e751e7ea869b8262f883d008a2b81b8", + "reference": "34c8a4b51e751e7ea869b8262f883d008a2b81b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2016-01-13 10:28:07" + }, + { + "name": "thelia/currency-converter", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/thelia/CurrencyConverter.git", + "reference": "dcad992579ad6a54381d52cce5d0327ffacc9863" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia/CurrencyConverter/zipball/dcad992579ad6a54381d52cce5d0327ffacc9863", + "reference": "dcad992579ad6a54381d52cce5d0327ffacc9863", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "thelia/math-tools": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Thelia\\CurrencyConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0+" + ], + "authors": [ + { + "name": "Manuel Raynaud", + "email": "manu@thelia.net" + } + ], + "description": "php 5.4 currency tools", + "time": "2015-11-05 16:15:32" + }, + { + "name": "thelia/installer", + "version": "1.2", + "source": { + "type": "git", + "url": "https://github.com/thelia/installer.git", + "reference": "da27ff8bc633452913590ee5bc26ee4c79ff61ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia/installer/zipball/da27ff8bc633452913590ee5bc26ee4c79ff61ee", + "reference": "da27ff8bc633452913590ee5bc26ee4c79ff61ee", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0" + }, + "require-dev": { + "composer/composer": "1.0.*@dev" + }, + "type": "composer-plugin", + "extra": { + "class": "Thelia\\Composer\\TheliaInstallerPlugin" + }, + "autoload": { + "psr-0": { + "Thelia\\Composer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL V3" + ], + "authors": [ + { + "name": "Manuel Raynaud", + "email": "raynaud.manu@gmail.com", + "homepage": "https://github.com/lunika" + } + ], + "description": "custom installer for Thelia.", + "keywords": [ + "Thelia", + "Thelia-module", + "Thelia-template" + ], + "time": "2015-06-11 14:04:43" + }, + { + "name": "thelia/math-tools", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/thelia/math-tools.git", + "reference": "4e66cd5448531a6eaf565acd8b69d9c693da7a3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia/math-tools/zipball/4e66cd5448531a6eaf565acd8b69d9c693da7a3a", + "reference": "4e66cd5448531a6eaf565acd8b69d9c693da7a3a", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "4.1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Thelia\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Benjamin Perche", + "email": "bperche@openstudio.com" + } + ], + "description": "Number management library", + "time": "2015-11-05 15:52:55" + }, + { + "name": "thelia/order-creation-module", + "version": "1.4", + "source": { + "type": "git", + "url": "https://github.com/thelia-modules/OrderCreation.git", + "reference": "27904242efb0a1fbec92f977949f766176f2d083" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia-modules/OrderCreation/zipball/27904242efb0a1fbec92f977949f766176f2d083", + "reference": "27904242efb0a1fbec92f977949f766176f2d083", + "shasum": "" + }, + "require": { + "thelia/installer": "~1.1" + }, + "type": "thelia-module", + "extra": { + "installer-name": "OrderCreation" + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0+" + ], + "time": "2015-09-29 15:23:31" + }, + { + "name": "thelia/paypal-module", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/thelia-modules/Paypal.git", + "reference": "113b1314c11e7e4a41d540698ea39766ec622340" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia-modules/Paypal/zipball/113b1314c11e7e4a41d540698ea39766ec622340", + "reference": "113b1314c11e7e4a41d540698ea39766ec622340", + "shasum": "" + }, + "require": { + "thelia/installer": "~1.0" + }, + "type": "thelia-module", + "extra": { + "installer-name": "Paypal" + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL V3" + ], + "authors": [ + { + "name": "Thelia", + "email": "info@thelia.net", + "homepage": "https://github.com/thelia-modules" + } + ], + "description": "Paypal module for Thelia ecommerce solution", + "time": "2016-01-14 15:33:37" + }, + { + "name": "thelia/take-customer-account-module", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/thelia-modules/TakeCustomerAccount.git", + "reference": "68c0aa16fea905c4d4fbb2d9dd9e9ed1700fdee8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia-modules/TakeCustomerAccount/zipball/68c0aa16fea905c4d4fbb2d9dd9e9ed1700fdee8", + "reference": "68c0aa16fea905c4d4fbb2d9dd9e9ed1700fdee8", + "shasum": "" + }, + "require": { + "thelia/installer": "~1.1" + }, + "type": "thelia-module", + "extra": { + "installer-name": "TakeCustomerAccount" + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0+" + ], + "time": "2016-02-22 21:26:29" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14 21:17:01" + }, + { + "name": "fzaninotto/faker", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "suggest": { + "ext-intl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2015-05-29 06:29:14" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "phpspec/prophecy", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2015-08-13 10:07:40" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-10-06 15:47:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2015-06-21 13:08:43" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2015-06-21 08:01:12" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-09-15 10:49:45" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.23", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6e351261f9cd33daf205a131a1ba61c6d33bd483", + "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": ">=1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2016-02-11 14:56:33" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-10-02 06:51:40" + }, + { + "name": "sebastian/comparator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-07-26 15:48:44" + }, + { + "name": "sebastian/diff", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-12-08 07:14:41" + }, + { + "name": "sebastian/environment", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6e7133793a8e5a5714a551a8324337374be209df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e7133793a8e5a5714a551a8324337374be209df", + "reference": "6e7133793a8e5a5714a551a8324337374be209df", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2015-12-02 08:37:27" + }, + { + "name": "sebastian/exporter", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-06-21 07:55:53" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12 03:26:01" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-11-11 19:50:13" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21 13:59:46" + }, + { + "name": "thelia/hooktest-module", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/thelia/HookTest-module.git", + "reference": "32891857fd1e8e9ca5b7a9dbb0960ef3dd525fcb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia/HookTest-module/zipball/32891857fd1e8e9ca5b7a9dbb0960ef3dd525fcb", + "reference": "32891857fd1e8e9ca5b7a9dbb0960ef3dd525fcb", + "shasum": "" + }, + "require": { + "thelia/installer": "~1.1" + }, + "type": "thelia-module", + "extra": { + "installer-name": "HookTest" + }, + "notification-url": "https://packagist.org/downloads/", + "time": "2014-12-24 09:52:09" + }, + { + "name": "thelia/hooktest-template", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/thelia/hooktest-template.git", + "reference": "bb0a26df8ecfe7e41e2e391adb22360201088dda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thelia/hooktest-template/zipball/bb0a26df8ecfe7e41e2e391adb22360201088dda", + "reference": "bb0a26df8ecfe7e41e2e391adb22360201088dda", + "shasum": "" + }, + "require": { + "thelia/installer": "~1.1" + }, + "type": "thelia-frontoffice-template", + "extra": { + "installer-name": "hooktest" + }, + "notification-url": "https://packagist.org/downloads/", + "time": "2014-12-24 09:51:48" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "propel/propel": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.4" + }, + "platform-dev": [] +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..342afb65 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +web: + build: ./docker/php + ports: + - "8080:80" + links: + - mariaDB + environment: + SYMFONY_ENV: dev + # see https://registry.hub.docker.com/u/jderusse/dns-gen/ + #- DOMAIN_NAME=thelia.docker + command: /usr/sbin/apache2ctl -D FOREGROUND + volumes: + - .:/var/www/html + +phpmyadmin: + image: corbinu/docker-phpmyadmin + ports: + - "8081:80" + environment: + MYSQL_ROOT_UNSERNAME: root + MYSQL_ROOT_PASSWORD: toor + MYSQL_PORT_3306_TCP_ADDR: maria + MYSQL_PORT_3306_TCP_PORT: 3306 + links: + - mariaDB:maria + +mariaDB: + image: mariadb + environment: + MYSQL_DATABASE: thelia + MYSQL_ROOT_PASSWORD: toor diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile new file mode 100644 index 00000000..ffc02c27 --- /dev/null +++ b/docker/php/Dockerfile @@ -0,0 +1,21 @@ +FROM php:5.6-apache +COPY docker-php-pecl-install /usr/local/bin/ + +RUN apt-get update && apt-get install -y \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libmcrypt-dev \ + libpng12-dev \ + libicu-dev \ + git \ + zip \ + libzip-dev \ + && docker-php-ext-install intl pdo_mysql mcrypt mbstring zip \ + && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ + && docker-php-ext-install gd \ + && docker-php-pecl-install xdebug-2.3.3 + +RUN a2enmod rewrite +RUN usermod -u 1000 www-data +COPY config/php.ini /usr/local/etc/php/ +COPY config/vhost/vhost.conf /etc/apache2/sites-enabled/ \ No newline at end of file diff --git a/docker/php/config/php.ini b/docker/php/config/php.ini new file mode 100644 index 00000000..080f441f --- /dev/null +++ b/docker/php/config/php.ini @@ -0,0 +1,14 @@ +post_max_size=20M +html_errors=On +display_errors=On +date.timezone=Europe/Paris +memory_limit=-1 + +[xdebug] +xdebug.cli_color=1 +xdebug.var_display_max_children=-1 +xdebug.var_display_max_depth=-1 +xdebug.var_display_max_data=-1 +xdebug.remote_enable=1 +xdebug.remote_connect_back=1 +xdebug.remote_port=9000 \ No newline at end of file diff --git a/docker/php/config/vhost/vhost.conf b/docker/php/config/vhost/vhost.conf new file mode 100644 index 00000000..62dd689c --- /dev/null +++ b/docker/php/config/vhost/vhost.conf @@ -0,0 +1,11 @@ + + DocumentRoot /var/www/html/web + + SetEnv SYMFONY_ENV "dev" + + + DirectoryIndex index.php + AllowOverride All + Require all granted + + \ No newline at end of file diff --git a/docker/php/docker-php-pecl-install b/docker/php/docker-php-pecl-install new file mode 100644 index 00000000..bcbad10b --- /dev/null +++ b/docker/php/docker-php-pecl-install @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +cd /usr/src/php/ext + +usage() { + echo "usage: $0 extension-version [extension-version] ...]" + echo " ie: $0 oauth-1.2.3 uploadprogress-1.0.3.1" +} + +while [ $# -gt 0 ]; do + ext="$1" + shift + if [ -d "$ext" ]; then + echo >&2 "error: $(pwd -P)/$ext exists already" + echo >&2 + usage >&2 + exit 1 + fi + exts+=( "$ext" ) +done + +if [ "${#exts[@]}" -eq 0 ]; then + usage >&2 + exit 1 +fi + +for ext in "${exts[@]}"; do + ( + mkdir -p $ext + curl -sSL "http://pecl.php.net/get/$ext" | tar xvz -C "$ext" --strip-components=1 + docker-php-ext-install $ext + ) +done diff --git a/error.txt b/error.txt new file mode 100644 index 00000000..e69de29b diff --git a/index.html b/index.html new file mode 100644 index 00000000..9f1ec11f --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + + + Redirecting... + + + +Redirecting... + + \ No newline at end of file diff --git a/local/.gitkeep b/local/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/local/I18n/.gitkeep b/local/I18n/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/local/I18n/fr_FR.php b/local/I18n/fr_FR.php new file mode 100644 index 00000000..b6251283 --- /dev/null +++ b/local/I18n/fr_FR.php @@ -0,0 +1,4 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+
diff --git a/local/media/.gitkeep b/local/media/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/local/media/documents/content/touchpadclimslidesupervisionhotellerie-5.png b/local/media/documents/content/touchpadclimslidesupervisionhotellerie-5.png new file mode 100644 index 00000000..dbcf8bd3 Binary files /dev/null and b/local/media/documents/content/touchpadclimslidesupervisionhotellerie-5.png differ diff --git a/local/media/documents/content/touchpadeclairageslidesupervisionhotellerie-6.png b/local/media/documents/content/touchpadeclairageslidesupervisionhotellerie-6.png new file mode 100644 index 00000000..b8f81193 Binary files /dev/null and b/local/media/documents/content/touchpadeclairageslidesupervisionhotellerie-6.png differ diff --git a/local/media/documents/content/touchpadfond-7.jpg b/local/media/documents/content/touchpadfond-7.jpg new file mode 100644 index 00000000..8e8cc589 Binary files /dev/null and b/local/media/documents/content/touchpadfond-7.jpg differ diff --git a/local/media/documents/content/touchpadsaunaslidesupervisionhotellerie-8.png b/local/media/documents/content/touchpadsaunaslidesupervisionhotellerie-8.png new file mode 100644 index 00000000..0f442016 Binary files /dev/null and b/local/media/documents/content/touchpadsaunaslidesupervisionhotellerie-8.png differ diff --git a/local/media/documents/content/touchpadslidessupervisionhotellerie-9.png b/local/media/documents/content/touchpadslidessupervisionhotellerie-9.png new file mode 100644 index 00000000..58e3c034 Binary files /dev/null and b/local/media/documents/content/touchpadslidessupervisionhotellerie-9.png differ diff --git a/local/media/documents/product/2304.16reghm-27.pdf b/local/media/documents/product/2304.16reghm-27.pdf new file mode 100644 index 00000000..d8ee7688 Binary files /dev/null and b/local/media/documents/product/2304.16reghm-27.pdf differ diff --git a/local/media/documents/product/compatibilit_klic_dd3_di_daikin-24.pdf b/local/media/documents/product/compatibilit_klic_dd3_di_daikin-24.pdf new file mode 100644 index 00000000..20829fcb Binary files /dev/null and b/local/media/documents/product/compatibilit_klic_dd3_di_daikin-24.pdf differ diff --git a/local/media/documents/product/compatibilit_klic_di_daikin_fr-35.pdf b/local/media/documents/product/compatibilit_klic_di_daikin_fr-35.pdf new file mode 100644 index 00000000..4db7f2b6 Binary files /dev/null and b/local/media/documents/product/compatibilit_klic_di_daikin_fr-35.pdf differ diff --git a/local/media/documents/product/descriptionetinstructiondemontage_ld-fluoled-40w-1.2m-69.pdf b/local/media/documents/product/descriptionetinstructiondemontage_ld-fluoled-40w-1.2m-69.pdf new file mode 100644 index 00000000..40632d3e Binary files /dev/null and b/local/media/documents/product/descriptionetinstructiondemontage_ld-fluoled-40w-1.2m-69.pdf differ diff --git a/local/media/documents/product/descriptionetinstructiondemontage_ld-fluoled-50w-1.5m-68.pdf b/local/media/documents/product/descriptionetinstructiondemontage_ld-fluoled-50w-1.5m-68.pdf new file mode 100644 index 00000000..76fdae84 Binary files /dev/null and b/local/media/documents/product/descriptionetinstructiondemontage_ld-fluoled-50w-1.5m-68.pdf differ diff --git a/local/media/documents/product/descriptionetinstructiondemontage_ld-gamelleled-100w-110-72.pdf b/local/media/documents/product/descriptionetinstructiondemontage_ld-gamelleled-100w-110-72.pdf new file mode 100644 index 00000000..066e15d4 Binary files /dev/null and b/local/media/documents/product/descriptionetinstructiondemontage_ld-gamelleled-100w-110-72.pdf differ diff --git a/local/media/documents/product/descriptionetinstructiondemontage_ld-projecteurled-100w-71.pdf b/local/media/documents/product/descriptionetinstructiondemontage_ld-projecteurled-100w-71.pdf new file mode 100644 index 00000000..03fee1ea Binary files /dev/null and b/local/media/documents/product/descriptionetinstructiondemontage_ld-projecteurled-100w-71.pdf differ diff --git a/local/media/documents/product/descriptionetinstructiondemontage_ld-projecteurled-50w-80.pdf b/local/media/documents/product/descriptionetinstructiondemontage_ld-projecteurled-50w-80.pdf new file mode 100644 index 00000000..05a57ab3 Binary files /dev/null and b/local/media/documents/product/descriptionetinstructiondemontage_ld-projecteurled-50w-80.pdf differ diff --git a/local/media/documents/product/document_technique_diminboxdx4_fr_ed1-41.pdf b/local/media/documents/product/document_technique_diminboxdx4_fr_ed1-41.pdf new file mode 100644 index 00000000..686f59fd Binary files /dev/null and b/local/media/documents/product/document_technique_diminboxdx4_fr_ed1-41.pdf differ diff --git a/local/media/documents/product/document_technique_klic-pa_fr_ed1-39.pdf b/local/media/documents/product/document_technique_klic-pa_fr_ed1-39.pdf new file mode 100644 index 00000000..db4ed461 Binary files /dev/null and b/local/media/documents/product/document_technique_klic-pa_fr_ed1-39.pdf differ diff --git a/local/media/documents/product/document_technique_lumento_dx4_fr_ed2-40.pdf b/local/media/documents/product/document_technique_lumento_dx4_fr_ed2-40.pdf new file mode 100644 index 00000000..1f27a988 Binary files /dev/null and b/local/media/documents/product/document_technique_lumento_dx4_fr_ed2-40.pdf differ diff --git a/local/media/documents/product/en_2304.16regchm_2308.16regchm_td-31.pdf b/local/media/documents/product/en_2304.16regchm_2308.16regchm_td-31.pdf new file mode 100644 index 00000000..035a8f31 Binary files /dev/null and b/local/media/documents/product/en_2304.16regchm_2308.16regchm_td-31.pdf differ diff --git a/local/media/documents/product/en_2304.16regchm_2308.16regchm_td-32.pdf b/local/media/documents/product/en_2304.16regchm_2308.16regchm_td-32.pdf new file mode 100644 index 00000000..035a8f31 Binary files /dev/null and b/local/media/documents/product/en_2304.16regchm_2308.16regchm_td-32.pdf differ diff --git a/local/media/documents/product/en_2304.16reghm_2308.16reghm_td-33.pdf b/local/media/documents/product/en_2304.16reghm_2308.16reghm_td-33.pdf new file mode 100644 index 00000000..6a5636ce Binary files /dev/null and b/local/media/documents/product/en_2304.16reghm_2308.16reghm_td-33.pdf differ diff --git a/local/media/documents/product/en_2304.16reghm_2308.16reghm_td-34.pdf b/local/media/documents/product/en_2304.16reghm_2308.16reghm_td-34.pdf new file mode 100644 index 00000000..6a5636ce Binary files /dev/null and b/local/media/documents/product/en_2304.16reghm_2308.16reghm_td-34.pdf differ diff --git a/local/media/documents/product/en_23xx.16reghe_td-28.pdf b/local/media/documents/product/en_23xx.16reghe_td-28.pdf new file mode 100644 index 00000000..3b1590a8 Binary files /dev/null and b/local/media/documents/product/en_23xx.16reghe_td-28.pdf differ diff --git a/local/media/documents/product/en_23xx.16reghe_td-29.pdf b/local/media/documents/product/en_23xx.16reghe_td-29.pdf new file mode 100644 index 00000000..3b1590a8 Binary files /dev/null and b/local/media/documents/product/en_23xx.16reghe_td-29.pdf differ diff --git a/local/media/documents/product/en_23xx.16reghe_td-30.pdf b/local/media/documents/product/en_23xx.16reghe_td-30.pdf new file mode 100644 index 00000000..3b1590a8 Binary files /dev/null and b/local/media/documents/product/en_23xx.16reghe_td-30.pdf differ diff --git a/local/media/documents/product/fiche_technique_knx_ip_router_ed2_fr2-15.pdf b/local/media/documents/product/fiche_technique_knx_ip_router_ed2_fr2-15.pdf new file mode 100644 index 00000000..20b835f3 Binary files /dev/null and b/local/media/documents/product/fiche_technique_knx_ip_router_ed2_fr2-15.pdf differ diff --git a/local/media/documents/product/fr_1224ledude_82592323_15092016-21.pdf b/local/media/documents/product/fr_1224ledude_82592323_15092016-21.pdf new file mode 100644 index 00000000..c2163d86 Binary files /dev/null and b/local/media/documents/product/fr_1224ledude_82592323_15092016-21.pdf differ diff --git a/local/media/documents/product/fr_1224ledude_ad-22.pdf b/local/media/documents/product/fr_1224ledude_ad-22.pdf new file mode 100644 index 00000000..a5df1101 Binary files /dev/null and b/local/media/documents/product/fr_1224ledude_ad-22.pdf differ diff --git a/local/media/documents/product/hoja_tecnica_diminbox_fr_ed4-20.pdf b/local/media/documents/product/hoja_tecnica_diminbox_fr_ed4-20.pdf new file mode 100644 index 00000000..70ea6fa9 Binary files /dev/null and b/local/media/documents/product/hoja_tecnica_diminbox_fr_ed4-20.pdf differ diff --git a/local/media/documents/product/hoja_tecnica_knx_ip_interface_ed2_fr1-17.pdf b/local/media/documents/product/hoja_tecnica_knx_ip_interface_ed2_fr1-17.pdf new file mode 100644 index 00000000..6457db7e Binary files /dev/null and b/local/media/documents/product/hoja_tecnica_knx_ip_interface_ed2_fr1-17.pdf differ diff --git a/local/media/documents/product/informationsupplmentaire_ld-fluoled-40w-1.2m-75.pdf b/local/media/documents/product/informationsupplmentaire_ld-fluoled-40w-1.2m-75.pdf new file mode 100644 index 00000000..2ae7a13f Binary files /dev/null and b/local/media/documents/product/informationsupplmentaire_ld-fluoled-40w-1.2m-75.pdf differ diff --git a/local/media/documents/product/informationsupplmentaire_ld-fluoled-50w-1.5m-77.pdf b/local/media/documents/product/informationsupplmentaire_ld-fluoled-50w-1.5m-77.pdf new file mode 100644 index 00000000..766de7c0 Binary files /dev/null and b/local/media/documents/product/informationsupplmentaire_ld-fluoled-50w-1.5m-77.pdf differ diff --git a/local/media/documents/product/informationsupplmentaire_ld-gamelleled-100w-110-81.pdf b/local/media/documents/product/informationsupplmentaire_ld-gamelleled-100w-110-81.pdf new file mode 100644 index 00000000..2d1174f8 Binary files /dev/null and b/local/media/documents/product/informationsupplmentaire_ld-gamelleled-100w-110-81.pdf differ diff --git a/local/media/documents/product/informationsupplmentaire_ld-projecteurled-100w-83.pdf b/local/media/documents/product/informationsupplmentaire_ld-projecteurled-100w-83.pdf new file mode 100644 index 00000000..b1b3c7ea Binary files /dev/null and b/local/media/documents/product/informationsupplmentaire_ld-projecteurled-100w-83.pdf differ diff --git a/local/media/documents/product/informationsupplmentaire_ld-projecteurled-50w-82.pdf b/local/media/documents/product/informationsupplmentaire_ld-projecteurled-50w-82.pdf new file mode 100644 index 00000000..d459840f Binary files /dev/null and b/local/media/documents/product/informationsupplmentaire_ld-projecteurled-50w-82.pdf differ diff --git a/local/media/documents/product/klic-fj_tableau_compatibilits_fr_ed1-37.pdf b/local/media/documents/product/klic-fj_tableau_compatibilits_fr_ed1-37.pdf new file mode 100644 index 00000000..504136c1 Binary files /dev/null and b/local/media/documents/product/klic-fj_tableau_compatibilits_fr_ed1-37.pdf differ diff --git a/local/media/documents/product/klic-lg1_table_compatibilites_fr_ed1-36.pdf b/local/media/documents/product/klic-lg1_table_compatibilites_fr_ed1-36.pdf new file mode 100644 index 00000000..b1abaff0 Binary files /dev/null and b/local/media/documents/product/klic-lg1_table_compatibilites_fr_ed1-36.pdf differ diff --git a/local/media/documents/product/klic-ts_table_compatibilits_fr_ed1-38.pdf b/local/media/documents/product/klic-ts_table_compatibilits_fr_ed1-38.pdf new file mode 100644 index 00000000..da6fd185 Binary files /dev/null and b/local/media/documents/product/klic-ts_table_compatibilits_fr_ed1-38.pdf differ diff --git a/local/media/documents/product/manual_knx-ip_interface_fr_v1.1_a-18.pdf b/local/media/documents/product/manual_knx-ip_interface_fr_v1.1_a-18.pdf new file mode 100644 index 00000000..4ff7db9d Binary files /dev/null and b/local/media/documents/product/manual_knx-ip_interface_fr_v1.1_a-18.pdf differ diff --git a/local/media/documents/product/manual_knx-ip_router_fr_v1.0_a1-16.pdf b/local/media/documents/product/manual_knx-ip_router_fr_v1.0_a1-16.pdf new file mode 100644 index 00000000..e4cb0f6b Binary files /dev/null and b/local/media/documents/product/manual_knx-ip_router_fr_v1.0_a1-16.pdf differ diff --git a/local/media/documents/product/mx_ml_mx2wire_fr_091126-ilovepdf-compressed-19.pdf b/local/media/documents/product/mx_ml_mx2wire_fr_091126-ilovepdf-compressed-19.pdf new file mode 100644 index 00000000..dc65e125 Binary files /dev/null and b/local/media/documents/product/mx_ml_mx2wire_fr_091126-ilovepdf-compressed-19.pdf differ diff --git a/local/media/images/brand/BRAND-1.png b/local/media/images/brand/BRAND-1.png new file mode 100644 index 00000000..dfde5d54 Binary files /dev/null and b/local/media/images/brand/BRAND-1.png differ diff --git a/local/media/images/brand/BRAND-2.png b/local/media/images/brand/BRAND-2.png new file mode 100644 index 00000000..cbedcf2f Binary files /dev/null and b/local/media/images/brand/BRAND-2.png differ diff --git a/local/media/images/brand/BRAND-3.png b/local/media/images/brand/BRAND-3.png new file mode 100644 index 00000000..fd413208 Binary files /dev/null and b/local/media/images/brand/BRAND-3.png differ diff --git a/local/media/images/brand/BRAND-4.png b/local/media/images/brand/BRAND-4.png new file mode 100644 index 00000000..931b72a2 Binary files /dev/null and b/local/media/images/brand/BRAND-4.png differ diff --git a/local/media/images/brand/BRAND-5.png b/local/media/images/brand/BRAND-5.png new file mode 100644 index 00000000..6f6023a9 Binary files /dev/null and b/local/media/images/brand/BRAND-5.png differ diff --git a/local/media/images/brand/BRAND-6.png b/local/media/images/brand/BRAND-6.png new file mode 100644 index 00000000..6a4ac4f4 Binary files /dev/null and b/local/media/images/brand/BRAND-6.png differ diff --git a/local/media/images/brand/BRAND-7.png b/local/media/images/brand/BRAND-7.png new file mode 100644 index 00000000..ba4c5b4f Binary files /dev/null and b/local/media/images/brand/BRAND-7.png differ diff --git a/local/media/images/carousel/photo9-1.bmp b/local/media/images/carousel/photo9-1.bmp new file mode 100644 index 00000000..7ff4aeb1 Binary files /dev/null and b/local/media/images/carousel/photo9-1.bmp differ diff --git a/local/media/images/category/2019-03-22_08-31-31_539-80.jpg b/local/media/images/category/2019-03-22_08-31-31_539-80.jpg new file mode 100644 index 00000000..d32a5618 Binary files /dev/null and b/local/media/images/category/2019-03-22_08-31-31_539-80.jpg differ diff --git a/local/media/images/category/6c49696f-2014-4be0-a0fe-8227e2c45ebd-74.jpeg b/local/media/images/category/6c49696f-2014-4be0-a0fe-8227e2c45ebd-74.jpeg new file mode 100644 index 00000000..2c698b91 Binary files /dev/null and b/local/media/images/category/6c49696f-2014-4be0-a0fe-8227e2c45ebd-74.jpeg differ diff --git a/local/media/images/category/75ec430b-fc35-40be-bdb7-e799d89c7838-73.jpeg b/local/media/images/category/75ec430b-fc35-40be-bdb7-e799d89c7838-73.jpeg new file mode 100644 index 00000000..ddccbe9c Binary files /dev/null and b/local/media/images/category/75ec430b-fc35-40be-bdb7-e799d89c7838-73.jpeg differ diff --git a/local/media/images/category/801531f9-9d36-4e9e-99be-9573b64bbd8b-71.jpeg b/local/media/images/category/801531f9-9d36-4e9e-99be-9573b64bbd8b-71.jpeg new file mode 100644 index 00000000..75a84be3 Binary files /dev/null and b/local/media/images/category/801531f9-9d36-4e9e-99be-9573b64bbd8b-71.jpeg differ diff --git a/local/media/images/category/assemblage_bouton-36.jpg b/local/media/images/category/assemblage_bouton-36.jpg new file mode 100644 index 00000000..b4b17eef Binary files /dev/null and b/local/media/images/category/assemblage_bouton-36.jpg differ diff --git a/local/media/images/category/boutonappelsecours-62.png b/local/media/images/category/boutonappelsecours-62.png new file mode 100644 index 00000000..d2025b68 Binary files /dev/null and b/local/media/images/category/boutonappelsecours-62.png differ diff --git a/local/media/images/category/eb0f8f03-775f-4bc3-a31a-f929bb31ac3f-72.jpeg b/local/media/images/category/eb0f8f03-775f-4bc3-a31a-f929bb31ac3f-72.jpeg new file mode 100644 index 00000000..fdcc659c Binary files /dev/null and b/local/media/images/category/eb0f8f03-775f-4bc3-a31a-f929bb31ac3f-72.jpeg differ diff --git a/local/media/images/category/enjoliveursimple-aluminium-al2990-20.png b/local/media/images/category/enjoliveursimple-aluminium-al2990-20.png new file mode 100644 index 00000000..b498d3ca Binary files /dev/null and b/local/media/images/category/enjoliveursimple-aluminium-al2990-20.png differ diff --git a/local/media/images/category/enjoliveursimple-aluminium-al2990-7.png b/local/media/images/category/enjoliveursimple-aluminium-al2990-7.png new file mode 100644 index 00000000..b498d3ca Binary files /dev/null and b/local/media/images/category/enjoliveursimple-aluminium-al2990-7.png differ diff --git a/local/media/images/category/enjoliveursimple-blanc-ls990ww-17.png b/local/media/images/category/enjoliveursimple-blanc-ls990ww-17.png new file mode 100644 index 00000000..cf926040 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-blanc-ls990ww-17.png differ diff --git a/local/media/images/category/enjoliveursimple-blanc-ls990ww-5.png b/local/media/images/category/enjoliveursimple-blanc-ls990ww-5.png new file mode 100644 index 00000000..cf926040 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-blanc-ls990ww-5.png differ diff --git a/local/media/images/category/enjoliveursimple-canonfusil-me2990d-11.png b/local/media/images/category/enjoliveursimple-canonfusil-me2990d-11.png new file mode 100644 index 00000000..a018ccf4 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-canonfusil-me2990d-11.png differ diff --git a/local/media/images/category/enjoliveursimple-canonfusil-me2990d-24.png b/local/media/images/category/enjoliveursimple-canonfusil-me2990d-24.png new file mode 100644 index 00000000..a018ccf4 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-canonfusil-me2990d-24.png differ diff --git a/local/media/images/category/enjoliveursimple-chrome-gcr2990-15.png b/local/media/images/category/enjoliveursimple-chrome-gcr2990-15.png new file mode 100644 index 00000000..bfb84955 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-chrome-gcr2990-15.png differ diff --git a/local/media/images/category/enjoliveursimple-grisclair-ls990lg-19.png b/local/media/images/category/enjoliveursimple-grisclair-ls990lg-19.png new file mode 100644 index 00000000..c2da4a65 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-grisclair-ls990lg-19.png differ diff --git a/local/media/images/category/enjoliveursimple-grisclair-ls990lg-6.png b/local/media/images/category/enjoliveursimple-grisclair-ls990lg-6.png new file mode 100644 index 00000000..c2da4a65 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-grisclair-ls990lg-6.png differ diff --git a/local/media/images/category/enjoliveursimple-ivoire-ls990-18.png b/local/media/images/category/enjoliveursimple-ivoire-ls990-18.png new file mode 100644 index 00000000..7979d666 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-ivoire-ls990-18.png differ diff --git a/local/media/images/category/enjoliveursimple-ivoire-ls990-4.png b/local/media/images/category/enjoliveursimple-ivoire-ls990-4.png new file mode 100644 index 00000000..7979d666 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-ivoire-ls990-4.png differ diff --git a/local/media/images/category/enjoliveursimple-laitonancien-me2990at-12.png b/local/media/images/category/enjoliveursimple-laitonancien-me2990at-12.png new file mode 100644 index 00000000..e560d21d Binary files /dev/null and b/local/media/images/category/enjoliveursimple-laitonancien-me2990at-12.png differ diff --git a/local/media/images/category/enjoliveursimple-laitondore-me2990c-13.png b/local/media/images/category/enjoliveursimple-laitondore-me2990c-13.png new file mode 100644 index 00000000..82269067 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-laitondore-me2990c-13.png differ diff --git a/local/media/images/category/enjoliveursimple-metalinox-es2990-8.png b/local/media/images/category/enjoliveursimple-metalinox-es2990-8.png new file mode 100644 index 00000000..c3414627 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-metalinox-es2990-8.png differ diff --git a/local/media/images/category/enjoliveursimple-noir-ls990sw-9.png b/local/media/images/category/enjoliveursimple-noir-ls990sw-9.png new file mode 100644 index 00000000..b197fb8e Binary files /dev/null and b/local/media/images/category/enjoliveursimple-noir-ls990sw-9.png differ diff --git a/local/media/images/category/enjoliveursimple-ortraite-go2990-14.png b/local/media/images/category/enjoliveursimple-ortraite-go2990-14.png new file mode 100644 index 00000000..c5e2b927 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-ortraite-go2990-14.png differ diff --git a/local/media/images/category/enjoliveursimple-titane-al2990an-10.png b/local/media/images/category/enjoliveursimple-titane-al2990an-10.png new file mode 100644 index 00000000..b2ee30e7 Binary files /dev/null and b/local/media/images/category/enjoliveursimple-titane-al2990an-10.png differ diff --git a/local/media/images/category/img_2144.jpg-75.jpg b/local/media/images/category/img_2144.jpg-75.jpg new file mode 100644 index 00000000..598dd168 Binary files /dev/null and b/local/media/images/category/img_2144.jpg-75.jpg differ diff --git a/local/media/images/category/img_2223-81.jpg b/local/media/images/category/img_2223-81.jpg new file mode 100644 index 00000000..9430d787 Binary files /dev/null and b/local/media/images/category/img_2223-81.jpg differ diff --git a/local/media/images/category/jung_al2990an-34.png b/local/media/images/category/jung_al2990an-34.png new file mode 100644 index 00000000..e291e866 Binary files /dev/null and b/local/media/images/category/jung_al2990an-34.png differ diff --git a/local/media/images/category/jung_es2990-32.png b/local/media/images/category/jung_es2990-32.png new file mode 100644 index 00000000..8315a6f1 Binary files /dev/null and b/local/media/images/category/jung_es2990-32.png differ diff --git a/local/media/images/category/jung_gcr2990-31.png b/local/media/images/category/jung_gcr2990-31.png new file mode 100644 index 00000000..0d30f569 Binary files /dev/null and b/local/media/images/category/jung_gcr2990-31.png differ diff --git a/local/media/images/category/jung_go2990-29.png b/local/media/images/category/jung_go2990-29.png new file mode 100644 index 00000000..00c3a72c Binary files /dev/null and b/local/media/images/category/jung_go2990-29.png differ diff --git a/local/media/images/category/jung_ls990sw-33.png b/local/media/images/category/jung_ls990sw-33.png new file mode 100644 index 00000000..5e02abf3 Binary files /dev/null and b/local/media/images/category/jung_ls990sw-33.png differ diff --git a/local/media/images/category/jung_me2990at-35.png b/local/media/images/category/jung_me2990at-35.png new file mode 100644 index 00000000..6ef78176 Binary files /dev/null and b/local/media/images/category/jung_me2990at-35.png differ diff --git a/local/media/images/category/jung_me2990c-30.png b/local/media/images/category/jung_me2990c-30.png new file mode 100644 index 00000000..531902de Binary files /dev/null and b/local/media/images/category/jung_me2990c-30.png differ diff --git a/local/media/images/category/mx-i25m-sec-38.jpg b/local/media/images/category/mx-i25m-sec-38.jpg new file mode 100644 index 00000000..bf0a13ef Binary files /dev/null and b/local/media/images/category/mx-i25m-sec-38.jpg differ diff --git a/local/media/images/category/petitfour-16.jpg b/local/media/images/category/petitfour-16.jpg new file mode 100644 index 00000000..41761fd0 Binary files /dev/null and b/local/media/images/category/petitfour-16.jpg differ diff --git a/local/media/images/category/plancoupebateau.jpg-58.jpg b/local/media/images/category/plancoupebateau.jpg-58.jpg new file mode 100644 index 00000000..e52daa7f Binary files /dev/null and b/local/media/images/category/plancoupebateau.jpg-58.jpg differ diff --git a/local/media/images/category/plaqueled.png-60.png b/local/media/images/category/plaqueled.png-60.png new file mode 100644 index 00000000..e29140ce Binary files /dev/null and b/local/media/images/category/plaqueled.png-60.png differ diff --git a/local/media/images/module/Paypal-2-logo.png b/local/media/images/module/Paypal-2-logo.png new file mode 100644 index 00000000..1fe1879f Binary files /dev/null and b/local/media/images/module/Paypal-2-logo.png differ diff --git a/local/media/images/module/Paypal-3-logo.png b/local/media/images/module/Paypal-3-logo.png new file mode 100644 index 00000000..1fe1879f Binary files /dev/null and b/local/media/images/module/Paypal-3-logo.png differ diff --git a/local/media/images/module/ico_ilot_connect-18.png b/local/media/images/module/ico_ilot_connect-18.png new file mode 100644 index 00000000..ee358c82 Binary files /dev/null and b/local/media/images/module/ico_ilot_connect-18.png differ diff --git a/local/media/images/module/logocb2-17.png b/local/media/images/module/logocb2-17.png new file mode 100644 index 00000000..6dc8eba2 Binary files /dev/null and b/local/media/images/module/logocb2-17.png differ diff --git a/local/media/images/module/logopaiement_paypal-16.gif b/local/media/images/module/logopaiement_paypal-16.gif new file mode 100644 index 00000000..1956da7a Binary files /dev/null and b/local/media/images/module/logopaiement_paypal-16.gif differ diff --git a/local/media/images/product/0929aba9-2eb6-45f0-a404-ce21d3de790b-2673.jpeg b/local/media/images/product/0929aba9-2eb6-45f0-a404-ce21d3de790b-2673.jpeg new file mode 100644 index 00000000..094a1d75 Binary files /dev/null and b/local/media/images/product/0929aba9-2eb6-45f0-a404-ce21d3de790b-2673.jpeg differ diff --git a/local/media/images/product/093700-1833.jpg b/local/media/images/product/093700-1833.jpg new file mode 100644 index 00000000..3f10629d Binary files /dev/null and b/local/media/images/product/093700-1833.jpg differ diff --git a/local/media/images/product/0bdfa563-73ae-47ee-8efa-ad73353867c2-2659.jpeg b/local/media/images/product/0bdfa563-73ae-47ee-8efa-ad73353867c2-2659.jpeg new file mode 100644 index 00000000..e70cb4af Binary files /dev/null and b/local/media/images/product/0bdfa563-73ae-47ee-8efa-ad73353867c2-2659.jpeg differ diff --git a/local/media/images/product/1-8x0a9814-3070.jpg b/local/media/images/product/1-8x0a9814-3070.jpg new file mode 100644 index 00000000..7b4f4874 Binary files /dev/null and b/local/media/images/product/1-8x0a9814-3070.jpg differ diff --git a/local/media/images/product/1-8x0a9814-3071.jpg b/local/media/images/product/1-8x0a9814-3071.jpg new file mode 100644 index 00000000..7b4f4874 Binary files /dev/null and b/local/media/images/product/1-8x0a9814-3071.jpg differ diff --git a/local/media/images/product/10-JUNG_4092TSM-1.jpg b/local/media/images/product/10-JUNG_4092TSM-1.jpg new file mode 100644 index 00000000..5af0379f Binary files /dev/null and b/local/media/images/product/10-JUNG_4092TSM-1.jpg differ diff --git a/local/media/images/product/100-SCHNEIDER_UNICA_2_poussoirs_blanc-1.jpg b/local/media/images/product/100-SCHNEIDER_UNICA_2_poussoirs_blanc-1.jpg new file mode 100644 index 00000000..83ef4b41 Binary files /dev/null and b/local/media/images/product/100-SCHNEIDER_UNICA_2_poussoirs_blanc-1.jpg differ diff --git a/local/media/images/product/101-SCHNEIDER_UNICA_2_poussoirs_aluminium-1.jpg b/local/media/images/product/101-SCHNEIDER_UNICA_2_poussoirs_aluminium-1.jpg new file mode 100644 index 00000000..8ee2c197 Binary files /dev/null and b/local/media/images/product/101-SCHNEIDER_UNICA_2_poussoirs_aluminium-1.jpg differ diff --git a/local/media/images/product/102-SCHNEIDER_UNICA_4_poussoirs_graphite-1.jpg b/local/media/images/product/102-SCHNEIDER_UNICA_4_poussoirs_graphite-1.jpg new file mode 100644 index 00000000..7c733786 Binary files /dev/null and b/local/media/images/product/102-SCHNEIDER_UNICA_4_poussoirs_graphite-1.jpg differ diff --git a/local/media/images/product/103-SCHNEIDER_UNICA_4_poussoirs_blanc-1.jpg b/local/media/images/product/103-SCHNEIDER_UNICA_4_poussoirs_blanc-1.jpg new file mode 100644 index 00000000..ff5e0fa1 Binary files /dev/null and b/local/media/images/product/103-SCHNEIDER_UNICA_4_poussoirs_blanc-1.jpg differ diff --git a/local/media/images/product/104-SCHNEIDER_UNICA_4_poussoirs_aluminium-1.jpg b/local/media/images/product/104-SCHNEIDER_UNICA_4_poussoirs_aluminium-1.jpg new file mode 100644 index 00000000..92ea83f4 Binary files /dev/null and b/local/media/images/product/104-SCHNEIDER_UNICA_4_poussoirs_aluminium-1.jpg differ diff --git a/local/media/images/product/105-SCHNEIDER_UNICA_thermostat_graphite-1.jpg b/local/media/images/product/105-SCHNEIDER_UNICA_thermostat_graphite-1.jpg new file mode 100644 index 00000000..d3aff348 Binary files /dev/null and b/local/media/images/product/105-SCHNEIDER_UNICA_thermostat_graphite-1.jpg differ diff --git a/local/media/images/product/106-SCHNEIDER_UNICA_thermostat_blanca-1.jpg b/local/media/images/product/106-SCHNEIDER_UNICA_thermostat_blanca-1.jpg new file mode 100644 index 00000000..c614cad3 Binary files /dev/null and b/local/media/images/product/106-SCHNEIDER_UNICA_thermostat_blanca-1.jpg differ diff --git a/local/media/images/product/107-SCHNEIDER_UNICA_thermostat_aluminium-1.jpg b/local/media/images/product/107-SCHNEIDER_UNICA_thermostat_aluminium-1.jpg new file mode 100644 index 00000000..78891bdb Binary files /dev/null and b/local/media/images/product/107-SCHNEIDER_UNICA_thermostat_aluminium-1.jpg differ diff --git a/local/media/images/product/108-SCHNEIDER_UNICA_detecteur_mouvement_graphite-1.jpg b/local/media/images/product/108-SCHNEIDER_UNICA_detecteur_mouvement_graphite-1.jpg new file mode 100644 index 00000000..ae2384fd Binary files /dev/null and b/local/media/images/product/108-SCHNEIDER_UNICA_detecteur_mouvement_graphite-1.jpg differ diff --git a/local/media/images/product/109-SCHNEIDER_UNICA_detecteur_mouvement_blanc-1.jpg b/local/media/images/product/109-SCHNEIDER_UNICA_detecteur_mouvement_blanc-1.jpg new file mode 100644 index 00000000..45392d09 Binary files /dev/null and b/local/media/images/product/109-SCHNEIDER_UNICA_detecteur_mouvement_blanc-1.jpg differ diff --git a/local/media/images/product/110-SCHNEIDER_UNICA_detecteur_mouvement_aluminium-1.jpg b/local/media/images/product/110-SCHNEIDER_UNICA_detecteur_mouvement_aluminium-1.jpg new file mode 100644 index 00000000..c75d045c Binary files /dev/null and b/local/media/images/product/110-SCHNEIDER_UNICA_detecteur_mouvement_aluminium-1.jpg differ diff --git a/local/media/images/product/111-SCHNEIDER_Actionneur_stores_2x_10A-1.jpg b/local/media/images/product/111-SCHNEIDER_Actionneur_stores_2x_10A-1.jpg new file mode 100644 index 00000000..6f3f9722 Binary files /dev/null and b/local/media/images/product/111-SCHNEIDER_Actionneur_stores_2x_10A-1.jpg differ diff --git a/local/media/images/product/112-SCHNEIDER_Actionneur_stores_mutifonction_4x_10A-1.jpg b/local/media/images/product/112-SCHNEIDER_Actionneur_stores_mutifonction_4x_10A-1.jpg new file mode 100644 index 00000000..42e31e7f Binary files /dev/null and b/local/media/images/product/112-SCHNEIDER_Actionneur_stores_mutifonction_4x_10A-1.jpg differ diff --git a/local/media/images/product/113-SCHNEIDER_Actionneur_stores_8x_10A-1.jpg b/local/media/images/product/113-SCHNEIDER_Actionneur_stores_8x_10A-1.jpg new file mode 100644 index 00000000..bc21f29f Binary files /dev/null and b/local/media/images/product/113-SCHNEIDER_Actionneur_stores_8x_10A-1.jpg differ diff --git a/local/media/images/product/114-SCHNEIDER_Actionneur_stores_12x_24x_10A-1.jpg b/local/media/images/product/114-SCHNEIDER_Actionneur_stores_12x_24x_10A-1.jpg new file mode 100644 index 00000000..a12afa48 Binary files /dev/null and b/local/media/images/product/114-SCHNEIDER_Actionneur_stores_12x_24x_10A-1.jpg differ diff --git a/local/media/images/product/11413aae196a66dae416fdbe05d597a3-2019-03-22_08-31-31_539-77-2907.jpg b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-2019-03-22_08-31-31_539-77-2907.jpg new file mode 100644 index 00000000..bdfab319 Binary files /dev/null and b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-2019-03-22_08-31-31_539-77-2907.jpg differ diff --git a/local/media/images/product/11413aae196a66dae416fdbe05d597a3-antenesmartradio-837-2866.png b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-antenesmartradio-837-2866.png new file mode 100644 index 00000000..77d33d38 Binary files /dev/null and b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-antenesmartradio-837-2866.png differ diff --git a/local/media/images/product/11413aae196a66dae416fdbe05d597a3-img_2223-76-2906.jpg b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-img_2223-76-2906.jpg new file mode 100644 index 00000000..c592e2bd Binary files /dev/null and b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-img_2223-76-2906.jpg differ diff --git a/local/media/images/product/11413aae196a66dae416fdbe05d597a3-jung_535u-2442-2451.png b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-jung_535u-2442-2451.png new file mode 100644 index 00000000..6e3f5370 Binary files /dev/null and b/local/media/images/product/11413aae196a66dae416fdbe05d597a3-jung_535u-2442-2451.png differ diff --git a/local/media/images/product/115-SCHNEIDER_Detecteur_mouvement_exterieur_blanc-1.jpg b/local/media/images/product/115-SCHNEIDER_Detecteur_mouvement_exterieur_blanc-1.jpg new file mode 100644 index 00000000..fd57a405 Binary files /dev/null and b/local/media/images/product/115-SCHNEIDER_Detecteur_mouvement_exterieur_blanc-1.jpg differ diff --git a/local/media/images/product/116-SCHNEIDER_Detecteur_mouvement_exterieur_aluminium-1.jpg b/local/media/images/product/116-SCHNEIDER_Detecteur_mouvement_exterieur_aluminium-1.jpg new file mode 100644 index 00000000..11341477 Binary files /dev/null and b/local/media/images/product/116-SCHNEIDER_Detecteur_mouvement_exterieur_aluminium-1.jpg differ diff --git a/local/media/images/product/117-SCHNEIDER_equerre_de_montage-1.jpg b/local/media/images/product/117-SCHNEIDER_equerre_de_montage-1.jpg new file mode 100644 index 00000000..b205f20e Binary files /dev/null and b/local/media/images/product/117-SCHNEIDER_equerre_de_montage-1.jpg differ diff --git a/local/media/images/product/118-SCHNEIDER_Cadre_ALTIRA_1_poste_blanc-1.jpg b/local/media/images/product/118-SCHNEIDER_Cadre_ALTIRA_1_poste_blanc-1.jpg new file mode 100644 index 00000000..428f2f27 Binary files /dev/null and b/local/media/images/product/118-SCHNEIDER_Cadre_ALTIRA_1_poste_blanc-1.jpg differ diff --git a/local/media/images/product/119-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_blanc-1.jpg b/local/media/images/product/119-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_blanc-1.jpg new file mode 100644 index 00000000..046cbc3f Binary files /dev/null and b/local/media/images/product/119-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_blanc-1.jpg differ diff --git a/local/media/images/product/120-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mm_blanc-1.jpg b/local/media/images/product/120-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mm_blanc-1.jpg new file mode 100644 index 00000000..25844a7e Binary files /dev/null and b/local/media/images/product/120-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mm_blanc-1.jpg differ diff --git a/local/media/images/product/121-SCHNEIDER_Cadre_ALTIRA_2_postes_blanc-1.jpg b/local/media/images/product/121-SCHNEIDER_Cadre_ALTIRA_2_postes_blanc-1.jpg new file mode 100644 index 00000000..c1b1f1ef Binary files /dev/null and b/local/media/images/product/121-SCHNEIDER_Cadre_ALTIRA_2_postes_blanc-1.jpg differ diff --git a/local/media/images/product/122-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_blanc-1.jpg b/local/media/images/product/122-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_blanc-1.jpg new file mode 100644 index 00000000..c072290b Binary files /dev/null and b/local/media/images/product/122-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_blanc-1.jpg differ diff --git a/local/media/images/product/123-SCHNEIDER_Cadre_ALTIRA_3_postes_blanc-1.jpg b/local/media/images/product/123-SCHNEIDER_Cadre_ALTIRA_3_postes_blanc-1.jpg new file mode 100644 index 00000000..9f7def66 Binary files /dev/null and b/local/media/images/product/123-SCHNEIDER_Cadre_ALTIRA_3_postes_blanc-1.jpg differ diff --git a/local/media/images/product/124-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_blanc-1.jpg b/local/media/images/product/124-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_blanc-1.jpg new file mode 100644 index 00000000..7f6a6932 Binary files /dev/null and b/local/media/images/product/124-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_blanc-1.jpg differ diff --git a/local/media/images/product/125-SCHNEIDER_Cadre_ALTIRA_2x3_postes_blanc-1.jpg b/local/media/images/product/125-SCHNEIDER_Cadre_ALTIRA_2x3_postes_blanc-1.jpg new file mode 100644 index 00000000..b28d132d Binary files /dev/null and b/local/media/images/product/125-SCHNEIDER_Cadre_ALTIRA_2x3_postes_blanc-1.jpg differ diff --git a/local/media/images/product/126-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_blanc-1.jpg b/local/media/images/product/126-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_blanc-1.jpg new file mode 100644 index 00000000..415ba895 Binary files /dev/null and b/local/media/images/product/126-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_blanc-1.jpg differ diff --git a/local/media/images/product/127-SCHNEIDER_Cadre_ALTIRA_2_postes_verti57blanc9010-1.jpg b/local/media/images/product/127-SCHNEIDER_Cadre_ALTIRA_2_postes_verti57blanc9010-1.jpg new file mode 100644 index 00000000..a495b5f9 Binary files /dev/null and b/local/media/images/product/127-SCHNEIDER_Cadre_ALTIRA_2_postes_verti57blanc9010-1.jpg differ diff --git a/local/media/images/product/128-SCHNEIDER_Cadre_ALTIRA_2_postes_blanc_9010-1.jpg b/local/media/images/product/128-SCHNEIDER_Cadre_ALTIRA_2_postes_blanc_9010-1.jpg new file mode 100644 index 00000000..1cf08a6c Binary files /dev/null and b/local/media/images/product/128-SCHNEIDER_Cadre_ALTIRA_2_postes_blanc_9010-1.jpg differ diff --git a/local/media/images/product/129-SCHNEIDER_Cadre_ALTIRA_2_postes_verti71blanc9010-1.jpg b/local/media/images/product/129-SCHNEIDER_Cadre_ALTIRA_2_postes_verti71blanc9010-1.jpg new file mode 100644 index 00000000..41d7535d Binary files /dev/null and b/local/media/images/product/129-SCHNEIDER_Cadre_ALTIRA_2_postes_verti71blanc9010-1.jpg differ diff --git a/local/media/images/product/130-SCHNEIDER_Cadre_ALTIRA_3_postes_blanc9010-1.jpg b/local/media/images/product/130-SCHNEIDER_Cadre_ALTIRA_3_postes_blanc9010-1.jpg new file mode 100644 index 00000000..3bb87e84 Binary files /dev/null and b/local/media/images/product/130-SCHNEIDER_Cadre_ALTIRA_3_postes_blanc9010-1.jpg differ diff --git a/local/media/images/product/130c504c-64f4-47d9-8426-3d35f0a1ed59-2627.jpeg b/local/media/images/product/130c504c-64f4-47d9-8426-3d35f0a1ed59-2627.jpeg new file mode 100644 index 00000000..7c49f07e Binary files /dev/null and b/local/media/images/product/130c504c-64f4-47d9-8426-3d35f0a1ed59-2627.jpeg differ diff --git a/local/media/images/product/131-SCHNEIDER_Cadre_ALTIRA_2_postes_horiz._blanc_9010-1.jpg b/local/media/images/product/131-SCHNEIDER_Cadre_ALTIRA_2_postes_horiz._blanc_9010-1.jpg new file mode 100644 index 00000000..64e34a81 Binary files /dev/null and b/local/media/images/product/131-SCHNEIDER_Cadre_ALTIRA_2_postes_horiz._blanc_9010-1.jpg differ diff --git a/local/media/images/product/132-SCHNEIDER_Cadre_ALTIRA_1_poste_blanc_9010-1.jpg b/local/media/images/product/132-SCHNEIDER_Cadre_ALTIRA_1_poste_blanc_9010-1.jpg new file mode 100644 index 00000000..968db16f Binary files /dev/null and b/local/media/images/product/132-SCHNEIDER_Cadre_ALTIRA_1_poste_blanc_9010-1.jpg differ diff --git a/local/media/images/product/133-SCHNEIDER_Cadre_ALTIRA_3_postes_horiz._blanc9010-1.jpg b/local/media/images/product/133-SCHNEIDER_Cadre_ALTIRA_3_postes_horiz._blanc9010-1.jpg new file mode 100644 index 00000000..59b3a266 Binary files /dev/null and b/local/media/images/product/133-SCHNEIDER_Cadre_ALTIRA_3_postes_horiz._blanc9010-1.jpg differ diff --git a/local/media/images/product/134-SCHNEIDER_Cadre_ALTIRA_2x3_postes_blanc9010-1.jpg b/local/media/images/product/134-SCHNEIDER_Cadre_ALTIRA_2x3_postes_blanc9010-1.jpg new file mode 100644 index 00000000..dc0dc61c Binary files /dev/null and b/local/media/images/product/134-SCHNEIDER_Cadre_ALTIRA_2x3_postes_blanc9010-1.jpg differ diff --git a/local/media/images/product/135-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_blanc9010-1.jpg b/local/media/images/product/135-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_blanc9010-1.jpg new file mode 100644 index 00000000..ca5f0bdc Binary files /dev/null and b/local/media/images/product/135-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_blanc9010-1.jpg differ diff --git a/local/media/images/product/136-SCHNEIDER_Cadre_ALTIRA_1_poste_marbre-1.jpg b/local/media/images/product/136-SCHNEIDER_Cadre_ALTIRA_1_poste_marbre-1.jpg new file mode 100644 index 00000000..8a5b8d6d Binary files /dev/null and b/local/media/images/product/136-SCHNEIDER_Cadre_ALTIRA_1_poste_marbre-1.jpg differ diff --git a/local/media/images/product/137-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_marbre-1.jpg b/local/media/images/product/137-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_marbre-1.jpg new file mode 100644 index 00000000..4c899eea Binary files /dev/null and b/local/media/images/product/137-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_marbre-1.jpg differ diff --git a/local/media/images/product/138-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mmmarbre-1.jpg b/local/media/images/product/138-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mmmarbre-1.jpg new file mode 100644 index 00000000..7751daca Binary files /dev/null and b/local/media/images/product/138-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mmmarbre-1.jpg differ diff --git a/local/media/images/product/139-SCHNEIDER_Cadre_ALTIRA_2_postes_marbre-1.jpg b/local/media/images/product/139-SCHNEIDER_Cadre_ALTIRA_2_postes_marbre-1.jpg new file mode 100644 index 00000000..6c10c695 Binary files /dev/null and b/local/media/images/product/139-SCHNEIDER_Cadre_ALTIRA_2_postes_marbre-1.jpg differ diff --git a/local/media/images/product/140-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.71mm_marbre-1.jpg b/local/media/images/product/140-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.71mm_marbre-1.jpg new file mode 100644 index 00000000..ab5318ae Binary files /dev/null and b/local/media/images/product/140-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.71mm_marbre-1.jpg differ diff --git a/local/media/images/product/141-SCHNEIDER_Cadre_ALTIRA_3_postes_marbre-1.jpg b/local/media/images/product/141-SCHNEIDER_Cadre_ALTIRA_3_postes_marbre-1.jpg new file mode 100644 index 00000000..efc2d655 Binary files /dev/null and b/local/media/images/product/141-SCHNEIDER_Cadre_ALTIRA_3_postes_marbre-1.jpg differ diff --git a/local/media/images/product/142-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_marbre-1.jpg b/local/media/images/product/142-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_marbre-1.jpg new file mode 100644 index 00000000..2f5b7d49 Binary files /dev/null and b/local/media/images/product/142-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_marbre-1.jpg differ diff --git a/local/media/images/product/143-SCHNEIDER_Cadre_ALTIRA_2x3_postes_marbre-1.jpg b/local/media/images/product/143-SCHNEIDER_Cadre_ALTIRA_2x3_postes_marbre-1.jpg new file mode 100644 index 00000000..4ea2a41f Binary files /dev/null and b/local/media/images/product/143-SCHNEIDER_Cadre_ALTIRA_2x3_postes_marbre-1.jpg differ diff --git a/local/media/images/product/144-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_marbre-1.jpg b/local/media/images/product/144-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_marbre-1.jpg new file mode 100644 index 00000000..0f56d139 Binary files /dev/null and b/local/media/images/product/144-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_marbre-1.jpg differ diff --git a/local/media/images/product/145-SCHNEIDER_Cadre_ALTIRA_1_poste_granit-1.jpg b/local/media/images/product/145-SCHNEIDER_Cadre_ALTIRA_1_poste_granit-1.jpg new file mode 100644 index 00000000..7e025ece Binary files /dev/null and b/local/media/images/product/145-SCHNEIDER_Cadre_ALTIRA_1_poste_granit-1.jpg differ diff --git a/local/media/images/product/146-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_granit-1.jpg b/local/media/images/product/146-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_granit-1.jpg new file mode 100644 index 00000000..e979248e Binary files /dev/null and b/local/media/images/product/146-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_granit-1.jpg differ diff --git a/local/media/images/product/147-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mm_granit-1.jpg b/local/media/images/product/147-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mm_granit-1.jpg new file mode 100644 index 00000000..11d71198 Binary files /dev/null and b/local/media/images/product/147-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._57mm_granit-1.jpg differ diff --git a/local/media/images/product/148-SCHNEIDER_Cadre_ALTIRA_2_postes_granit-1.jpg b/local/media/images/product/148-SCHNEIDER_Cadre_ALTIRA_2_postes_granit-1.jpg new file mode 100644 index 00000000..b7e163a2 Binary files /dev/null and b/local/media/images/product/148-SCHNEIDER_Cadre_ALTIRA_2_postes_granit-1.jpg differ diff --git a/local/media/images/product/149-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_gr b/local/media/images/product/149-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_gr new file mode 100644 index 00000000..d390e1c2 Binary files /dev/null and b/local/media/images/product/149-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_gr differ diff --git a/local/media/images/product/149-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_granit-1.jpg b/local/media/images/product/149-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_granit-1.jpg new file mode 100644 index 00000000..d390e1c2 Binary files /dev/null and b/local/media/images/product/149-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mm_granit-1.jpg differ diff --git a/local/media/images/product/149908-9542156-2400.jpg b/local/media/images/product/149908-9542156-2400.jpg new file mode 100644 index 00000000..9630088e Binary files /dev/null and b/local/media/images/product/149908-9542156-2400.jpg differ diff --git a/local/media/images/product/149908-95421631-2401.jpg b/local/media/images/product/149908-95421631-2401.jpg new file mode 100644 index 00000000..9c6891e9 Binary files /dev/null and b/local/media/images/product/149908-95421631-2401.jpg differ diff --git a/local/media/images/product/15-12-2861.png b/local/media/images/product/15-12-2861.png new file mode 100644 index 00000000..b81ebd18 Binary files /dev/null and b/local/media/images/product/15-12-2861.png differ diff --git a/local/media/images/product/15-24-2858.png b/local/media/images/product/15-24-2858.png new file mode 100644 index 00000000..2e59da5a Binary files /dev/null and b/local/media/images/product/15-24-2858.png differ diff --git a/local/media/images/product/150-SCHNEIDER_Cadre_ALTIRA_3_postes_granit-1.jpg b/local/media/images/product/150-SCHNEIDER_Cadre_ALTIRA_3_postes_granit-1.jpg new file mode 100644 index 00000000..69766c3d Binary files /dev/null and b/local/media/images/product/150-SCHNEIDER_Cadre_ALTIRA_3_postes_granit-1.jpg differ diff --git a/local/media/images/product/151-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_granit-1.jpg b/local/media/images/product/151-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_granit-1.jpg new file mode 100644 index 00000000..aab42cb8 Binary files /dev/null and b/local/media/images/product/151-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_granit-1.jpg differ diff --git a/local/media/images/product/152-SCHNEIDER_Cadre_ALTIRA b/local/media/images/product/152-SCHNEIDER_Cadre_ALTIRA new file mode 100644 index 00000000..63421eeb Binary files /dev/null and b/local/media/images/product/152-SCHNEIDER_Cadre_ALTIRA differ diff --git a/local/media/images/product/152-SCHNEIDER_Cadre_ALTIRA_2x3_postes_granit-1.jpg b/local/media/images/product/152-SCHNEIDER_Cadre_ALTIRA_2x3_postes_granit-1.jpg new file mode 100644 index 00000000..990dd07c Binary files /dev/null and b/local/media/images/product/152-SCHNEIDER_Cadre_ALTIRA_2x3_postes_granit-1.jpg differ diff --git a/local/media/images/product/153-SCHNEIDER_Cadre_ALTIRA_3_postes b/local/media/images/product/153-SCHNEIDER_Cadre_ALTIRA_3_postes new file mode 100644 index 00000000..b3adaaa8 Binary files /dev/null and b/local/media/images/product/153-SCHNEIDER_Cadre_ALTIRA_3_postes differ diff --git a/local/media/images/product/153-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_granit-1.jpg b/local/media/images/product/153-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_granit-1.jpg new file mode 100644 index 00000000..6249d6c0 Binary files /dev/null and b/local/media/images/product/153-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_granit-1.jpg differ diff --git a/local/media/images/product/154-SCHNEIDER_Cadre_ALTIRA_1_poste_schiste-1.jpg b/local/media/images/product/154-SCHNEIDER_Cadre_ALTIRA_1_poste_schiste-1.jpg new file mode 100644 index 00000000..28bd64b3 Binary files /dev/null and b/local/media/images/product/154-SCHNEIDER_Cadre_ALTIRA_1_poste_schiste-1.jpg differ diff --git a/local/media/images/product/155-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_schiste-1.jpg b/local/media/images/product/155-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_schiste-1.jpg new file mode 100644 index 00000000..db1217e5 Binary files /dev/null and b/local/media/images/product/155-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_schiste-1.jpg differ diff --git a/local/media/images/product/156-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mm_schiste-1.j b/local/media/images/product/156-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mm_schiste-1.j new file mode 100644 index 00000000..c5e9348e Binary files /dev/null and b/local/media/images/product/156-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mm_schiste-1.j differ diff --git a/local/media/images/product/156-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mm_schiste-1.jpg b/local/media/images/product/156-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mm_schiste-1.jpg new file mode 100644 index 00000000..c5e9348e Binary files /dev/null and b/local/media/images/product/156-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mm_schiste-1.jpg differ diff --git a/local/media/images/product/157-SCHNEIDER_Cadre_ALTIRA_2_postes_schiste-1 b/local/media/images/product/157-SCHNEIDER_Cadre_ALTIRA_2_postes_schiste-1 new file mode 100644 index 00000000..0a2199c5 Binary files /dev/null and b/local/media/images/product/157-SCHNEIDER_Cadre_ALTIRA_2_postes_schiste-1 differ diff --git a/local/media/images/product/157-SCHNEIDER_Cadre_ALTIRA_2_postes_schiste-1.jpg b/local/media/images/product/157-SCHNEIDER_Cadre_ALTIRA_2_postes_schiste-1.jpg new file mode 100644 index 00000000..a7c615f4 Binary files /dev/null and b/local/media/images/product/157-SCHNEIDER_Cadre_ALTIRA_2_postes_schiste-1.jpg differ diff --git a/local/media/images/product/157532680-1567.jpg b/local/media/images/product/157532680-1567.jpg new file mode 100644 index 00000000..e6172200 Binary files /dev/null and b/local/media/images/product/157532680-1567.jpg differ diff --git a/local/media/images/product/158-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mmschiste-1.j b/local/media/images/product/158-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mmschiste-1.j new file mode 100644 index 00000000..b640c98a Binary files /dev/null and b/local/media/images/product/158-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mmschiste-1.j differ diff --git a/local/media/images/product/158-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mmschiste-1.jpg b/local/media/images/product/158-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mmschiste-1.jpg new file mode 100644 index 00000000..b640c98a Binary files /dev/null and b/local/media/images/product/158-SCHNEIDER_Cadre_ALTIRA_2_postes_verti._71mmschiste-1.jpg differ diff --git a/local/media/images/product/159-SCHNEIDER_Cadre_ALTIRA_3_postes_schiste-1 b/local/media/images/product/159-SCHNEIDER_Cadre_ALTIRA_3_postes_schiste-1 new file mode 100644 index 00000000..942ad6b1 Binary files /dev/null and b/local/media/images/product/159-SCHNEIDER_Cadre_ALTIRA_3_postes_schiste-1 differ diff --git a/local/media/images/product/159-SCHNEIDER_Cadre_ALTIRA_3_postes_schiste-1.jpg b/local/media/images/product/159-SCHNEIDER_Cadre_ALTIRA_3_postes_schiste-1.jpg new file mode 100644 index 00000000..a30a2f62 Binary files /dev/null and b/local/media/images/product/159-SCHNEIDER_Cadre_ALTIRA_3_postes_schiste-1.jpg differ diff --git a/local/media/images/product/160-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_schiste-1 b/local/media/images/product/160-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_schiste-1 new file mode 100644 index 00000000..eeb444e8 Binary files /dev/null and b/local/media/images/product/160-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_schiste-1 differ diff --git a/local/media/images/product/160-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_schiste-1.jpg b/local/media/images/product/160-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_schiste-1.jpg new file mode 100644 index 00000000..12a8b8c2 Binary files /dev/null and b/local/media/images/product/160-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_schiste-1.jpg differ diff --git a/local/media/images/product/161-SCHNEIDER_Cadre_ALTIRA_2x3_postes_schiste-1 b/local/media/images/product/161-SCHNEIDER_Cadre_ALTIRA_2x3_postes_schiste-1 new file mode 100644 index 00000000..ccc029c4 Binary files /dev/null and b/local/media/images/product/161-SCHNEIDER_Cadre_ALTIRA_2x3_postes_schiste-1 differ diff --git a/local/media/images/product/161-SCHNEIDER_Cadre_ALTIRA_2x3_postes_schiste-1.jpg b/local/media/images/product/161-SCHNEIDER_Cadre_ALTIRA_2x3_postes_schiste-1.jpg new file mode 100644 index 00000000..7de8119f Binary files /dev/null and b/local/media/images/product/161-SCHNEIDER_Cadre_ALTIRA_2x3_postes_schiste-1.jpg differ diff --git a/local/media/images/product/162-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_schiste-1 b/local/media/images/product/162-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_schiste-1 new file mode 100644 index 00000000..8973677d Binary files /dev/null and b/local/media/images/product/162-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_schiste-1 differ diff --git a/local/media/images/product/162-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_schiste-1.jpg b/local/media/images/product/162-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_schiste-1.jpg new file mode 100644 index 00000000..d2b73f17 Binary files /dev/null and b/local/media/images/product/162-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_schiste-1.jpg differ diff --git a/local/media/images/product/163-SCHNEIDER_Cadre_ALTIRA_1_poste_ardoise-1.jpg b/local/media/images/product/163-SCHNEIDER_Cadre_ALTIRA_1_poste_ardoise-1.jpg new file mode 100644 index 00000000..72b13b61 Binary files /dev/null and b/local/media/images/product/163-SCHNEIDER_Cadre_ALTIRA_1_poste_ardoise-1.jpg differ diff --git a/local/media/images/product/164-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_ardoise-1.jpg b/local/media/images/product/164-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_ardoise-1.jpg new file mode 100644 index 00000000..3cc77d8b Binary files /dev/null and b/local/media/images/product/164-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_ardoise-1.jpg differ diff --git a/local/media/images/product/165-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mmardoise-1.jpg b/local/media/images/product/165-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mmardoise-1.jpg new file mode 100644 index 00000000..a75dc4e0 Binary files /dev/null and b/local/media/images/product/165-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57mmardoise-1.jpg differ diff --git a/local/media/images/product/166-SCHNEIDER_Cadre_ALTIRA_2_postes_ardoise-1.jpg b/local/media/images/product/166-SCHNEIDER_Cadre_ALTIRA_2_postes_ardoise-1.jpg new file mode 100644 index 00000000..fdbed01f Binary files /dev/null and b/local/media/images/product/166-SCHNEIDER_Cadre_ALTIRA_2_postes_ardoise-1.jpg differ diff --git a/local/media/images/product/167-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.71mm_ardoise-1.jpg b/local/media/images/product/167-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.71mm_ardoise-1.jpg new file mode 100644 index 00000000..76c7eb22 Binary files /dev/null and b/local/media/images/product/167-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.71mm_ardoise-1.jpg differ diff --git a/local/media/images/product/168-SCHNEIDER_Cadre_ALTIRA_3_postes_ardoise-1.jpg b/local/media/images/product/168-SCHNEIDER_Cadre_ALTIRA_3_postes_ardoise-1.jpg new file mode 100644 index 00000000..f03ab0aa Binary files /dev/null and b/local/media/images/product/168-SCHNEIDER_Cadre_ALTIRA_3_postes_ardoise-1.jpg differ diff --git a/local/media/images/product/169-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_ardoise-1.jpg b/local/media/images/product/169-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_ardoise-1.jpg new file mode 100644 index 00000000..3bc4203a Binary files /dev/null and b/local/media/images/product/169-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_ardoise-1.jpg differ diff --git a/local/media/images/product/170-SCHNEIDER_Cadre_ALTIRA_2x3_postes_ardoise-1.jpg b/local/media/images/product/170-SCHNEIDER_Cadre_ALTIRA_2x3_postes_ardoise-1.jpg new file mode 100644 index 00000000..6e4600b9 Binary files /dev/null and b/local/media/images/product/170-SCHNEIDER_Cadre_ALTIRA_2x3_postes_ardoise-1.jpg differ diff --git a/local/media/images/product/171-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_ardoise-1.jpg b/local/media/images/product/171-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_ardoise-1.jpg new file mode 100644 index 00000000..edfefb7c Binary files /dev/null and b/local/media/images/product/171-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_ardoise-1.jpg differ diff --git a/local/media/images/product/172-SCHNEIDER_Cadre_ALTIRA_1_poste_alu-1.jpg b/local/media/images/product/172-SCHNEIDER_Cadre_ALTIRA_1_poste_alu-1.jpg new file mode 100644 index 00000000..3131a936 Binary files /dev/null and b/local/media/images/product/172-SCHNEIDER_Cadre_ALTIRA_1_poste_alu-1.jpg differ diff --git a/local/media/images/product/173-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_alu-1.jpg b/local/media/images/product/173-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_alu-1.jpg new file mode 100644 index 00000000..d86a431f Binary files /dev/null and b/local/media/images/product/173-SCHNEIDER_Cadre_ALTIRA_2_postes_horizontal_alu-1.jpg differ diff --git a/local/media/images/product/174-SCHNEIDER_Cadre_ALTIRA_2_postes_vertical_57mm_alu-1.jpg b/local/media/images/product/174-SCHNEIDER_Cadre_ALTIRA_2_postes_vertical_57mm_alu-1.jpg new file mode 100644 index 00000000..51572fcd Binary files /dev/null and b/local/media/images/product/174-SCHNEIDER_Cadre_ALTIRA_2_postes_vertical_57mm_alu-1.jpg differ diff --git a/local/media/images/product/175-SCHNEIDER_Cadre_ALTIRA_2_postes_alu-1.jpg b/local/media/images/product/175-SCHNEIDER_Cadre_ALTIRA_2_postes_alu-1.jpg new file mode 100644 index 00000000..57ecb2b9 Binary files /dev/null and b/local/media/images/product/175-SCHNEIDER_Cadre_ALTIRA_2_postes_alu-1.jpg differ diff --git a/local/media/images/product/176-SCHNEIDER_Cadre_ALTIRA_2_postes b/local/media/images/product/176-SCHNEIDER_Cadre_ALTIRA_2_postes new file mode 100644 index 00000000..0195bf1d Binary files /dev/null and b/local/media/images/product/176-SCHNEIDER_Cadre_ALTIRA_2_postes differ diff --git a/local/media/images/product/176-SCHNEIDER_Cadre_ALTIRA_2_postes_vertical_71mm_alu-1.jpg b/local/media/images/product/176-SCHNEIDER_Cadre_ALTIRA_2_postes_vertical_71mm_alu-1.jpg new file mode 100644 index 00000000..2bb63cab Binary files /dev/null and b/local/media/images/product/176-SCHNEIDER_Cadre_ALTIRA_2_postes_vertical_71mm_alu-1.jpg differ diff --git a/local/media/images/product/177-SCHNEIDER_Cadre_ALTIRA_3_postes_alu-1.jpg b/local/media/images/product/177-SCHNEIDER_Cadre_ALTIRA_3_postes_alu-1.jpg new file mode 100644 index 00000000..afde3287 Binary files /dev/null and b/local/media/images/product/177-SCHNEIDER_Cadre_ALTIRA_3_postes_alu-1.jpg differ diff --git a/local/media/images/product/178-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_alu-1.jpg b/local/media/images/product/178-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_alu-1.jpg new file mode 100644 index 00000000..f6a7f458 Binary files /dev/null and b/local/media/images/product/178-SCHNEIDER_Cadre_ALTIRA_3_postes_horizontal_alu-1.jpg differ diff --git a/local/media/images/product/179-SCHNEIDER_Cadre_ALTIRA_2x3_postes_alu-1.jpg b/local/media/images/product/179-SCHNEIDER_Cadre_ALTIRA_2x3_postes_alu-1.jpg new file mode 100644 index 00000000..5787a7fe Binary files /dev/null and b/local/media/images/product/179-SCHNEIDER_Cadre_ALTIRA_2x3_postes_alu-1.jpg differ diff --git a/local/media/images/product/18-ZENNIO_Z38inoir1-1.jpg b/local/media/images/product/18-ZENNIO_Z38inoir1-1.jpg new file mode 100644 index 00000000..3f86f009 Binary files /dev/null and b/local/media/images/product/18-ZENNIO_Z38inoir1-1.jpg differ diff --git a/local/media/images/product/180-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_alu-1.jpg b/local/media/images/product/180-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_alu-1.jpg new file mode 100644 index 00000000..c009485a Binary files /dev/null and b/local/media/images/product/180-SCHNEIDER_Cadre_ALTIRA_3_postes_vertical_alu-1.jpg differ diff --git a/local/media/images/product/181-SCHNEIDER_Cadre_ALTIRA_1_poste_antimicrobien-1.jpg b/local/media/images/product/181-SCHNEIDER_Cadre_ALTIRA_1_poste_antimicrobien-1.jpg new file mode 100644 index 00000000..9b93f106 Binary files /dev/null and b/local/media/images/product/181-SCHNEIDER_Cadre_ALTIRA_1_poste_antimicrobien-1.jpg differ diff --git a/local/media/images/product/182-SCHNEIDER_Cadre_ALTIRA_2_postes_horiz._antimicrobe-1.jpg b/local/media/images/product/182-SCHNEIDER_Cadre_ALTIRA_2_postes_horiz._antimicrobe-1.jpg new file mode 100644 index 00000000..d67f8349 Binary files /dev/null and b/local/media/images/product/182-SCHNEIDER_Cadre_ALTIRA_2_postes_horiz._antimicrobe-1.jpg differ diff --git a/local/media/images/product/183-SCHNEIDER_Cadre_ALT b/local/media/images/product/183-SCHNEIDER_Cadre_ALT new file mode 100644 index 00000000..49648ce6 Binary files /dev/null and b/local/media/images/product/183-SCHNEIDER_Cadre_ALT differ diff --git a/local/media/images/product/183-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57antimicr.-1.jpg b/local/media/images/product/183-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57antimicr.-1.jpg new file mode 100644 index 00000000..a803a88d Binary files /dev/null and b/local/media/images/product/183-SCHNEIDER_Cadre_ALTIRA_2_postes_verti.57antimicr.-1.jpg differ diff --git a/local/media/images/product/184-SCHNEIDER_Cadre_ALTIRA_2_postes_antimicrobien-1.jpg b/local/media/images/product/184-SCHNEIDER_Cadre_ALTIRA_2_postes_antimicrobien-1.jpg new file mode 100644 index 00000000..e7a3275f Binary files /dev/null and b/local/media/images/product/184-SCHNEIDER_Cadre_ALTIRA_2_postes_antimicrobien-1.jpg differ diff --git a/local/media/images/product/185-SCHNEIDER_Cadre_ALTIRA_3_postes_antimicrobien-1.jpg b/local/media/images/product/185-SCHNEIDER_Cadre_ALTIRA_3_postes_antimicrobien-1.jpg new file mode 100644 index 00000000..734aaa3c Binary files /dev/null and b/local/media/images/product/185-SCHNEIDER_Cadre_ALTIRA_3_postes_antimicrobien-1.jpg differ diff --git a/local/media/images/product/186-SCHNEIDER_Cadre_ALTIRA_3_postes_hori b/local/media/images/product/186-SCHNEIDER_Cadre_ALTIRA_3_postes_hori new file mode 100644 index 00000000..4ad47278 Binary files /dev/null and b/local/media/images/product/186-SCHNEIDER_Cadre_ALTIRA_3_postes_hori differ diff --git a/local/media/images/product/186-SCHNEIDER_Cadre_ALTIRA_3_postes_horiz._antimicrobe-1.jpg b/local/media/images/product/186-SCHNEIDER_Cadre_ALTIRA_3_postes_horiz._antimicrobe-1.jpg new file mode 100644 index 00000000..93b961e0 Binary files /dev/null and b/local/media/images/product/186-SCHNEIDER_Cadre_ALTIRA_3_postes_horiz._antimicrobe-1.jpg differ diff --git a/local/media/images/product/187-SCHNEIDER_Cadre_ALTIRA_2x3_postes_antimicrobien-1.jpg b/local/media/images/product/187-SCHNEIDER_Cadre_ALTIRA_2x3_postes_antimicrobien-1.jpg new file mode 100644 index 00000000..31ebcaab Binary files /dev/null and b/local/media/images/product/187-SCHNEIDER_Cadre_ALTIRA_2x3_postes_antimicrobien-1.jpg differ diff --git a/local/media/images/product/188-TRIVUM_TouchPad-Silver5-1.jpg b/local/media/images/product/188-TRIVUM_TouchPad-Silver5-1.jpg new file mode 100644 index 00000000..374f12f6 Binary files /dev/null and b/local/media/images/product/188-TRIVUM_TouchPad-Silver5-1.jpg differ diff --git a/local/media/images/product/191-Amplificateur+audio+-1.png b/local/media/images/product/191-Amplificateur+audio+-1.png new file mode 100644 index 00000000..8ae600a5 Binary files /dev/null and b/local/media/images/product/191-Amplificateur+audio+-1.png differ diff --git a/local/media/images/product/192-TRIVUM_SupportEcran-1.jpg b/local/media/images/product/192-TRIVUM_SupportEcran-1.jpg new file mode 100644 index 00000000..46534e3c Binary files /dev/null and b/local/media/images/product/192-TRIVUM_SupportEcran-1.jpg differ diff --git a/local/media/images/product/195-TRIVUM_TouchPad-Black-1.jpg b/local/media/images/product/195-TRIVUM_TouchPad-Black-1.jpg new file mode 100644 index 00000000..a12f48a1 Binary files /dev/null and b/local/media/images/product/195-TRIVUM_TouchPad-Black-1.jpg differ diff --git a/local/media/images/product/196-JUNG_RANAL2914-1.jpg b/local/media/images/product/196-JUNG_RANAL2914-1.jpg new file mode 100644 index 00000000..b25d434c Binary files /dev/null and b/local/media/images/product/196-JUNG_RANAL2914-1.jpg differ diff --git a/local/media/images/product/197-JUNG_RANAL2914AN-1.jpg b/local/media/images/product/197-JUNG_RANAL2914AN-1.jpg new file mode 100644 index 00000000..387ae16b Binary files /dev/null and b/local/media/images/product/197-JUNG_RANAL2914AN-1.jpg differ diff --git a/local/media/images/product/198-J b/local/media/images/product/198-J new file mode 100644 index 00000000..28610c32 Binary files /dev/null and b/local/media/images/product/198-J differ diff --git a/local/media/images/product/198-JUNG_RANES2914-1.jpg b/local/media/images/product/198-JUNG_RANES2914-1.jpg new file mode 100644 index 00000000..bf219e34 Binary files /dev/null and b/local/media/images/product/198-JUNG_RANES2914-1.jpg differ diff --git a/local/media/images/product/199-JUNG_RANLS914LG-1.jpg b/local/media/images/product/199-JUNG_RANLS914LG-1.jpg new file mode 100644 index 00000000..0323367e Binary files /dev/null and b/local/media/images/product/199-JUNG_RANLS914LG-1.jpg differ diff --git a/local/media/images/product/1a863259-c283-47b1-90d5-643be38d8474-2671.jpeg b/local/media/images/product/1a863259-c283-47b1-90d5-643be38d8474-2671.jpeg new file mode 100644 index 00000000..437b4510 Binary files /dev/null and b/local/media/images/product/1a863259-c283-47b1-90d5-643be38d8474-2671.jpeg differ diff --git a/local/media/images/product/1af77ab5-b76c-4b0d-b64e-b7ae1099fc31-2674.jpeg b/local/media/images/product/1af77ab5-b76c-4b0d-b64e-b7ae1099fc31-2674.jpeg new file mode 100644 index 00000000..0d2e477f Binary files /dev/null and b/local/media/images/product/1af77ab5-b76c-4b0d-b64e-b7ae1099fc31-2674.jpeg differ diff --git a/local/media/images/product/1fc98042-f72b-4152-86cb-fb69529c41b0-2685.jpeg b/local/media/images/product/1fc98042-f72b-4152-86cb-fb69529c41b0-2685.jpeg new file mode 100644 index 00000000..7dff9aee Binary files /dev/null and b/local/media/images/product/1fc98042-f72b-4152-86cb-fb69529c41b0-2685.jpeg differ diff --git a/local/media/images/product/2-8x0a9817-3-3068.jpg b/local/media/images/product/2-8x0a9817-3-3068.jpg new file mode 100644 index 00000000..b45750bd Binary files /dev/null and b/local/media/images/product/2-8x0a9817-3-3068.jpg differ diff --git a/local/media/images/product/2-8x0a9817-3072.jpg b/local/media/images/product/2-8x0a9817-3072.jpg new file mode 100644 index 00000000..8e278c20 Binary files /dev/null and b/local/media/images/product/2-8x0a9817-3072.jpg differ diff --git a/local/media/images/product/200-JUNG_RANLS914SW-1.jpg b/local/media/images/product/200-JUNG_RANLS914SW-1.jpg new file mode 100644 index 00000000..8e18bee7 Binary files /dev/null and b/local/media/images/product/200-JUNG_RANLS914SW-1.jpg differ diff --git a/local/media/images/product/20180730_170025-2556.jpg b/local/media/images/product/20180730_170025-2556.jpg new file mode 100644 index 00000000..6ab56495 Binary files /dev/null and b/local/media/images/product/20180730_170025-2556.jpg differ diff --git a/local/media/images/product/20180730_170322-2555.jpg b/local/media/images/product/20180730_170322-2555.jpg new file mode 100644 index 00000000..bb82c66d Binary files /dev/null and b/local/media/images/product/20180730_170322-2555.jpg differ diff --git a/local/media/images/product/203-JUNG_AL2981-1.jpg b/local/media/images/product/203-JUNG_AL2981-1.jpg new file mode 100644 index 00000000..dca0b0dd Binary files /dev/null and b/local/media/images/product/203-JUNG_AL2981-1.jpg differ diff --git a/local/media/images/product/204-JUNG_AL2982-1.jpg b/local/media/images/product/204-JUNG_AL2982-1.jpg new file mode 100644 index 00000000..4c477daa Binary files /dev/null and b/local/media/images/product/204-JUNG_AL2982-1.jpg differ diff --git a/local/media/images/product/205-JUNG_AL2983-1. b/local/media/images/product/205-JUNG_AL2983-1. new file mode 100644 index 00000000..4570c7a9 Binary files /dev/null and b/local/media/images/product/205-JUNG_AL2983-1. differ diff --git a/local/media/images/product/205-JUNG_AL2983-1.jpg b/local/media/images/product/205-JUNG_AL2983-1.jpg new file mode 100644 index 00000000..908e05e0 Binary files /dev/null and b/local/media/images/product/205-JUNG_AL2983-1.jpg differ diff --git a/local/media/images/product/206-JUNG_AL2984-1.jpg b/local/media/images/product/206-JUNG_AL2984-1.jpg new file mode 100644 index 00000000..3925bd83 Binary files /dev/null and b/local/media/images/product/206-JUNG_AL2984-1.jpg differ diff --git a/local/media/images/product/207-JUNG_AL2985-1.jpg b/local/media/images/product/207-JUNG_AL2985-1.jpg new file mode 100644 index 00000000..227937b4 Binary files /dev/null and b/local/media/images/product/207-JUNG_AL2985-1.jpg differ diff --git a/local/media/images/product/208-JUNG_AL2981AN-1.jpg b/local/media/images/product/208-JUNG_AL2981AN-1.jpg new file mode 100644 index 00000000..60bafdff Binary files /dev/null and b/local/media/images/product/208-JUNG_AL2981AN-1.jpg differ diff --git a/local/media/images/product/209-JUNG_AL2982AN-1.jpg b/local/media/images/product/209-JUNG_AL2982AN-1.jpg new file mode 100644 index 00000000..19097b4a Binary files /dev/null and b/local/media/images/product/209-JUNG_AL2982AN-1.jpg differ diff --git a/local/media/images/product/20989_2_-2418.jpg b/local/media/images/product/20989_2_-2418.jpg new file mode 100644 index 00000000..aee14b52 Binary files /dev/null and b/local/media/images/product/20989_2_-2418.jpg differ diff --git a/local/media/images/product/210-JUNG_AL2983AN-1.jpg b/local/media/images/product/210-JUNG_AL2983AN-1.jpg new file mode 100644 index 00000000..1e8e60e2 Binary files /dev/null and b/local/media/images/product/210-JUNG_AL2983AN-1.jpg differ diff --git a/local/media/images/product/211-JUNG_A b/local/media/images/product/211-JUNG_A new file mode 100644 index 00000000..4a4c5441 Binary files /dev/null and b/local/media/images/product/211-JUNG_A differ diff --git a/local/media/images/product/211-JUNG_AL2984AN-1.jpg b/local/media/images/product/211-JUNG_AL2984AN-1.jpg new file mode 100644 index 00000000..abbb3abf Binary files /dev/null and b/local/media/images/product/211-JUNG_AL2984AN-1.jpg differ diff --git a/local/media/images/product/21192908_2017_m_0_lo-2568.jpg b/local/media/images/product/21192908_2017_m_0_lo-2568.jpg new file mode 100644 index 00000000..b0738e85 Binary files /dev/null and b/local/media/images/product/21192908_2017_m_0_lo-2568.jpg differ diff --git a/local/media/images/product/212-JUNG_AL2985AN-1.jpg b/local/media/images/product/212-JUNG_AL2985AN-1.jpg new file mode 100644 index 00000000..6efd2158 Binary files /dev/null and b/local/media/images/product/212-JUNG_AL2985AN-1.jpg differ diff --git a/local/media/images/product/213-JUNG_ES2981-1.jpg b/local/media/images/product/213-JUNG_ES2981-1.jpg new file mode 100644 index 00000000..613c5d3c Binary files /dev/null and b/local/media/images/product/213-JUNG_ES2981-1.jpg differ diff --git a/local/media/images/product/214-JUNG_ES2982-1.jpg b/local/media/images/product/214-JUNG_ES2982-1.jpg new file mode 100644 index 00000000..f9df4e33 Binary files /dev/null and b/local/media/images/product/214-JUNG_ES2982-1.jpg differ diff --git a/local/media/images/product/215-JUNG_ES2983-1.jpg b/local/media/images/product/215-JUNG_ES2983-1.jpg new file mode 100644 index 00000000..fb7620cf Binary files /dev/null and b/local/media/images/product/215-JUNG_ES2983-1.jpg differ diff --git a/local/media/images/product/216-JUNG_ES2984- b/local/media/images/product/216-JUNG_ES2984- new file mode 100644 index 00000000..f02b792c Binary files /dev/null and b/local/media/images/product/216-JUNG_ES2984- differ diff --git a/local/media/images/product/216-JUNG_ES2984-1.jpg b/local/media/images/product/216-JUNG_ES2984-1.jpg new file mode 100644 index 00000000..19caf1bf Binary files /dev/null and b/local/media/images/product/216-JUNG_ES2984-1.jpg differ diff --git a/local/media/images/product/217-JUNG_ES2985-1.jpg b/local/media/images/product/217-JUNG_ES2985-1.jpg new file mode 100644 index 00000000..18cd01f2 Binary files /dev/null and b/local/media/images/product/217-JUNG_ES2985-1.jpg differ diff --git a/local/media/images/product/218-JUNG_ES2983WW-1.jpg b/local/media/images/product/218-JUNG_ES2983WW-1.jpg new file mode 100644 index 00000000..7b0b6734 Binary files /dev/null and b/local/media/images/product/218-JUNG_ES2983WW-1.jpg differ diff --git a/local/media/images/product/219-JUNG_ES2984WW-1.jpg b/local/media/images/product/219-JUNG_ES2984WW-1.jpg new file mode 100644 index 00000000..50a9424c Binary files /dev/null and b/local/media/images/product/219-JUNG_ES2984WW-1.jpg differ diff --git a/local/media/images/product/220-JUNG_ES2985WW-1.jpg b/local/media/images/product/220-JUNG_ES2985WW-1.jpg new file mode 100644 index 00000000..acd3866e Binary files /dev/null and b/local/media/images/product/220-JUNG_ES2985WW-1.jpg differ diff --git a/local/media/images/product/221-JUNG_GCR298 b/local/media/images/product/221-JUNG_GCR298 new file mode 100644 index 00000000..a3e75f2c Binary files /dev/null and b/local/media/images/product/221-JUNG_GCR298 differ diff --git a/local/media/images/product/221-JUNG_GCR2981-1.jpg b/local/media/images/product/221-JUNG_GCR2981-1.jpg new file mode 100644 index 00000000..2b415e0a Binary files /dev/null and b/local/media/images/product/221-JUNG_GCR2981-1.jpg differ diff --git a/local/media/images/product/222-JUNG_GCR2982-1.jpg b/local/media/images/product/222-JUNG_GCR2982-1.jpg new file mode 100644 index 00000000..8745e4f4 Binary files /dev/null and b/local/media/images/product/222-JUNG_GCR2982-1.jpg differ diff --git a/local/media/images/product/223-JUNG_GCR2983-1.jpg b/local/media/images/product/223-JUNG_GCR2983-1.jpg new file mode 100644 index 00000000..817f610c Binary files /dev/null and b/local/media/images/product/223-JUNG_GCR2983-1.jpg differ diff --git a/local/media/images/product/223569_l-2417.jpg b/local/media/images/product/223569_l-2417.jpg new file mode 100644 index 00000000..495232b3 Binary files /dev/null and b/local/media/images/product/223569_l-2417.jpg differ diff --git a/local/media/images/product/224-JUNG_GCR2984-1.jpg b/local/media/images/product/224-JUNG_GCR2984-1.jpg new file mode 100644 index 00000000..6edd4f60 Binary files /dev/null and b/local/media/images/product/224-JUNG_GCR2984-1.jpg differ diff --git a/local/media/images/product/225-JUNG_GCR2985-1.jpg b/local/media/images/product/225-JUNG_GCR2985-1.jpg new file mode 100644 index 00000000..ddd67380 Binary files /dev/null and b/local/media/images/product/225-JUNG_GCR2985-1.jpg differ diff --git a/local/media/images/product/226-JUNG_GO2981- b/local/media/images/product/226-JUNG_GO2981- new file mode 100644 index 00000000..20a48fdc Binary files /dev/null and b/local/media/images/product/226-JUNG_GO2981- differ diff --git a/local/media/images/product/226-JUNG_GO2981-1.jpg b/local/media/images/product/226-JUNG_GO2981-1.jpg new file mode 100644 index 00000000..a35b6730 Binary files /dev/null and b/local/media/images/product/226-JUNG_GO2981-1.jpg differ diff --git a/local/media/images/product/227-JUNG_GO2982-1.jpg b/local/media/images/product/227-JUNG_GO2982-1.jpg new file mode 100644 index 00000000..78a2366b Binary files /dev/null and b/local/media/images/product/227-JUNG_GO2982-1.jpg differ diff --git a/local/media/images/product/228-JUNG_GO2983-1.jpg b/local/media/images/product/228-JUNG_GO2983-1.jpg new file mode 100644 index 00000000..e960dfbf Binary files /dev/null and b/local/media/images/product/228-JUNG_GO2983-1.jpg differ diff --git a/local/media/images/product/229-JUNG_GO2984-1.jpg b/local/media/images/product/229-JUNG_GO2984-1.jpg new file mode 100644 index 00000000..0e06fa73 Binary files /dev/null and b/local/media/images/product/229-JUNG_GO2984-1.jpg differ diff --git a/local/media/images/product/230-JUNG_GO2985-1.jpg b/local/media/images/product/230-JUNG_GO2985-1.jpg new file mode 100644 index 00000000..adbe4fd0 Binary files /dev/null and b/local/media/images/product/230-JUNG_GO2985-1.jpg differ diff --git a/local/media/images/product/231-JUNG_ME2981C-1.jpg b/local/media/images/product/231-JUNG_ME2981C-1.jpg new file mode 100644 index 00000000..f8c96629 Binary files /dev/null and b/local/media/images/product/231-JUNG_ME2981C-1.jpg differ diff --git a/local/media/images/product/232-JUNG_ME2981AT-1.jpg b/local/media/images/product/232-JUNG_ME2981AT-1.jpg new file mode 100644 index 00000000..926742ef Binary files /dev/null and b/local/media/images/product/232-JUNG_ME2981AT-1.jpg differ diff --git a/local/media/images/product/233-JUNG_ME2981 b/local/media/images/product/233-JUNG_ME2981 new file mode 100644 index 00000000..882caeba Binary files /dev/null and b/local/media/images/product/233-JUNG_ME2981 differ diff --git a/local/media/images/product/233-JUNG_ME2981D-1.jpg b/local/media/images/product/233-JUNG_ME2981D-1.jpg new file mode 100644 index 00000000..075ff71b Binary files /dev/null and b/local/media/images/product/233-JUNG_ME2981D-1.jpg differ diff --git a/local/media/images/product/234-732aeb4a8d599dd31ad958d034af-1.jpg b/local/media/images/product/234-732aeb4a8d599dd31ad958d034af-1.jpg new file mode 100644 index 00000000..806bda8e Binary files /dev/null and b/local/media/images/product/234-732aeb4a8d599dd31ad958d034af-1.jpg differ diff --git a/local/media/images/product/234-Enjoliveur+prise+cou-1.png b/local/media/images/product/234-Enjoliveur+prise+cou-1.png new file mode 100644 index 00000000..806bda8e Binary files /dev/null and b/local/media/images/product/234-Enjoliveur+prise+cou-1.png differ diff --git a/local/media/images/product/235-Enjoliveur+prise+cou-1.png b/local/media/images/product/235-Enjoliveur+prise+cou-1.png new file mode 100644 index 00000000..9feb54e1 Binary files /dev/null and b/local/media/images/product/235-Enjoliveur+prise+cou-1.png differ diff --git a/local/media/images/product/239-Enjoliveur+prise+cou-1.png b/local/media/images/product/239-Enjoliveur+prise+cou-1.png new file mode 100644 index 00000000..7814adc3 Binary files /dev/null and b/local/media/images/product/239-Enjoliveur+prise+cou-1.png differ diff --git a/local/media/images/product/241-Enjoliveur+prise+cou-1.png b/local/media/images/product/241-Enjoliveur+prise+cou-1.png new file mode 100644 index 00000000..60dc4d47 Binary files /dev/null and b/local/media/images/product/241-Enjoliveur+prise+cou-1.png differ diff --git a/local/media/images/product/243-JUNG_LS990KLGGO-1.jpg b/local/media/images/product/243-JUNG_LS990KLGGO-1.jpg new file mode 100644 index 00000000..cf18e703 Binary files /dev/null and b/local/media/images/product/243-JUNG_LS990KLGGO-1.jpg differ diff --git a/local/media/images/product/244-JUNG_AL2990KL-1.jpg b/local/media/images/product/244-JUNG_AL2990KL-1.jpg new file mode 100644 index 00000000..b4ef92b3 Binary files /dev/null and b/local/media/images/product/244-JUNG_AL2990KL-1.jpg differ diff --git a/local/media/images/product/245-JUNG_ES2990KL-1.jpg b/local/media/images/product/245-JUNG_ES2990KL-1.jpg new file mode 100644 index 00000000..9212520b Binary files /dev/null and b/local/media/images/product/245-JUNG_ES2990KL-1.jpg differ diff --git a/local/media/images/product/246-JUNG_AL2990KLAN-1.jpg b/local/media/images/product/246-JUNG_AL2990KLAN-1.jpg new file mode 100644 index 00000000..c7931068 Binary files /dev/null and b/local/media/images/product/246-JUNG_AL2990KLAN-1.jpg differ diff --git a/local/media/images/product/247-JUNG_GCR2990KL-1.jpg b/local/media/images/product/247-JUNG_GCR2990KL-1.jpg new file mode 100644 index 00000000..0729d08f Binary files /dev/null and b/local/media/images/product/247-JUNG_GCR2990KL-1.jpg differ diff --git a/local/media/images/product/248-JUNG_GO2990KL-1.jpg b/local/media/images/product/248-JUNG_GO2990KL-1.jpg new file mode 100644 index 00000000..097e40fe Binary files /dev/null and b/local/media/images/product/248-JUNG_GO2990KL-1.jpg differ diff --git a/local/media/images/product/25-JUNG_4094TSM-1.jpg b/local/media/images/product/25-JUNG_4094TSM-1.jpg new file mode 100644 index 00000000..ecc15e76 Binary files /dev/null and b/local/media/images/product/25-JUNG_4094TSM-1.jpg differ diff --git a/local/media/images/product/251-JUNG_LS969-1UA-1.jpg b/local/media/images/product/251-JUNG_LS969-1UA-1.jpg new file mode 100644 index 00000000..f1e4d91b Binary files /dev/null and b/local/media/images/product/251-JUNG_LS969-1UA-1.jpg differ diff --git a/local/media/images/product/252-Enjoliveur+prise+RJ4-1.png b/local/media/images/product/252-Enjoliveur+prise+RJ4-1.png new file mode 100644 index 00000000..1231f82a Binary files /dev/null and b/local/media/images/product/252-Enjoliveur+prise+RJ4-1.png differ diff --git a/local/media/images/product/253-JUNG_LS969-1UALG-1.jpg b/local/media/images/product/253-JUNG_LS969-1UALG-1.jpg new file mode 100644 index 00000000..028ecad6 Binary files /dev/null and b/local/media/images/product/253-JUNG_LS969-1UALG-1.jpg differ diff --git a/local/media/images/product/254-JUNG_LS969-1UASW-1.jpg b/local/media/images/product/254-JUNG_LS969-1UASW-1.jpg new file mode 100644 index 00000000..f323f883 Binary files /dev/null and b/local/media/images/product/254-JUNG_LS969-1UASW-1.jpg differ diff --git a/local/media/images/product/255-JUNG_AL2969-1UA-1.jpg b/local/media/images/product/255-JUNG_AL2969-1UA-1.jpg new file mode 100644 index 00000000..d9f807de Binary files /dev/null and b/local/media/images/product/255-JUNG_AL2969-1UA-1.jpg differ diff --git a/local/media/images/product/256-JUNG_ES2969-1UA-1.jpg b/local/media/images/product/256-JUNG_ES2969-1UA-1.jpg new file mode 100644 index 00000000..5ee9ea09 Binary files /dev/null and b/local/media/images/product/256-JUNG_ES2969-1UA-1.jpg differ diff --git a/local/media/images/product/257-JUNG_AL2969-1UAAN-1.jpg b/local/media/images/product/257-JUNG_AL2969-1UAAN-1.jpg new file mode 100644 index 00000000..4f74076a Binary files /dev/null and b/local/media/images/product/257-JUNG_AL2969-1UAAN-1.jpg differ diff --git a/local/media/images/product/258-JUNG_GCR2969-1UA-1.jpg b/local/media/images/product/258-JUNG_GCR2969-1UA-1.jpg new file mode 100644 index 00000000..7e86a4f5 Binary files /dev/null and b/local/media/images/product/258-JUNG_GCR2969-1UA-1.jpg differ diff --git a/local/media/images/product/26-bus_knx_schneider_160mA-1.jpg b/local/media/images/product/26-bus_knx_schneider_160mA-1.jpg new file mode 100644 index 00000000..33f78749 Binary files /dev/null and b/local/media/images/product/26-bus_knx_schneider_160mA-1.jpg differ diff --git a/local/media/images/product/260-JUNG_LS969-1UAGGO-1.jpg b/local/media/images/product/260-JUNG_LS969-1UAGGO-1.jpg new file mode 100644 index 00000000..d37d1742 Binary files /dev/null and b/local/media/images/product/260-JUNG_LS969-1UAGGO-1.jpg differ diff --git a/local/media/images/product/263-JUNG_LS969-1NAUALG-1.jpg b/local/media/images/product/263-JUNG_LS969-1NAUALG-1.jpg new file mode 100644 index 00000000..4ac1ed21 Binary files /dev/null and b/local/media/images/product/263-JUNG_LS969-1NAUALG-1.jpg differ diff --git a/local/media/images/product/264-JUNG_LS969-1NAUASW-1.jpg b/local/media/images/product/264-JUNG_LS969-1NAUASW-1.jpg new file mode 100644 index 00000000..378764f2 Binary files /dev/null and b/local/media/images/product/264-JUNG_LS969-1NAUASW-1.jpg differ diff --git a/local/media/images/product/265-JUNG_AL2969-1NAUA-1.jpg b/local/media/images/product/265-JUNG_AL2969-1NAUA-1.jpg new file mode 100644 index 00000000..a2db68ec Binary files /dev/null and b/local/media/images/product/265-JUNG_AL2969-1NAUA-1.jpg differ diff --git a/local/media/images/product/266-JUNG_ES2969-1NAUA-1.jpg b/local/media/images/product/266-JUNG_ES2969-1NAUA-1.jpg new file mode 100644 index 00000000..dbcfa6c7 Binary files /dev/null and b/local/media/images/product/266-JUNG_ES2969-1NAUA-1.jpg differ diff --git a/local/media/images/product/267-JUNG_AL2969-1NAUAAN-1.jpg b/local/media/images/product/267-JUNG_AL2969-1NAUAAN-1.jpg new file mode 100644 index 00000000..dba03e34 Binary files /dev/null and b/local/media/images/product/267-JUNG_AL2969-1NAUAAN-1.jpg differ diff --git a/local/media/images/product/268-JUNG_GCR2969-1NAUA-1.jpg b/local/media/images/product/268-JUNG_GCR2969-1NAUA-1.jpg new file mode 100644 index 00000000..388ee8c4 Binary files /dev/null and b/local/media/images/product/268-JUNG_GCR2969-1NAUA-1.jpg differ diff --git a/local/media/images/product/269-JUNG_GO2969-1NAUA-1.jpg b/local/media/images/product/269-JUNG_GO2969-1NAUA-1.jpg new file mode 100644 index 00000000..4e645818 Binary files /dev/null and b/local/media/images/product/269-JUNG_GO2969-1NAUA-1.jpg differ diff --git a/local/media/images/product/27-bus_knx_schneider_320mA-1.jpg b/local/media/images/product/27-bus_knx_schneider_320mA-1.jpg new file mode 100644 index 00000000..0ecd3ec9 Binary files /dev/null and b/local/media/images/product/27-bus_knx_schneider_320mA-1.jpg differ diff --git a/local/media/images/product/270-JUNG_LS969-2UA-1.jpg b/local/media/images/product/270-JUNG_LS969-2UA-1.jpg new file mode 100644 index 00000000..81f76130 Binary files /dev/null and b/local/media/images/product/270-JUNG_LS969-2UA-1.jpg differ diff --git a/local/media/images/product/271-Enjoliveur+prise+RJ4-1.png b/local/media/images/product/271-Enjoliveur+prise+RJ4-1.png new file mode 100644 index 00000000..4b695ee6 Binary files /dev/null and b/local/media/images/product/271-Enjoliveur+prise+RJ4-1.png differ diff --git a/local/media/images/product/272-JUNG_LS969-2UALG-1.jpg b/local/media/images/product/272-JUNG_LS969-2UALG-1.jpg new file mode 100644 index 00000000..f36de4aa Binary files /dev/null and b/local/media/images/product/272-JUNG_LS969-2UALG-1.jpg differ diff --git a/local/media/images/product/273-JUNG_LS969-2UASW-1.jpg b/local/media/images/product/273-JUNG_LS969-2UASW-1.jpg new file mode 100644 index 00000000..7f3c4253 Binary files /dev/null and b/local/media/images/product/273-JUNG_LS969-2UASW-1.jpg differ diff --git a/local/media/images/product/274-JUNG_AL2969-2UA-1.jpg b/local/media/images/product/274-JUNG_AL2969-2UA-1.jpg new file mode 100644 index 00000000..47b22b31 Binary files /dev/null and b/local/media/images/product/274-JUNG_AL2969-2UA-1.jpg differ diff --git a/local/media/images/product/275-JUNG_ES2969-2UA-1.jpg b/local/media/images/product/275-JUNG_ES2969-2UA-1.jpg new file mode 100644 index 00000000..18cdaeeb Binary files /dev/null and b/local/media/images/product/275-JUNG_ES2969-2UA-1.jpg differ diff --git a/local/media/images/product/276-JUNG_AL2969-2UAAN-1.jpg b/local/media/images/product/276-JUNG_AL2969-2UAAN-1.jpg new file mode 100644 index 00000000..29f4dab1 Binary files /dev/null and b/local/media/images/product/276-JUNG_AL2969-2UAAN-1.jpg differ diff --git a/local/media/images/product/277-JUNG_GCR2969-2UA-1.jpg b/local/media/images/product/277-JUNG_GCR2969-2UA-1.jpg new file mode 100644 index 00000000..ff7f337a Binary files /dev/null and b/local/media/images/product/277-JUNG_GCR2969-2UA-1.jpg differ diff --git a/local/media/images/product/278-JUNG_GO2969-2UA-1.jpg b/local/media/images/product/278-JUNG_GO2969-2UA-1.jpg new file mode 100644 index 00000000..ff6bf880 Binary files /dev/null and b/local/media/images/product/278-JUNG_GO2969-2UA-1.jpg differ diff --git a/local/media/images/product/279-JUNG_LS969-2UAGGO-1.jpg b/local/media/images/product/279-JUNG_LS969-2UAGGO-1.jpg new file mode 100644 index 00000000..0a1f989c Binary files /dev/null and b/local/media/images/product/279-JUNG_LS969-2UAGGO-1.jpg differ diff --git a/local/media/images/product/28-bus_knx_schneider_640mA-1.jpg b/local/media/images/product/28-bus_knx_schneider_640mA-1.jpg new file mode 100644 index 00000000..ad409583 Binary files /dev/null and b/local/media/images/product/28-bus_knx_schneider_640mA-1.jpg differ diff --git a/local/media/images/product/281-Enjoliveur+prise+RJ4-1.png b/local/media/images/product/281-Enjoliveur+prise+RJ4-1.png new file mode 100644 index 00000000..72434f5c Binary files /dev/null and b/local/media/images/product/281-Enjoliveur+prise+RJ4-1.png differ diff --git a/local/media/images/product/282-JUNG_LS969-2NAUALG-1.jpg b/local/media/images/product/282-JUNG_LS969-2NAUALG-1.jpg new file mode 100644 index 00000000..1910db08 Binary files /dev/null and b/local/media/images/product/282-JUNG_LS969-2NAUALG-1.jpg differ diff --git a/local/media/images/product/283-JUNG_LS969-2NAUASW-1.jpg b/local/media/images/product/283-JUNG_LS969-2NAUASW-1.jpg new file mode 100644 index 00000000..06504f0b Binary files /dev/null and b/local/media/images/product/283-JUNG_LS969-2NAUASW-1.jpg differ diff --git a/local/media/images/product/284-JUNG_AL2969-2NAUA-1.jpg b/local/media/images/product/284-JUNG_AL2969-2NAUA-1.jpg new file mode 100644 index 00000000..4b73ef1f Binary files /dev/null and b/local/media/images/product/284-JUNG_AL2969-2NAUA-1.jpg differ diff --git a/local/media/images/product/285-JUNG_ES2969-2NAUA-1.jpg b/local/media/images/product/285-JUNG_ES2969-2NAUA-1.jpg new file mode 100644 index 00000000..a4216fef Binary files /dev/null and b/local/media/images/product/285-JUNG_ES2969-2NAUA-1.jpg differ diff --git a/local/media/images/product/286-JUNG_AL2969-2NAUAAN-1.jpg b/local/media/images/product/286-JUNG_AL2969-2NAUAAN-1.jpg new file mode 100644 index 00000000..b1a519ac Binary files /dev/null and b/local/media/images/product/286-JUNG_AL2969-2NAUAAN-1.jpg differ diff --git a/local/media/images/product/287-JUNG_GCR2969-2NAUA-1.jpg b/local/media/images/product/287-JUNG_GCR2969-2NAUA-1.jpg new file mode 100644 index 00000000..2987c83e Binary files /dev/null and b/local/media/images/product/287-JUNG_GCR2969-2NAUA-1.jpg differ diff --git a/local/media/images/product/288-JUNG_GO2969-2NAUA-1.jpg b/local/media/images/product/288-JUNG_GO2969-2NAUA-1.jpg new file mode 100644 index 00000000..1b71b690 Binary files /dev/null and b/local/media/images/product/288-JUNG_GO2969-2NAUA-1.jpg differ diff --git a/local/media/images/product/291-JUNG_LS990SAT-1.jpg b/local/media/images/product/291-JUNG_LS990SAT-1.jpg new file mode 100644 index 00000000..8fbff9e0 Binary files /dev/null and b/local/media/images/product/291-JUNG_LS990SAT-1.jpg differ diff --git a/local/media/images/product/292-Enjoliveur+prise+TV%2F-1.png b/local/media/images/product/292-Enjoliveur+prise+TV%2F-1.png new file mode 100644 index 00000000..69a122a6 Binary files /dev/null and b/local/media/images/product/292-Enjoliveur+prise+TV%2F-1.png differ diff --git a/local/media/images/product/293-JUNG_LS990SATLG-1.jpg b/local/media/images/product/293-JUNG_LS990SATLG-1.jpg new file mode 100644 index 00000000..c2482ecf Binary files /dev/null and b/local/media/images/product/293-JUNG_LS990SATLG-1.jpg differ diff --git a/local/media/images/product/294-JUNG_LS990SATSW-1.jpg b/local/media/images/product/294-JUNG_LS990SATSW-1.jpg new file mode 100644 index 00000000..9067ce51 Binary files /dev/null and b/local/media/images/product/294-JUNG_LS990SATSW-1.jpg differ diff --git a/local/media/images/product/295-JUNG_AL2990SAT-1.jpg b/local/media/images/product/295-JUNG_AL2990SAT-1.jpg new file mode 100644 index 00000000..33cfd84d Binary files /dev/null and b/local/media/images/product/295-JUNG_AL2990SAT-1.jpg differ diff --git a/local/media/images/product/296-JUNG_ES2990SAT-1.jpg b/local/media/images/product/296-JUNG_ES2990SAT-1.jpg new file mode 100644 index 00000000..fdd80ce8 Binary files /dev/null and b/local/media/images/product/296-JUNG_ES2990SAT-1.jpg differ diff --git a/local/media/images/product/297-JUNG_AL2990SATAN-1.jpg b/local/media/images/product/297-JUNG_AL2990SATAN-1.jpg new file mode 100644 index 00000000..57981b05 Binary files /dev/null and b/local/media/images/product/297-JUNG_AL2990SATAN-1.jpg differ diff --git a/local/media/images/product/298-JUNG_GO2990SAT-1.jpg b/local/media/images/product/298-JUNG_GO2990SAT-1.jpg new file mode 100644 index 00000000..3d206a35 Binary files /dev/null and b/local/media/images/product/298-JUNG_GO2990SAT-1.jpg differ diff --git a/local/media/images/product/299-JUNG_GCR2990SAT-1.jpg b/local/media/images/product/299-JUNG_GCR2990SAT-1.jpg new file mode 100644 index 00000000..0da9cdc4 Binary files /dev/null and b/local/media/images/product/299-JUNG_GCR2990SAT-1.jpg differ diff --git a/local/media/images/product/2a3bd0f1-5dda-42fa-84cf-50ba148537ee-2672.jpeg b/local/media/images/product/2a3bd0f1-5dda-42fa-84cf-50ba148537ee-2672.jpeg new file mode 100644 index 00000000..6ad4e7d7 Binary files /dev/null and b/local/media/images/product/2a3bd0f1-5dda-42fa-84cf-50ba148537ee-2672.jpeg differ diff --git a/local/media/images/product/3-Sonde+Acier-1.png b/local/media/images/product/3-Sonde+Acier-1.png new file mode 100644 index 00000000..21d14611 Binary files /dev/null and b/local/media/images/product/3-Sonde+Acier-1.png differ diff --git a/local/media/images/product/30-12-2862.png b/local/media/images/product/30-12-2862.png new file mode 100644 index 00000000..a1c967cd Binary files /dev/null and b/local/media/images/product/30-12-2862.png differ diff --git a/local/media/images/product/30-24-2859.png b/local/media/images/product/30-24-2859.png new file mode 100644 index 00000000..fc2501bc Binary files /dev/null and b/local/media/images/product/30-24-2859.png differ diff --git a/local/media/images/product/300-SCHNEIDER_UNICA-PCalu-1.jpg b/local/media/images/product/300-SCHNEIDER_UNICA-PCalu-1.jpg new file mode 100644 index 00000000..c6180a3a Binary files /dev/null and b/local/media/images/product/300-SCHNEIDER_UNICA-PCalu-1.jpg differ diff --git a/local/media/images/product/301-SCHNEIDER_UNICA-PCgraphite-1.jpg b/local/media/images/product/301-SCHNEIDER_UNICA-PCgraphite-1.jpg new file mode 100644 index 00000000..9bceac34 Binary files /dev/null and b/local/media/images/product/301-SCHNEIDER_UNICA-PCgraphite-1.jpg differ diff --git a/local/media/images/product/302-SCHNEIDER_UNICAenjoliveurPCgraphite-1.jpg b/local/media/images/product/302-SCHNEIDER_UNICAenjoliveurPCgraphite-1.jpg new file mode 100644 index 00000000..dd1b118f Binary files /dev/null and b/local/media/images/product/302-SCHNEIDER_UNICAenjoliveurPCgraphite-1.jpg differ diff --git a/local/media/images/product/303-SCHNEIDER_UNICAenjoliveurPCblanc-1.jpg b/local/media/images/product/303-SCHNEIDER_UNICAenjoliveurPCblanc-1.jpg new file mode 100644 index 00000000..148a2c62 Binary files /dev/null and b/local/media/images/product/303-SCHNEIDER_UNICAenjoliveurPCblanc-1.jpg differ diff --git a/local/media/images/product/304-SCHNEIDER_UNICAenjoliveurPCalu-1.jpg b/local/media/images/product/304-SCHNEIDER_UNICAenjoliveurPCalu-1.jpg new file mode 100644 index 00000000..506b30ba Binary files /dev/null and b/local/media/images/product/304-SCHNEIDER_UNICAenjoliveurPCalu-1.jpg differ diff --git a/local/media/images/product/305-SCHNEIDER_UNICAsupportentraxe71mm-1.jpg b/local/media/images/product/305-SCHNEIDER_UNICAsupportentraxe71mm-1.jpg new file mode 100644 index 00000000..760497d0 Binary files /dev/null and b/local/media/images/product/305-SCHNEIDER_UNICAsupportentraxe71mm-1.jpg differ diff --git a/local/media/images/product/306-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Agraph-1.jpg b/local/media/images/product/306-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Agraph-1.jpg new file mode 100644 index 00000000..a4c8978c Binary files /dev/null and b/local/media/images/product/306-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Agraph-1.jpg differ diff --git a/local/media/images/product/307-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Ablanc-1.jpg b/local/media/images/product/307-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Ablanc-1.jpg new file mode 100644 index 00000000..c8f9d37e Binary files /dev/null and b/local/media/images/product/307-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Ablanc-1.jpg differ diff --git a/local/media/images/product/308-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Aalu-1.jpg b/local/media/images/product/308-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Aalu-1.jpg new file mode 100644 index 00000000..749a3826 Binary files /dev/null and b/local/media/images/product/308-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Aalu-1.jpg differ diff --git a/local/media/images/product/309-SCHNEIDER_UNICApriseRJ45-2modules-cat6graph-1.jpg b/local/media/images/product/309-SCHNEIDER_UNICApriseRJ45-2modules-cat6graph-1.jpg new file mode 100644 index 00000000..869c0157 Binary files /dev/null and b/local/media/images/product/309-SCHNEIDER_UNICApriseRJ45-2modules-cat6graph-1.jpg differ diff --git a/local/media/images/product/310-SCHNEIDER_UNICApriseRJ45-2modules-cat6blanc-1.jpg b/local/media/images/product/310-SCHNEIDER_UNICApriseRJ45-2modules-cat6blanc-1.jpg new file mode 100644 index 00000000..9d67d8b0 Binary files /dev/null and b/local/media/images/product/310-SCHNEIDER_UNICApriseRJ45-2modules-cat6blanc-1.jpg differ diff --git a/local/media/images/product/311-SCHNEIDER_UNICApriseRJ45-2modules-cat6alu-1.jpg b/local/media/images/product/311-SCHNEIDER_UNICApriseRJ45-2modules-cat6alu-1.jpg new file mode 100644 index 00000000..fc360246 Binary files /dev/null and b/local/media/images/product/311-SCHNEIDER_UNICApriseRJ45-2modules-cat6alu-1.jpg differ diff --git a/local/media/images/product/312-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Agraph-1.jpg b/local/media/images/product/312-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Agraph-1.jpg new file mode 100644 index 00000000..a4c8978c Binary files /dev/null and b/local/media/images/product/312-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Agraph-1.jpg differ diff --git a/local/media/images/product/313-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Ablanc-1.jpg b/local/media/images/product/313-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Ablanc-1.jpg new file mode 100644 index 00000000..c8f9d37e Binary files /dev/null and b/local/media/images/product/313-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Ablanc-1.jpg differ diff --git a/local/media/images/product/314-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Aalu-1.jpg b/local/media/images/product/314-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Aalu-1.jpg new file mode 100644 index 00000000..749a3826 Binary files /dev/null and b/local/media/images/product/314-SCHNEIDER_UNICApriseRJ45-1module-cat6:6Aalu-1.jpg differ diff --git a/local/media/images/product/315-SCHNEIDER_UNICApriseRJ45-2modules-cat6graph-1.jpg b/local/media/images/product/315-SCHNEIDER_UNICApriseRJ45-2modules-cat6graph-1.jpg new file mode 100644 index 00000000..869c0157 Binary files /dev/null and b/local/media/images/product/315-SCHNEIDER_UNICApriseRJ45-2modules-cat6graph-1.jpg differ diff --git a/local/media/images/product/316-SCHNEIDER_UNICApriseRJ45-2modules-cat6blanc-1.jpg b/local/media/images/product/316-SCHNEIDER_UNICApriseRJ45-2modules-cat6blanc-1.jpg new file mode 100644 index 00000000..9d67d8b0 Binary files /dev/null and b/local/media/images/product/316-SCHNEIDER_UNICApriseRJ45-2modules-cat6blanc-1.jpg differ diff --git a/local/media/images/product/317-SCHNEIDER_UNICApriseRJ45-2modules-cat6alu-1.jpg b/local/media/images/product/317-SCHNEIDER_UNICApriseRJ45-2modules-cat6alu-1.jpg new file mode 100644 index 00000000..fc360246 Binary files /dev/null and b/local/media/images/product/317-SCHNEIDER_UNICApriseRJ45-2modules-cat6alu-1.jpg differ diff --git a/local/media/images/product/318-SCHNEIDER_UNICApriseTVgraph-1.jpg b/local/media/images/product/318-SCHNEIDER_UNICApriseTVgraph-1.jpg new file mode 100644 index 00000000..8e09ef56 Binary files /dev/null and b/local/media/images/product/318-SCHNEIDER_UNICApriseTVgraph-1.jpg differ diff --git a/local/media/images/product/32-SCHNEIDER_Connecteur_BUS_rouge:gris-1.jpg b/local/media/images/product/32-SCHNEIDER_Connecteur_BUS_rouge:gris-1.jpg new file mode 100644 index 00000000..7e0800dd Binary files /dev/null and b/local/media/images/product/32-SCHNEIDER_Connecteur_BUS_rouge:gris-1.jpg differ diff --git a/local/media/images/product/320-SCHNEIDER_UNICApriseTValu-1.jpg b/local/media/images/product/320-SCHNEIDER_UNICApriseTValu-1.jpg new file mode 100644 index 00000000..4e75487d Binary files /dev/null and b/local/media/images/product/320-SCHNEIDER_UNICApriseTValu-1.jpg differ diff --git a/local/media/images/product/321-SCHNEIDER_ALTIRA-PCsimpleblanc-1.jpg b/local/media/images/product/321-SCHNEIDER_ALTIRA-PCsimpleblanc-1.jpg new file mode 100644 index 00000000..e936bf3a Binary files /dev/null and b/local/media/images/product/321-SCHNEIDER_ALTIRA-PCsimpleblanc-1.jpg differ diff --git a/local/media/images/product/323-SCHNEIDER_ALTIRA-PCsimpleblancpol-1.jpg b/local/media/images/product/323-SCHNEIDER_ALTIRA-PCsimpleblancpol-1.jpg new file mode 100644 index 00000000..9f68f58c Binary files /dev/null and b/local/media/images/product/323-SCHNEIDER_ALTIRA-PCsimpleblancpol-1.jpg differ diff --git a/local/media/images/product/324-SCHNEIDER_ALTIRA-PCsimplealu-1.jpg b/local/media/images/product/324-SCHNEIDER_ALTIRA-PCsimplealu-1.jpg new file mode 100644 index 00000000..2179b182 Binary files /dev/null and b/local/media/images/product/324-SCHNEIDER_ALTIRA-PCsimplealu-1.jpg differ diff --git a/local/media/images/product/325-SCHNEIDER_ALTIRA-PCsimpleantimicrobe-1.jpg b/local/media/images/product/325-SCHNEIDER_ALTIRA-PCsimpleantimicrobe-1.jpg new file mode 100644 index 00000000..362fe647 Binary files /dev/null and b/local/media/images/product/325-SCHNEIDER_ALTIRA-PCsimpleantimicrobe-1.jpg differ diff --git a/local/media/images/product/326-SCHNEIDER_ALTIRApriseTVblancpol-1.jpg b/local/media/images/product/326-SCHNEIDER_ALTIRApriseTVblancpol-1.jpg new file mode 100644 index 00000000..cbb5ef4d Binary files /dev/null and b/local/media/images/product/326-SCHNEIDER_ALTIRApriseTVblancpol-1.jpg differ diff --git a/local/media/images/product/327-SCHNEIDER_ALTIRApriseTValu-1.jpg b/local/media/images/product/327-SCHNEIDER_ALTIRApriseTValu-1.jpg new file mode 100644 index 00000000..25f53de4 Binary files /dev/null and b/local/media/images/product/327-SCHNEIDER_ALTIRApriseTValu-1.jpg differ diff --git a/local/media/images/product/328-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg b/local/media/images/product/328-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..60017af8 Binary files /dev/null and b/local/media/images/product/328-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/329-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg b/local/media/images/product/329-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..60017af8 Binary files /dev/null and b/local/media/images/product/329-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/33-CABLE+KNX+2x2x0.8mm+-1.png b/local/media/images/product/33-CABLE+KNX+2x2x0.8mm+-1.png new file mode 100644 index 00000000..f4298f20 Binary files /dev/null and b/local/media/images/product/33-CABLE+KNX+2x2x0.8mm+-1.png differ diff --git a/local/media/images/product/330-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg b/local/media/images/product/330-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..60017af8 Binary files /dev/null and b/local/media/images/product/330-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/331-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg b/local/media/images/product/331-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..916bcfd7 Binary files /dev/null and b/local/media/images/product/331-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/332-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg b/local/media/images/product/332-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..916bcfd7 Binary files /dev/null and b/local/media/images/product/332-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/333-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg b/local/media/images/product/333-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..916bcfd7 Binary files /dev/null and b/local/media/images/product/333-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/334-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg b/local/media/images/product/334-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg new file mode 100644 index 00000000..2e8a08ac Binary files /dev/null and b/local/media/images/product/334-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg differ diff --git a/local/media/images/product/335-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg b/local/media/images/product/335-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg new file mode 100644 index 00000000..2e8a08ac Binary files /dev/null and b/local/media/images/product/335-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg differ diff --git a/local/media/images/product/336-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg b/local/media/images/product/336-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg new file mode 100644 index 00000000..2e8a08ac Binary files /dev/null and b/local/media/images/product/336-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPantimicrobe-1.jpg differ diff --git a/local/media/images/product/337-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg b/local/media/images/product/337-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg new file mode 100644 index 00000000..12964340 Binary files /dev/null and b/local/media/images/product/337-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg differ diff --git a/local/media/images/product/338-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg b/local/media/images/product/338-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg new file mode 100644 index 00000000..12964340 Binary files /dev/null and b/local/media/images/product/338-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg differ diff --git a/local/media/images/product/339-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg b/local/media/images/product/339-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg new file mode 100644 index 00000000..12964340 Binary files /dev/null and b/local/media/images/product/339-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPantimicrobe-1.jpg differ diff --git a/local/media/images/product/34-connecteur_bus_knx_gris_et_jaune_-1.jpg b/local/media/images/product/34-connecteur_bus_knx_gris_et_jaune_-1.jpg new file mode 100644 index 00000000..854c0c46 Binary files /dev/null and b/local/media/images/product/34-connecteur_bus_knx_gris_et_jaune_-1.jpg differ diff --git a/local/media/images/product/340-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg b/local/media/images/product/340-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..0e681135 Binary files /dev/null and b/local/media/images/product/340-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/341-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg b/local/media/images/product/341-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..0e681135 Binary files /dev/null and b/local/media/images/product/341-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/342-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg b/local/media/images/product/342-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..0e681135 Binary files /dev/null and b/local/media/images/product/342-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/343-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg b/local/media/images/product/343-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..465cd486 Binary files /dev/null and b/local/media/images/product/343-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/344-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg b/local/media/images/product/344-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..465cd486 Binary files /dev/null and b/local/media/images/product/344-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/345-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg b/local/media/images/product/345-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..465cd486 Binary files /dev/null and b/local/media/images/product/345-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/346-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg b/local/media/images/product/346-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..9d3bfaf1 Binary files /dev/null and b/local/media/images/product/346-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/347-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg b/local/media/images/product/347-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..9d3bfaf1 Binary files /dev/null and b/local/media/images/product/347-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/348-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg b/local/media/images/product/348-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..9d3bfaf1 Binary files /dev/null and b/local/media/images/product/348-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/349-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg b/local/media/images/product/349-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..004502a4 Binary files /dev/null and b/local/media/images/product/349-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/35-Zennio_Z38ialuminium1-1.jpg b/local/media/images/product/35-Zennio_Z38ialuminium1-1.jpg new file mode 100644 index 00000000..603ffbf6 Binary files /dev/null and b/local/media/images/product/35-Zennio_Z38ialuminium1-1.jpg differ diff --git a/local/media/images/product/350-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg b/local/media/images/product/350-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..004502a4 Binary files /dev/null and b/local/media/images/product/350-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/351-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg b/local/media/images/product/351-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..004502a4 Binary files /dev/null and b/local/media/images/product/351-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/352-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg b/local/media/images/product/352-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..916bcfd7 Binary files /dev/null and b/local/media/images/product/352-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/353-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg b/local/media/images/product/353-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..916bcfd7 Binary files /dev/null and b/local/media/images/product/353-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/354-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg b/local/media/images/product/354-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..60017af8 Binary files /dev/null and b/local/media/images/product/354-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/355-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg b/local/media/images/product/355-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg new file mode 100644 index 00000000..60017af8 Binary files /dev/null and b/local/media/images/product/355-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblancpol-1.jpg differ diff --git a/local/media/images/product/356-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg b/local/media/images/product/356-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..0e681135 Binary files /dev/null and b/local/media/images/product/356-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/357-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg b/local/media/images/product/357-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..0e681135 Binary files /dev/null and b/local/media/images/product/357-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/358-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg b/local/media/images/product/358-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..465cd486 Binary files /dev/null and b/local/media/images/product/358-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/359-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg b/local/media/images/product/359-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg new file mode 100644 index 00000000..465cd486 Binary files /dev/null and b/local/media/images/product/359-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPalu-1.jpg differ diff --git a/local/media/images/product/35e94e5f-9e1e-45f7-a94f-23e0c019a909-2645.jpeg b/local/media/images/product/35e94e5f-9e1e-45f7-a94f-23e0c019a909-2645.jpeg new file mode 100644 index 00000000..84a67524 Binary files /dev/null and b/local/media/images/product/35e94e5f-9e1e-45f7-a94f-23e0c019a909-2645.jpeg differ diff --git a/local/media/images/product/36-Ecran+tactile+Z38i+K-1.png b/local/media/images/product/36-Ecran+tactile+Z38i+K-1.png new file mode 100644 index 00000000..105e4e36 Binary files /dev/null and b/local/media/images/product/36-Ecran+tactile+Z38i+K-1.png differ diff --git a/local/media/images/product/360-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg b/local/media/images/product/360-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..9d3bfaf1 Binary files /dev/null and b/local/media/images/product/360-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/361-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg b/local/media/images/product/361-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..9d3bfaf1 Binary files /dev/null and b/local/media/images/product/361-SCHNEIDER_ALTIRApriseRJ45double-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/362-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg b/local/media/images/product/362-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..004502a4 Binary files /dev/null and b/local/media/images/product/362-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/363-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg b/local/media/images/product/363-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg new file mode 100644 index 00000000..004502a4 Binary files /dev/null and b/local/media/images/product/363-SCHNEIDER_ALTIRApriseRJ45-UTP:FTPblanc-1.jpg differ diff --git a/local/media/images/product/3653a63c-161a-47eb-9c38-4dea16c35317-2631.jpeg b/local/media/images/product/3653a63c-161a-47eb-9c38-4dea16c35317-2631.jpeg new file mode 100644 index 00000000..97d99a9b Binary files /dev/null and b/local/media/images/product/3653a63c-161a-47eb-9c38-4dea16c35317-2631.jpeg differ diff --git a/local/media/images/product/37-ZENNIO_Z41argent1-1.jpg b/local/media/images/product/37-ZENNIO_Z41argent1-1.jpg new file mode 100644 index 00000000..5e492572 Binary files /dev/null and b/local/media/images/product/37-ZENNIO_Z41argent1-1.jpg differ diff --git a/local/media/images/product/372-FSCGLOBAL-cableexterieur31000502D-1.jpg b/local/media/images/product/372-FSCGLOBAL-cableexterieur31000502D-1.jpg new file mode 100644 index 00000000..10826f4c Binary files /dev/null and b/local/media/images/product/372-FSCGLOBAL-cableexterieur31000502D-1.jpg differ diff --git a/local/media/images/product/377-Transformateur+24+VD-1.png b/local/media/images/product/377-Transformateur+24+VD-1.png new file mode 100644 index 00000000..2893c550 Binary files /dev/null and b/local/media/images/product/377-Transformateur+24+VD-1.png differ diff --git a/local/media/images/product/378-MeanWel_l-_SP-240-24-1.jpg b/local/media/images/product/378-MeanWel_l-_SP-240-24-1.jpg new file mode 100644 index 00000000..2545c4a3 Binary files /dev/null and b/local/media/images/product/378-MeanWel_l-_SP-240-24-1.jpg differ diff --git a/local/media/images/product/379-Variateur_1000W-1.jpg b/local/media/images/product/379-Variateur_1000W-1.jpg new file mode 100644 index 00000000..162c8a28 Binary files /dev/null and b/local/media/images/product/379-Variateur_1000W-1.jpg differ diff --git a/local/media/images/product/380-Variateur_150W-1.jpg b/local/media/images/product/380-Variateur_150W-1.jpg new file mode 100644 index 00000000..d061e8a5 Binary files /dev/null and b/local/media/images/product/380-Variateur_150W-1.jpg differ diff --git a/local/media/images/product/381-Variateur_250W-1.jpg b/local/media/images/product/381-Variateur_250W-1.jpg new file mode 100644 index 00000000..53bb0fae Binary files /dev/null and b/local/media/images/product/381-Variateur_250W-1.jpg differ diff --git a/local/media/images/product/382-Variateur_300W-1.jpg b/local/media/images/product/382-Variateur_300W-1.jpg new file mode 100644 index 00000000..3d2ef0bd Binary files /dev/null and b/local/media/images/product/382-Variateur_300W-1.jpg differ diff --git a/local/media/images/product/383-Variateur_500W-1.jpg b/local/media/images/product/383-Variateur_500W-1.jpg new file mode 100644 index 00000000..ccc29bf7 Binary files /dev/null and b/local/media/images/product/383-Variateur_500W-1.jpg differ diff --git a/local/media/images/product/384-SCHNEIDER-ALTIRAsupportfixation-1.jpg b/local/media/images/product/384-SCHNEIDER-ALTIRAsupportfixation-1.jpg new file mode 100644 index 00000000..392b58eb Binary files /dev/null and b/local/media/images/product/384-SCHNEIDER-ALTIRAsupportfixation-1.jpg differ diff --git a/local/media/images/product/385-SCHNEIDER_UNICAsupportentraxe71mm-1.jpg b/local/media/images/product/385-SCHNEIDER_UNICAsupportentraxe71mm-1.jpg new file mode 100644 index 00000000..760497d0 Binary files /dev/null and b/local/media/images/product/385-SCHNEIDER_UNICAsupportentraxe71mm-1.jpg differ diff --git a/local/media/images/product/386-SCHNEIDER-UNICAcadre1poste-chromebrillant-alu-1.jpg b/local/media/images/product/386-SCHNEIDER-UNICAcadre1poste-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..afdb1aa0 Binary files /dev/null and b/local/media/images/product/386-SCHNEIDER-UNICAcadre1poste-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/387-SCHNEIDER-UNICAcadre1poste-chromebrillant-graph-1.jpg b/local/media/images/product/387-SCHNEIDER-UNICAcadre1poste-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..a8fc27aa Binary files /dev/null and b/local/media/images/product/387-SCHNEIDER-UNICAcadre1poste-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/388-SCHNEIDER-UNICAcadre1poste-chromesatine-alu-1.jpg b/local/media/images/product/388-SCHNEIDER-UNICAcadre1poste-chromesatine-alu-1.jpg new file mode 100644 index 00000000..d8eb9826 Binary files /dev/null and b/local/media/images/product/388-SCHNEIDER-UNICAcadre1poste-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/389-SCHNEIDER-UNICAcadre1poste-chromesatine-graph-1.jpg b/local/media/images/product/389-SCHNEIDER-UNICAcadre1poste-chromesatine-graph-1.jpg new file mode 100644 index 00000000..866e1287 Binary files /dev/null and b/local/media/images/product/389-SCHNEIDER-UNICAcadre1poste-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/38a2652d-7261-4a16-8b71-4034fbd6a468-2691.jpeg b/local/media/images/product/38a2652d-7261-4a16-8b71-4034fbd6a468-2691.jpeg new file mode 100644 index 00000000..9f4903f9 Binary files /dev/null and b/local/media/images/product/38a2652d-7261-4a16-8b71-4034fbd6a468-2691.jpeg differ diff --git a/local/media/images/product/390-SCHNEIDER-UNICAcadre1poste-grismetal-alu-1.jpg b/local/media/images/product/390-SCHNEIDER-UNICAcadre1poste-grismetal-alu-1.jpg new file mode 100644 index 00000000..df6dba8d Binary files /dev/null and b/local/media/images/product/390-SCHNEIDER-UNICAcadre1poste-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/391-SCHNEIDER-UNICAcadre1poste-grismetal-graph-1.jpg b/local/media/images/product/391-SCHNEIDER-UNICAcadre1poste-grismetal-graph-1.jpg new file mode 100644 index 00000000..5002b912 Binary files /dev/null and b/local/media/images/product/391-SCHNEIDER-UNICAcadre1poste-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/392-SCHNEIDER-UNICAcadre1poste-nickelmat-alu-1.jpg b/local/media/images/product/392-SCHNEIDER-UNICAcadre1poste-nickelmat-alu-1.jpg new file mode 100644 index 00000000..e62ed116 Binary files /dev/null and b/local/media/images/product/392-SCHNEIDER-UNICAcadre1poste-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/393-SCHNEIDER-UNICAcadre1poste-nickelmat-graph-1.jpg b/local/media/images/product/393-SCHNEIDER-UNICAcadre1poste-nickelmat-graph-1.jpg new file mode 100644 index 00000000..76b91b86 Binary files /dev/null and b/local/media/images/product/393-SCHNEIDER-UNICAcadre1poste-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/394-SCHNEIDER-UNICAcadre1poste-noirrhodium-alu-1.jpg b/local/media/images/product/394-SCHNEIDER-UNICAcadre1poste-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..ece47b68 Binary files /dev/null and b/local/media/images/product/394-SCHNEIDER-UNICAcadre1poste-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/395-SCHNEIDER-UNICAcadre1poste-noirrhodium-graph-1.jpg b/local/media/images/product/395-SCHNEIDER-UNICAcadre1poste-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..00780958 Binary files /dev/null and b/local/media/images/product/395-SCHNEIDER-UNICAcadre1poste-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/396-SCHNEIDER-UNICAcadre1poste-cuivreonyx-alu-1.jpg b/local/media/images/product/396-SCHNEIDER-UNICAcadre1poste-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..a743ec5b Binary files /dev/null and b/local/media/images/product/396-SCHNEIDER-UNICAcadre1poste-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/397-SCHNEIDER-UNICAcadre1poste-cuivreonyx-graph-1.jpg b/local/media/images/product/397-SCHNEIDER-UNICAcadre1poste-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..3c8f13d0 Binary files /dev/null and b/local/media/images/product/397-SCHNEIDER-UNICAcadre1poste-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/398-SCHNEIDER-UNICAcadre1poste-blanctechno-alu-1.jpg b/local/media/images/product/398-SCHNEIDER-UNICAcadre1poste-blanctechno-alu-1.jpg new file mode 100644 index 00000000..dd8dd3ca Binary files /dev/null and b/local/media/images/product/398-SCHNEIDER-UNICAcadre1poste-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/399-SCHNEIDER-UNICAcadre1poste-blanctechno-graph-1.jpg b/local/media/images/product/399-SCHNEIDER-UNICAcadre1poste-blanctechno-graph-1.jpg new file mode 100644 index 00000000..a139a439 Binary files /dev/null and b/local/media/images/product/399-SCHNEIDER-UNICAcadre1poste-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/3a75fdff-3f1f-4176-94b9-5156ae556568-2646.jpeg b/local/media/images/product/3a75fdff-3f1f-4176-94b9-5156ae556568-2646.jpeg new file mode 100644 index 00000000..e165e9d6 Binary files /dev/null and b/local/media/images/product/3a75fdff-3f1f-4176-94b9-5156ae556568-2646.jpeg differ diff --git a/local/media/images/product/3b55d176-f111-4382-b45d-b4d548a44ec8-2683.jpeg b/local/media/images/product/3b55d176-f111-4382-b45d-b4d548a44ec8-2683.jpeg new file mode 100644 index 00000000..3d5b7654 Binary files /dev/null and b/local/media/images/product/3b55d176-f111-4382-b45d-b4d548a44ec8-2683.jpeg differ diff --git a/local/media/images/product/3f1eef37-3a6e-445e-80ae-8731cccd2699-2676.jpeg b/local/media/images/product/3f1eef37-3a6e-445e-80ae-8731cccd2699-2676.jpeg new file mode 100644 index 00000000..24077cab Binary files /dev/null and b/local/media/images/product/3f1eef37-3a6e-445e-80ae-8731cccd2699-2676.jpeg differ diff --git a/local/media/images/product/40-ZENNIO_cadre_z38i_noir-1.jpg b/local/media/images/product/40-ZENNIO_cadre_z38i_noir-1.jpg new file mode 100644 index 00000000..95b85309 Binary files /dev/null and b/local/media/images/product/40-ZENNIO_cadre_z38i_noir-1.jpg differ diff --git a/local/media/images/product/400-SCHNEIDER-UNICAcadre1poste-cerisier-alu-1.jpg b/local/media/images/product/400-SCHNEIDER-UNICAcadre1poste-cerisier-alu-1.jpg new file mode 100644 index 00000000..272fc4cb Binary files /dev/null and b/local/media/images/product/400-SCHNEIDER-UNICAcadre1poste-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/402-SCHNEIDER-UNICAcadre1poste-tabac-alu-1.jpg b/local/media/images/product/402-SCHNEIDER-UNICAcadre1poste-tabac-alu-1.jpg new file mode 100644 index 00000000..97ecd5c8 Binary files /dev/null and b/local/media/images/product/402-SCHNEIDER-UNICAcadre1poste-tabac-alu-1.jpg differ diff --git a/local/media/images/product/404-SCHNEIDER-UNICAcadre1poste-wenge-alu-1.jpg b/local/media/images/product/404-SCHNEIDER-UNICAcadre1poste-wenge-alu-1.jpg new file mode 100644 index 00000000..563da000 Binary files /dev/null and b/local/media/images/product/404-SCHNEIDER-UNICAcadre1poste-wenge-alu-1.jpg differ diff --git a/local/media/images/product/406-SCHNEIDER-UNICAcadre2postes-chromebrillant-alu-1.jpg b/local/media/images/product/406-SCHNEIDER-UNICAcadre2postes-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..4969e629 Binary files /dev/null and b/local/media/images/product/406-SCHNEIDER-UNICAcadre2postes-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/407-SCHNEIDER-UNICAcadre2postes-chromebrillant-graph-1.jpg b/local/media/images/product/407-SCHNEIDER-UNICAcadre2postes-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..2ba2d328 Binary files /dev/null and b/local/media/images/product/407-SCHNEIDER-UNICAcadre2postes-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/408-SCHNEIDER-UNICAcadre2postes-chromesatine-alu-1.jpg b/local/media/images/product/408-SCHNEIDER-UNICAcadre2postes-chromesatine-alu-1.jpg new file mode 100644 index 00000000..e913b83e Binary files /dev/null and b/local/media/images/product/408-SCHNEIDER-UNICAcadre2postes-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/409-SCHNEIDER-UNICAcadre2postes-chromesatine-graph-1.jpg b/local/media/images/product/409-SCHNEIDER-UNICAcadre2postes-chromesatine-graph-1.jpg new file mode 100644 index 00000000..44bc405b Binary files /dev/null and b/local/media/images/product/409-SCHNEIDER-UNICAcadre2postes-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/41-ZENNIO_cadre_z38i_blanc-1.jpg b/local/media/images/product/41-ZENNIO_cadre_z38i_blanc-1.jpg new file mode 100644 index 00000000..7e57039e Binary files /dev/null and b/local/media/images/product/41-ZENNIO_cadre_z38i_blanc-1.jpg differ diff --git a/local/media/images/product/410-SCHNEIDER-UNICAcadre2postes-grismetal-alu-1.jpg b/local/media/images/product/410-SCHNEIDER-UNICAcadre2postes-grismetal-alu-1.jpg new file mode 100644 index 00000000..f9a7e74b Binary files /dev/null and b/local/media/images/product/410-SCHNEIDER-UNICAcadre2postes-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/411-SCHNEIDER-UNICAcadre2postes-grismetal-graph-1.jpg b/local/media/images/product/411-SCHNEIDER-UNICAcadre2postes-grismetal-graph-1.jpg new file mode 100644 index 00000000..9c7b2bf0 Binary files /dev/null and b/local/media/images/product/411-SCHNEIDER-UNICAcadre2postes-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/412-SCHNEIDER-UNICAcadre2postes-nickelmat-alu-1.jpg b/local/media/images/product/412-SCHNEIDER-UNICAcadre2postes-nickelmat-alu-1.jpg new file mode 100644 index 00000000..bb0f45e1 Binary files /dev/null and b/local/media/images/product/412-SCHNEIDER-UNICAcadre2postes-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/413-SCHNEIDER-UNICAcadre2postes-nickelmat-graph-1.jpg b/local/media/images/product/413-SCHNEIDER-UNICAcadre2postes-nickelmat-graph-1.jpg new file mode 100644 index 00000000..0e3682cc Binary files /dev/null and b/local/media/images/product/413-SCHNEIDER-UNICAcadre2postes-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/414-SCHNEIDER-UNICAcadre2postes-noirrhodium-alu-1.jpg b/local/media/images/product/414-SCHNEIDER-UNICAcadre2postes-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..f75baa43 Binary files /dev/null and b/local/media/images/product/414-SCHNEIDER-UNICAcadre2postes-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/415-SCHNEIDER-UNICAcadre2postes-noirrhodium-graph-1.jpg b/local/media/images/product/415-SCHNEIDER-UNICAcadre2postes-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..103d6e1f Binary files /dev/null and b/local/media/images/product/415-SCHNEIDER-UNICAcadre2postes-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/416-SCHNEIDER-UNICAcadre2postes-cuivreonyx-alu-1.jpg b/local/media/images/product/416-SCHNEIDER-UNICAcadre2postes-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..466a0c03 Binary files /dev/null and b/local/media/images/product/416-SCHNEIDER-UNICAcadre2postes-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/417-SCHNEIDER-UNICAcadre2postes-cuivreonyx-graph-1.jpg b/local/media/images/product/417-SCHNEIDER-UNICAcadre2postes-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..6b230f30 Binary files /dev/null and b/local/media/images/product/417-SCHNEIDER-UNICAcadre2postes-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/418-SCHNEIDER-UNICAcadre2postes-blanctechno-alu-1.jpg b/local/media/images/product/418-SCHNEIDER-UNICAcadre2postes-blanctechno-alu-1.jpg new file mode 100644 index 00000000..13276440 Binary files /dev/null and b/local/media/images/product/418-SCHNEIDER-UNICAcadre2postes-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/419-SCHNEIDER-UNICAcadre2postes-blanctechno-graph-1.jpg b/local/media/images/product/419-SCHNEIDER-UNICAcadre2postes-blanctechno-graph-1.jpg new file mode 100644 index 00000000..f1e11847 Binary files /dev/null and b/local/media/images/product/419-SCHNEIDER-UNICAcadre2postes-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/42-ZENNIO_cadre_z38i_gris-1.jpg b/local/media/images/product/42-ZENNIO_cadre_z38i_gris-1.jpg new file mode 100644 index 00000000..6438ea96 Binary files /dev/null and b/local/media/images/product/42-ZENNIO_cadre_z38i_gris-1.jpg differ diff --git a/local/media/images/product/420-SCHNEIDER-UNICAcadre2postes-cerisier-alu-1.jpg b/local/media/images/product/420-SCHNEIDER-UNICAcadre2postes-cerisier-alu-1.jpg new file mode 100644 index 00000000..eb2ee9fa Binary files /dev/null and b/local/media/images/product/420-SCHNEIDER-UNICAcadre2postes-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/422-SCHNEIDER-UNICAcadre2postes-tabac-alu-1.jpg b/local/media/images/product/422-SCHNEIDER-UNICAcadre2postes-tabac-alu-1.jpg new file mode 100644 index 00000000..8f8ca60b Binary files /dev/null and b/local/media/images/product/422-SCHNEIDER-UNICAcadre2postes-tabac-alu-1.jpg differ diff --git a/local/media/images/product/424-SCHNEIDER-UNICAcadre2postes-wenge-alu-1.jpg b/local/media/images/product/424-SCHNEIDER-UNICAcadre2postes-wenge-alu-1.jpg new file mode 100644 index 00000000..e5c3c913 Binary files /dev/null and b/local/media/images/product/424-SCHNEIDER-UNICAcadre2postes-wenge-alu-1.jpg differ diff --git a/local/media/images/product/446-SCHNEIDER-UNICAcadre3postes-chromebrillant-alu-1.jpg b/local/media/images/product/446-SCHNEIDER-UNICAcadre3postes-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..f0971a83 Binary files /dev/null and b/local/media/images/product/446-SCHNEIDER-UNICAcadre3postes-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/447-SCHNEIDER-UNICAcadre3postes-chromebrillant-graph-1.jpg b/local/media/images/product/447-SCHNEIDER-UNICAcadre3postes-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..069eb1b9 Binary files /dev/null and b/local/media/images/product/447-SCHNEIDER-UNICAcadre3postes-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/448-SCHNEIDER-UNICAcadre3postes-chromesatine-alu-1.jpg b/local/media/images/product/448-SCHNEIDER-UNICAcadre3postes-chromesatine-alu-1.jpg new file mode 100644 index 00000000..c77ced33 Binary files /dev/null and b/local/media/images/product/448-SCHNEIDER-UNICAcadre3postes-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/449-SCHNEIDER-UNICAcadre3postes-chromesatine-graph-1.jpg b/local/media/images/product/449-SCHNEIDER-UNICAcadre3postes-chromesatine-graph-1.jpg new file mode 100644 index 00000000..af021ffc Binary files /dev/null and b/local/media/images/product/449-SCHNEIDER-UNICAcadre3postes-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/45-klic_di-1.jpg b/local/media/images/product/45-klic_di-1.jpg new file mode 100644 index 00000000..211b4fa2 Binary files /dev/null and b/local/media/images/product/45-klic_di-1.jpg differ diff --git a/local/media/images/product/450-SCHNEIDER-UNICAcadre3postes-grismetal-alu-1.jpg b/local/media/images/product/450-SCHNEIDER-UNICAcadre3postes-grismetal-alu-1.jpg new file mode 100644 index 00000000..612f6380 Binary files /dev/null and b/local/media/images/product/450-SCHNEIDER-UNICAcadre3postes-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/451-SCHNEIDER-UNICAcadre3postes-grismetal-graph-1.jpg b/local/media/images/product/451-SCHNEIDER-UNICAcadre3postes-grismetal-graph-1.jpg new file mode 100644 index 00000000..8c214339 Binary files /dev/null and b/local/media/images/product/451-SCHNEIDER-UNICAcadre3postes-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/452-SCHNEIDER-UNICAcadre3postes-nickelmat-alu-1.jpg b/local/media/images/product/452-SCHNEIDER-UNICAcadre3postes-nickelmat-alu-1.jpg new file mode 100644 index 00000000..b8229350 Binary files /dev/null and b/local/media/images/product/452-SCHNEIDER-UNICAcadre3postes-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/453-SCHNEIDER-UNICAcadre3postes-nickelmat-graph-1.jpg b/local/media/images/product/453-SCHNEIDER-UNICAcadre3postes-nickelmat-graph-1.jpg new file mode 100644 index 00000000..f2c35cb6 Binary files /dev/null and b/local/media/images/product/453-SCHNEIDER-UNICAcadre3postes-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/454-SCHNEIDER-UNICAcadre3postes-noirrhodium-alu-1.jpg b/local/media/images/product/454-SCHNEIDER-UNICAcadre3postes-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..ed9e3d6e Binary files /dev/null and b/local/media/images/product/454-SCHNEIDER-UNICAcadre3postes-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/455-SCHNEIDER-UNICAcadre3postes-noirrhodium-graph-1.jpg b/local/media/images/product/455-SCHNEIDER-UNICAcadre3postes-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..7abb6267 Binary files /dev/null and b/local/media/images/product/455-SCHNEIDER-UNICAcadre3postes-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/456-SCHNEIDER-UNICAcadre3postes-cuivreonyx-alu-1.jpg b/local/media/images/product/456-SCHNEIDER-UNICAcadre3postes-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..df24411a Binary files /dev/null and b/local/media/images/product/456-SCHNEIDER-UNICAcadre3postes-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/457-SCHNEIDER-UNICAcadre3postes-cuivreonyx-graph-1.jpg b/local/media/images/product/457-SCHNEIDER-UNICAcadre3postes-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..554ec858 Binary files /dev/null and b/local/media/images/product/457-SCHNEIDER-UNICAcadre3postes-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/458-SCHNEIDER-UNICAcadre3postes-blanctechno-alu-1.jpg b/local/media/images/product/458-SCHNEIDER-UNICAcadre3postes-blanctechno-alu-1.jpg new file mode 100644 index 00000000..bb1f7395 Binary files /dev/null and b/local/media/images/product/458-SCHNEIDER-UNICAcadre3postes-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/459-SCHNEIDER-UNICAcadre3postes-blanctechno-graph-1.jpg b/local/media/images/product/459-SCHNEIDER-UNICAcadre3postes-blanctechno-graph-1.jpg new file mode 100644 index 00000000..a554bd6c Binary files /dev/null and b/local/media/images/product/459-SCHNEIDER-UNICAcadre3postes-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/460-SCHNEIDER-UNICAcadre3postes-cerisier-alu-1.jpg b/local/media/images/product/460-SCHNEIDER-UNICAcadre3postes-cerisier-alu-1.jpg new file mode 100644 index 00000000..4bb39b84 Binary files /dev/null and b/local/media/images/product/460-SCHNEIDER-UNICAcadre3postes-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/462-SCHNEIDER-UNICAcadre3postes-tabac-alu-1.jpg b/local/media/images/product/462-SCHNEIDER-UNICAcadre3postes-tabac-alu-1.jpg new file mode 100644 index 00000000..eeb2f30c Binary files /dev/null and b/local/media/images/product/462-SCHNEIDER-UNICAcadre3postes-tabac-alu-1.jpg differ diff --git a/local/media/images/product/464-SCHNEIDER-UNICAcadre3postes-wenge-alu-1.jpg b/local/media/images/product/464-SCHNEIDER-UNICAcadre3postes-wenge-alu-1.jpg new file mode 100644 index 00000000..39215f28 Binary files /dev/null and b/local/media/images/product/464-SCHNEIDER-UNICAcadre3postes-wenge-alu-1.jpg differ diff --git a/local/media/images/product/465cb6e8-15ad-4002-a30a-8c385fa25fb3-2670.jpeg b/local/media/images/product/465cb6e8-15ad-4002-a30a-8c385fa25fb3-2670.jpeg new file mode 100644 index 00000000..cd176d59 Binary files /dev/null and b/local/media/images/product/465cb6e8-15ad-4002-a30a-8c385fa25fb3-2670.jpeg differ diff --git a/local/media/images/product/466-SCHNEIDER-UNICAcadre4postes-chromebrillant-alu-1.jpg b/local/media/images/product/466-SCHNEIDER-UNICAcadre4postes-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..147ca38f Binary files /dev/null and b/local/media/images/product/466-SCHNEIDER-UNICAcadre4postes-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/467-SCHNEIDER-UNICAcadre4postes-chromebrillant-graph-1.jpg b/local/media/images/product/467-SCHNEIDER-UNICAcadre4postes-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..f46c47e2 Binary files /dev/null and b/local/media/images/product/467-SCHNEIDER-UNICAcadre4postes-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/468-SCHNEIDER-UNICAcadre4postes-chromesatine-alu-1.jpg b/local/media/images/product/468-SCHNEIDER-UNICAcadre4postes-chromesatine-alu-1.jpg new file mode 100644 index 00000000..ee3ae818 Binary files /dev/null and b/local/media/images/product/468-SCHNEIDER-UNICAcadre4postes-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/469-SCHNEIDER-UNICAcadre4postes-chromesatine-graph-1.jpg b/local/media/images/product/469-SCHNEIDER-UNICAcadre4postes-chromesatine-graph-1.jpg new file mode 100644 index 00000000..889dc6f6 Binary files /dev/null and b/local/media/images/product/469-SCHNEIDER-UNICAcadre4postes-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/470-SCHNEIDER-UNICAcadre4postes-grismetal-alu-1.jpg b/local/media/images/product/470-SCHNEIDER-UNICAcadre4postes-grismetal-alu-1.jpg new file mode 100644 index 00000000..1b6d8c8a Binary files /dev/null and b/local/media/images/product/470-SCHNEIDER-UNICAcadre4postes-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/471-SCHNEIDER-UNICAcadre4postes-grismetal-graph-1.jpg b/local/media/images/product/471-SCHNEIDER-UNICAcadre4postes-grismetal-graph-1.jpg new file mode 100644 index 00000000..eb77410a Binary files /dev/null and b/local/media/images/product/471-SCHNEIDER-UNICAcadre4postes-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/472-SCHNEIDER-UNICAcadre4postes-nickelmat-alu-1.jpg b/local/media/images/product/472-SCHNEIDER-UNICAcadre4postes-nickelmat-alu-1.jpg new file mode 100644 index 00000000..4f3d36e0 Binary files /dev/null and b/local/media/images/product/472-SCHNEIDER-UNICAcadre4postes-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/473-SCHNEIDER-UNICAcadre4postes-nickelmat-graph-1.jpg b/local/media/images/product/473-SCHNEIDER-UNICAcadre4postes-nickelmat-graph-1.jpg new file mode 100644 index 00000000..b57213ed Binary files /dev/null and b/local/media/images/product/473-SCHNEIDER-UNICAcadre4postes-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/474-SCHNEIDER-UNICAcadre4postes-noirrhodium-alu-1.jpg b/local/media/images/product/474-SCHNEIDER-UNICAcadre4postes-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..936ee8c6 Binary files /dev/null and b/local/media/images/product/474-SCHNEIDER-UNICAcadre4postes-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/475-SCHNEIDER-UNICAcadre4postes-noirrhodium-graph-1.jpg b/local/media/images/product/475-SCHNEIDER-UNICAcadre4postes-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..e518db8f Binary files /dev/null and b/local/media/images/product/475-SCHNEIDER-UNICAcadre4postes-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/476-SCHNEIDER-UNICAcadre4postes-cuivreonyx-alu-1.jpg b/local/media/images/product/476-SCHNEIDER-UNICAcadre4postes-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..6721dea6 Binary files /dev/null and b/local/media/images/product/476-SCHNEIDER-UNICAcadre4postes-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/477-SCHNEIDER-UNICAcadre4postes-cuivreonyx-graph-1.jpg b/local/media/images/product/477-SCHNEIDER-UNICAcadre4postes-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..e82b43b5 Binary files /dev/null and b/local/media/images/product/477-SCHNEIDER-UNICAcadre4postes-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/478-SCHNEIDER-UNICAcadre4postes-blanctechno-alu-1.jpg b/local/media/images/product/478-SCHNEIDER-UNICAcadre4postes-blanctechno-alu-1.jpg new file mode 100644 index 00000000..ec41b107 Binary files /dev/null and b/local/media/images/product/478-SCHNEIDER-UNICAcadre4postes-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/479-SCHNEIDER-UNICAcadre4postes-blanctechno-graph-1.jpg b/local/media/images/product/479-SCHNEIDER-UNICAcadre4postes-blanctechno-graph-1.jpg new file mode 100644 index 00000000..8c491d00 Binary files /dev/null and b/local/media/images/product/479-SCHNEIDER-UNICAcadre4postes-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/48-ZENNIO_ConnecteurMAX6-1.jpg b/local/media/images/product/48-ZENNIO_ConnecteurMAX6-1.jpg new file mode 100644 index 00000000..b68258d3 Binary files /dev/null and b/local/media/images/product/48-ZENNIO_ConnecteurMAX6-1.jpg differ diff --git a/local/media/images/product/480-SCHNEIDER-UNICAcadre4postes-cerisier-alu-1.jpg b/local/media/images/product/480-SCHNEIDER-UNICAcadre4postes-cerisier-alu-1.jpg new file mode 100644 index 00000000..c7491e66 Binary files /dev/null and b/local/media/images/product/480-SCHNEIDER-UNICAcadre4postes-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/482-SCHNEIDER-UNICAcadre4postes-tabac-alu-1.jpg b/local/media/images/product/482-SCHNEIDER-UNICAcadre4postes-tabac-alu-1.jpg new file mode 100644 index 00000000..8bb21458 Binary files /dev/null and b/local/media/images/product/482-SCHNEIDER-UNICAcadre4postes-tabac-alu-1.jpg differ diff --git a/local/media/images/product/484-SCHNEIDER-UNICAcadre4postes-wenge-alu-1.jpg b/local/media/images/product/484-SCHNEIDER-UNICAcadre4postes-wenge-alu-1.jpg new file mode 100644 index 00000000..02459fc2 Binary files /dev/null and b/local/media/images/product/484-SCHNEIDER-UNICAcadre4postes-wenge-alu-1.jpg differ diff --git a/local/media/images/product/486-SCHNEIDER-UNICAcadre2postesV-chromebrillant-alu-1.jpg b/local/media/images/product/486-SCHNEIDER-UNICAcadre2postesV-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..861d1717 Binary files /dev/null and b/local/media/images/product/486-SCHNEIDER-UNICAcadre2postesV-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/487-SCHNEIDER-UNICAcadre2postesV-chromebrillant-graph-1.jpg b/local/media/images/product/487-SCHNEIDER-UNICAcadre2postesV-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..8b24d1cb Binary files /dev/null and b/local/media/images/product/487-SCHNEIDER-UNICAcadre2postesV-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/488-SCHNEIDER-UNICAcadre2postesV-chromesatine-alu-1.jpg b/local/media/images/product/488-SCHNEIDER-UNICAcadre2postesV-chromesatine-alu-1.jpg new file mode 100644 index 00000000..280ac520 Binary files /dev/null and b/local/media/images/product/488-SCHNEIDER-UNICAcadre2postesV-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/489-SCHNEIDER-UNICAcadre2postesV-chromesatine-graph-1.jpg b/local/media/images/product/489-SCHNEIDER-UNICAcadre2postesV-chromesatine-graph-1.jpg new file mode 100644 index 00000000..0dd8ef60 Binary files /dev/null and b/local/media/images/product/489-SCHNEIDER-UNICAcadre2postesV-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/490-SCHNEIDER-UNICAcadre2postesV-grismetal-alu-1.jpg b/local/media/images/product/490-SCHNEIDER-UNICAcadre2postesV-grismetal-alu-1.jpg new file mode 100644 index 00000000..e520d076 Binary files /dev/null and b/local/media/images/product/490-SCHNEIDER-UNICAcadre2postesV-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/491-SCHNEIDER-UNICAcadre2postesV-grismetal-graph-1.jpg b/local/media/images/product/491-SCHNEIDER-UNICAcadre2postesV-grismetal-graph-1.jpg new file mode 100644 index 00000000..f69bde88 Binary files /dev/null and b/local/media/images/product/491-SCHNEIDER-UNICAcadre2postesV-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/492-SCHNEIDER-UNICAcadre2postesV-nickelmat-alu-1.jpg b/local/media/images/product/492-SCHNEIDER-UNICAcadre2postesV-nickelmat-alu-1.jpg new file mode 100644 index 00000000..25562fc3 Binary files /dev/null and b/local/media/images/product/492-SCHNEIDER-UNICAcadre2postesV-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/493-SCHNEIDER-UNICAcadre2postesV-nickelmat-graph-1.jpg b/local/media/images/product/493-SCHNEIDER-UNICAcadre2postesV-nickelmat-graph-1.jpg new file mode 100644 index 00000000..0e3682cc Binary files /dev/null and b/local/media/images/product/493-SCHNEIDER-UNICAcadre2postesV-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/494-SCHNEIDER-UNICAcadre2postesV-noirrhodium-alu-1.jpg b/local/media/images/product/494-SCHNEIDER-UNICAcadre2postesV-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..43e782b1 Binary files /dev/null and b/local/media/images/product/494-SCHNEIDER-UNICAcadre2postesV-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/495-SCHNEIDER-UNICAcadre2postesV-noirrhodium-graph-1.jpg b/local/media/images/product/495-SCHNEIDER-UNICAcadre2postesV-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..442d1912 Binary files /dev/null and b/local/media/images/product/495-SCHNEIDER-UNICAcadre2postesV-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/496-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-alu-1.jpg b/local/media/images/product/496-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..c0db2823 Binary files /dev/null and b/local/media/images/product/496-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/497-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-graph-1.jpg b/local/media/images/product/497-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..119981cf Binary files /dev/null and b/local/media/images/product/497-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/498-SCHNEIDER-UNICAcadre2postesV-blanctechno-alu-1.jpg b/local/media/images/product/498-SCHNEIDER-UNICAcadre2postesV-blanctechno-alu-1.jpg new file mode 100644 index 00000000..dfbac7a2 Binary files /dev/null and b/local/media/images/product/498-SCHNEIDER-UNICAcadre2postesV-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/499-SCHNEIDER-UNICAcadre2postesV-blanctechno-graph-1.jpg b/local/media/images/product/499-SCHNEIDER-UNICAcadre2postesV-blanctechno-graph-1.jpg new file mode 100644 index 00000000..407cfb05 Binary files /dev/null and b/local/media/images/product/499-SCHNEIDER-UNICAcadre2postesV-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/4e336dd5-2284-4978-b9f6-059cdf230819-2648.jpeg b/local/media/images/product/4e336dd5-2284-4978-b9f6-059cdf230819-2648.jpeg new file mode 100644 index 00000000..bc686231 Binary files /dev/null and b/local/media/images/product/4e336dd5-2284-4978-b9f6-059cdf230819-2648.jpeg differ diff --git a/local/media/images/product/5-ZENNIO_Z41noir2-1.jpg b/local/media/images/product/5-ZENNIO_Z41noir2-1.jpg new file mode 100644 index 00000000..8cf41cb7 Binary files /dev/null and b/local/media/images/product/5-ZENNIO_Z41noir2-1.jpg differ diff --git a/local/media/images/product/500-SCHNEIDER-UNICAcadre2postesV-cerisier-alu-1.jpg b/local/media/images/product/500-SCHNEIDER-UNICAcadre2postesV-cerisier-alu-1.jpg new file mode 100644 index 00000000..ff18a684 Binary files /dev/null and b/local/media/images/product/500-SCHNEIDER-UNICAcadre2postesV-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/502-SCHNEIDER-UNICAcadre2postesV-wenge-alu-1.jpg b/local/media/images/product/502-SCHNEIDER-UNICAcadre2postesV-wenge-alu-1.jpg new file mode 100644 index 00000000..7e201ee4 Binary files /dev/null and b/local/media/images/product/502-SCHNEIDER-UNICAcadre2postesV-wenge-alu-1.jpg differ diff --git a/local/media/images/product/504-SCHNEIDER-UNICAcadre2postesV-tabac-alu-1.jpg b/local/media/images/product/504-SCHNEIDER-UNICAcadre2postesV-tabac-alu-1.jpg new file mode 100644 index 00000000..82e9b446 Binary files /dev/null and b/local/media/images/product/504-SCHNEIDER-UNICAcadre2postesV-tabac-alu-1.jpg differ diff --git a/local/media/images/product/50417-10113843-2405.jpg b/local/media/images/product/50417-10113843-2405.jpg new file mode 100644 index 00000000..c5a214cd Binary files /dev/null and b/local/media/images/product/50417-10113843-2405.jpg differ diff --git a/local/media/images/product/506-SCHNEIDER-UNICAcadre2postesV-chromebrillant-alu-1.jpg b/local/media/images/product/506-SCHNEIDER-UNICAcadre2postesV-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..861d1717 Binary files /dev/null and b/local/media/images/product/506-SCHNEIDER-UNICAcadre2postesV-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/506u-2435.png b/local/media/images/product/506u-2435.png new file mode 100644 index 00000000..0547f7a7 Binary files /dev/null and b/local/media/images/product/506u-2435.png differ diff --git a/local/media/images/product/507-SCHNEIDER-UNICAcadre2postesV-chromebrillant-graph-1.jpg b/local/media/images/product/507-SCHNEIDER-UNICAcadre2postesV-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..8b24d1cb Binary files /dev/null and b/local/media/images/product/507-SCHNEIDER-UNICAcadre2postesV-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/508-SCHNEIDER-UNICAcadre2postesV-chromesatine-alu-1.jpg b/local/media/images/product/508-SCHNEIDER-UNICAcadre2postesV-chromesatine-alu-1.jpg new file mode 100644 index 00000000..280ac520 Binary files /dev/null and b/local/media/images/product/508-SCHNEIDER-UNICAcadre2postesV-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/509-SCHNEIDER-UNICAcadre2postesV-chromesatine-graph-1.jpg b/local/media/images/product/509-SCHNEIDER-UNICAcadre2postesV-chromesatine-graph-1.jpg new file mode 100644 index 00000000..0dd8ef60 Binary files /dev/null and b/local/media/images/product/509-SCHNEIDER-UNICAcadre2postesV-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/51-ZENNIO_ZN1AC6S381-1.jpg b/local/media/images/product/51-ZENNIO_ZN1AC6S381-1.jpg new file mode 100644 index 00000000..a340ce87 Binary files /dev/null and b/local/media/images/product/51-ZENNIO_ZN1AC6S381-1.jpg differ diff --git a/local/media/images/product/510-SCHNEIDER-UNICAcadre2postesV-grismetal-alu-1.jpg b/local/media/images/product/510-SCHNEIDER-UNICAcadre2postesV-grismetal-alu-1.jpg new file mode 100644 index 00000000..e520d076 Binary files /dev/null and b/local/media/images/product/510-SCHNEIDER-UNICAcadre2postesV-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/511-SCHNEIDER-UNICAcadre2postesV-grismetal-graph-1.jpg b/local/media/images/product/511-SCHNEIDER-UNICAcadre2postesV-grismetal-graph-1.jpg new file mode 100644 index 00000000..f69bde88 Binary files /dev/null and b/local/media/images/product/511-SCHNEIDER-UNICAcadre2postesV-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/512-SCHNEIDER-UNICAcadre2postesV-nickelmat-alu-1.jpg b/local/media/images/product/512-SCHNEIDER-UNICAcadre2postesV-nickelmat-alu-1.jpg new file mode 100644 index 00000000..25562fc3 Binary files /dev/null and b/local/media/images/product/512-SCHNEIDER-UNICAcadre2postesV-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/513-SCHNEIDER-UNICAcadre2postesV-nickelmat-graph-1.jpg b/local/media/images/product/513-SCHNEIDER-UNICAcadre2postesV-nickelmat-graph-1.jpg new file mode 100644 index 00000000..0e3682cc Binary files /dev/null and b/local/media/images/product/513-SCHNEIDER-UNICAcadre2postesV-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/514-SCHNEIDER-UNICAcadre2postesV-noirrhodium-alu-1.jpg b/local/media/images/product/514-SCHNEIDER-UNICAcadre2postesV-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..43e782b1 Binary files /dev/null and b/local/media/images/product/514-SCHNEIDER-UNICAcadre2postesV-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/515-SCHNEIDER-UNICAcadre2postesV-noirrhodium-graph-1.jpg b/local/media/images/product/515-SCHNEIDER-UNICAcadre2postesV-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..442d1912 Binary files /dev/null and b/local/media/images/product/515-SCHNEIDER-UNICAcadre2postesV-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/516-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-alu-1.jpg b/local/media/images/product/516-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..c0db2823 Binary files /dev/null and b/local/media/images/product/516-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/517-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-graph-1.jpg b/local/media/images/product/517-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..119981cf Binary files /dev/null and b/local/media/images/product/517-SCHNEIDER-UNICAcadre2postesV-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/518-SCHNEIDER-UNICAcadre2postesV-blanctechno-alu-1.jpg b/local/media/images/product/518-SCHNEIDER-UNICAcadre2postesV-blanctechno-alu-1.jpg new file mode 100644 index 00000000..dfbac7a2 Binary files /dev/null and b/local/media/images/product/518-SCHNEIDER-UNICAcadre2postesV-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/519-SCHNEIDER-UNICAcadre2postesV-blanctechno-graph-1.jpg b/local/media/images/product/519-SCHNEIDER-UNICAcadre2postesV-blanctechno-graph-1.jpg new file mode 100644 index 00000000..407cfb05 Binary files /dev/null and b/local/media/images/product/519-SCHNEIDER-UNICAcadre2postesV-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/51f41eb2-9cbb-4401-86ce-143ac89183ce-2635.jpeg b/local/media/images/product/51f41eb2-9cbb-4401-86ce-143ac89183ce-2635.jpeg new file mode 100644 index 00000000..737a8723 Binary files /dev/null and b/local/media/images/product/51f41eb2-9cbb-4401-86ce-143ac89183ce-2635.jpeg differ diff --git a/local/media/images/product/52-ZENNIO_ConnecteurMAX6-1.jpg b/local/media/images/product/52-ZENNIO_ConnecteurMAX6-1.jpg new file mode 100644 index 00000000..b68258d3 Binary files /dev/null and b/local/media/images/product/52-ZENNIO_ConnecteurMAX6-1.jpg differ diff --git a/local/media/images/product/520-SCHNEIDER-UNICAcadre2postesV-cerisier-alu-1.jpg b/local/media/images/product/520-SCHNEIDER-UNICAcadre2postesV-cerisier-alu-1.jpg new file mode 100644 index 00000000..ff18a684 Binary files /dev/null and b/local/media/images/product/520-SCHNEIDER-UNICAcadre2postesV-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/522-SCHNEIDER-UNICAcadre2postesV-wenge-alu-1.jpg b/local/media/images/product/522-SCHNEIDER-UNICAcadre2postesV-wenge-alu-1.jpg new file mode 100644 index 00000000..7e201ee4 Binary files /dev/null and b/local/media/images/product/522-SCHNEIDER-UNICAcadre2postesV-wenge-alu-1.jpg differ diff --git a/local/media/images/product/524-SCHNEIDER-UNICAcadre2postesV-tabac-alu-1.jpg b/local/media/images/product/524-SCHNEIDER-UNICAcadre2postesV-tabac-alu-1.jpg new file mode 100644 index 00000000..82e9b446 Binary files /dev/null and b/local/media/images/product/524-SCHNEIDER-UNICAcadre2postesV-tabac-alu-1.jpg differ diff --git a/local/media/images/product/526-SCHNEIDER-UNICAcadre3postesV-chromebrillant-alu-1.jpg b/local/media/images/product/526-SCHNEIDER-UNICAcadre3postesV-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..aecda31b Binary files /dev/null and b/local/media/images/product/526-SCHNEIDER-UNICAcadre3postesV-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/527-SCHNEIDER-UNICAcadre3postesV-chromebrillant-graph-1.jpg b/local/media/images/product/527-SCHNEIDER-UNICAcadre3postesV-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..648d60af Binary files /dev/null and b/local/media/images/product/527-SCHNEIDER-UNICAcadre3postesV-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/528-SCHNEIDER-UNICAcadre3postesV-chromesatine-alu-1.jpg b/local/media/images/product/528-SCHNEIDER-UNICAcadre3postesV-chromesatine-alu-1.jpg new file mode 100644 index 00000000..aacea72c Binary files /dev/null and b/local/media/images/product/528-SCHNEIDER-UNICAcadre3postesV-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/529-SCHNEIDER-UNICAcadre3postesV-chromesatine-graph-1.jpg b/local/media/images/product/529-SCHNEIDER-UNICAcadre3postesV-chromesatine-graph-1.jpg new file mode 100644 index 00000000..4d204ac2 Binary files /dev/null and b/local/media/images/product/529-SCHNEIDER-UNICAcadre3postesV-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/530-SCHNEIDER-UNICAcadre3postesV-grismetal-alu-1.jpg b/local/media/images/product/530-SCHNEIDER-UNICAcadre3postesV-grismetal-alu-1.jpg new file mode 100644 index 00000000..94ecef34 Binary files /dev/null and b/local/media/images/product/530-SCHNEIDER-UNICAcadre3postesV-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/531-SCHNEIDER-UNICAcadre3postesV-grismetal-graph-1.jpg b/local/media/images/product/531-SCHNEIDER-UNICAcadre3postesV-grismetal-graph-1.jpg new file mode 100644 index 00000000..4e4699c9 Binary files /dev/null and b/local/media/images/product/531-SCHNEIDER-UNICAcadre3postesV-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/532-SCHNEIDER-UNICAcadre3postesV-nickelmat-alu-1.jpg b/local/media/images/product/532-SCHNEIDER-UNICAcadre3postesV-nickelmat-alu-1.jpg new file mode 100644 index 00000000..ca411134 Binary files /dev/null and b/local/media/images/product/532-SCHNEIDER-UNICAcadre3postesV-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/533-SCHNEIDER-UNICAcadre3postesV-nickelmat-graph-1.jpg b/local/media/images/product/533-SCHNEIDER-UNICAcadre3postesV-nickelmat-graph-1.jpg new file mode 100644 index 00000000..2b17dfc4 Binary files /dev/null and b/local/media/images/product/533-SCHNEIDER-UNICAcadre3postesV-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/534-SCHNEIDER-UNICAcadre3postesV-noirrhodium-alu-1.jpg b/local/media/images/product/534-SCHNEIDER-UNICAcadre3postesV-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..88cd3b03 Binary files /dev/null and b/local/media/images/product/534-SCHNEIDER-UNICAcadre3postesV-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/535-SCHNEIDER-UNICAcadre3postesV-noirrhodium-graph-1.jpg b/local/media/images/product/535-SCHNEIDER-UNICAcadre3postesV-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..db26854c Binary files /dev/null and b/local/media/images/product/535-SCHNEIDER-UNICAcadre3postesV-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/536-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-alu-1.jpg b/local/media/images/product/536-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..b9c15920 Binary files /dev/null and b/local/media/images/product/536-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/537-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-graph-1.jpg b/local/media/images/product/537-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..af38c8c8 Binary files /dev/null and b/local/media/images/product/537-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/538-SCHNEIDER-UNICAcadre3postesV-blanctechno-alu-1.jpg b/local/media/images/product/538-SCHNEIDER-UNICAcadre3postesV-blanctechno-alu-1.jpg new file mode 100644 index 00000000..9017c703 Binary files /dev/null and b/local/media/images/product/538-SCHNEIDER-UNICAcadre3postesV-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/539-SCHNEIDER-UNICAcadre3postesV-blanctechno-graph-1.jpg b/local/media/images/product/539-SCHNEIDER-UNICAcadre3postesV-blanctechno-graph-1.jpg new file mode 100644 index 00000000..63c501e3 Binary files /dev/null and b/local/media/images/product/539-SCHNEIDER-UNICAcadre3postesV-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/540-SCHNEIDER-UNICAcadre3postesV-cerisier-alu-1.jpg b/local/media/images/product/540-SCHNEIDER-UNICAcadre3postesV-cerisier-alu-1.jpg new file mode 100644 index 00000000..9b05fd57 Binary files /dev/null and b/local/media/images/product/540-SCHNEIDER-UNICAcadre3postesV-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/542-SCHNEIDER-UNICAcadre3postesV-wenge-alu-1.jpg b/local/media/images/product/542-SCHNEIDER-UNICAcadre3postesV-wenge-alu-1.jpg new file mode 100644 index 00000000..95f4c0ba Binary files /dev/null and b/local/media/images/product/542-SCHNEIDER-UNICAcadre3postesV-wenge-alu-1.jpg differ diff --git a/local/media/images/product/544-SCHNEIDER-UNICAcadre3postesV-tabac-alu-1.jpg b/local/media/images/product/544-SCHNEIDER-UNICAcadre3postesV-tabac-alu-1.jpg new file mode 100644 index 00000000..028e6b01 Binary files /dev/null and b/local/media/images/product/544-SCHNEIDER-UNICAcadre3postesV-tabac-alu-1.jpg differ diff --git a/local/media/images/product/546-SCHNEIDER-UNICAcadre3postesV-chromebrillant-alu-1.jpg b/local/media/images/product/546-SCHNEIDER-UNICAcadre3postesV-chromebrillant-alu-1.jpg new file mode 100644 index 00000000..aecda31b Binary files /dev/null and b/local/media/images/product/546-SCHNEIDER-UNICAcadre3postesV-chromebrillant-alu-1.jpg differ diff --git a/local/media/images/product/547-SCHNEIDER-UNICAcadre3postesV-chromebrillant-graph-1.jpg b/local/media/images/product/547-SCHNEIDER-UNICAcadre3postesV-chromebrillant-graph-1.jpg new file mode 100644 index 00000000..648d60af Binary files /dev/null and b/local/media/images/product/547-SCHNEIDER-UNICAcadre3postesV-chromebrillant-graph-1.jpg differ diff --git a/local/media/images/product/548-SCHNEIDER-UNICAcadre3postesV-chromesatine-alu-1.jpg b/local/media/images/product/548-SCHNEIDER-UNICAcadre3postesV-chromesatine-alu-1.jpg new file mode 100644 index 00000000..aacea72c Binary files /dev/null and b/local/media/images/product/548-SCHNEIDER-UNICAcadre3postesV-chromesatine-alu-1.jpg differ diff --git a/local/media/images/product/549-SCHNEIDER-UNICAcadre3postesV-chromesatine-graph-1.jpg b/local/media/images/product/549-SCHNEIDER-UNICAcadre3postesV-chromesatine-graph-1.jpg new file mode 100644 index 00000000..4d204ac2 Binary files /dev/null and b/local/media/images/product/549-SCHNEIDER-UNICAcadre3postesV-chromesatine-graph-1.jpg differ diff --git a/local/media/images/product/550-SCHNEIDER-UNICAcadre3postesV-grismetal-alu-1.jpg b/local/media/images/product/550-SCHNEIDER-UNICAcadre3postesV-grismetal-alu-1.jpg new file mode 100644 index 00000000..94ecef34 Binary files /dev/null and b/local/media/images/product/550-SCHNEIDER-UNICAcadre3postesV-grismetal-alu-1.jpg differ diff --git a/local/media/images/product/551-SCHNEIDER-UNICAcadre3postesV-grismetal-graph-1.jpg b/local/media/images/product/551-SCHNEIDER-UNICAcadre3postesV-grismetal-graph-1.jpg new file mode 100644 index 00000000..4e4699c9 Binary files /dev/null and b/local/media/images/product/551-SCHNEIDER-UNICAcadre3postesV-grismetal-graph-1.jpg differ diff --git a/local/media/images/product/552-SCHNEIDER-UNICAcadre3postesV-nickelmat-alu-1.jpg b/local/media/images/product/552-SCHNEIDER-UNICAcadre3postesV-nickelmat-alu-1.jpg new file mode 100644 index 00000000..ca411134 Binary files /dev/null and b/local/media/images/product/552-SCHNEIDER-UNICAcadre3postesV-nickelmat-alu-1.jpg differ diff --git a/local/media/images/product/553-SCHNEIDER-UNICAcadre3postesV-nickelmat-graph-1.jpg b/local/media/images/product/553-SCHNEIDER-UNICAcadre3postesV-nickelmat-graph-1.jpg new file mode 100644 index 00000000..2b17dfc4 Binary files /dev/null and b/local/media/images/product/553-SCHNEIDER-UNICAcadre3postesV-nickelmat-graph-1.jpg differ diff --git a/local/media/images/product/554-SCHNEIDER-UNICAcadre3postesV-noirrhodium-alu-1.jpg b/local/media/images/product/554-SCHNEIDER-UNICAcadre3postesV-noirrhodium-alu-1.jpg new file mode 100644 index 00000000..88cd3b03 Binary files /dev/null and b/local/media/images/product/554-SCHNEIDER-UNICAcadre3postesV-noirrhodium-alu-1.jpg differ diff --git a/local/media/images/product/555-SCHNEIDER-UNICAcadre3postesV-noirrhodium-graph-1.jpg b/local/media/images/product/555-SCHNEIDER-UNICAcadre3postesV-noirrhodium-graph-1.jpg new file mode 100644 index 00000000..db26854c Binary files /dev/null and b/local/media/images/product/555-SCHNEIDER-UNICAcadre3postesV-noirrhodium-graph-1.jpg differ diff --git a/local/media/images/product/556-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-alu-1.jpg b/local/media/images/product/556-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-alu-1.jpg new file mode 100644 index 00000000..b9c15920 Binary files /dev/null and b/local/media/images/product/556-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-alu-1.jpg differ diff --git a/local/media/images/product/557-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-graph-1.jpg b/local/media/images/product/557-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-graph-1.jpg new file mode 100644 index 00000000..af38c8c8 Binary files /dev/null and b/local/media/images/product/557-SCHNEIDER-UNICAcadre3postesV-cuivreonyx-graph-1.jpg differ diff --git a/local/media/images/product/558-SCHNEIDER-UNICAcadre3postesV-blanctechno-alu-1.jpg b/local/media/images/product/558-SCHNEIDER-UNICAcadre3postesV-blanctechno-alu-1.jpg new file mode 100644 index 00000000..9017c703 Binary files /dev/null and b/local/media/images/product/558-SCHNEIDER-UNICAcadre3postesV-blanctechno-alu-1.jpg differ diff --git a/local/media/images/product/559-SCHNEIDER-UNICAcadre3postesV-blanctechno-graph-1.jpg b/local/media/images/product/559-SCHNEIDER-UNICAcadre3postesV-blanctechno-graph-1.jpg new file mode 100644 index 00000000..63c501e3 Binary files /dev/null and b/local/media/images/product/559-SCHNEIDER-UNICAcadre3postesV-blanctechno-graph-1.jpg differ diff --git a/local/media/images/product/560-SCHNEIDER-UNICAcadre3postesV-cerisier-alu-1.jpg b/local/media/images/product/560-SCHNEIDER-UNICAcadre3postesV-cerisier-alu-1.jpg new file mode 100644 index 00000000..9b05fd57 Binary files /dev/null and b/local/media/images/product/560-SCHNEIDER-UNICAcadre3postesV-cerisier-alu-1.jpg differ diff --git a/local/media/images/product/561f759a-ca92-4334-83b2-170b83d7b2da-2622.jpeg b/local/media/images/product/561f759a-ca92-4334-83b2-170b83d7b2da-2622.jpeg new file mode 100644 index 00000000..76a86570 Binary files /dev/null and b/local/media/images/product/561f759a-ca92-4334-83b2-170b83d7b2da-2622.jpeg differ diff --git a/local/media/images/product/562-SCHNEIDER-UNICAcadre3postesV-wenge-alu-1.jpg b/local/media/images/product/562-SCHNEIDER-UNICAcadre3postesV-wenge-alu-1.jpg new file mode 100644 index 00000000..95f4c0ba Binary files /dev/null and b/local/media/images/product/562-SCHNEIDER-UNICAcadre3postesV-wenge-alu-1.jpg differ diff --git a/local/media/images/product/564-SCHNEIDER-UNICAcadre3postesV-tabac-alu-1.jpg b/local/media/images/product/564-SCHNEIDER-UNICAcadre3postesV-tabac-alu-1.jpg new file mode 100644 index 00000000..028e6b01 Binary files /dev/null and b/local/media/images/product/564-SCHNEIDER-UNICAcadre3postesV-tabac-alu-1.jpg differ diff --git a/local/media/images/product/567-Enjoliveur+prise+cou-1.png b/local/media/images/product/567-Enjoliveur+prise+cou-1.png new file mode 100644 index 00000000..b7404f0a Binary files /dev/null and b/local/media/images/product/567-Enjoliveur+prise+cou-1.png differ diff --git a/local/media/images/product/571-3224130631f72d46850e84d9c6f5-1.jpg b/local/media/images/product/571-3224130631f72d46850e84d9c6f5-1.jpg new file mode 100644 index 00000000..3608e065 Binary files /dev/null and b/local/media/images/product/571-3224130631f72d46850e84d9c6f5-1.jpg differ diff --git a/local/media/images/product/571-Enjoliveur+prise+cou-1.png b/local/media/images/product/571-Enjoliveur+prise+cou-1.png new file mode 100644 index 00000000..3608e065 Binary files /dev/null and b/local/media/images/product/571-Enjoliveur+prise+cou-1.png differ diff --git a/local/media/images/product/572-Ecran+tactile+Touch--1.png b/local/media/images/product/572-Ecran+tactile+Touch--1.png new file mode 100644 index 00000000..2cffc69c Binary files /dev/null and b/local/media/images/product/572-Ecran+tactile+Touch--1.png differ diff --git a/local/media/images/product/573-TMD6-1.jpg b/local/media/images/product/573-TMD6-1.jpg new file mode 100644 index 00000000..30866506 Binary files /dev/null and b/local/media/images/product/573-TMD6-1.jpg differ diff --git a/local/media/images/product/574-TMD7-1.jpg b/local/media/images/product/574-TMD7-1.jpg new file mode 100644 index 00000000..00faa598 Binary files /dev/null and b/local/media/images/product/574-TMD7-1.jpg differ diff --git a/local/media/images/product/576-SCHNEIDER_ALTIRA_2_pousoirs_blanc-1.jpg b/local/media/images/product/576-SCHNEIDER_ALTIRA_2_pousoirs_blanc-1.jpg new file mode 100644 index 00000000..4763beaa Binary files /dev/null and b/local/media/images/product/576-SCHNEIDER_ALTIRA_2_pousoirs_blanc-1.jpg differ diff --git a/local/media/images/product/577-SCHNEIDER_ALTIRA_4_poussoirs_blanc-1.jpg b/local/media/images/product/577-SCHNEIDER_ALTIRA_4_poussoirs_blanc-1.jpg new file mode 100644 index 00000000..17b1fd6e Binary files /dev/null and b/local/media/images/product/577-SCHNEIDER_ALTIRA_4_poussoirs_blanc-1.jpg differ diff --git a/local/media/images/product/578-SCHNEIDER_ALTIRA_2_poussoirs_alu-1.jpg b/local/media/images/product/578-SCHNEIDER_ALTIRA_2_poussoirs_alu-1.jpg new file mode 100644 index 00000000..8ec427c2 Binary files /dev/null and b/local/media/images/product/578-SCHNEIDER_ALTIRA_2_poussoirs_alu-1.jpg differ diff --git a/local/media/images/product/579-SCHNEIDER_ALTIRA_4_poussoirs_alu-1.jpg b/local/media/images/product/579-SCHNEIDER_ALTIRA_4_poussoirs_alu-1.jpg new file mode 100644 index 00000000..564fce6e Binary files /dev/null and b/local/media/images/product/579-SCHNEIDER_ALTIRA_4_poussoirs_alu-1.jpg differ diff --git a/local/media/images/product/580-JUNG_AL2995KO5-1.jpg b/local/media/images/product/580-JUNG_AL2995KO5-1.jpg new file mode 100644 index 00000000..3d6ebabe Binary files /dev/null and b/local/media/images/product/580-JUNG_AL2995KO5-1.jpg differ diff --git a/local/media/images/product/581-JUNG_ES2995KO5-1.jpg b/local/media/images/product/581-JUNG_ES2995KO5-1.jpg new file mode 100644 index 00000000..9c3c503b Binary files /dev/null and b/local/media/images/product/581-JUNG_ES2995KO5-1.jpg differ diff --git a/local/media/images/product/582-JUNG_AL2995KO5AN-1.jpg b/local/media/images/product/582-JUNG_AL2995KO5AN-1.jpg new file mode 100644 index 00000000..963c8b8a Binary files /dev/null and b/local/media/images/product/582-JUNG_AL2995KO5AN-1.jpg differ diff --git a/local/media/images/product/583-JUNG_GCR2995KO5-1.jpg b/local/media/images/product/583-JUNG_GCR2995KO5-1.jpg new file mode 100644 index 00000000..eb6f776d Binary files /dev/null and b/local/media/images/product/583-JUNG_GCR2995KO5-1.jpg differ diff --git a/local/media/images/product/584-JUNG_GO2995KO5-1.jpg b/local/media/images/product/584-JUNG_GO2995KO5-1.jpg new file mode 100644 index 00000000..ce0af9d6 Binary files /dev/null and b/local/media/images/product/584-JUNG_GO2995KO5-1.jpg differ diff --git a/local/media/images/product/585-Enjoliveur+double+do-1.png b/local/media/images/product/585-Enjoliveur+double+do-1.png new file mode 100644 index 00000000..bb5d9e3e Binary files /dev/null and b/local/media/images/product/585-Enjoliveur+double+do-1.png differ diff --git a/local/media/images/product/586-JUNG_AL2995KO5PAN-1.jpg b/local/media/images/product/586-JUNG_AL2995KO5PAN-1.jpg new file mode 100644 index 00000000..05e0d2f6 Binary files /dev/null and b/local/media/images/product/586-JUNG_AL2995KO5PAN-1.jpg differ diff --git a/local/media/images/product/587-JUNG_ES2995KO5P-1.jpg b/local/media/images/product/587-JUNG_ES2995KO5P-1.jpg new file mode 100644 index 00000000..983d5588 Binary files /dev/null and b/local/media/images/product/587-JUNG_ES2995KO5P-1.jpg differ diff --git a/local/media/images/product/588-Panneau+LED+600x600-1.png b/local/media/images/product/588-Panneau+LED+600x600-1.png new file mode 100644 index 00000000..a329e098 Binary files /dev/null and b/local/media/images/product/588-Panneau+LED+600x600-1.png differ diff --git a/local/media/images/product/590-125b16e1c1cc9ad7aa7383c4bd21-1.jpg b/local/media/images/product/590-125b16e1c1cc9ad7aa7383c4bd21-1.jpg new file mode 100644 index 00000000..730e1650 Binary files /dev/null and b/local/media/images/product/590-125b16e1c1cc9ad7aa7383c4bd21-1.jpg differ diff --git a/local/media/images/product/591-Kit+KNX+bureau+pour+-1.png b/local/media/images/product/591-Kit+KNX+bureau+pour+-1.png new file mode 100644 index 00000000..4161b804 Binary files /dev/null and b/local/media/images/product/591-Kit+KNX+bureau+pour+-1.png differ diff --git a/local/media/images/product/592-Kit+KNX+commerce+pou-1.png b/local/media/images/product/592-Kit+KNX+commerce+pou-1.png new file mode 100644 index 00000000..33fd19b8 Binary files /dev/null and b/local/media/images/product/592-Kit+KNX+commerce+pou-1.png differ diff --git a/local/media/images/product/595-Haut-parleur+plafond-1.png b/local/media/images/product/595-Haut-parleur+plafond-1.png new file mode 100644 index 00000000..3e76131c Binary files /dev/null and b/local/media/images/product/595-Haut-parleur+plafond-1.png differ diff --git a/local/media/images/product/597-1908bd99bef5b8c31df0217f6d45-1.jpg b/local/media/images/product/597-1908bd99bef5b8c31df0217f6d45-1.jpg new file mode 100644 index 00000000..fef682fb Binary files /dev/null and b/local/media/images/product/597-1908bd99bef5b8c31df0217f6d45-1.jpg differ diff --git a/local/media/images/product/597-Enceinte+EVID+Mod%C3%A8l-1.png b/local/media/images/product/597-Enceinte+EVID+Mod%C3%A8l-1.png new file mode 100644 index 00000000..fef682fb Binary files /dev/null and b/local/media/images/product/597-Enceinte+EVID+Mod%C3%A8l-1.png differ diff --git a/local/media/images/product/598-46401fea4fe9c9f1486f4bdab44a-1.jpg b/local/media/images/product/598-46401fea4fe9c9f1486f4bdab44a-1.jpg new file mode 100644 index 00000000..fef682fb Binary files /dev/null and b/local/media/images/product/598-46401fea4fe9c9f1486f4bdab44a-1.jpg differ diff --git a/local/media/images/product/598-Enceinte+EVID+Mod%C3%A8l-1.png b/local/media/images/product/598-Enceinte+EVID+Mod%C3%A8l-1.png new file mode 100644 index 00000000..fef682fb Binary files /dev/null and b/local/media/images/product/598-Enceinte+EVID+Mod%C3%A8l-1.png differ diff --git a/local/media/images/product/599-d4eb49c38476e7324a45797a5d2d-1.jpg b/local/media/images/product/599-d4eb49c38476e7324a45797a5d2d-1.jpg new file mode 100644 index 00000000..e0b1d08a Binary files /dev/null and b/local/media/images/product/599-d4eb49c38476e7324a45797a5d2d-1.jpg differ diff --git a/local/media/images/product/5wmip68-3039.png b/local/media/images/product/5wmip68-3039.png new file mode 100644 index 00000000..1aafd96f Binary files /dev/null and b/local/media/images/product/5wmip68-3039.png differ diff --git a/local/media/images/product/60-12-2863.png b/local/media/images/product/60-12-2863.png new file mode 100644 index 00000000..b0997774 Binary files /dev/null and b/local/media/images/product/60-12-2863.png differ diff --git a/local/media/images/product/60-24-2860.png b/local/media/images/product/60-24-2860.png new file mode 100644 index 00000000..9b191fd3 Binary files /dev/null and b/local/media/images/product/60-24-2860.png differ diff --git a/local/media/images/product/601-Enceinte+murale+EVID-1.png b/local/media/images/product/601-Enceinte+murale+EVID-1.png new file mode 100644 index 00000000..ef37c474 Binary files /dev/null and b/local/media/images/product/601-Enceinte+murale+EVID-1.png differ diff --git a/local/media/images/product/602-Enceinte+plafond+EVI-1.png b/local/media/images/product/602-Enceinte+plafond+EVI-1.png new file mode 100644 index 00000000..4726e642 Binary files /dev/null and b/local/media/images/product/602-Enceinte+plafond+EVI-1.png differ diff --git a/local/media/images/product/602-d42e19d607da632b710fbf3b07fc-1.jpg b/local/media/images/product/602-d42e19d607da632b710fbf3b07fc-1.jpg new file mode 100644 index 00000000..4726e642 Binary files /dev/null and b/local/media/images/product/602-d42e19d607da632b710fbf3b07fc-1.jpg differ diff --git a/local/media/images/product/603-2b244a9324288e7d1380eaca811a-1.jpg b/local/media/images/product/603-2b244a9324288e7d1380eaca811a-1.jpg new file mode 100644 index 00000000..bd6a509e Binary files /dev/null and b/local/media/images/product/603-2b244a9324288e7d1380eaca811a-1.jpg differ diff --git a/local/media/images/product/604-b053ee1fc5801e21c386777dee37-1.jpg b/local/media/images/product/604-b053ee1fc5801e21c386777dee37-1.jpg new file mode 100644 index 00000000..3803de0c Binary files /dev/null and b/local/media/images/product/604-b053ee1fc5801e21c386777dee37-1.jpg differ diff --git a/local/media/images/product/606-Enjoliveur+de+doigt+-1.png b/local/media/images/product/606-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..d4f03fa4 Binary files /dev/null and b/local/media/images/product/606-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/607-Enjoliveur+de+doigt+-1.png b/local/media/images/product/607-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..96e80b2e Binary files /dev/null and b/local/media/images/product/607-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/608-Enjoliveur+de+doigt+-1.png b/local/media/images/product/608-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..0d33387b Binary files /dev/null and b/local/media/images/product/608-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/609-Enjoliveur+de+doigt+-1.png b/local/media/images/product/609-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..c643e812 Binary files /dev/null and b/local/media/images/product/609-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/61-JUNG_3074TSM-1.jpg b/local/media/images/product/61-JUNG_3074TSM-1.jpg new file mode 100644 index 00000000..097ba77b Binary files /dev/null and b/local/media/images/product/61-JUNG_3074TSM-1.jpg differ diff --git a/local/media/images/product/610-Enjoliveur+de+doigt+-1.png b/local/media/images/product/610-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..f4ae24b0 Binary files /dev/null and b/local/media/images/product/610-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/610-b8044abb14cacb9da2e457c4bd53-1.jpg b/local/media/images/product/610-b8044abb14cacb9da2e457c4bd53-1.jpg new file mode 100644 index 00000000..f4ae24b0 Binary files /dev/null and b/local/media/images/product/610-b8044abb14cacb9da2e457c4bd53-1.jpg differ diff --git a/local/media/images/product/611-855045c075c1f16a0c7d821ff8f8-1.jpg b/local/media/images/product/611-855045c075c1f16a0c7d821ff8f8-1.jpg new file mode 100644 index 00000000..a452411f Binary files /dev/null and b/local/media/images/product/611-855045c075c1f16a0c7d821ff8f8-1.jpg differ diff --git a/local/media/images/product/611-Enjoliveur+de+doigt+-1.png b/local/media/images/product/611-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..a452411f Binary files /dev/null and b/local/media/images/product/611-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/612-Enjoliveur+de+doigt+-1.png b/local/media/images/product/612-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..b03012dd Binary files /dev/null and b/local/media/images/product/612-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/613-Enjoliveur+de+doigt+-1.png b/local/media/images/product/613-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..da309e3b Binary files /dev/null and b/local/media/images/product/613-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/614-Enjoliveur+de+doigt+-1.png b/local/media/images/product/614-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..5eea004a Binary files /dev/null and b/local/media/images/product/614-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/615-Enjoliveur+de+doigt+-1.png b/local/media/images/product/615-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..1bd3d052 Binary files /dev/null and b/local/media/images/product/615-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/615-ab3e535ac5d1dbeec82944632b05-1.jpg b/local/media/images/product/615-ab3e535ac5d1dbeec82944632b05-1.jpg new file mode 100644 index 00000000..1bd3d052 Binary files /dev/null and b/local/media/images/product/615-ab3e535ac5d1dbeec82944632b05-1.jpg differ diff --git a/local/media/images/product/616-Enjoliveur+de+doigt+-1.png b/local/media/images/product/616-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..81660aca Binary files /dev/null and b/local/media/images/product/616-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/617-Enjoliveur+de+doigt+-1.png b/local/media/images/product/617-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..2afac1f5 Binary files /dev/null and b/local/media/images/product/617-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/618-Enjoliveur+de+doigt+-1.png b/local/media/images/product/618-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..d8bcb213 Binary files /dev/null and b/local/media/images/product/618-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/619-Kit+musique+4+zones+-1.png b/local/media/images/product/619-Kit+musique+4+zones+-1.png new file mode 100644 index 00000000..48f607c2 Binary files /dev/null and b/local/media/images/product/619-Kit+musique+4+zones+-1.png differ diff --git a/local/media/images/product/62-JUNG_LS981W-1.jpg b/local/media/images/product/62-JUNG_LS981W-1.jpg new file mode 100644 index 00000000..5f7ca28d Binary files /dev/null and b/local/media/images/product/62-JUNG_LS981W-1.jpg differ diff --git a/local/media/images/product/623-7e8b77280a70aeae2d2dcd3bb7ce-1.jpg b/local/media/images/product/623-7e8b77280a70aeae2d2dcd3bb7ce-1.jpg new file mode 100644 index 00000000..d3e35595 Binary files /dev/null and b/local/media/images/product/623-7e8b77280a70aeae2d2dcd3bb7ce-1.jpg differ diff --git a/local/media/images/product/63-JUNG_LS981SW-1.jpg b/local/media/images/product/63-JUNG_LS981SW-1.jpg new file mode 100644 index 00000000..a63348d6 Binary files /dev/null and b/local/media/images/product/63-JUNG_LS981SW-1.jpg differ diff --git a/local/media/images/product/631-Enjoliveur+de+doigt+-1.png b/local/media/images/product/631-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..faf9157b Binary files /dev/null and b/local/media/images/product/631-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/632-Enjoliveur+double+do-1.png b/local/media/images/product/632-Enjoliveur+double+do-1.png new file mode 100644 index 00000000..38913f42 Binary files /dev/null and b/local/media/images/product/632-Enjoliveur+double+do-1.png differ diff --git a/local/media/images/product/639050_jung_1224ledude-2469.jpg b/local/media/images/product/639050_jung_1224ledude-2469.jpg new file mode 100644 index 00000000..8b76f149 Binary files /dev/null and b/local/media/images/product/639050_jung_1224ledude-2469.jpg differ diff --git a/local/media/images/product/64-JUNG_LS981LG-1.jpg b/local/media/images/product/64-JUNG_LS981LG-1.jpg new file mode 100644 index 00000000..96f7474e Binary files /dev/null and b/local/media/images/product/64-JUNG_LS981LG-1.jpg differ diff --git a/local/media/images/product/640-Kit+Smart+radio+%2B+ha-1.png b/local/media/images/product/640-Kit+Smart+radio+%2B+ha-1.png new file mode 100644 index 00000000..8a93cab1 Binary files /dev/null and b/local/media/images/product/640-Kit+Smart+radio+%2B+ha-1.png differ diff --git a/local/media/images/product/641-Kit+Smart+radio+%2B+ha-1.png b/local/media/images/product/641-Kit+Smart+radio+%2B+ha-1.png new file mode 100644 index 00000000..58dfffbf Binary files /dev/null and b/local/media/images/product/641-Kit+Smart+radio+%2B+ha-1.png differ diff --git a/local/media/images/product/642-Kit+Smart+radio+%2B+ha-1.png b/local/media/images/product/642-Kit+Smart+radio+%2B+ha-1.png new file mode 100644 index 00000000..f963a5c3 Binary files /dev/null and b/local/media/images/product/642-Kit+Smart+radio+%2B+ha-1.png differ diff --git a/local/media/images/product/644-Prise+courant+JUNG-1.png b/local/media/images/product/644-Prise+courant+JUNG-1.png new file mode 100644 index 00000000..f7f7f6ba Binary files /dev/null and b/local/media/images/product/644-Prise+courant+JUNG-1.png differ diff --git a/local/media/images/product/645-Prise+RJ+45+simple+J-1.png b/local/media/images/product/645-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..d6522b51 Binary files /dev/null and b/local/media/images/product/645-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/646-Prise+RJ+45+double+J-1.png b/local/media/images/product/646-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..28ea2ab7 Binary files /dev/null and b/local/media/images/product/646-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/647-Prise+t%C3%A9l%C3%A9vision+J-1.png b/local/media/images/product/647-Prise+t%C3%A9l%C3%A9vision+J-1.png new file mode 100644 index 00000000..8c6880de Binary files /dev/null and b/local/media/images/product/647-Prise+t%C3%A9l%C3%A9vision+J-1.png differ diff --git a/local/media/images/product/648-Bouton-poussoir+1+vo-1.png b/local/media/images/product/648-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..0d45dc7d Binary files /dev/null and b/local/media/images/product/648-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/649-Bouton-poussoir+1+vo-1.png b/local/media/images/product/649-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..0d45dc7d Binary files /dev/null and b/local/media/images/product/649-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/650-Bouton-poussoir+2+vo-1.png b/local/media/images/product/650-Bouton-poussoir+2+vo-1.png new file mode 100644 index 00000000..05b85777 Binary files /dev/null and b/local/media/images/product/650-Bouton-poussoir+2+vo-1.png differ diff --git a/local/media/images/product/651-Bouton-poussoir+2+vo-1.png b/local/media/images/product/651-Bouton-poussoir+2+vo-1.png new file mode 100644 index 00000000..05b85777 Binary files /dev/null and b/local/media/images/product/651-Bouton-poussoir+2+vo-1.png differ diff --git a/local/media/images/product/652-Ensemble+platine+com-1.png b/local/media/images/product/652-Ensemble+platine+com-1.png new file mode 100644 index 00000000..2d738d71 Binary files /dev/null and b/local/media/images/product/652-Ensemble+platine+com-1.png differ diff --git a/local/media/images/product/653-Ensemble+platine+com-1.png b/local/media/images/product/653-Ensemble+platine+com-1.png new file mode 100644 index 00000000..1ea9a0dd Binary files /dev/null and b/local/media/images/product/653-Ensemble+platine+com-1.png differ diff --git a/local/media/images/product/654-Platine+commande+2+v-1.png b/local/media/images/product/654-Platine+commande+2+v-1.png new file mode 100644 index 00000000..83250149 Binary files /dev/null and b/local/media/images/product/654-Platine+commande+2+v-1.png differ diff --git a/local/media/images/product/655-Platine+commande+4+v-1.png b/local/media/images/product/655-Platine+commande+4+v-1.png new file mode 100644 index 00000000..dbe68dd6 Binary files /dev/null and b/local/media/images/product/655-Platine+commande+4+v-1.png differ diff --git a/local/media/images/product/657-Cadre+1+poste+JUNG-1.png b/local/media/images/product/657-Cadre+1+poste+JUNG-1.png new file mode 100644 index 00000000..20600459 Binary files /dev/null and b/local/media/images/product/657-Cadre+1+poste+JUNG-1.png differ diff --git a/local/media/images/product/658-Cadre+2+postes+JUNG-1.png b/local/media/images/product/658-Cadre+2+postes+JUNG-1.png new file mode 100644 index 00000000..628e72b2 Binary files /dev/null and b/local/media/images/product/658-Cadre+2+postes+JUNG-1.png differ diff --git a/local/media/images/product/659-Cadre+3+postes+JUNG-1.png b/local/media/images/product/659-Cadre+3+postes+JUNG-1.png new file mode 100644 index 00000000..7b40bbb8 Binary files /dev/null and b/local/media/images/product/659-Cadre+3+postes+JUNG-1.png differ diff --git a/local/media/images/product/66-JUNG_LS981GGO-1.jpg b/local/media/images/product/66-JUNG_LS981GGO-1.jpg new file mode 100644 index 00000000..56744f36 Binary files /dev/null and b/local/media/images/product/66-JUNG_LS981GGO-1.jpg differ diff --git a/local/media/images/product/660-Cadre+4+postes+JUNG-1.png b/local/media/images/product/660-Cadre+4+postes+JUNG-1.png new file mode 100644 index 00000000..093c6115 Binary files /dev/null and b/local/media/images/product/660-Cadre+4+postes+JUNG-1.png differ diff --git a/local/media/images/product/661-Cadre+5+postes+JUNG-1.png b/local/media/images/product/661-Cadre+5+postes+JUNG-1.png new file mode 100644 index 00000000..d56877f9 Binary files /dev/null and b/local/media/images/product/661-Cadre+5+postes+JUNG-1.png differ diff --git a/local/media/images/product/662-Cadre+Flat+1+poste+J-1.png b/local/media/images/product/662-Cadre+Flat+1+poste+J-1.png new file mode 100644 index 00000000..0ce75759 Binary files /dev/null and b/local/media/images/product/662-Cadre+Flat+1+poste+J-1.png differ diff --git a/local/media/images/product/663-Cadre+Flat+2+postes+-1.png b/local/media/images/product/663-Cadre+Flat+2+postes+-1.png new file mode 100644 index 00000000..1e22073c Binary files /dev/null and b/local/media/images/product/663-Cadre+Flat+2+postes+-1.png differ diff --git a/local/media/images/product/664-Cadre+Flat+3+postes+-1.png b/local/media/images/product/664-Cadre+Flat+3+postes+-1.png new file mode 100644 index 00000000..02b8f2c5 Binary files /dev/null and b/local/media/images/product/664-Cadre+Flat+3+postes+-1.png differ diff --git a/local/media/images/product/667-Prise+RJ45+double+JU-1.png b/local/media/images/product/667-Prise+RJ45+double+JU-1.png new file mode 100644 index 00000000..eb9d5ac8 Binary files /dev/null and b/local/media/images/product/667-Prise+RJ45+double+JU-1.png differ diff --git a/local/media/images/product/67-JUNG_LS982W-1.jpg b/local/media/images/product/67-JUNG_LS982W-1.jpg new file mode 100644 index 00000000..1924bf09 Binary files /dev/null and b/local/media/images/product/67-JUNG_LS982W-1.jpg differ diff --git a/local/media/images/product/68-JUNG_LS982SW-1.jpg b/local/media/images/product/68-JUNG_LS982SW-1.jpg new file mode 100644 index 00000000..ec2bc4bb Binary files /dev/null and b/local/media/images/product/68-JUNG_LS982SW-1.jpg differ diff --git a/local/media/images/product/686-Prise+RJ+45+simple+J-1.png b/local/media/images/product/686-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..5621076f Binary files /dev/null and b/local/media/images/product/686-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/688-Bouton-poussoir+1+vo-1.png b/local/media/images/product/688-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..9a138614 Binary files /dev/null and b/local/media/images/product/688-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/689-Bouton-poussoir+2+vo-1.png b/local/media/images/product/689-Bouton-poussoir+2+vo-1.png new file mode 100644 index 00000000..a248b3b6 Binary files /dev/null and b/local/media/images/product/689-Bouton-poussoir+2+vo-1.png differ diff --git a/local/media/images/product/68cd9506-5c5b-481e-aa5e-333f3ad65238-2628.jpeg b/local/media/images/product/68cd9506-5c5b-481e-aa5e-333f3ad65238-2628.jpeg new file mode 100644 index 00000000..b20e02da Binary files /dev/null and b/local/media/images/product/68cd9506-5c5b-481e-aa5e-333f3ad65238-2628.jpeg differ diff --git a/local/media/images/product/69-JUNG_LS982LG-1.jpg b/local/media/images/product/69-JUNG_LS982LG-1.jpg new file mode 100644 index 00000000..26f2c3b6 Binary files /dev/null and b/local/media/images/product/69-JUNG_LS982LG-1.jpg differ diff --git a/local/media/images/product/698c61b4-c80f-49fb-bfa7-faee7c722f38-2662.jpeg b/local/media/images/product/698c61b4-c80f-49fb-bfa7-faee7c722f38-2662.jpeg new file mode 100644 index 00000000..e1303148 Binary files /dev/null and b/local/media/images/product/698c61b4-c80f-49fb-bfa7-faee7c722f38-2662.jpeg differ diff --git a/local/media/images/product/6a0ef124-ef89-4096-9ae6-29ee386fb9e5-2626.jpeg b/local/media/images/product/6a0ef124-ef89-4096-9ae6-29ee386fb9e5-2626.jpeg new file mode 100644 index 00000000..63ab3548 Binary files /dev/null and b/local/media/images/product/6a0ef124-ef89-4096-9ae6-29ee386fb9e5-2626.jpeg differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-20180730_170025-2556-2954.jpg b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-20180730_170025-2556-2954.jpg new file mode 100644 index 00000000..4b633912 Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-20180730_170025-2556-2954.jpg differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-6d1696bee7835dd96f75f90fc20b01bf-packeclairagemaison-2363-2465-2482.png b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-6d1696bee7835dd96f75f90fc20b01bf-packeclairagemaison-2363-2465-2482.png new file mode 100644 index 00000000..43e20bd0 Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-6d1696bee7835dd96f75f90fc20b01bf-packeclairagemaison-2363-2465-2482.png differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-92b71be6-1295-4362-a024-8b05afed44ee-2686-2951.jpeg b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-92b71be6-1295-4362-a024-8b05afed44ee-2686-2951.jpeg new file mode 100644 index 00000000..8e9270c2 Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-92b71be6-1295-4362-a024-8b05afed44ee-2686-2951.jpeg differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-ae5d8b92-d23a-4257-8de0-cd6c4715d9e4-2687-2953.jpeg b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-ae5d8b92-d23a-4257-8de0-cd6c4715d9e4-2687-2953.jpeg new file mode 100644 index 00000000..bb2d526c Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-ae5d8b92-d23a-4257-8de0-cd6c4715d9e4-2687-2953.jpeg differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-calqueviacopiecopier2-2573-2952.png b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-calqueviacopiecopier2-2573-2952.png new file mode 100644 index 00000000..dd85d6a8 Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-calqueviacopiecopier2-2573-2952.png differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-interlegrandlogo-2396-2597.jpg b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-interlegrandlogo-2396-2597.jpg new file mode 100644 index 00000000..f354f0b2 Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-interlegrandlogo-2396-2597.jpg differ diff --git a/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-z41_smatphoneapp-2366-2464.png b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-z41_smatphoneapp-2366-2464.png new file mode 100644 index 00000000..b64a68f0 Binary files /dev/null and b/local/media/images/product/6d1696bee7835dd96f75f90fc20b01bf-z41_smatphoneapp-2366-2464.png differ diff --git a/local/media/images/product/6fa3ce2d-5126-41a7-95eb-679d0f6ebfc3-2661.jpeg b/local/media/images/product/6fa3ce2d-5126-41a7-95eb-679d0f6ebfc3-2661.jpeg new file mode 100644 index 00000000..3a3c672d Binary files /dev/null and b/local/media/images/product/6fa3ce2d-5126-41a7-95eb-679d0f6ebfc3-2661.jpeg differ diff --git a/local/media/images/product/703-Prise+RJ+45+double+J-1.png b/local/media/images/product/703-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..eb9d5ac8 Binary files /dev/null and b/local/media/images/product/703-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/705-Prise+RJ+45+simple+J-1.png b/local/media/images/product/705-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..78c26229 Binary files /dev/null and b/local/media/images/product/705-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/706-Prise+RJ+45+double+J-1.png b/local/media/images/product/706-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..f58ea3b3 Binary files /dev/null and b/local/media/images/product/706-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/708c6b0d-f959-4ade-9f44-07e5f44ec174-2689.jpeg b/local/media/images/product/708c6b0d-f959-4ade-9f44-07e5f44ec174-2689.jpeg new file mode 100644 index 00000000..f568d241 Binary files /dev/null and b/local/media/images/product/708c6b0d-f959-4ade-9f44-07e5f44ec174-2689.jpeg differ diff --git a/local/media/images/product/71-JUNG_LS982GGO-1.jpg b/local/media/images/product/71-JUNG_LS982GGO-1.jpg new file mode 100644 index 00000000..8dc1fe14 Binary files /dev/null and b/local/media/images/product/71-JUNG_LS982GGO-1.jpg differ diff --git a/local/media/images/product/72-JUNG_LS983W-1.jpg b/local/media/images/product/72-JUNG_LS983W-1.jpg new file mode 100644 index 00000000..66f074c4 Binary files /dev/null and b/local/media/images/product/72-JUNG_LS983W-1.jpg differ diff --git a/local/media/images/product/720-Cadre+Flat+1+poste+J-1.png b/local/media/images/product/720-Cadre+Flat+1+poste+J-1.png new file mode 100644 index 00000000..4f3952af Binary files /dev/null and b/local/media/images/product/720-Cadre+Flat+1+poste+J-1.png differ diff --git a/local/media/images/product/72380130-9fba-45ef-91b7-6524d4b79dd1-2623.jpeg b/local/media/images/product/72380130-9fba-45ef-91b7-6524d4b79dd1-2623.jpeg new file mode 100644 index 00000000..5ff75488 Binary files /dev/null and b/local/media/images/product/72380130-9fba-45ef-91b7-6524d4b79dd1-2623.jpeg differ diff --git a/local/media/images/product/725-Prise+RJ+45+simple+J-1.png b/local/media/images/product/725-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..b9b4bec9 Binary files /dev/null and b/local/media/images/product/725-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/726-Prise+RJ+45+double+J-1.png b/local/media/images/product/726-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..18397bba Binary files /dev/null and b/local/media/images/product/726-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/73-JUNG_LS983SW-1.jpg b/local/media/images/product/73-JUNG_LS983SW-1.jpg new file mode 100644 index 00000000..f8df4153 Binary files /dev/null and b/local/media/images/product/73-JUNG_LS983SW-1.jpg differ diff --git a/local/media/images/product/74-JUNG_LS983LG-1.jpg b/local/media/images/product/74-JUNG_LS983LG-1.jpg new file mode 100644 index 00000000..000e9351 Binary files /dev/null and b/local/media/images/product/74-JUNG_LS983LG-1.jpg differ diff --git a/local/media/images/product/742-Prise+courant+JUNG-1.png b/local/media/images/product/742-Prise+courant+JUNG-1.png new file mode 100644 index 00000000..9feb54e1 Binary files /dev/null and b/local/media/images/product/742-Prise+courant+JUNG-1.png differ diff --git a/local/media/images/product/744-Prise+RJ+45+simple+J-1.png b/local/media/images/product/744-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..1231f82a Binary files /dev/null and b/local/media/images/product/744-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/745-Prise+RJ+45+double+J-1.png b/local/media/images/product/745-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..4b695ee6 Binary files /dev/null and b/local/media/images/product/745-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/76-JUNG_LS983GGO-1.jpg b/local/media/images/product/76-JUNG_LS983GGO-1.jpg new file mode 100644 index 00000000..886793b4 Binary files /dev/null and b/local/media/images/product/76-JUNG_LS983GGO-1.jpg differ diff --git a/local/media/images/product/763-Prise+RJ+45+simple+J-1.png b/local/media/images/product/763-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..96e5468c Binary files /dev/null and b/local/media/images/product/763-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/764-Prise+RJ+45+double+J-1.png b/local/media/images/product/764-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..d7b5ec6b Binary files /dev/null and b/local/media/images/product/764-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/77-JUNG_LS984W-1.jpg b/local/media/images/product/77-JUNG_LS984W-1.jpg new file mode 100644 index 00000000..64ed5a00 Binary files /dev/null and b/local/media/images/product/77-JUNG_LS984W-1.jpg differ diff --git a/local/media/images/product/78-JUNG_LS984SW-1.jpg b/local/media/images/product/78-JUNG_LS984SW-1.jpg new file mode 100644 index 00000000..ce609f29 Binary files /dev/null and b/local/media/images/product/78-JUNG_LS984SW-1.jpg differ diff --git a/local/media/images/product/782-Prise+RJ+45+double+J-1.png b/local/media/images/product/782-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..d7983245 Binary files /dev/null and b/local/media/images/product/782-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/79-JUNG_LS984LG-1.jpg b/local/media/images/product/79-JUNG_LS984LG-1.jpg new file mode 100644 index 00000000..a2486618 Binary files /dev/null and b/local/media/images/product/79-JUNG_LS984LG-1.jpg differ diff --git a/local/media/images/product/8-Bouton+poussoir+simp-1.png b/local/media/images/product/8-Bouton+poussoir+simp-1.png new file mode 100644 index 00000000..db285342 Binary files /dev/null and b/local/media/images/product/8-Bouton+poussoir+simp-1.png differ diff --git a/local/media/images/product/800-Prise+RJ+45+simple+J-1.png b/local/media/images/product/800-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..f8d599d9 Binary files /dev/null and b/local/media/images/product/800-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/801-Prise+RJ+45+double+J-1.png b/local/media/images/product/801-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..c095c838 Binary files /dev/null and b/local/media/images/product/801-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/803-Bouton-poussoir+1+vo-1.png b/local/media/images/product/803-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..bc5d9c5e Binary files /dev/null and b/local/media/images/product/803-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/804-Bouton-poussoir+1+vo-1.png b/local/media/images/product/804-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..bc5d9c5e Binary files /dev/null and b/local/media/images/product/804-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/807-Platine+commande+2+v-1.png b/local/media/images/product/807-Platine+commande+2+v-1.png new file mode 100644 index 00000000..830f2e16 Binary files /dev/null and b/local/media/images/product/807-Platine+commande+2+v-1.png differ diff --git a/local/media/images/product/81-JUNG_LS984GGO-1.jpg b/local/media/images/product/81-JUNG_LS984GGO-1.jpg new file mode 100644 index 00000000..98fe9edb Binary files /dev/null and b/local/media/images/product/81-JUNG_LS984GGO-1.jpg differ diff --git a/local/media/images/product/819-Prise+RJ+45+simple+J-1.png b/local/media/images/product/819-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..a245d18b Binary files /dev/null and b/local/media/images/product/819-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/82-JUNG_LS985W-1.jpg b/local/media/images/product/82-JUNG_LS985W-1.jpg new file mode 100644 index 00000000..11dc9b85 Binary files /dev/null and b/local/media/images/product/82-JUNG_LS985W-1.jpg differ diff --git a/local/media/images/product/820-Prise+RJ+45+double+J-1.png b/local/media/images/product/820-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..7ededea4 Binary files /dev/null and b/local/media/images/product/820-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/83-JUNG_LS985SW-1.jpg b/local/media/images/product/83-JUNG_LS985SW-1.jpg new file mode 100644 index 00000000..3b822fe7 Binary files /dev/null and b/local/media/images/product/83-JUNG_LS985SW-1.jpg differ diff --git a/local/media/images/product/838-Prise+RJ+45+simple+J-1.png b/local/media/images/product/838-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..99d6ca2e Binary files /dev/null and b/local/media/images/product/838-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/839-Prise+RJ+45+double+J-1.png b/local/media/images/product/839-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..f3cd5f5c Binary files /dev/null and b/local/media/images/product/839-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/83b277c9-5a6c-4eba-883d-1c69f7034d42-2660.jpeg b/local/media/images/product/83b277c9-5a6c-4eba-883d-1c69f7034d42-2660.jpeg new file mode 100644 index 00000000..a808c1e5 Binary files /dev/null and b/local/media/images/product/83b277c9-5a6c-4eba-883d-1c69f7034d42-2660.jpeg differ diff --git a/local/media/images/product/84-JUNG_LS985LG-1.jpg b/local/media/images/product/84-JUNG_LS985LG-1.jpg new file mode 100644 index 00000000..ecbdc658 Binary files /dev/null and b/local/media/images/product/84-JUNG_LS985LG-1.jpg differ diff --git a/local/media/images/product/845-Platine+commande+2+v-1.png b/local/media/images/product/845-Platine+commande+2+v-1.png new file mode 100644 index 00000000..ee887a0c Binary files /dev/null and b/local/media/images/product/845-Platine+commande+2+v-1.png differ diff --git a/local/media/images/product/846-Platine+commande+4+v-1.png b/local/media/images/product/846-Platine+commande+4+v-1.png new file mode 100644 index 00000000..2e5a1889 Binary files /dev/null and b/local/media/images/product/846-Platine+commande+4+v-1.png differ diff --git a/local/media/images/product/857-Prise+RJ+45+simple+J-1.png b/local/media/images/product/857-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..9a0d97b2 Binary files /dev/null and b/local/media/images/product/857-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/859-Bouton-poussoir+1+vo-1.png b/local/media/images/product/859-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..4b2b5084 Binary files /dev/null and b/local/media/images/product/859-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/86-JUNG_LS995KO5-1.jpg b/local/media/images/product/86-JUNG_LS995KO5-1.jpg new file mode 100644 index 00000000..c289cf15 Binary files /dev/null and b/local/media/images/product/86-JUNG_LS995KO5-1.jpg differ diff --git a/local/media/images/product/860-Bouton-poussoir+1+vo-1.png b/local/media/images/product/860-Bouton-poussoir+1+vo-1.png new file mode 100644 index 00000000..4b2b5084 Binary files /dev/null and b/local/media/images/product/860-Bouton-poussoir+1+vo-1.png differ diff --git a/local/media/images/product/865-Prise+courant+JUNG-1.png b/local/media/images/product/865-Prise+courant+JUNG-1.png new file mode 100644 index 00000000..4e71eb3a Binary files /dev/null and b/local/media/images/product/865-Prise+courant+JUNG-1.png differ diff --git a/local/media/images/product/867-Prise+RJ+45+simple+J-1.png b/local/media/images/product/867-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..d889e6cd Binary files /dev/null and b/local/media/images/product/867-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/869-Prise+RJ+45+double+J-1.png b/local/media/images/product/869-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..5a82c1cb Binary files /dev/null and b/local/media/images/product/869-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/87-JUNG_LS995KO5SW-1.jpg b/local/media/images/product/87-JUNG_LS995KO5SW-1.jpg new file mode 100644 index 00000000..90e213a2 Binary files /dev/null and b/local/media/images/product/87-JUNG_LS995KO5SW-1.jpg differ diff --git a/local/media/images/product/88-JUNG_LS995KO5LG-1.jpg b/local/media/images/product/88-JUNG_LS995KO5LG-1.jpg new file mode 100644 index 00000000..f4f577e5 Binary files /dev/null and b/local/media/images/product/88-JUNG_LS995KO5LG-1.jpg differ diff --git a/local/media/images/product/882-Prise+RJ+45+simple+J-1.png b/local/media/images/product/882-Prise+RJ+45+simple+J-1.png new file mode 100644 index 00000000..a790f5f8 Binary files /dev/null and b/local/media/images/product/882-Prise+RJ+45+simple+J-1.png differ diff --git a/local/media/images/product/883-Prise+RJ+45+double+J-1.png b/local/media/images/product/883-Prise+RJ+45+double+J-1.png new file mode 100644 index 00000000..684d2dfe Binary files /dev/null and b/local/media/images/product/883-Prise+RJ+45+double+J-1.png differ diff --git a/local/media/images/product/89-Enjoliveur+double+do-1.png b/local/media/images/product/89-Enjoliveur+double+do-1.png new file mode 100644 index 00000000..23e79613 Binary files /dev/null and b/local/media/images/product/89-Enjoliveur+double+do-1.png differ diff --git a/local/media/images/product/895-Controleur+ProServ-1.png b/local/media/images/product/895-Controleur+ProServ-1.png new file mode 100644 index 00000000..2ce68699 Binary files /dev/null and b/local/media/images/product/895-Controleur+ProServ-1.png differ diff --git a/local/media/images/product/896-Application+Z41+remo-1.png b/local/media/images/product/896-Application+Z41+remo-1.png new file mode 100644 index 00000000..f404ce7a Binary files /dev/null and b/local/media/images/product/896-Application+Z41+remo-1.png differ diff --git a/local/media/images/product/897-Application+Trivum+--1.png b/local/media/images/product/897-Application+Trivum+--1.png new file mode 100644 index 00000000..81248440 Binary files /dev/null and b/local/media/images/product/897-Application+Trivum+--1.png differ diff --git a/local/media/images/product/898-Alimentation+24+V+DC-1.png b/local/media/images/product/898-Alimentation+24+V+DC-1.png new file mode 100644 index 00000000..80983ac5 Binary files /dev/null and b/local/media/images/product/898-Alimentation+24+V+DC-1.png differ diff --git a/local/media/images/product/898-d3f38a5a05347d2568062db21cdf-1.jpg b/local/media/images/product/898-d3f38a5a05347d2568062db21cdf-1.jpg new file mode 100644 index 00000000..80983ac5 Binary files /dev/null and b/local/media/images/product/898-d3f38a5a05347d2568062db21cdf-1.jpg differ diff --git a/local/media/images/product/899-Alimentation+24+V+DC-1.png b/local/media/images/product/899-Alimentation+24+V+DC-1.png new file mode 100644 index 00000000..e70e71fe Binary files /dev/null and b/local/media/images/product/899-Alimentation+24+V+DC-1.png differ diff --git a/local/media/images/product/89b95511-84a3-4479-b6f2-dde1f990988a-2649.jpeg b/local/media/images/product/89b95511-84a3-4479-b6f2-dde1f990988a-2649.jpeg new file mode 100644 index 00000000..953a60ec Binary files /dev/null and b/local/media/images/product/89b95511-84a3-4479-b6f2-dde1f990988a-2649.jpeg differ diff --git a/local/media/images/product/8aa41467-796b-4736-abfb-33f959f25492-2679.jpeg b/local/media/images/product/8aa41467-796b-4736-abfb-33f959f25492-2679.jpeg new file mode 100644 index 00000000..362b7e2c Binary files /dev/null and b/local/media/images/product/8aa41467-796b-4736-abfb-33f959f25492-2679.jpeg differ diff --git a/local/media/images/product/8c530af7afaea4379c6368d4c0b47e6b-1473.png b/local/media/images/product/8c530af7afaea4379c6368d4c0b47e6b-1473.png new file mode 100644 index 00000000..8c54ec2b Binary files /dev/null and b/local/media/images/product/8c530af7afaea4379c6368d4c0b47e6b-1473.png differ diff --git a/local/media/images/product/9-JUNG_4072-1.01LED-1.jpg b/local/media/images/product/9-JUNG_4072-1.01LED-1.jpg new file mode 100644 index 00000000..a5260edd Binary files /dev/null and b/local/media/images/product/9-JUNG_4072-1.01LED-1.jpg differ diff --git a/local/media/images/product/90-JUNG_LS995P-1.jpg b/local/media/images/product/90-JUNG_LS995P-1.jpg new file mode 100644 index 00000000..6703fac5 Binary files /dev/null and b/local/media/images/product/90-JUNG_LS995P-1.jpg differ diff --git a/local/media/images/product/900-Alimentation+24+V+DC-1.png b/local/media/images/product/900-Alimentation+24+V+DC-1.png new file mode 100644 index 00000000..d309295a Binary files /dev/null and b/local/media/images/product/900-Alimentation+24+V+DC-1.png differ diff --git a/local/media/images/product/908-kit+climat+pour+habi-1.png b/local/media/images/product/908-kit+climat+pour+habi-1.png new file mode 100644 index 00000000..2da17b9c Binary files /dev/null and b/local/media/images/product/908-kit+climat+pour+habi-1.png differ diff --git a/local/media/images/product/91-JUNG_LS995PSW-1.jpg b/local/media/images/product/91-JUNG_LS995PSW-1.jpg new file mode 100644 index 00000000..40810729 Binary files /dev/null and b/local/media/images/product/91-JUNG_LS995PSW-1.jpg differ diff --git a/local/media/images/product/912-Enjoliveur+de+doigt+-1.png b/local/media/images/product/912-Enjoliveur+de+doigt+-1.png new file mode 100644 index 00000000..cc65a855 Binary files /dev/null and b/local/media/images/product/912-Enjoliveur+de+doigt+-1.png differ diff --git a/local/media/images/product/915-Alimentation+24+V+DC-1.png b/local/media/images/product/915-Alimentation+24+V+DC-1.png new file mode 100644 index 00000000..1f76dba6 Binary files /dev/null and b/local/media/images/product/915-Alimentation+24+V+DC-1.png differ diff --git a/local/media/images/product/92-JUNG_LS995PLG-1.jpg b/local/media/images/product/92-JUNG_LS995PLG-1.jpg new file mode 100644 index 00000000..f1e04348 Binary files /dev/null and b/local/media/images/product/92-JUNG_LS995PLG-1.jpg differ diff --git a/local/media/images/product/92b71be6-1295-4362-a024-8b05afed44ee-2686.jpeg b/local/media/images/product/92b71be6-1295-4362-a024-8b05afed44ee-2686.jpeg new file mode 100644 index 00000000..fa1c5a91 Binary files /dev/null and b/local/media/images/product/92b71be6-1295-4362-a024-8b05afed44ee-2686.jpeg differ diff --git a/local/media/images/product/93-Enjoliveur+double+do-1.png b/local/media/images/product/93-Enjoliveur+double+do-1.png new file mode 100644 index 00000000..2d8598e7 Binary files /dev/null and b/local/media/images/product/93-Enjoliveur+double+do-1.png differ diff --git a/local/media/images/product/95-JUNG_4072.01LED-1.jpg b/local/media/images/product/95-JUNG_4072.01LED-1.jpg new file mode 100644 index 00000000..a5260edd Binary files /dev/null and b/local/media/images/product/95-JUNG_4072.01LED-1.jpg differ diff --git a/local/media/images/product/96-SCHNEIDER_ALTIRA_2_poussoirs_LED_blanc-1.jpg b/local/media/images/product/96-SCHNEIDER_ALTIRA_2_poussoirs_LED_blanc-1.jpg new file mode 100644 index 00000000..000b6a5c Binary files /dev/null and b/local/media/images/product/96-SCHNEIDER_ALTIRA_2_poussoirs_LED_blanc-1.jpg differ diff --git a/local/media/images/product/969f2eee-2aef-4964-8d6c-27a6807dbcce-2644.jpeg b/local/media/images/product/969f2eee-2aef-4964-8d6c-27a6807dbcce-2644.jpeg new file mode 100644 index 00000000..daf47041 Binary files /dev/null and b/local/media/images/product/969f2eee-2aef-4964-8d6c-27a6807dbcce-2644.jpeg differ diff --git a/local/media/images/product/96db4f8f-b039-4f32-bbeb-83ac94910e9e-2677.jpeg b/local/media/images/product/96db4f8f-b039-4f32-bbeb-83ac94910e9e-2677.jpeg new file mode 100644 index 00000000..61243000 Binary files /dev/null and b/local/media/images/product/96db4f8f-b039-4f32-bbeb-83ac94910e9e-2677.jpeg differ diff --git a/local/media/images/product/97-SCHNEIDER_ALTIRA_4_poussoirs_LED_blanc-1.jpg b/local/media/images/product/97-SCHNEIDER_ALTIRA_4_poussoirs_LED_blanc-1.jpg new file mode 100644 index 00000000..0ee7edc8 Binary files /dev/null and b/local/media/images/product/97-SCHNEIDER_ALTIRA_4_poussoirs_LED_blanc-1.jpg differ diff --git a/local/media/images/product/97782f69-6e2a-4528-8bf7-87fbfb6f368b-2619.jpeg b/local/media/images/product/97782f69-6e2a-4528-8bf7-87fbfb6f368b-2619.jpeg new file mode 100644 index 00000000..975b95da Binary files /dev/null and b/local/media/images/product/97782f69-6e2a-4528-8bf7-87fbfb6f368b-2619.jpeg differ diff --git a/local/media/images/product/99-SCHNEIDER_UNICA_2_poussoirs_graphte-1.jpg b/local/media/images/product/99-SCHNEIDER_UNICA_2_poussoirs_graphte-1.jpg new file mode 100644 index 00000000..e6a33595 Binary files /dev/null and b/local/media/images/product/99-SCHNEIDER_UNICA_2_poussoirs_graphte-1.jpg differ diff --git a/local/media/images/product/a4d4cdec-6d66-4128-acf0-ab3ff24513a1-2633.jpeg b/local/media/images/product/a4d4cdec-6d66-4128-acf0-ab3ff24513a1-2633.jpeg new file mode 100644 index 00000000..91602582 Binary files /dev/null and b/local/media/images/product/a4d4cdec-6d66-4128-acf0-ab3ff24513a1-2633.jpeg differ diff --git a/local/media/images/product/a5141605-5991-4e31-b3e2-c9f31cb5f03b-2647.jpeg b/local/media/images/product/a5141605-5991-4e31-b3e2-c9f31cb5f03b-2647.jpeg new file mode 100644 index 00000000..d704dd64 Binary files /dev/null and b/local/media/images/product/a5141605-5991-4e31-b3e2-c9f31cb5f03b-2647.jpeg differ diff --git a/local/media/images/product/a7263d84-b44f-4786-b94e-97904fdc232f-2625.jpeg b/local/media/images/product/a7263d84-b44f-4786-b94e-97904fdc232f-2625.jpeg new file mode 100644 index 00000000..73eb6945 Binary files /dev/null and b/local/media/images/product/a7263d84-b44f-4786-b94e-97904fdc232f-2625.jpeg differ diff --git a/local/media/images/product/aa31703psma6_web-2533.png b/local/media/images/product/aa31703psma6_web-2533.png new file mode 100644 index 00000000..9d7bcdbe Binary files /dev/null and b/local/media/images/product/aa31703psma6_web-2533.png differ diff --git a/local/media/images/product/ab2dfba7-ef00-4859-9766-cd4144525ed5-2682.jpeg b/local/media/images/product/ab2dfba7-ef00-4859-9766-cd4144525ed5-2682.jpeg new file mode 100644 index 00000000..ba89d46f Binary files /dev/null and b/local/media/images/product/ab2dfba7-ef00-4859-9766-cd4144525ed5-2682.jpeg differ diff --git a/local/media/images/product/acoustimass_series1_angleright_lg-2415.jpg b/local/media/images/product/acoustimass_series1_angleright_lg-2415.jpg new file mode 100644 index 00000000..1c06ce33 Binary files /dev/null and b/local/media/images/product/acoustimass_series1_angleright_lg-2415.jpg differ diff --git a/local/media/images/product/actinboxmax6-1447.png b/local/media/images/product/actinboxmax6-1447.png new file mode 100644 index 00000000..38ad184e Binary files /dev/null and b/local/media/images/product/actinboxmax6-1447.png differ diff --git a/local/media/images/product/actinboxquatro-1446.png b/local/media/images/product/actinboxquatro-1446.png new file mode 100644 index 00000000..3450ba3c Binary files /dev/null and b/local/media/images/product/actinboxquatro-1446.png differ diff --git a/local/media/images/product/actionneur16sortiestor2316.16reghe-1455.png b/local/media/images/product/actionneur16sortiestor2316.16reghe-1455.png new file mode 100644 index 00000000..08f4b4fe Binary files /dev/null and b/local/media/images/product/actionneur16sortiestor2316.16reghe-1455.png differ diff --git a/local/media/images/product/actionneur4sortiestor2304.16reghe-1460.png b/local/media/images/product/actionneur4sortiestor2304.16reghe-1460.png new file mode 100644 index 00000000..bab23a97 Binary files /dev/null and b/local/media/images/product/actionneur4sortiestor2304.16reghe-1460.png differ diff --git a/local/media/images/product/actionneur4sortiestor2304.16reghm-1456.png b/local/media/images/product/actionneur4sortiestor2304.16reghm-1456.png new file mode 100644 index 00000000..37840d08 Binary files /dev/null and b/local/media/images/product/actionneur4sortiestor2304.16reghm-1456.png differ diff --git a/local/media/images/product/actionneur8sortiestor2308.16regchm-1458.png b/local/media/images/product/actionneur8sortiestor2308.16regchm-1458.png new file mode 100644 index 00000000..2ee5f06a Binary files /dev/null and b/local/media/images/product/actionneur8sortiestor2308.16regchm-1458.png differ diff --git a/local/media/images/product/actionneur8sortiestor2308.16reghe-1459.png b/local/media/images/product/actionneur8sortiestor2308.16reghe-1459.png new file mode 100644 index 00000000..8af49d43 Binary files /dev/null and b/local/media/images/product/actionneur8sortiestor2308.16reghe-1459.png differ diff --git a/local/media/images/product/ae5d8b92-d23a-4257-8de0-cd6c4715d9e4-2687.jpeg b/local/media/images/product/ae5d8b92-d23a-4257-8de0-cd6c4715d9e4-2687.jpeg new file mode 100644 index 00000000..adb2f422 Binary files /dev/null and b/local/media/images/product/ae5d8b92-d23a-4257-8de0-cd6c4715d9e4-2687.jpeg differ diff --git a/local/media/images/product/aefbab3a-5137-445a-9eb4-3a91c76ebc53-2624.jpeg b/local/media/images/product/aefbab3a-5137-445a-9eb4-3a91c76ebc53-2624.jpeg new file mode 100644 index 00000000..9231f376 Binary files /dev/null and b/local/media/images/product/aefbab3a-5137-445a-9eb4-3a91c76ebc53-2624.jpeg differ diff --git a/local/media/images/product/al2969-2uanm9005-2826.png b/local/media/images/product/al2969-2uanm9005-2826.png new file mode 100644 index 00000000..da4762c5 Binary files /dev/null and b/local/media/images/product/al2969-2uanm9005-2826.png differ diff --git a/local/media/images/product/al2969-2uanmg-2827.png b/local/media/images/product/al2969-2uanmg-2827.png new file mode 100644 index 00000000..cd2c48c5 Binary files /dev/null and b/local/media/images/product/al2969-2uanmg-2827.png differ diff --git a/local/media/images/product/al2969-2uarc-2828.png b/local/media/images/product/al2969-2uarc-2828.png new file mode 100644 index 00000000..26e24975 Binary files /dev/null and b/local/media/images/product/al2969-2uarc-2828.png differ diff --git a/local/media/images/product/al2969-2uarg-2829.png b/local/media/images/product/al2969-2uarg-2829.png new file mode 100644 index 00000000..f99bb002 Binary files /dev/null and b/local/media/images/product/al2969-2uarg-2829.png differ diff --git a/local/media/images/product/al2981annm9005-2834.png b/local/media/images/product/al2981annm9005-2834.png new file mode 100644 index 00000000..a6d2c59a Binary files /dev/null and b/local/media/images/product/al2981annm9005-2834.png differ diff --git a/local/media/images/product/al2981annmg-2835.png b/local/media/images/product/al2981annmg-2835.png new file mode 100644 index 00000000..25b9f27a Binary files /dev/null and b/local/media/images/product/al2981annmg-2835.png differ diff --git a/local/media/images/product/al2981drc-2836.png b/local/media/images/product/al2981drc-2836.png new file mode 100644 index 00000000..90973ca9 Binary files /dev/null and b/local/media/images/product/al2981drc-2836.png differ diff --git a/local/media/images/product/al2981drg-2837.png b/local/media/images/product/al2981drg-2837.png new file mode 100644 index 00000000..02fff39d Binary files /dev/null and b/local/media/images/product/al2981drg-2837.png differ diff --git a/local/media/images/product/al2982annm9005-2838.png b/local/media/images/product/al2982annm9005-2838.png new file mode 100644 index 00000000..25e64c6c Binary files /dev/null and b/local/media/images/product/al2982annm9005-2838.png differ diff --git a/local/media/images/product/al2982annmg-2839.png b/local/media/images/product/al2982annmg-2839.png new file mode 100644 index 00000000..7853612e Binary files /dev/null and b/local/media/images/product/al2982annmg-2839.png differ diff --git a/local/media/images/product/al2982drc-2840.png b/local/media/images/product/al2982drc-2840.png new file mode 100644 index 00000000..86c7c996 Binary files /dev/null and b/local/media/images/product/al2982drc-2840.png differ diff --git a/local/media/images/product/al2982drg-2841.png b/local/media/images/product/al2982drg-2841.png new file mode 100644 index 00000000..dff8ee30 Binary files /dev/null and b/local/media/images/product/al2982drg-2841.png differ diff --git a/local/media/images/product/al2983annm9005-2842.png b/local/media/images/product/al2983annm9005-2842.png new file mode 100644 index 00000000..cbb75675 Binary files /dev/null and b/local/media/images/product/al2983annm9005-2842.png differ diff --git a/local/media/images/product/al2983drc-2843.png b/local/media/images/product/al2983drc-2843.png new file mode 100644 index 00000000..9c62235f Binary files /dev/null and b/local/media/images/product/al2983drc-2843.png differ diff --git a/local/media/images/product/al2983drg-2844.png b/local/media/images/product/al2983drg-2844.png new file mode 100644 index 00000000..41c099a8 Binary files /dev/null and b/local/media/images/product/al2983drg-2844.png differ diff --git a/local/media/images/product/al2984annm9005-2846.png b/local/media/images/product/al2984annm9005-2846.png new file mode 100644 index 00000000..4182248d Binary files /dev/null and b/local/media/images/product/al2984annm9005-2846.png differ diff --git a/local/media/images/product/al2984annmg-2847.png b/local/media/images/product/al2984annmg-2847.png new file mode 100644 index 00000000..289376e2 Binary files /dev/null and b/local/media/images/product/al2984annmg-2847.png differ diff --git a/local/media/images/product/al2984drc-2848.png b/local/media/images/product/al2984drc-2848.png new file mode 100644 index 00000000..27b6c780 Binary files /dev/null and b/local/media/images/product/al2984drc-2848.png differ diff --git a/local/media/images/product/al2984drg-2849.png b/local/media/images/product/al2984drg-2849.png new file mode 100644 index 00000000..3cc4ffb5 Binary files /dev/null and b/local/media/images/product/al2984drg-2849.png differ diff --git a/local/media/images/product/al2985annm9005-2850.png b/local/media/images/product/al2985annm9005-2850.png new file mode 100644 index 00000000..eec154c3 Binary files /dev/null and b/local/media/images/product/al2985annm9005-2850.png differ diff --git a/local/media/images/product/al2985annmg-2851.png b/local/media/images/product/al2985annmg-2851.png new file mode 100644 index 00000000..74d937d3 Binary files /dev/null and b/local/media/images/product/al2985annmg-2851.png differ diff --git a/local/media/images/product/al2985drg-2853.png b/local/media/images/product/al2985drg-2853.png new file mode 100644 index 00000000..826c180f Binary files /dev/null and b/local/media/images/product/al2985drg-2853.png differ diff --git a/local/media/images/product/al2990anm9005-2890.png b/local/media/images/product/al2990anm9005-2890.png new file mode 100644 index 00000000..57aa390b Binary files /dev/null and b/local/media/images/product/al2990anm9005-2890.png differ diff --git a/local/media/images/product/al2990anmg-2891.png b/local/media/images/product/al2990anmg-2891.png new file mode 100644 index 00000000..d2c273d1 Binary files /dev/null and b/local/media/images/product/al2990anmg-2891.png differ diff --git a/local/media/images/product/al2990arc-2892.png b/local/media/images/product/al2990arc-2892.png new file mode 100644 index 00000000..2052b5bc Binary files /dev/null and b/local/media/images/product/al2990arc-2892.png differ diff --git a/local/media/images/product/al2990arg-2893.png b/local/media/images/product/al2990arg-2893.png new file mode 100644 index 00000000..c76ab048 Binary files /dev/null and b/local/media/images/product/al2990arg-2893.png differ diff --git a/local/media/images/product/al2990klannm9005-2822.png b/local/media/images/product/al2990klannm9005-2822.png new file mode 100644 index 00000000..77261e81 Binary files /dev/null and b/local/media/images/product/al2990klannm9005-2822.png differ diff --git a/local/media/images/product/al2990klannmg-2823.png b/local/media/images/product/al2990klannmg-2823.png new file mode 100644 index 00000000..3cfa4021 Binary files /dev/null and b/local/media/images/product/al2990klannmg-2823.png differ diff --git a/local/media/images/product/al2990nm9005-2759.png b/local/media/images/product/al2990nm9005-2759.png new file mode 100644 index 00000000..fbe80bad Binary files /dev/null and b/local/media/images/product/al2990nm9005-2759.png differ diff --git a/local/media/images/product/al2990nmg-2760.png b/local/media/images/product/al2990nmg-2760.png new file mode 100644 index 00000000..f94d846d Binary files /dev/null and b/local/media/images/product/al2990nmg-2760.png differ diff --git a/local/media/images/product/al2990rc-2758.png b/local/media/images/product/al2990rc-2758.png new file mode 100644 index 00000000..588852a8 Binary files /dev/null and b/local/media/images/product/al2990rc-2758.png differ diff --git a/local/media/images/product/al2990rg-2761.png b/local/media/images/product/al2990rg-2761.png new file mode 100644 index 00000000..d254f45c Binary files /dev/null and b/local/media/images/product/al2990rg-2761.png differ diff --git a/local/media/images/product/al2990satnm9005-2818.png b/local/media/images/product/al2990satnm9005-2818.png new file mode 100644 index 00000000..3bc4b5f0 Binary files /dev/null and b/local/media/images/product/al2990satnm9005-2818.png differ diff --git a/local/media/images/product/al2990satnmg-2819.png b/local/media/images/product/al2990satnmg-2819.png new file mode 100644 index 00000000..815208e3 Binary files /dev/null and b/local/media/images/product/al2990satnmg-2819.png differ diff --git a/local/media/images/product/al2990satrc-2820.png b/local/media/images/product/al2990satrc-2820.png new file mode 100644 index 00000000..2987d87e Binary files /dev/null and b/local/media/images/product/al2990satrc-2820.png differ diff --git a/local/media/images/product/al2990satrc-2852.png b/local/media/images/product/al2990satrc-2852.png new file mode 100644 index 00000000..1832e5c7 Binary files /dev/null and b/local/media/images/product/al2990satrc-2852.png differ diff --git a/local/media/images/product/al2990satrg-2821.png b/local/media/images/product/al2990satrg-2821.png new file mode 100644 index 00000000..23c07b34 Binary files /dev/null and b/local/media/images/product/al2990satrg-2821.png differ diff --git a/local/media/images/product/al2994nm9005-2814.png b/local/media/images/product/al2994nm9005-2814.png new file mode 100644 index 00000000..fbe80bad Binary files /dev/null and b/local/media/images/product/al2994nm9005-2814.png differ diff --git a/local/media/images/product/al2994nmg-2815.png b/local/media/images/product/al2994nmg-2815.png new file mode 100644 index 00000000..f94d846d Binary files /dev/null and b/local/media/images/product/al2994nmg-2815.png differ diff --git a/local/media/images/product/al2994rc-2816.png b/local/media/images/product/al2994rc-2816.png new file mode 100644 index 00000000..588852a8 Binary files /dev/null and b/local/media/images/product/al2994rc-2816.png differ diff --git a/local/media/images/product/al2994rg-2817.png b/local/media/images/product/al2994rg-2817.png new file mode 100644 index 00000000..d254f45c Binary files /dev/null and b/local/media/images/product/al2994rg-2817.png differ diff --git a/local/media/images/product/al2995ko5nm9005-2810.png b/local/media/images/product/al2995ko5nm9005-2810.png new file mode 100644 index 00000000..1e748844 Binary files /dev/null and b/local/media/images/product/al2995ko5nm9005-2810.png differ diff --git a/local/media/images/product/al2995ko5nmg-2811.png b/local/media/images/product/al2995ko5nmg-2811.png new file mode 100644 index 00000000..88c083b6 Binary files /dev/null and b/local/media/images/product/al2995ko5nmg-2811.png differ diff --git a/local/media/images/product/al2995ko5rc-2812.png b/local/media/images/product/al2995ko5rc-2812.png new file mode 100644 index 00000000..3ac39a6e Binary files /dev/null and b/local/media/images/product/al2995ko5rc-2812.png differ diff --git a/local/media/images/product/al2995ko5rg-2813.png b/local/media/images/product/al2995ko5rg-2813.png new file mode 100644 index 00000000..732312df Binary files /dev/null and b/local/media/images/product/al2995ko5rg-2813.png differ diff --git a/local/media/images/product/al2995nm9005-2806.png b/local/media/images/product/al2995nm9005-2806.png new file mode 100644 index 00000000..7c723511 Binary files /dev/null and b/local/media/images/product/al2995nm9005-2806.png differ diff --git a/local/media/images/product/al2995nmg-2807.png b/local/media/images/product/al2995nmg-2807.png new file mode 100644 index 00000000..26adf721 Binary files /dev/null and b/local/media/images/product/al2995nmg-2807.png differ diff --git a/local/media/images/product/al2995rc-2808.png b/local/media/images/product/al2995rc-2808.png new file mode 100644 index 00000000..c75ca904 Binary files /dev/null and b/local/media/images/product/al2995rc-2808.png differ diff --git a/local/media/images/product/al2995rg-2809.png b/local/media/images/product/al2995rg-2809.png new file mode 100644 index 00000000..28b58827 Binary files /dev/null and b/local/media/images/product/al2995rg-2809.png differ diff --git a/local/media/images/product/alimlightanddomotique-2587.png b/local/media/images/product/alimlightanddomotique-2587.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2587.png differ diff --git a/local/media/images/product/alimlightanddomotique-2588.png b/local/media/images/product/alimlightanddomotique-2588.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2588.png differ diff --git a/local/media/images/product/alimlightanddomotique-2589.png b/local/media/images/product/alimlightanddomotique-2589.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2589.png differ diff --git a/local/media/images/product/alimlightanddomotique-2590.png b/local/media/images/product/alimlightanddomotique-2590.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2590.png differ diff --git a/local/media/images/product/alimlightanddomotique-2591.png b/local/media/images/product/alimlightanddomotique-2591.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2591.png differ diff --git a/local/media/images/product/alimlightanddomotique-2592.png b/local/media/images/product/alimlightanddomotique-2592.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2592.png differ diff --git a/local/media/images/product/alimlightanddomotique-2593.png b/local/media/images/product/alimlightanddomotique-2593.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2593.png differ diff --git a/local/media/images/product/alimlightanddomotique-2594.png b/local/media/images/product/alimlightanddomotique-2594.png new file mode 100644 index 00000000..a0d5dc22 Binary files /dev/null and b/local/media/images/product/alimlightanddomotique-2594.png differ diff --git a/local/media/images/product/aluminium-2701.png b/local/media/images/product/aluminium-2701.png new file mode 100644 index 00000000..3c4e9e37 Binary files /dev/null and b/local/media/images/product/aluminium-2701.png differ diff --git a/local/media/images/product/amplitrivumrp340-2353.png b/local/media/images/product/amplitrivumrp340-2353.png new file mode 100644 index 00000000..27e71a44 Binary files /dev/null and b/local/media/images/product/amplitrivumrp340-2353.png differ diff --git a/local/media/images/product/antenesmartradio-837.png b/local/media/images/product/antenesmartradio-837.png new file mode 100644 index 00000000..6859eaae Binary files /dev/null and b/local/media/images/product/antenesmartradio-837.png differ diff --git a/local/media/images/product/arreturgence-2322.jpg b/local/media/images/product/arreturgence-2322.jpg new file mode 100644 index 00000000..950f9748 Binary files /dev/null and b/local/media/images/product/arreturgence-2322.jpg differ diff --git a/local/media/images/product/b3d30757-fe1c-4cfd-a524-a13f1c7de7e5-2643.jpeg b/local/media/images/product/b3d30757-fe1c-4cfd-a524-a13f1c7de7e5-2643.jpeg new file mode 100644 index 00000000..219938d8 Binary files /dev/null and b/local/media/images/product/b3d30757-fe1c-4cfd-a524-a13f1c7de7e5-2643.jpeg differ diff --git a/local/media/images/product/b4facac7-eac0-4d67-8241-a0d2e19d3dde-2634.jpeg b/local/media/images/product/b4facac7-eac0-4d67-8241-a0d2e19d3dde-2634.jpeg new file mode 100644 index 00000000..c99a54e6 Binary files /dev/null and b/local/media/images/product/b4facac7-eac0-4d67-8241-a0d2e19d3dde-2634.jpeg differ diff --git a/local/media/images/product/bandeauetiquettetableauok-2431.jpg b/local/media/images/product/bandeauetiquettetableauok-2431.jpg new file mode 100644 index 00000000..8c186204 Binary files /dev/null and b/local/media/images/product/bandeauetiquettetableauok-2431.jpg differ diff --git a/local/media/images/product/blanc-2700.png b/local/media/images/product/blanc-2700.png new file mode 100644 index 00000000..23976ca6 Binary files /dev/null and b/local/media/images/product/blanc-2700.png differ diff --git a/local/media/images/product/boitierencastrable-1voie-1925.png b/local/media/images/product/boitierencastrable-1voie-1925.png new file mode 100644 index 00000000..d9872810 Binary files /dev/null and b/local/media/images/product/boitierencastrable-1voie-1925.png differ diff --git a/local/media/images/product/boitierencastrable-2voies-1926.png b/local/media/images/product/boitierencastrable-2voies-1926.png new file mode 100644 index 00000000..fbef4b51 Binary files /dev/null and b/local/media/images/product/boitierencastrable-2voies-1926.png differ diff --git a/local/media/images/product/boitierencastrable-3voies-1927.png b/local/media/images/product/boitierencastrable-3voies-1927.png new file mode 100644 index 00000000..302a1864 Binary files /dev/null and b/local/media/images/product/boitierencastrable-3voies-1927.png differ diff --git a/local/media/images/product/boitiersaillie-875.png b/local/media/images/product/boitiersaillie-875.png new file mode 100644 index 00000000..15cd5e3e Binary files /dev/null and b/local/media/images/product/boitiersaillie-875.png differ diff --git a/local/media/images/product/boutonappelsecours-2385.png b/local/media/images/product/boutonappelsecours-2385.png new file mode 100644 index 00000000..d2025b68 Binary files /dev/null and b/local/media/images/product/boutonappelsecours-2385.png differ diff --git a/local/media/images/product/boutonappelsecours-2392.png b/local/media/images/product/boutonappelsecours-2392.png new file mode 100644 index 00000000..d2025b68 Binary files /dev/null and b/local/media/images/product/boutonappelsecours-2392.png differ diff --git a/local/media/images/product/bpsimple-4071.01led-1434.png b/local/media/images/product/bpsimple-4071.01led-1434.png new file mode 100644 index 00000000..9a25ccf6 Binary files /dev/null and b/local/media/images/product/bpsimple-4071.01led-1434.png differ diff --git a/local/media/images/product/c1a63bfe-1293-4855-b896-c3024abf9803-2621.jpeg b/local/media/images/product/c1a63bfe-1293-4855-b896-c3024abf9803-2621.jpeg new file mode 100644 index 00000000..a53e72fd Binary files /dev/null and b/local/media/images/product/c1a63bfe-1293-4855-b896-c3024abf9803-2621.jpeg differ diff --git a/local/media/images/product/c38a9c8a-f281-4436-abc0-11c1c68f28cc-2678.jpeg b/local/media/images/product/c38a9c8a-f281-4436-abc0-11c1c68f28cc-2678.jpeg new file mode 100644 index 00000000..7c92934e Binary files /dev/null and b/local/media/images/product/c38a9c8a-f281-4436-abc0-11c1c68f28cc-2678.jpeg differ diff --git a/local/media/images/product/c5423e89-29c6-4a56-9de6-cb03ed9fbd25-2680.jpeg b/local/media/images/product/c5423e89-29c6-4a56-9de6-cb03ed9fbd25-2680.jpeg new file mode 100644 index 00000000..31b1c148 Binary files /dev/null and b/local/media/images/product/c5423e89-29c6-4a56-9de6-cb03ed9fbd25-2680.jpeg differ diff --git a/local/media/images/product/ca1b86b3-f83c-41f8-a4ba-c4a0ded65059-2684.jpeg b/local/media/images/product/ca1b86b3-f83c-41f8-a4ba-c4a0ded65059-2684.jpeg new file mode 100644 index 00000000..32aeaa85 Binary files /dev/null and b/local/media/images/product/ca1b86b3-f83c-41f8-a4ba-c4a0ded65059-2684.jpeg differ diff --git a/local/media/images/product/cable-831.png b/local/media/images/product/cable-831.png new file mode 100644 index 00000000..bb32d621 Binary files /dev/null and b/local/media/images/product/cable-831.png differ diff --git a/local/media/images/product/cadredoublet2424-grisfonce-1918.png b/local/media/images/product/cadredoublet2424-grisfonce-1918.png new file mode 100644 index 00000000..1d6832af Binary files /dev/null and b/local/media/images/product/cadredoublet2424-grisfonce-1918.png differ diff --git a/local/media/images/product/cadredoublet2425-ambre-1917.png b/local/media/images/product/cadredoublet2425-ambre-1917.png new file mode 100644 index 00000000..def8437d Binary files /dev/null and b/local/media/images/product/cadredoublet2425-ambre-1917.png differ diff --git a/local/media/images/product/cadredoublet2425-argentmetallise-1919.png b/local/media/images/product/cadredoublet2425-argentmetallise-1919.png new file mode 100644 index 00000000..e2c6a371 Binary files /dev/null and b/local/media/images/product/cadredoublet2425-argentmetallise-1919.png differ diff --git a/local/media/images/product/cadredoublet2425-blanc-1915.png b/local/media/images/product/cadredoublet2425-blanc-1915.png new file mode 100644 index 00000000..e2c22179 Binary files /dev/null and b/local/media/images/product/cadredoublet2425-blanc-1915.png differ diff --git a/local/media/images/product/cadredoublet2425-noir-1916.png b/local/media/images/product/cadredoublet2425-noir-1916.png new file mode 100644 index 00000000..85a037e2 Binary files /dev/null and b/local/media/images/product/cadredoublet2425-noir-1916.png differ diff --git a/local/media/images/product/cadreled.png-2307.png b/local/media/images/product/cadreled.png-2307.png new file mode 100644 index 00000000..24254cfa Binary files /dev/null and b/local/media/images/product/cadreled.png-2307.png differ diff --git a/local/media/images/product/cadreledalu.png-2309.png b/local/media/images/product/cadreledalu.png-2309.png new file mode 100644 index 00000000..949fefba Binary files /dev/null and b/local/media/images/product/cadreledalu.png-2309.png differ diff --git a/local/media/images/product/cadreledbronze.png-2310.png b/local/media/images/product/cadreledbronze.png-2310.png new file mode 100644 index 00000000..92653c7f Binary files /dev/null and b/local/media/images/product/cadreledbronze.png-2310.png differ diff --git a/local/media/images/product/cadreledcanonfusil.png-2311.png b/local/media/images/product/cadreledcanonfusil.png-2311.png new file mode 100644 index 00000000..4c47ed1a Binary files /dev/null and b/local/media/images/product/cadreledcanonfusil.png-2311.png differ diff --git a/local/media/images/product/cadreledinox.png-2312.png b/local/media/images/product/cadreledinox.png-2312.png new file mode 100644 index 00000000..661dc9b0 Binary files /dev/null and b/local/media/images/product/cadreledinox.png-2312.png differ diff --git a/local/media/images/product/cadrelednoir.png-2313.png b/local/media/images/product/cadrelednoir.png-2313.png new file mode 100644 index 00000000..16d8c388 Binary files /dev/null and b/local/media/images/product/cadrelednoir.png-2313.png differ diff --git a/local/media/images/product/cadreledor.png-2314.png b/local/media/images/product/cadreledor.png-2314.png new file mode 100644 index 00000000..fa0006c5 Binary files /dev/null and b/local/media/images/product/cadreledor.png-2314.png differ diff --git a/local/media/images/product/cadreledtitane.png-2308.png b/local/media/images/product/cadreledtitane.png-2308.png new file mode 100644 index 00000000..cc9d5506 Binary files /dev/null and b/local/media/images/product/cadreledtitane.png-2308.png differ diff --git a/local/media/images/product/cadresimplet2425-ambre-1912.png b/local/media/images/product/cadresimplet2425-ambre-1912.png new file mode 100644 index 00000000..60afffcc Binary files /dev/null and b/local/media/images/product/cadresimplet2425-ambre-1912.png differ diff --git a/local/media/images/product/cadresimplet2425-argentmetallise-1914.png b/local/media/images/product/cadresimplet2425-argentmetallise-1914.png new file mode 100644 index 00000000..e8200a56 Binary files /dev/null and b/local/media/images/product/cadresimplet2425-argentmetallise-1914.png differ diff --git a/local/media/images/product/cadresimplet2425-blanc-1910.png b/local/media/images/product/cadresimplet2425-blanc-1910.png new file mode 100644 index 00000000..c4cb1c0a Binary files /dev/null and b/local/media/images/product/cadresimplet2425-blanc-1910.png differ diff --git a/local/media/images/product/cadresimplet2425-grisfonce-1913.png b/local/media/images/product/cadresimplet2425-grisfonce-1913.png new file mode 100644 index 00000000..35e83e3e Binary files /dev/null and b/local/media/images/product/cadresimplet2425-grisfonce-1913.png differ diff --git a/local/media/images/product/cadresimplet2425-noir-1911.png b/local/media/images/product/cadresimplet2425-noir-1911.png new file mode 100644 index 00000000..ead777ab Binary files /dev/null and b/local/media/images/product/cadresimplet2425-noir-1911.png differ diff --git a/local/media/images/product/cadretriplet2425-ambre-1922.png b/local/media/images/product/cadretriplet2425-ambre-1922.png new file mode 100644 index 00000000..3ca1a105 Binary files /dev/null and b/local/media/images/product/cadretriplet2425-ambre-1922.png differ diff --git a/local/media/images/product/cadretriplet2425-argentmetallise-1924.png b/local/media/images/product/cadretriplet2425-argentmetallise-1924.png new file mode 100644 index 00000000..296c7775 Binary files /dev/null and b/local/media/images/product/cadretriplet2425-argentmetallise-1924.png differ diff --git a/local/media/images/product/cadretriplet2425-blanc-1920.png b/local/media/images/product/cadretriplet2425-blanc-1920.png new file mode 100644 index 00000000..6372571c Binary files /dev/null and b/local/media/images/product/cadretriplet2425-blanc-1920.png differ diff --git a/local/media/images/product/cadretriplet2425-grisfonce-1923.png b/local/media/images/product/cadretriplet2425-grisfonce-1923.png new file mode 100644 index 00000000..8eea7c80 Binary files /dev/null and b/local/media/images/product/cadretriplet2425-grisfonce-1923.png differ diff --git a/local/media/images/product/cadretriplet2425-noir-1921.png b/local/media/images/product/cadretriplet2425-noir-1921.png new file mode 100644 index 00000000..c51944c8 Binary files /dev/null and b/local/media/images/product/cadretriplet2425-noir-1921.png differ diff --git a/local/media/images/product/caed7fe1-44c1-4183-bd3c-b103777fa267-2620.jpeg b/local/media/images/product/caed7fe1-44c1-4183-bd3c-b103777fa267-2620.jpeg new file mode 100644 index 00000000..62f10527 Binary files /dev/null and b/local/media/images/product/caed7fe1-44c1-4183-bd3c-b103777fa267-2620.jpeg differ diff --git a/local/media/images/product/calquedarrireplan15-2552.png b/local/media/images/product/calquedarrireplan15-2552.png new file mode 100644 index 00000000..793aaa65 Binary files /dev/null and b/local/media/images/product/calquedarrireplan15-2552.png differ diff --git a/local/media/images/product/calquedarrireplan25-2577.png b/local/media/images/product/calquedarrireplan25-2577.png new file mode 100644 index 00000000..7f179d9f Binary files /dev/null and b/local/media/images/product/calquedarrireplan25-2577.png differ diff --git a/local/media/images/product/calquedarrireplan3-2539.png b/local/media/images/product/calquedarrireplan3-2539.png new file mode 100644 index 00000000..3b6cf7ae Binary files /dev/null and b/local/media/images/product/calquedarrireplan3-2539.png differ diff --git a/local/media/images/product/calquedarrireplan33-2584.png b/local/media/images/product/calquedarrireplan33-2584.png new file mode 100644 index 00000000..9b4b0b85 Binary files /dev/null and b/local/media/images/product/calquedarrireplan33-2584.png differ diff --git a/local/media/images/product/calquedarrireplan34-2585.png b/local/media/images/product/calquedarrireplan34-2585.png new file mode 100644 index 00000000..c18a588c Binary files /dev/null and b/local/media/images/product/calquedarrireplan34-2585.png differ diff --git a/local/media/images/product/calquedarrireplan5-2537.png b/local/media/images/product/calquedarrireplan5-2537.png new file mode 100644 index 00000000..fb732fb3 Binary files /dev/null and b/local/media/images/product/calquedarrireplan5-2537.png differ diff --git a/local/media/images/product/calquedarrireplan7-2536.png b/local/media/images/product/calquedarrireplan7-2536.png new file mode 100644 index 00000000..9b7c0ae0 Binary files /dev/null and b/local/media/images/product/calquedarrireplan7-2536.png differ diff --git a/local/media/images/product/calquedarrireplan9-2955.png b/local/media/images/product/calquedarrireplan9-2955.png new file mode 100644 index 00000000..42aeeb53 Binary files /dev/null and b/local/media/images/product/calquedarrireplan9-2955.png differ diff --git a/local/media/images/product/calqueviacopie1-2921.png b/local/media/images/product/calqueviacopie1-2921.png new file mode 100644 index 00000000..04e6ef28 Binary files /dev/null and b/local/media/images/product/calqueviacopie1-2921.png differ diff --git a/local/media/images/product/calqueviacopie12-2553.png b/local/media/images/product/calqueviacopie12-2553.png new file mode 100644 index 00000000..db463571 Binary files /dev/null and b/local/media/images/product/calqueviacopie12-2553.png differ diff --git a/local/media/images/product/calqueviacopie2-2922.png b/local/media/images/product/calqueviacopie2-2922.png new file mode 100644 index 00000000..24807304 Binary files /dev/null and b/local/media/images/product/calqueviacopie2-2922.png differ diff --git a/local/media/images/product/calqueviacopiecopier2-2573.png b/local/media/images/product/calqueviacopiecopier2-2573.png new file mode 100644 index 00000000..c8a454f9 Binary files /dev/null and b/local/media/images/product/calqueviacopiecopier2-2573.png differ diff --git a/local/media/images/product/canondefusildark-2702.png b/local/media/images/product/canondefusildark-2702.png new file mode 100644 index 00000000..27f134b7 Binary files /dev/null and b/local/media/images/product/canondefusildark-2702.png differ diff --git a/local/media/images/product/capture.jpg-2406.jpg b/local/media/images/product/capture.jpg-2406.jpg new file mode 100644 index 00000000..a47bf0a4 Binary files /dev/null and b/local/media/images/product/capture.jpg-2406.jpg differ diff --git a/local/media/images/product/capturedecran2015-10-28a16.12.17-2208.png b/local/media/images/product/capturedecran2015-10-28a16.12.17-2208.png new file mode 100644 index 00000000..b1c16fc3 Binary files /dev/null and b/local/media/images/product/capturedecran2015-10-28a16.12.17-2208.png differ diff --git a/local/media/images/product/capturedecran2016-04-06a11.56.37-2228.png b/local/media/images/product/capturedecran2016-04-06a11.56.37-2228.png new file mode 100644 index 00000000..0dd1df72 Binary files /dev/null and b/local/media/images/product/capturedecran2016-04-06a11.56.37-2228.png differ diff --git a/local/media/images/product/capturedecran2016-04-06a11.56.37-2229.png b/local/media/images/product/capturedecran2016-04-06a11.56.37-2229.png new file mode 100644 index 00000000..0dd1df72 Binary files /dev/null and b/local/media/images/product/capturedecran2016-04-06a11.56.37-2229.png differ diff --git a/local/media/images/product/capturedecran2016-04-06a11.59.42-2230.png b/local/media/images/product/capturedecran2016-04-06a11.59.42-2230.png new file mode 100644 index 00000000..0591b810 Binary files /dev/null and b/local/media/images/product/capturedecran2016-04-06a11.59.42-2230.png differ diff --git a/local/media/images/product/capturedecran2016-04-06a12.02.38-2231.png b/local/media/images/product/capturedecran2016-04-06a12.02.38-2231.png new file mode 100644 index 00000000..0581492d Binary files /dev/null and b/local/media/images/product/capturedecran2016-04-06a12.02.38-2231.png differ diff --git a/local/media/images/product/capturedecran2017-05-03a10.47.37-2467.png b/local/media/images/product/capturedecran2017-05-03a10.47.37-2467.png new file mode 100644 index 00000000..2c88163e Binary files /dev/null and b/local/media/images/product/capturedecran2017-05-03a10.47.37-2467.png differ diff --git a/local/media/images/product/carte-elctronique-4entrees-3sorties-1928.png b/local/media/images/product/carte-elctronique-4entrees-3sorties-1928.png new file mode 100644 index 00000000..90ff03b8 Binary files /dev/null and b/local/media/images/product/carte-elctronique-4entrees-3sorties-1928.png differ diff --git a/local/media/images/product/carte1-2460.png b/local/media/images/product/carte1-2460.png new file mode 100644 index 00000000..b0e689e6 Binary files /dev/null and b/local/media/images/product/carte1-2460.png differ diff --git a/local/media/images/product/carte2-2461.png b/local/media/images/product/carte2-2461.png new file mode 100644 index 00000000..d5c392ef Binary files /dev/null and b/local/media/images/product/carte2-2461.png differ diff --git a/local/media/images/product/carte3-2462.png b/local/media/images/product/carte3-2462.png new file mode 100644 index 00000000..2fcda8e9 Binary files /dev/null and b/local/media/images/product/carte3-2462.png differ diff --git a/local/media/images/product/carterfidmobotix-2459.jpg b/local/media/images/product/carterfidmobotix-2459.jpg new file mode 100644 index 00000000..0dbac149 Binary files /dev/null and b/local/media/images/product/carterfidmobotix-2459.jpg differ diff --git a/local/media/images/product/cd16943psps4_web-2696.png b/local/media/images/product/cd16943psps4_web-2696.png new file mode 100644 index 00000000..855f0c77 Binary files /dev/null and b/local/media/images/product/cd16943psps4_web-2696.png differ diff --git a/local/media/images/product/climat-2380.jpg b/local/media/images/product/climat-2380.jpg new file mode 100644 index 00000000..e028c7fa Binary files /dev/null and b/local/media/images/product/climat-2380.jpg differ diff --git a/local/media/images/product/clock-for-smart-home-and-offic-2561.png b/local/media/images/product/clock-for-smart-home-and-offic-2561.png new file mode 100644 index 00000000..257a6bcf Binary files /dev/null and b/local/media/images/product/clock-for-smart-home-and-offic-2561.png differ diff --git a/local/media/images/product/collage-2488.png b/local/media/images/product/collage-2488.png new file mode 100644 index 00000000..1d6a269a Binary files /dev/null and b/local/media/images/product/collage-2488.png differ diff --git a/local/media/images/product/cube-systeme-freespace-3s-surface-schemas-et-des-dimensions-controlsound-division-professionnelle-2421.jpg b/local/media/images/product/cube-systeme-freespace-3s-surface-schemas-et-des-dimensions-controlsound-division-professionnelle-2421.jpg new file mode 100644 index 00000000..4595bfb7 Binary files /dev/null and b/local/media/images/product/cube-systeme-freespace-3s-surface-schemas-et-des-dimensions-controlsound-division-professionnelle-2421.jpg differ diff --git a/local/media/images/product/cube-systeme-freespace-3s-surface-schemas-et-des-dimensions-controlsound-division-professionnelle-2422.jpg b/local/media/images/product/cube-systeme-freespace-3s-surface-schemas-et-des-dimensions-controlsound-division-professionnelle-2422.jpg new file mode 100644 index 00000000..4595bfb7 Binary files /dev/null and b/local/media/images/product/cube-systeme-freespace-3s-surface-schemas-et-des-dimensions-controlsound-division-professionnelle-2422.jpg differ diff --git a/local/media/images/product/cx31684pbpb4_web-2698.png b/local/media/images/product/cx31684pbpb4_web-2698.png new file mode 100644 index 00000000..24a3320b Binary files /dev/null and b/local/media/images/product/cx31684pbpb4_web-2698.png differ diff --git a/local/media/images/product/d0c2791e-212a-489b-98c3-775a7ab8d105-2681.jpeg b/local/media/images/product/d0c2791e-212a-489b-98c3-775a7ab8d105-2681.jpeg new file mode 100644 index 00000000..92e84aa6 Binary files /dev/null and b/local/media/images/product/d0c2791e-212a-489b-98c3-775a7ab8d105-2681.jpeg differ diff --git a/local/media/images/product/d98c7afd-651a-4874-9a28-4aa73ce317cb-2632.jpeg b/local/media/images/product/d98c7afd-651a-4874-9a28-4aa73ce317cb-2632.jpeg new file mode 100644 index 00000000..aa361680 Binary files /dev/null and b/local/media/images/product/d98c7afd-651a-4874-9a28-4aa73ce317cb-2632.jpeg differ diff --git a/local/media/images/product/damalisksupport-2402.jpg b/local/media/images/product/damalisksupport-2402.jpg new file mode 100644 index 00000000..41ebd298 Binary files /dev/null and b/local/media/images/product/damalisksupport-2402.jpg differ diff --git a/local/media/images/product/dbcbdedd-cefa-4cd4-88c0-3d1edb61dda9-2595.jpeg b/local/media/images/product/dbcbdedd-cefa-4cd4-88c0-3d1edb61dda9-2595.jpeg new file mode 100644 index 00000000..55a445fb Binary files /dev/null and b/local/media/images/product/dbcbdedd-cefa-4cd4-88c0-3d1edb61dda9-2595.jpeg differ diff --git a/local/media/images/product/dcd19f63-7540-4837-bcfd-303a4092b41a-2658.jpeg b/local/media/images/product/dcd19f63-7540-4837-bcfd-303a4092b41a-2658.jpeg new file mode 100644 index 00000000..0c37d4b3 Binary files /dev/null and b/local/media/images/product/dcd19f63-7540-4837-bcfd-303a4092b41a-2658.jpeg differ diff --git a/local/media/images/product/de-sapin-de-noel-1477.png b/local/media/images/product/de-sapin-de-noel-1477.png new file mode 100644 index 00000000..92bb57e5 Binary files /dev/null and b/local/media/images/product/de-sapin-de-noel-1477.png differ diff --git a/local/media/images/product/detecteur-avertisseur-autonome-de-fumee-sidorex-img-13477-2221.png b/local/media/images/product/detecteur-avertisseur-autonome-de-fumee-sidorex-img-13477-2221.png new file mode 100644 index 00000000..4158dc3d Binary files /dev/null and b/local/media/images/product/detecteur-avertisseur-autonome-de-fumee-sidorex-img-13477-2221.png differ diff --git a/local/media/images/product/detecteurfumesiemens-2390.png b/local/media/images/product/detecteurfumesiemens-2390.png new file mode 100644 index 00000000..6a154dc0 Binary files /dev/null and b/local/media/images/product/detecteurfumesiemens-2390.png differ diff --git a/local/media/images/product/dgs1008pc1imagelfront-2570.png b/local/media/images/product/dgs1008pc1imagelfront-2570.png new file mode 100644 index 00000000..b8315755 Binary files /dev/null and b/local/media/images/product/dgs1008pc1imagelfront-2570.png differ diff --git a/local/media/images/product/dimingbox_dx4_370x361-2903.png b/local/media/images/product/dimingbox_dx4_370x361-2903.png new file mode 100644 index 00000000..9b203e04 Binary files /dev/null and b/local/media/images/product/dimingbox_dx4_370x361-2903.png differ diff --git a/local/media/images/product/dimmer_2ch370x361-1448.png b/local/media/images/product/dimmer_2ch370x361-1448.png new file mode 100644 index 00000000..964c6c3f Binary files /dev/null and b/local/media/images/product/dimmer_2ch370x361-1448.png differ diff --git a/local/media/images/product/dimminbox_dx1_370x361-2900.png b/local/media/images/product/dimminbox_dx1_370x361-2900.png new file mode 100644 index 00000000..f202e94f Binary files /dev/null and b/local/media/images/product/dimminbox_dx1_370x361-2900.png differ diff --git a/local/media/images/product/drp-240-24-alimentation-10a_879dd-1847.jpg b/local/media/images/product/drp-240-24-alimentation-10a_879dd-1847.jpg new file mode 100644 index 00000000..248ffab9 Binary files /dev/null and b/local/media/images/product/drp-240-24-alimentation-10a_879dd-1847.jpg differ diff --git a/local/media/images/product/eclairagebureau-2364.jpg b/local/media/images/product/eclairagebureau-2364.jpg new file mode 100644 index 00000000..1d10b837 Binary files /dev/null and b/local/media/images/product/eclairagebureau-2364.jpg differ diff --git a/local/media/images/product/eclairagerestaurant-2365.jpg b/local/media/images/product/eclairagerestaurant-2365.jpg new file mode 100644 index 00000000..055b1af8 Binary files /dev/null and b/local/media/images/product/eclairagerestaurant-2365.jpg differ diff --git a/local/media/images/product/ed6614a4-5e2a-49bd-8e8c-e882a6a98dc7-2688.jpeg b/local/media/images/product/ed6614a4-5e2a-49bd-8e8c-e882a6a98dc7-2688.jpeg new file mode 100644 index 00000000..8fcf4bd7 Binary files /dev/null and b/local/media/images/product/ed6614a4-5e2a-49bd-8e8c-e882a6a98dc7-2688.jpeg differ diff --git a/local/media/images/product/ede6f4c1-c491-4c97-abbf-9cb17616e0ad-2675.jpeg b/local/media/images/product/ede6f4c1-c491-4c97-abbf-9cb17616e0ad-2675.jpeg new file mode 100644 index 00000000..fc1e1b4f Binary files /dev/null and b/local/media/images/product/ede6f4c1-c491-4c97-abbf-9cb17616e0ad-2675.jpeg differ diff --git a/local/media/images/product/efojzoejiz-2586.png b/local/media/images/product/efojzoejiz-2586.png new file mode 100644 index 00000000..eaae2c8c Binary files /dev/null and b/local/media/images/product/efojzoejiz-2586.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-blanc-ls990klww-1577.png b/local/media/images/product/enjoliveurcouvercle-blanc-ls990klww-1577.png new file mode 100644 index 00000000..5a78b0d2 Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-blanc-ls990klww-1577.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-blanc-ls990klww-1790.png b/local/media/images/product/enjoliveurcouvercle-blanc-ls990klww-1790.png new file mode 100644 index 00000000..5a78b0d2 Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-blanc-ls990klww-1790.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-chrome-gcr2990kl-1788.png b/local/media/images/product/enjoliveurcouvercle-chrome-gcr2990kl-1788.png new file mode 100644 index 00000000..a3d31864 Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-chrome-gcr2990kl-1788.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-metalinox-es2990kl-1781.png b/local/media/images/product/enjoliveurcouvercle-metalinox-es2990kl-1781.png new file mode 100644 index 00000000..8a359c54 Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-metalinox-es2990kl-1781.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-noir-ls990klsw-1782.png b/local/media/images/product/enjoliveurcouvercle-noir-ls990klsw-1782.png new file mode 100644 index 00000000..d227e2ec Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-noir-ls990klsw-1782.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-ortraite-go2990kl-1787.png b/local/media/images/product/enjoliveurcouvercle-ortraite-go2990kl-1787.png new file mode 100644 index 00000000..704880a0 Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-ortraite-go2990kl-1787.png differ diff --git a/local/media/images/product/enjoliveurcouvercle-titane-al2990klan-1785.png b/local/media/images/product/enjoliveurcouvercle-titane-al2990klan-1785.png new file mode 100644 index 00000000..9fd88c43 Binary files /dev/null and b/local/media/images/product/enjoliveurcouvercle-titane-al2990klan-1785.png differ diff --git a/local/media/images/product/enjoliveurdoublebp-ivoire-ls995-1584.png b/local/media/images/product/enjoliveurdoublebp-ivoire-ls995-1584.png new file mode 100644 index 00000000..7ff18854 Binary files /dev/null and b/local/media/images/product/enjoliveurdoublebp-ivoire-ls995-1584.png differ diff --git a/local/media/images/product/enjoliveurdoublevr-ivoire-ls995p-1591.png b/local/media/images/product/enjoliveurdoublevr-ivoire-ls995p-1591.png new file mode 100644 index 00000000..1be15872 Binary files /dev/null and b/local/media/images/product/enjoliveurdoublevr-ivoire-ls995p-1591.png differ diff --git a/local/media/images/product/enjoliveursimple-aluminium-al2990-2266.png b/local/media/images/product/enjoliveursimple-aluminium-al2990-2266.png new file mode 100644 index 00000000..a89d1062 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-aluminium-al2990-2266.png differ diff --git a/local/media/images/product/enjoliveursimple-aluminium-al2990-2281.png b/local/media/images/product/enjoliveursimple-aluminium-al2990-2281.png new file mode 100644 index 00000000..a89d1062 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-aluminium-al2990-2281.png differ diff --git a/local/media/images/product/enjoliveursimple-blanc-ls990ww-2268.png b/local/media/images/product/enjoliveursimple-blanc-ls990ww-2268.png new file mode 100644 index 00000000..dd3f2ed6 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-blanc-ls990ww-2268.png differ diff --git a/local/media/images/product/enjoliveursimple-blanc-ls990ww-2282.png b/local/media/images/product/enjoliveursimple-blanc-ls990ww-2282.png new file mode 100644 index 00000000..dd3f2ed6 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-blanc-ls990ww-2282.png differ diff --git a/local/media/images/product/enjoliveursimple-canonfusil-me2990d-2267.png b/local/media/images/product/enjoliveursimple-canonfusil-me2990d-2267.png new file mode 100644 index 00000000..81120302 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-canonfusil-me2990d-2267.png differ diff --git a/local/media/images/product/enjoliveursimple-canonfusil-me2990d-2280.png b/local/media/images/product/enjoliveursimple-canonfusil-me2990d-2280.png new file mode 100644 index 00000000..81120302 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-canonfusil-me2990d-2280.png differ diff --git a/local/media/images/product/enjoliveursimple-chrome-gcr2990-2269.png b/local/media/images/product/enjoliveursimple-chrome-gcr2990-2269.png new file mode 100644 index 00000000..166bd912 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-chrome-gcr2990-2269.png differ diff --git a/local/media/images/product/enjoliveursimple-chrome-gcr2990-2284.png b/local/media/images/product/enjoliveursimple-chrome-gcr2990-2284.png new file mode 100644 index 00000000..166bd912 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-chrome-gcr2990-2284.png differ diff --git a/local/media/images/product/enjoliveursimple-grisclair-ls990lg-2271.png b/local/media/images/product/enjoliveursimple-grisclair-ls990lg-2271.png new file mode 100644 index 00000000..e5d06193 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-grisclair-ls990lg-2271.png differ diff --git a/local/media/images/product/enjoliveursimple-grisclair-ls990lg-2285.png b/local/media/images/product/enjoliveursimple-grisclair-ls990lg-2285.png new file mode 100644 index 00000000..e5d06193 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-grisclair-ls990lg-2285.png differ diff --git a/local/media/images/product/enjoliveursimple-ivoire-ls990-1588.png b/local/media/images/product/enjoliveursimple-ivoire-ls990-1588.png new file mode 100644 index 00000000..cfada048 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-ivoire-ls990-1588.png differ diff --git a/local/media/images/product/enjoliveursimple-ivoire-ls990-2272.png b/local/media/images/product/enjoliveursimple-ivoire-ls990-2272.png new file mode 100644 index 00000000..cfada048 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-ivoire-ls990-2272.png differ diff --git a/local/media/images/product/enjoliveursimple-ivoire-ls990-2286.png b/local/media/images/product/enjoliveursimple-ivoire-ls990-2286.png new file mode 100644 index 00000000..cfada048 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-ivoire-ls990-2286.png differ diff --git a/local/media/images/product/enjoliveursimple-laitonancien-me2990at-2275.png b/local/media/images/product/enjoliveursimple-laitonancien-me2990at-2275.png new file mode 100644 index 00000000..f0eeb56b Binary files /dev/null and b/local/media/images/product/enjoliveursimple-laitonancien-me2990at-2275.png differ diff --git a/local/media/images/product/enjoliveursimple-laitonancien-me2990at-2287.png b/local/media/images/product/enjoliveursimple-laitonancien-me2990at-2287.png new file mode 100644 index 00000000..f0eeb56b Binary files /dev/null and b/local/media/images/product/enjoliveursimple-laitonancien-me2990at-2287.png differ diff --git a/local/media/images/product/enjoliveursimple-laitondore-me2990c-2273.png b/local/media/images/product/enjoliveursimple-laitondore-me2990c-2273.png new file mode 100644 index 00000000..b07b62ce Binary files /dev/null and b/local/media/images/product/enjoliveursimple-laitondore-me2990c-2273.png differ diff --git a/local/media/images/product/enjoliveursimple-laitondore-me2990c-2288.png b/local/media/images/product/enjoliveursimple-laitondore-me2990c-2288.png new file mode 100644 index 00000000..b07b62ce Binary files /dev/null and b/local/media/images/product/enjoliveursimple-laitondore-me2990c-2288.png differ diff --git a/local/media/images/product/enjoliveursimple-metalinox-es2990-2274.png b/local/media/images/product/enjoliveursimple-metalinox-es2990-2274.png new file mode 100644 index 00000000..9bce63ef Binary files /dev/null and b/local/media/images/product/enjoliveursimple-metalinox-es2990-2274.png differ diff --git a/local/media/images/product/enjoliveursimple-metalinox-es2990-2289.png b/local/media/images/product/enjoliveursimple-metalinox-es2990-2289.png new file mode 100644 index 00000000..9bce63ef Binary files /dev/null and b/local/media/images/product/enjoliveursimple-metalinox-es2990-2289.png differ diff --git a/local/media/images/product/enjoliveursimple-noir-ls990sw-2276.png b/local/media/images/product/enjoliveursimple-noir-ls990sw-2276.png new file mode 100644 index 00000000..83908d79 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-noir-ls990sw-2276.png differ diff --git a/local/media/images/product/enjoliveursimple-noir-ls990sw-2290.png b/local/media/images/product/enjoliveursimple-noir-ls990sw-2290.png new file mode 100644 index 00000000..83908d79 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-noir-ls990sw-2290.png differ diff --git a/local/media/images/product/enjoliveursimple-orplaque-ls990ggo-2277.png b/local/media/images/product/enjoliveursimple-orplaque-ls990ggo-2277.png new file mode 100644 index 00000000..584b33f8 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-orplaque-ls990ggo-2277.png differ diff --git a/local/media/images/product/enjoliveursimple-orplaque-ls990ggo-2291.png b/local/media/images/product/enjoliveursimple-orplaque-ls990ggo-2291.png new file mode 100644 index 00000000..584b33f8 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-orplaque-ls990ggo-2291.png differ diff --git a/local/media/images/product/enjoliveursimple-ortraite-go2990-2278.png b/local/media/images/product/enjoliveursimple-ortraite-go2990-2278.png new file mode 100644 index 00000000..1091c0dc Binary files /dev/null and b/local/media/images/product/enjoliveursimple-ortraite-go2990-2278.png differ diff --git a/local/media/images/product/enjoliveursimple-ortraite-go2990-2292.png b/local/media/images/product/enjoliveursimple-ortraite-go2990-2292.png new file mode 100644 index 00000000..1091c0dc Binary files /dev/null and b/local/media/images/product/enjoliveursimple-ortraite-go2990-2292.png differ diff --git a/local/media/images/product/enjoliveursimple-titane-al2990an-2270.png b/local/media/images/product/enjoliveursimple-titane-al2990an-2270.png new file mode 100644 index 00000000..d2d81355 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-titane-al2990an-2270.png differ diff --git a/local/media/images/product/enjoliveursimple-titane-al2990an-2283.png b/local/media/images/product/enjoliveursimple-titane-al2990an-2283.png new file mode 100644 index 00000000..d2d81355 Binary files /dev/null and b/local/media/images/product/enjoliveursimple-titane-al2990an-2283.png differ diff --git a/local/media/images/product/enjoliveursimplevoyantcrayontivoirels5232i-1590.png b/local/media/images/product/enjoliveursimplevoyantcrayontivoirels5232i-1590.png new file mode 100644 index 00000000..869d3f4c Binary files /dev/null and b/local/media/images/product/enjoliveursimplevoyantcrayontivoirels5232i-1590.png differ diff --git a/local/media/images/product/enjoliveurvoyantdoublevr-ivoire-ls995ko5p-1592.png b/local/media/images/product/enjoliveurvoyantdoublevr-ivoire-ls995ko5p-1592.png new file mode 100644 index 00000000..1f46135f Binary files /dev/null and b/local/media/images/product/enjoliveurvoyantdoublevr-ivoire-ls995ko5p-1592.png differ diff --git a/local/media/images/product/etiquettefacade-2323.jpg b/local/media/images/product/etiquettefacade-2323.jpg new file mode 100644 index 00000000..d7d1a277 Binary files /dev/null and b/local/media/images/product/etiquettefacade-2323.jpg differ diff --git a/local/media/images/product/ev_evid_murale_fm4.2_doc-885.jpg b/local/media/images/product/ev_evid_murale_fm4.2_doc-885.jpg new file mode 100644 index 00000000..c315bcc0 Binary files /dev/null and b/local/media/images/product/ev_evid_murale_fm4.2_doc-885.jpg differ diff --git a/local/media/images/product/ev_evid_murale_fm6.2_doc-886.jpg b/local/media/images/product/ev_evid_murale_fm6.2_doc-886.jpg new file mode 100644 index 00000000..ea7a8df0 Binary files /dev/null and b/local/media/images/product/ev_evid_murale_fm6.2_doc-886.jpg differ diff --git a/local/media/images/product/ev_evid_plafond_c10.1_doc-883.png b/local/media/images/product/ev_evid_plafond_c10.1_doc-883.png new file mode 100644 index 00000000..e6e89609 Binary files /dev/null and b/local/media/images/product/ev_evid_plafond_c10.1_doc-883.png differ diff --git a/local/media/images/product/ev_evid_plafond_c4.2_doc-1568.png b/local/media/images/product/ev_evid_plafond_c4.2_doc-1568.png new file mode 100644 index 00000000..c08f5a78 Binary files /dev/null and b/local/media/images/product/ev_evid_plafond_c4.2_doc-1568.png differ diff --git a/local/media/images/product/ev_evid_plafond_c4.2_doc-880.png b/local/media/images/product/ev_evid_plafond_c4.2_doc-880.png new file mode 100644 index 00000000..c08f5a78 Binary files /dev/null and b/local/media/images/product/ev_evid_plafond_c4.2_doc-880.png differ diff --git a/local/media/images/product/ev_evid_plafond_c8.2hc_doc-881.png b/local/media/images/product/ev_evid_plafond_c8.2hc_doc-881.png new file mode 100644 index 00000000..f6771ded Binary files /dev/null and b/local/media/images/product/ev_evid_plafond_c8.2hc_doc-881.png differ diff --git a/local/media/images/product/ev_evid_plafond_c8.2lp_doc-1863.jpg b/local/media/images/product/ev_evid_plafond_c8.2lp_doc-1863.jpg new file mode 100644 index 00000000..e0b1d08a Binary files /dev/null and b/local/media/images/product/ev_evid_plafond_c8.2lp_doc-1863.jpg differ diff --git a/local/media/images/product/ev_evid_plafond_c8.2lp_doc-882.png b/local/media/images/product/ev_evid_plafond_c8.2lp_doc-882.png new file mode 100644 index 00000000..e25b080f Binary files /dev/null and b/local/media/images/product/ev_evid_plafond_c8.2lp_doc-882.png differ diff --git a/local/media/images/product/evevid6.2tw-1598.png b/local/media/images/product/evevid6.2tw-1598.png new file mode 100644 index 00000000..fd191c1a Binary files /dev/null and b/local/media/images/product/evevid6.2tw-1598.png differ diff --git a/local/media/images/product/evevid6.2tw-1603.png b/local/media/images/product/evevid6.2tw-1603.png new file mode 100644 index 00000000..fd191c1a Binary files /dev/null and b/local/media/images/product/evevid6.2tw-1603.png differ diff --git a/local/media/images/product/evid12.2-1573.png b/local/media/images/product/evid12.2-1573.png new file mode 100644 index 00000000..58124b66 Binary files /dev/null and b/local/media/images/product/evid12.2-1573.png differ diff --git a/local/media/images/product/evid_3.2-1554.png b/local/media/images/product/evid_3.2-1554.png new file mode 100644 index 00000000..0c5b5256 Binary files /dev/null and b/local/media/images/product/evid_3.2-1554.png differ diff --git a/local/media/images/product/evid_3.2sansgrille-1555.png b/local/media/images/product/evid_3.2sansgrille-1555.png new file mode 100644 index 00000000..f17cfa99 Binary files /dev/null and b/local/media/images/product/evid_3.2sansgrille-1555.png differ diff --git a/local/media/images/product/evid_4.2-1556.png b/local/media/images/product/evid_4.2-1556.png new file mode 100644 index 00000000..b55a1efb Binary files /dev/null and b/local/media/images/product/evid_4.2-1556.png differ diff --git a/local/media/images/product/evid_4.2tw_2-1599.jpg b/local/media/images/product/evid_4.2tw_2-1599.jpg new file mode 100644 index 00000000..74a03291 Binary files /dev/null and b/local/media/images/product/evid_4.2tw_2-1599.jpg differ diff --git a/local/media/images/product/evid_4.2tw_2-1600.jpg b/local/media/images/product/evid_4.2tw_2-1600.jpg new file mode 100644 index 00000000..74a03291 Binary files /dev/null and b/local/media/images/product/evid_4.2tw_2-1600.jpg differ diff --git a/local/media/images/product/evid_4.2tw_2-1601.jpg b/local/media/images/product/evid_4.2tw_2-1601.jpg new file mode 100644 index 00000000..74a03291 Binary files /dev/null and b/local/media/images/product/evid_4.2tw_2-1601.jpg differ diff --git a/local/media/images/product/evid_4.2wscreen-1557.png b/local/media/images/product/evid_4.2wscreen-1557.png new file mode 100644 index 00000000..0c5b5256 Binary files /dev/null and b/local/media/images/product/evid_4.2wscreen-1557.png differ diff --git a/local/media/images/product/evid_6.2-1558.png b/local/media/images/product/evid_6.2-1558.png new file mode 100644 index 00000000..1936b454 Binary files /dev/null and b/local/media/images/product/evid_6.2-1558.png differ diff --git a/local/media/images/product/evid_6.2wscreen-1559.png b/local/media/images/product/evid_6.2wscreen-1559.png new file mode 100644 index 00000000..0c5b5256 Binary files /dev/null and b/local/media/images/product/evid_6.2wscreen-1559.png differ diff --git a/local/media/images/product/evid_c10.1-trans-1572.png b/local/media/images/product/evid_c10.1-trans-1572.png new file mode 100644 index 00000000..f1e52cd7 Binary files /dev/null and b/local/media/images/product/evid_c10.1-trans-1572.png differ diff --git a/local/media/images/product/evid_c4.2d-trans-1569.png b/local/media/images/product/evid_c4.2d-trans-1569.png new file mode 100644 index 00000000..e09c1dd6 Binary files /dev/null and b/local/media/images/product/evid_c4.2d-trans-1569.png differ diff --git a/local/media/images/product/evid_c8.2hc-trans-1571.png b/local/media/images/product/evid_c8.2hc-trans-1571.png new file mode 100644 index 00000000..366f6a0b Binary files /dev/null and b/local/media/images/product/evid_c8.2hc-trans-1571.png differ diff --git a/local/media/images/product/evid_c8.2lp-trans-1570.png b/local/media/images/product/evid_c8.2lp-trans-1570.png new file mode 100644 index 00000000..ce5dac7c Binary files /dev/null and b/local/media/images/product/evid_c8.2lp-trans-1570.png differ diff --git a/local/media/images/product/evid_fm4.2-1561.png b/local/media/images/product/evid_fm4.2-1561.png new file mode 100644 index 00000000..a723a274 Binary files /dev/null and b/local/media/images/product/evid_fm4.2-1561.png differ diff --git a/local/media/images/product/evid_fm6.2-1565.png b/local/media/images/product/evid_fm6.2-1565.png new file mode 100644 index 00000000..a723a274 Binary files /dev/null and b/local/media/images/product/evid_fm6.2-1565.png differ diff --git a/local/media/images/product/evid_in_situ_conseil_general_43.jpg-1602.jpg b/local/media/images/product/evid_in_situ_conseil_general_43.jpg-1602.jpg new file mode 100644 index 00000000..cc794150 Binary files /dev/null and b/local/media/images/product/evid_in_situ_conseil_general_43.jpg-1602.jpg differ diff --git a/local/media/images/product/evidgranfm4.2-1562.png b/local/media/images/product/evidgranfm4.2-1562.png new file mode 100644 index 00000000..a243513a Binary files /dev/null and b/local/media/images/product/evidgranfm4.2-1562.png differ diff --git a/local/media/images/product/evidgranfm6.2-1566.png b/local/media/images/product/evidgranfm6.2-1566.png new file mode 100644 index 00000000..a243513a Binary files /dev/null and b/local/media/images/product/evidgranfm6.2-1566.png differ diff --git a/local/media/images/product/f0dfe69c-8610-4a25-9a3d-947cb20536d1-2630.jpeg b/local/media/images/product/f0dfe69c-8610-4a25-9a3d-947cb20536d1-2630.jpeg new file mode 100644 index 00000000..428812a6 Binary files /dev/null and b/local/media/images/product/f0dfe69c-8610-4a25-9a3d-947cb20536d1-2630.jpeg differ diff --git a/local/media/images/product/f54821c4-3a6e-4591-b8b1-0e19c6aa50a8-2629.jpeg b/local/media/images/product/f54821c4-3a6e-4591-b8b1-0e19c6aa50a8-2629.jpeg new file mode 100644 index 00000000..25eef071 Binary files /dev/null and b/local/media/images/product/f54821c4-3a6e-4591-b8b1-0e19c6aa50a8-2629.jpeg differ diff --git a/local/media/images/product/f6783789-01-1997.jpg b/local/media/images/product/f6783789-01-1997.jpg new file mode 100644 index 00000000..e1560bd5 Binary files /dev/null and b/local/media/images/product/f6783789-01-1997.jpg differ diff --git a/local/media/images/product/f6783789-02-1998.jpg b/local/media/images/product/f6783789-02-1998.jpg new file mode 100644 index 00000000..ead54681 Binary files /dev/null and b/local/media/images/product/f6783789-02-1998.jpg differ diff --git a/local/media/images/product/fapserver-couverture-2002.png b/local/media/images/product/fapserver-couverture-2002.png new file mode 100644 index 00000000..828e3f3d Binary files /dev/null and b/local/media/images/product/fapserver-couverture-2002.png differ diff --git a/local/media/images/product/fapserver-ordinateur-1943.png b/local/media/images/product/fapserver-ordinateur-1943.png new file mode 100644 index 00000000..f708ed68 Binary files /dev/null and b/local/media/images/product/fapserver-ordinateur-1943.png differ diff --git a/local/media/images/product/fapserver3-1940.jpg b/local/media/images/product/fapserver3-1940.jpg new file mode 100644 index 00000000..38cd4bfa Binary files /dev/null and b/local/media/images/product/fapserver3-1940.jpg differ diff --git a/local/media/images/product/fapserveraveciphone-1950.png b/local/media/images/product/fapserveraveciphone-1950.png new file mode 100644 index 00000000..2d1916b6 Binary files /dev/null and b/local/media/images/product/fapserveraveciphone-1950.png differ diff --git a/local/media/images/product/fapvserverregg-1929.png b/local/media/images/product/fapvserverregg-1929.png new file mode 100644 index 00000000..8656b263 Binary files /dev/null and b/local/media/images/product/fapvserverregg-1929.png differ diff --git a/local/media/images/product/fd1cad4e-f9ae-4219-842a-ea30d3a1d3a4-2690.jpeg b/local/media/images/product/fd1cad4e-f9ae-4219-842a-ea30d3a1d3a4-2690.jpeg new file mode 100644 index 00000000..9090b0a6 Binary files /dev/null and b/local/media/images/product/fd1cad4e-f9ae-4219-842a-ea30d3a1d3a4-2690.jpeg differ diff --git a/local/media/images/product/flat-2601.png b/local/media/images/product/flat-2601.png new file mode 100644 index 00000000..5141f67b Binary files /dev/null and b/local/media/images/product/flat-2601.png differ diff --git a/local/media/images/product/flatdesign-aluminium-fdal2981-2012.png b/local/media/images/product/flatdesign-aluminium-fdal2981-2012.png new file mode 100644 index 00000000..89aa10a9 Binary files /dev/null and b/local/media/images/product/flatdesign-aluminium-fdal2981-2012.png differ diff --git a/local/media/images/product/flatdesign-aluminium-fdal2982-1247.png b/local/media/images/product/flatdesign-aluminium-fdal2982-1247.png new file mode 100644 index 00000000..6214a1a1 Binary files /dev/null and b/local/media/images/product/flatdesign-aluminium-fdal2982-1247.png differ diff --git a/local/media/images/product/flatdesign-blanc-fd981ww-2016.png b/local/media/images/product/flatdesign-blanc-fd981ww-2016.png new file mode 100644 index 00000000..5930643f Binary files /dev/null and b/local/media/images/product/flatdesign-blanc-fd981ww-2016.png differ diff --git a/local/media/images/product/flatdesign-blanc-fd982ww-1241.png b/local/media/images/product/flatdesign-blanc-fd982ww-1241.png new file mode 100644 index 00000000..298e09f3 Binary files /dev/null and b/local/media/images/product/flatdesign-blanc-fd982ww-1241.png differ diff --git a/local/media/images/product/flatdesign-blanc-fd983ww-2018.png b/local/media/images/product/flatdesign-blanc-fd983ww-2018.png new file mode 100644 index 00000000..f931b474 Binary files /dev/null and b/local/media/images/product/flatdesign-blanc-fd983ww-2018.png differ diff --git a/local/media/images/product/flatdesign-canonfusil-fdal2981d-2008.png b/local/media/images/product/flatdesign-canonfusil-fdal2981d-2008.png new file mode 100644 index 00000000..f790b9a5 Binary files /dev/null and b/local/media/images/product/flatdesign-canonfusil-fdal2981d-2008.png differ diff --git a/local/media/images/product/flatdesign-canonfusil-fdal2982d-2017.png b/local/media/images/product/flatdesign-canonfusil-fdal2982d-2017.png new file mode 100644 index 00000000..5a01c153 Binary files /dev/null and b/local/media/images/product/flatdesign-canonfusil-fdal2982d-2017.png differ diff --git a/local/media/images/product/flatdesign-grisclair-fd981lg-2011.png b/local/media/images/product/flatdesign-grisclair-fd981lg-2011.png new file mode 100644 index 00000000..d01312ec Binary files /dev/null and b/local/media/images/product/flatdesign-grisclair-fd981lg-2011.png differ diff --git a/local/media/images/product/flatdesign-grisclair-fd982lg-1240.png b/local/media/images/product/flatdesign-grisclair-fd982lg-1240.png new file mode 100644 index 00000000..6ddf9127 Binary files /dev/null and b/local/media/images/product/flatdesign-grisclair-fd982lg-1240.png differ diff --git a/local/media/images/product/flatdesign-grisclair-fd983lg-2022.png b/local/media/images/product/flatdesign-grisclair-fd983lg-2022.png new file mode 100644 index 00000000..a2b745b3 Binary files /dev/null and b/local/media/images/product/flatdesign-grisclair-fd983lg-2022.png differ diff --git a/local/media/images/product/flatdesign-ivoire-fd981w-2007.png b/local/media/images/product/flatdesign-ivoire-fd981w-2007.png new file mode 100644 index 00000000..b9d78504 Binary files /dev/null and b/local/media/images/product/flatdesign-ivoire-fd981w-2007.png differ diff --git a/local/media/images/product/flatdesign-ivoire-fd982w-1248.png b/local/media/images/product/flatdesign-ivoire-fd982w-1248.png new file mode 100644 index 00000000..7dfc5b38 Binary files /dev/null and b/local/media/images/product/flatdesign-ivoire-fd982w-1248.png differ diff --git a/local/media/images/product/flatdesign-ivoire-fd983w-2020.png b/local/media/images/product/flatdesign-ivoire-fd983w-2020.png new file mode 100644 index 00000000..c91243f7 Binary files /dev/null and b/local/media/images/product/flatdesign-ivoire-fd983w-2020.png differ diff --git a/local/media/images/product/flatdesign-laitonancien-fdme2981at-2009.png b/local/media/images/product/flatdesign-laitonancien-fdme2981at-2009.png new file mode 100644 index 00000000..be6cd20d Binary files /dev/null and b/local/media/images/product/flatdesign-laitonancien-fdme2981at-2009.png differ diff --git a/local/media/images/product/flatdesign-laitonancien-fdme2982at-1245.png b/local/media/images/product/flatdesign-laitonancien-fdme2982at-1245.png new file mode 100644 index 00000000..28a78efc Binary files /dev/null and b/local/media/images/product/flatdesign-laitonancien-fdme2982at-1245.png differ diff --git a/local/media/images/product/flatdesign-laitondore-fdme2981c-2010.png b/local/media/images/product/flatdesign-laitondore-fdme2981c-2010.png new file mode 100644 index 00000000..e7265c28 Binary files /dev/null and b/local/media/images/product/flatdesign-laitondore-fdme2981c-2010.png differ diff --git a/local/media/images/product/flatdesign-laitondore-fdme2982c-1244.png b/local/media/images/product/flatdesign-laitondore-fdme2982c-1244.png new file mode 100644 index 00000000..41be925d Binary files /dev/null and b/local/media/images/product/flatdesign-laitondore-fdme2982c-1244.png differ diff --git a/local/media/images/product/flatdesign-metalinox-fdes2981-2014.png b/local/media/images/product/flatdesign-metalinox-fdes2981-2014.png new file mode 100644 index 00000000..10a09cc0 Binary files /dev/null and b/local/media/images/product/flatdesign-metalinox-fdes2981-2014.png differ diff --git a/local/media/images/product/flatdesign-metalinox-fdes2982-1243.png b/local/media/images/product/flatdesign-metalinox-fdes2982-1243.png new file mode 100644 index 00000000..4cd141bd Binary files /dev/null and b/local/media/images/product/flatdesign-metalinox-fdes2982-1243.png differ diff --git a/local/media/images/product/flatdesign-noir-fd981sw-2013.png b/local/media/images/product/flatdesign-noir-fd981sw-2013.png new file mode 100644 index 00000000..d118fb3f Binary files /dev/null and b/local/media/images/product/flatdesign-noir-fd981sw-2013.png differ diff --git a/local/media/images/product/flatdesign-noir-fd982sw-1239.png b/local/media/images/product/flatdesign-noir-fd982sw-1239.png new file mode 100644 index 00000000..2c36e863 Binary files /dev/null and b/local/media/images/product/flatdesign-noir-fd982sw-1239.png differ diff --git a/local/media/images/product/flatdesign-noir-fd983sw-2019.png b/local/media/images/product/flatdesign-noir-fd983sw-2019.png new file mode 100644 index 00000000..bd4c415f Binary files /dev/null and b/local/media/images/product/flatdesign-noir-fd983sw-2019.png differ diff --git a/local/media/images/product/flatdesign-titane-fdal2981an-2015.png b/local/media/images/product/flatdesign-titane-fdal2981an-2015.png new file mode 100644 index 00000000..078b2bce Binary files /dev/null and b/local/media/images/product/flatdesign-titane-fdal2981an-2015.png differ diff --git a/local/media/images/product/flatdesign-titane-fdal2982an-1242.png b/local/media/images/product/flatdesign-titane-fdal2982an-1242.png new file mode 100644 index 00000000..ff5ad2af Binary files /dev/null and b/local/media/images/product/flatdesign-titane-fdal2982an-1242.png differ diff --git a/local/media/images/product/fluoled40wblancchaud-3079.png b/local/media/images/product/fluoled40wblancchaud-3079.png new file mode 100644 index 00000000..74a73a8f Binary files /dev/null and b/local/media/images/product/fluoled40wblancchaud-3079.png differ diff --git a/local/media/images/product/fluoled40wblancfroid-3080.png b/local/media/images/product/fluoled40wblancfroid-3080.png new file mode 100644 index 00000000..9b43c3a0 Binary files /dev/null and b/local/media/images/product/fluoled40wblancfroid-3080.png differ diff --git a/local/media/images/product/fluoled50wblancchaud-3082.png b/local/media/images/product/fluoled50wblancchaud-3082.png new file mode 100644 index 00000000..2eb8d6b2 Binary files /dev/null and b/local/media/images/product/fluoled50wblancchaud-3082.png differ diff --git a/local/media/images/product/fluoled50wblancfroid-3081.png b/local/media/images/product/fluoled50wblancfroid-3081.png new file mode 100644 index 00000000..149457f3 Binary files /dev/null and b/local/media/images/product/fluoled50wblancfroid-3081.png differ diff --git a/local/media/images/product/freespace-3-s-blanc-2411.png b/local/media/images/product/freespace-3-s-blanc-2411.png new file mode 100644 index 00000000..16981de4 Binary files /dev/null and b/local/media/images/product/freespace-3-s-blanc-2411.png differ diff --git a/local/media/images/product/freespace-3-s-blanc-2413.jpg b/local/media/images/product/freespace-3-s-blanc-2413.jpg new file mode 100644 index 00000000..32a67a24 Binary files /dev/null and b/local/media/images/product/freespace-3-s-blanc-2413.jpg differ diff --git a/local/media/images/product/fs3series2satelliteblacklg-2416.jpg b/local/media/images/product/fs3series2satelliteblacklg-2416.jpg new file mode 100644 index 00000000..a4b91af3 Binary files /dev/null and b/local/media/images/product/fs3series2satelliteblacklg-2416.jpg differ diff --git a/local/media/images/product/fsds100seanglerightwhitelg-2427.jpg b/local/media/images/product/fsds100seanglerightwhitelg-2427.jpg new file mode 100644 index 00000000..da20b834 Binary files /dev/null and b/local/media/images/product/fsds100seanglerightwhitelg-2427.jpg differ diff --git a/local/media/images/product/fsds100seanglerightwithtrimplatelg-2423.jpg b/local/media/images/product/fsds100seanglerightwithtrimplatelg-2423.jpg new file mode 100644 index 00000000..48c23e07 Binary files /dev/null and b/local/media/images/product/fsds100seanglerightwithtrimplatelg-2423.jpg differ diff --git a/local/media/images/product/fsds100segrilleoffblacklg-2424.jpg b/local/media/images/product/fsds100segrilleoffblacklg-2424.jpg new file mode 100644 index 00000000..ac0bc77c Binary files /dev/null and b/local/media/images/product/fsds100segrilleoffblacklg-2424.jpg differ diff --git a/local/media/images/product/fsds100segrilleoffwhitelg-2426.jpg b/local/media/images/product/fsds100segrilleoffwhitelg-2426.jpg new file mode 100644 index 00000000..829dbf92 Binary files /dev/null and b/local/media/images/product/fsds100segrilleoffwhitelg-2426.jpg differ diff --git a/local/media/images/product/fsds100sestraightonblacklg-2425.jpg b/local/media/images/product/fsds100sestraightonblacklg-2425.jpg new file mode 100644 index 00000000..f274c933 Binary files /dev/null and b/local/media/images/product/fsds100sestraightonblacklg-2425.jpg differ diff --git a/local/media/images/product/fsds100sestraightonwhitelg-2428.jpg b/local/media/images/product/fsds100sestraightonwhitelg-2428.jpg new file mode 100644 index 00000000..0a835299 Binary files /dev/null and b/local/media/images/product/fsds100sestraightonwhitelg-2428.jpg differ diff --git a/local/media/images/product/fsen_a_370x361-2504.png b/local/media/images/product/fsen_a_370x361-2504.png new file mode 100644 index 00000000..56651bc7 Binary files /dev/null and b/local/media/images/product/fsen_a_370x361-2504.png differ diff --git a/local/media/images/product/fsen_s_370x361-2503.png b/local/media/images/product/fsen_s_370x361-2503.png new file mode 100644 index 00000000..8776a112 Binary files /dev/null and b/local/media/images/product/fsen_s_370x361-2503.png differ diff --git a/local/media/images/product/fsen_w_370x361-2502.png b/local/media/images/product/fsen_w_370x361-2502.png new file mode 100644 index 00000000..dc990a1e Binary files /dev/null and b/local/media/images/product/fsen_w_370x361-2502.png differ diff --git a/local/media/images/product/gamellect-3052.png b/local/media/images/product/gamellect-3052.png new file mode 100644 index 00000000..4803ff2b Binary files /dev/null and b/local/media/images/product/gamellect-3052.png differ diff --git a/local/media/images/product/gamelledessous-3053.png b/local/media/images/product/gamelledessous-3053.png new file mode 100644 index 00000000..6be636ff Binary files /dev/null and b/local/media/images/product/gamelledessous-3053.png differ diff --git a/local/media/images/product/gamellefaceavant-3054.png b/local/media/images/product/gamellefaceavant-3054.png new file mode 100644 index 00000000..72ad6233 Binary files /dev/null and b/local/media/images/product/gamellefaceavant-3054.png differ diff --git a/local/media/images/product/gamellegravure-3055.png b/local/media/images/product/gamellegravure-3055.png new file mode 100644 index 00000000..9ba6dd15 Binary files /dev/null and b/local/media/images/product/gamellegravure-3055.png differ diff --git a/local/media/images/product/gamelleledblancchaud-3083.png b/local/media/images/product/gamelleledblancchaud-3083.png new file mode 100644 index 00000000..6281ffa5 Binary files /dev/null and b/local/media/images/product/gamelleledblancchaud-3083.png differ diff --git a/local/media/images/product/gamelleledblancfroid-3084.png b/local/media/images/product/gamelleledblancfroid-3084.png new file mode 100644 index 00000000..cbe55963 Binary files /dev/null and b/local/media/images/product/gamelleledblancfroid-3084.png differ diff --git a/local/media/images/product/gamelleleds-3058.png b/local/media/images/product/gamelleleds-3058.png new file mode 100644 index 00000000..69229fe4 Binary files /dev/null and b/local/media/images/product/gamelleleds-3058.png differ diff --git a/local/media/images/product/gravurealuminiumanodis-2339.jpeg b/local/media/images/product/gravurealuminiumanodis-2339.jpeg new file mode 100644 index 00000000..04ecdb30 Binary files /dev/null and b/local/media/images/product/gravurealuminiumanodis-2339.jpeg differ diff --git a/local/media/images/product/gravurealuminiumthermolaqublancbrillant-2338.jpeg b/local/media/images/product/gravurealuminiumthermolaqublancbrillant-2338.jpeg new file mode 100644 index 00000000..2ada1824 Binary files /dev/null and b/local/media/images/product/gravurealuminiumthermolaqublancbrillant-2338.jpeg differ diff --git a/local/media/images/product/gravureinoxbross-2399.jpeg b/local/media/images/product/gravureinoxbross-2399.jpeg new file mode 100644 index 00000000..467b3e89 Binary files /dev/null and b/local/media/images/product/gravureinoxbross-2399.jpeg differ diff --git a/local/media/images/product/grisclair-2703.png b/local/media/images/product/grisclair-2703.png new file mode 100644 index 00000000..6c631809 Binary files /dev/null and b/local/media/images/product/grisclair-2703.png differ diff --git a/local/media/images/product/ico-zigfox-2614.png b/local/media/images/product/ico-zigfox-2614.png new file mode 100644 index 00000000..39bfb9d0 Binary files /dev/null and b/local/media/images/product/ico-zigfox-2614.png differ diff --git a/local/media/images/product/ico-zigfox-2615.png b/local/media/images/product/ico-zigfox-2615.png new file mode 100644 index 00000000..5020312e Binary files /dev/null and b/local/media/images/product/ico-zigfox-2615.png differ diff --git a/local/media/images/product/ico-zigfox-2616.jpg b/local/media/images/product/ico-zigfox-2616.jpg new file mode 100644 index 00000000..6426ac84 Binary files /dev/null and b/local/media/images/product/ico-zigfox-2616.jpg differ diff --git a/local/media/images/product/ico-zigfox-2617.png b/local/media/images/product/ico-zigfox-2617.png new file mode 100644 index 00000000..800718fa Binary files /dev/null and b/local/media/images/product/ico-zigfox-2617.png differ diff --git a/local/media/images/product/iknixipad2.png-1932.png b/local/media/images/product/iknixipad2.png-1932.png new file mode 100644 index 00000000..7302da12 Binary files /dev/null and b/local/media/images/product/iknixipad2.png-1932.png differ diff --git a/local/media/images/product/iknixipad3.png-1933.png b/local/media/images/product/iknixipad3.png-1933.png new file mode 100644 index 00000000..0daf8f08 Binary files /dev/null and b/local/media/images/product/iknixipad3.png-1933.png differ diff --git a/local/media/images/product/iknixipad6.png-1936.png b/local/media/images/product/iknixipad6.png-1936.png new file mode 100644 index 00000000..4a2b6b13 Binary files /dev/null and b/local/media/images/product/iknixipad6.png-1936.png differ diff --git a/local/media/images/product/image.product.detail.lightbox_im0000142-1825.jpg b/local/media/images/product/image.product.detail.lightbox_im0000142-1825.jpg new file mode 100644 index 00000000..55215ef8 Binary files /dev/null and b/local/media/images/product/image.product.detail.lightbox_im0000142-1825.jpg differ diff --git a/local/media/images/product/image.product.detail.lightbox_im0000143-1826.jpg b/local/media/images/product/image.product.detail.lightbox_im0000143-1826.jpg new file mode 100644 index 00000000..8ea2419c Binary files /dev/null and b/local/media/images/product/image.product.detail.lightbox_im0000143-1826.jpg differ diff --git a/local/media/images/product/image.product.detail.lightbox_im0000143-867.jpg b/local/media/images/product/image.product.detail.lightbox_im0000143-867.jpg new file mode 100644 index 00000000..f3aa274c Binary files /dev/null and b/local/media/images/product/image.product.detail.lightbox_im0000143-867.jpg differ diff --git a/local/media/images/product/image.product.detail.lightbox_im0000143-873.jpg b/local/media/images/product/image.product.detail.lightbox_im0000143-873.jpg new file mode 100644 index 00000000..f3aa274c Binary files /dev/null and b/local/media/images/product/image.product.detail.lightbox_im0000143-873.jpg differ diff --git a/local/media/images/product/image.product.detail.lightbox_im0001250-872.jpg b/local/media/images/product/image.product.detail.lightbox_im0001250-872.jpg new file mode 100644 index 00000000..86c3addd Binary files /dev/null and b/local/media/images/product/image.product.detail.lightbox_im0001250-872.jpg differ diff --git a/local/media/images/product/image.product.detail.lightbox_im0001251-874.jpg b/local/media/images/product/image.product.detail.lightbox_im0001251-874.jpg new file mode 100644 index 00000000..43665f21 Binary files /dev/null and b/local/media/images/product/image.product.detail.lightbox_im0001251-874.jpg differ diff --git a/local/media/images/product/images-2332.jpg b/local/media/images/product/images-2332.jpg new file mode 100644 index 00000000..d6549e86 Binary files /dev/null and b/local/media/images/product/images-2332.jpg differ diff --git a/local/media/images/product/img-84522-2596.jpg b/local/media/images/product/img-84522-2596.jpg new file mode 100644 index 00000000..72020ba7 Binary files /dev/null and b/local/media/images/product/img-84522-2596.jpg differ diff --git a/local/media/images/product/img_20190424_135550-2880.png b/local/media/images/product/img_20190424_135550-2880.png new file mode 100644 index 00000000..322f5e76 Binary files /dev/null and b/local/media/images/product/img_20190424_135550-2880.png differ diff --git a/local/media/images/product/img_20190424_141812-2879.jpg b/local/media/images/product/img_20190424_141812-2879.jpg new file mode 100644 index 00000000..db21bc3e Binary files /dev/null and b/local/media/images/product/img_20190424_141812-2879.jpg differ diff --git a/local/media/images/product/img_20190910_151640-3007.jpg b/local/media/images/product/img_20190910_151640-3007.jpg new file mode 100644 index 00000000..bc8540bd Binary files /dev/null and b/local/media/images/product/img_20190910_151640-3007.jpg differ diff --git a/local/media/images/product/img_20190910_151657-3006.jpg b/local/media/images/product/img_20190910_151657-3006.jpg new file mode 100644 index 00000000..71de450d Binary files /dev/null and b/local/media/images/product/img_20190910_151657-3006.jpg differ diff --git a/local/media/images/product/img_20190910_151805-3008.jpg b/local/media/images/product/img_20190910_151805-3008.jpg new file mode 100644 index 00000000..41d9c53b Binary files /dev/null and b/local/media/images/product/img_20190910_151805-3008.jpg differ diff --git a/local/media/images/product/img_20190910_152024-3027.jpg b/local/media/images/product/img_20190910_152024-3027.jpg new file mode 100644 index 00000000..84dc0ab0 Binary files /dev/null and b/local/media/images/product/img_20190910_152024-3027.jpg differ diff --git a/local/media/images/product/img_20190910_152046-3028.jpg b/local/media/images/product/img_20190910_152046-3028.jpg new file mode 100644 index 00000000..0ecc1c36 Binary files /dev/null and b/local/media/images/product/img_20190910_152046-3028.jpg differ diff --git a/local/media/images/product/img_20190910_152128-3029.jpg b/local/media/images/product/img_20190910_152128-3029.jpg new file mode 100644 index 00000000..0328a43f Binary files /dev/null and b/local/media/images/product/img_20190910_152128-3029.jpg differ diff --git a/local/media/images/product/img_20190910_152232-3002.jpg b/local/media/images/product/img_20190910_152232-3002.jpg new file mode 100644 index 00000000..a87cbb23 Binary files /dev/null and b/local/media/images/product/img_20190910_152232-3002.jpg differ diff --git a/local/media/images/product/img_20190910_152341-3001.jpg b/local/media/images/product/img_20190910_152341-3001.jpg new file mode 100644 index 00000000..dc22e070 Binary files /dev/null and b/local/media/images/product/img_20190910_152341-3001.jpg differ diff --git a/local/media/images/product/img_20190910_152432-3000.jpg b/local/media/images/product/img_20190910_152432-3000.jpg new file mode 100644 index 00000000..69189187 Binary files /dev/null and b/local/media/images/product/img_20190910_152432-3000.jpg differ diff --git a/local/media/images/product/img_20190910_152515-3004.jpg b/local/media/images/product/img_20190910_152515-3004.jpg new file mode 100644 index 00000000..e262783b Binary files /dev/null and b/local/media/images/product/img_20190910_152515-3004.jpg differ diff --git a/local/media/images/product/img_20190910_152554-3003.jpg b/local/media/images/product/img_20190910_152554-3003.jpg new file mode 100644 index 00000000..0a8e8a6b Binary files /dev/null and b/local/media/images/product/img_20190910_152554-3003.jpg differ diff --git a/local/media/images/product/img_20190910_152646-3005.jpg b/local/media/images/product/img_20190910_152646-3005.jpg new file mode 100644 index 00000000..754faa60 Binary files /dev/null and b/local/media/images/product/img_20190910_152646-3005.jpg differ diff --git a/local/media/images/product/img_20190910_152719-3012.jpg b/local/media/images/product/img_20190910_152719-3012.jpg new file mode 100644 index 00000000..80f44fd8 Binary files /dev/null and b/local/media/images/product/img_20190910_152719-3012.jpg differ diff --git a/local/media/images/product/img_20190910_152739-3013.jpg b/local/media/images/product/img_20190910_152739-3013.jpg new file mode 100644 index 00000000..448cf6ab Binary files /dev/null and b/local/media/images/product/img_20190910_152739-3013.jpg differ diff --git a/local/media/images/product/img_20190910_152752-3014.jpg b/local/media/images/product/img_20190910_152752-3014.jpg new file mode 100644 index 00000000..b8ab31a3 Binary files /dev/null and b/local/media/images/product/img_20190910_152752-3014.jpg differ diff --git a/local/media/images/product/img_20190910_152819-3022.jpg b/local/media/images/product/img_20190910_152819-3022.jpg new file mode 100644 index 00000000..3f093c51 Binary files /dev/null and b/local/media/images/product/img_20190910_152819-3022.jpg differ diff --git a/local/media/images/product/img_20190910_152833-3021.jpg b/local/media/images/product/img_20190910_152833-3021.jpg new file mode 100644 index 00000000..b63724c9 Binary files /dev/null and b/local/media/images/product/img_20190910_152833-3021.jpg differ diff --git a/local/media/images/product/img_20190910_152843-3023.jpg b/local/media/images/product/img_20190910_152843-3023.jpg new file mode 100644 index 00000000..e01a2909 Binary files /dev/null and b/local/media/images/product/img_20190910_152843-3023.jpg differ diff --git a/local/media/images/product/img_20190910_154620-2992.jpg b/local/media/images/product/img_20190910_154620-2992.jpg new file mode 100644 index 00000000..5bd2063b Binary files /dev/null and b/local/media/images/product/img_20190910_154620-2992.jpg differ diff --git a/local/media/images/product/img_20190910_154632-2996.jpg b/local/media/images/product/img_20190910_154632-2996.jpg new file mode 100644 index 00000000..d5ad1075 Binary files /dev/null and b/local/media/images/product/img_20190910_154632-2996.jpg differ diff --git a/local/media/images/product/img_20190910_154839-2991.jpg b/local/media/images/product/img_20190910_154839-2991.jpg new file mode 100644 index 00000000..d41e4613 Binary files /dev/null and b/local/media/images/product/img_20190910_154839-2991.jpg differ diff --git a/local/media/images/product/img_20190910_154911-2995.jpg b/local/media/images/product/img_20190910_154911-2995.jpg new file mode 100644 index 00000000..d94787fc Binary files /dev/null and b/local/media/images/product/img_20190910_154911-2995.jpg differ diff --git a/local/media/images/product/img_20190910_154939-2998.jpg b/local/media/images/product/img_20190910_154939-2998.jpg new file mode 100644 index 00000000..2adf0b49 Binary files /dev/null and b/local/media/images/product/img_20190910_154939-2998.jpg differ diff --git a/local/media/images/product/img_20190910_155156-2997.jpg b/local/media/images/product/img_20190910_155156-2997.jpg new file mode 100644 index 00000000..cd4854ed Binary files /dev/null and b/local/media/images/product/img_20190910_155156-2997.jpg differ diff --git a/local/media/images/product/img_20190910_155213-2999.jpg b/local/media/images/product/img_20190910_155213-2999.jpg new file mode 100644 index 00000000..03734d54 Binary files /dev/null and b/local/media/images/product/img_20190910_155213-2999.jpg differ diff --git a/local/media/images/product/img_20190910_155250-2994.jpg b/local/media/images/product/img_20190910_155250-2994.jpg new file mode 100644 index 00000000..c3402e9d Binary files /dev/null and b/local/media/images/product/img_20190910_155250-2994.jpg differ diff --git a/local/media/images/product/img_20190910_155346-2993.jpg b/local/media/images/product/img_20190910_155346-2993.jpg new file mode 100644 index 00000000..8effa437 Binary files /dev/null and b/local/media/images/product/img_20190910_155346-2993.jpg differ diff --git a/local/media/images/product/impression-2599.png b/local/media/images/product/impression-2599.png new file mode 100644 index 00000000..b3aecc48 Binary files /dev/null and b/local/media/images/product/impression-2599.png differ diff --git a/local/media/images/product/inox-2704.png b/local/media/images/product/inox-2704.png new file mode 100644 index 00000000..a2fd4125 Binary files /dev/null and b/local/media/images/product/inox-2704.png differ diff --git a/local/media/images/product/interlegrandlogo-2396.jpg b/local/media/images/product/interlegrandlogo-2396.jpg new file mode 100644 index 00000000..6bd02754 Binary files /dev/null and b/local/media/images/product/interlegrandlogo-2396.jpg differ diff --git a/local/media/images/product/interlegrandpoisson-2397.jpg b/local/media/images/product/interlegrandpoisson-2397.jpg new file mode 100644 index 00000000..a9968207 Binary files /dev/null and b/local/media/images/product/interlegrandpoisson-2397.jpg differ diff --git a/local/media/images/product/interlegrandvilla-2398.jpg b/local/media/images/product/interlegrandvilla-2398.jpg new file mode 100644 index 00000000..5a9593eb Binary files /dev/null and b/local/media/images/product/interlegrandvilla-2398.jpg differ diff --git a/local/media/images/product/interrupteurcouleur-2336.jpg b/local/media/images/product/interrupteurcouleur-2336.jpg new file mode 100644 index 00000000..a447e9fd Binary files /dev/null and b/local/media/images/product/interrupteurcouleur-2336.jpg differ diff --git a/local/media/images/product/ip2014wm-3040.png b/local/media/images/product/ip2014wm-3040.png new file mode 100644 index 00000000..74ab1a13 Binary files /dev/null and b/local/media/images/product/ip2014wm-3040.png differ diff --git a/local/media/images/product/ip205wm-3038.png b/local/media/images/product/ip205wm-3038.png new file mode 100644 index 00000000..4509b8ee Binary files /dev/null and b/local/media/images/product/ip205wm-3038.png differ diff --git a/local/media/images/product/ipadcarr-2603.jpg b/local/media/images/product/ipadcarr-2603.jpg new file mode 100644 index 00000000..373e7d32 Binary files /dev/null and b/local/media/images/product/ipadcarr-2603.jpg differ diff --git a/local/media/images/product/ipadsorti-2604.jpg b/local/media/images/product/ipadsorti-2604.jpg new file mode 100644 index 00000000..58e36267 Binary files /dev/null and b/local/media/images/product/ipadsorti-2604.jpg differ diff --git a/local/media/images/product/iphonedroitaccueil-2867.png b/local/media/images/product/iphonedroitaccueil-2867.png new file mode 100644 index 00000000..ba29f286 Binary files /dev/null and b/local/media/images/product/iphonedroitaccueil-2867.png differ diff --git a/local/media/images/product/iphonetraversaccueil-2873.png b/local/media/images/product/iphonetraversaccueil-2873.png new file mode 100644 index 00000000..a07f5701 Binary files /dev/null and b/local/media/images/product/iphonetraversaccueil-2873.png differ diff --git a/local/media/images/product/iphonetraverschauffage-2874.png b/local/media/images/product/iphonetraverschauffage-2874.png new file mode 100644 index 00000000..fc305f7b Binary files /dev/null and b/local/media/images/product/iphonetraverschauffage-2874.png differ diff --git a/local/media/images/product/iphonetraversecl-2868.png b/local/media/images/product/iphonetraversecl-2868.png new file mode 100644 index 00000000..106896ec Binary files /dev/null and b/local/media/images/product/iphonetraversecl-2868.png differ diff --git a/local/media/images/product/iphonetraversecl-2875.png b/local/media/images/product/iphonetraversecl-2875.png new file mode 100644 index 00000000..fe1ead3a Binary files /dev/null and b/local/media/images/product/iphonetraversecl-2875.png differ diff --git a/local/media/images/product/iphonetraverspompe-2869.png b/local/media/images/product/iphonetraverspompe-2869.png new file mode 100644 index 00000000..cf47f76b Binary files /dev/null and b/local/media/images/product/iphonetraverspompe-2869.png differ diff --git a/local/media/images/product/iphonetraverstemp-2870.png b/local/media/images/product/iphonetraverstemp-2870.png new file mode 100644 index 00000000..b3eb73ca Binary files /dev/null and b/local/media/images/product/iphonetraverstemp-2870.png differ diff --git a/local/media/images/product/iphonetraverstemp-2876.png b/local/media/images/product/iphonetraverstemp-2876.png new file mode 100644 index 00000000..233d1558 Binary files /dev/null and b/local/media/images/product/iphonetraverstemp-2876.png differ diff --git a/local/media/images/product/ipipl370x361-2458.png b/local/media/images/product/ipipl370x361-2458.png new file mode 100644 index 00000000..cad8e108 Binary files /dev/null and b/local/media/images/product/ipipl370x361-2458.png differ diff --git a/local/media/images/product/iprpl370x361-2457.png b/local/media/images/product/iprpl370x361-2457.png new file mode 100644 index 00000000..3d5dcede Binary files /dev/null and b/local/media/images/product/iprpl370x361-2457.png differ diff --git a/local/media/images/product/ivoire-2705.png b/local/media/images/product/ivoire-2705.png new file mode 100644 index 00000000..65a9fd5a Binary files /dev/null and b/local/media/images/product/ivoire-2705.png differ diff --git a/local/media/images/product/jung_2224wh-2410.png b/local/media/images/product/jung_2224wh-2410.png new file mode 100644 index 00000000..7c5b8e82 Binary files /dev/null and b/local/media/images/product/jung_2224wh-2410.png differ diff --git a/local/media/images/product/jung_3901reghe-1791.png b/local/media/images/product/jung_3901reghe-1791.png new file mode 100644 index 00000000..c32a28cf Binary files /dev/null and b/local/media/images/product/jung_3901reghe-1791.png differ diff --git a/local/media/images/product/jung_3902reghe-1792.png b/local/media/images/product/jung_3902reghe-1792.png new file mode 100644 index 00000000..20e99e65 Binary files /dev/null and b/local/media/images/product/jung_3902reghe-1792.png differ diff --git a/local/media/images/product/jung_3904reghe-1793.png b/local/media/images/product/jung_3904reghe-1793.png new file mode 100644 index 00000000..24512575 Binary files /dev/null and b/local/media/images/product/jung_3904reghe-1793.png differ diff --git a/local/media/images/product/jung_4071.02led-1843.png b/local/media/images/product/jung_4071.02led-1843.png new file mode 100644 index 00000000..0642bcf0 Binary files /dev/null and b/local/media/images/product/jung_4071.02led-1843.png differ diff --git a/local/media/images/product/jung_4071.02led-1844.png b/local/media/images/product/jung_4071.02led-1844.png new file mode 100644 index 00000000..0642bcf0 Binary files /dev/null and b/local/media/images/product/jung_4071.02led-1844.png differ diff --git a/local/media/images/product/jung_4071.02led-1888.jpg b/local/media/images/product/jung_4071.02led-1888.jpg new file mode 100644 index 00000000..c971eba7 Binary files /dev/null and b/local/media/images/product/jung_4071.02led-1888.jpg differ diff --git a/local/media/images/product/jung_4071tsm-1294.png b/local/media/images/product/jung_4071tsm-1294.png new file mode 100644 index 00000000..6637b932 Binary files /dev/null and b/local/media/images/product/jung_4071tsm-1294.png differ diff --git a/local/media/images/product/jung_4072.01led-1766.png b/local/media/images/product/jung_4072.01led-1766.png new file mode 100644 index 00000000..6c3d18df Binary files /dev/null and b/local/media/images/product/jung_4072.01led-1766.png differ diff --git a/local/media/images/product/jung_4072.02led-1765.png b/local/media/images/product/jung_4072.02led-1765.png new file mode 100644 index 00000000..6c3d18df Binary files /dev/null and b/local/media/images/product/jung_4072.02led-1765.png differ diff --git a/local/media/images/product/jung_4072tsm-1291.png b/local/media/images/product/jung_4072tsm-1291.png new file mode 100644 index 00000000..ce282527 Binary files /dev/null and b/local/media/images/product/jung_4072tsm-1291.png differ diff --git a/local/media/images/product/jung_4073tsm-1292.png b/local/media/images/product/jung_4073tsm-1292.png new file mode 100644 index 00000000..0a7bacda Binary files /dev/null and b/local/media/images/product/jung_4073tsm-1292.png differ diff --git a/local/media/images/product/jung_4074tsm-2061.png b/local/media/images/product/jung_4074tsm-2061.png new file mode 100644 index 00000000..afdc41d2 Binary files /dev/null and b/local/media/images/product/jung_4074tsm-2061.png differ diff --git a/local/media/images/product/jung_4091tsem1-2057.png b/local/media/images/product/jung_4091tsem1-2057.png new file mode 100644 index 00000000..8f2699d7 Binary files /dev/null and b/local/media/images/product/jung_4091tsem1-2057.png differ diff --git a/local/media/images/product/jung_4092tsem-2058.png b/local/media/images/product/jung_4092tsem-2058.png new file mode 100644 index 00000000..c9ed62a2 Binary files /dev/null and b/local/media/images/product/jung_4092tsem-2058.png differ diff --git a/local/media/images/product/jung_4093tsem-2059.png b/local/media/images/product/jung_4093tsem-2059.png new file mode 100644 index 00000000..1df8b9aa Binary files /dev/null and b/local/media/images/product/jung_4093tsem-2059.png differ diff --git a/local/media/images/product/jung_4094tsem-2060.png b/local/media/images/product/jung_4094tsem-2060.png new file mode 100644 index 00000000..d6a2c239 Binary files /dev/null and b/local/media/images/product/jung_4094tsem-2060.png differ diff --git a/local/media/images/product/jung_501u-3033.png b/local/media/images/product/jung_501u-3033.png new file mode 100644 index 00000000..33bf447c Binary files /dev/null and b/local/media/images/product/jung_501u-3033.png differ diff --git a/local/media/images/product/jung_531-2usi-3035.png b/local/media/images/product/jung_531-2usi-3035.png new file mode 100644 index 00000000..7af52fb9 Binary files /dev/null and b/local/media/images/product/jung_531-2usi-3035.png differ diff --git a/local/media/images/product/jung_531u-3034.png b/local/media/images/product/jung_531u-3034.png new file mode 100644 index 00000000..7265f5de Binary files /dev/null and b/local/media/images/product/jung_531u-3034.png differ diff --git a/local/media/images/product/jung_532u-2521.png b/local/media/images/product/jung_532u-2521.png new file mode 100644 index 00000000..c4a880e0 Binary files /dev/null and b/local/media/images/product/jung_532u-2521.png differ diff --git a/local/media/images/product/jung_551wu-1494.png b/local/media/images/product/jung_551wu-1494.png new file mode 100644 index 00000000..122c6e96 Binary files /dev/null and b/local/media/images/product/jung_551wu-1494.png differ diff --git a/local/media/images/product/jung_al1561.07-2474.png b/local/media/images/product/jung_al1561.07-2474.png new file mode 100644 index 00000000..f1c3ee55 Binary files /dev/null and b/local/media/images/product/jung_al1561.07-2474.png differ diff --git a/local/media/images/product/jung_al2402tsa-1698.png b/local/media/images/product/jung_al2402tsa-1698.png new file mode 100644 index 00000000..8e165b78 Binary files /dev/null and b/local/media/images/product/jung_al2402tsa-1698.png differ diff --git a/local/media/images/product/jung_al2402tsaan-1716.png b/local/media/images/product/jung_al2402tsaan-1716.png new file mode 100644 index 00000000..34d3ca24 Binary files /dev/null and b/local/media/images/product/jung_al2402tsaan-1716.png differ diff --git a/local/media/images/product/jung_al2404tsa-1699.png b/local/media/images/product/jung_al2404tsa-1699.png new file mode 100644 index 00000000..a4e56bd7 Binary files /dev/null and b/local/media/images/product/jung_al2404tsa-1699.png differ diff --git a/local/media/images/product/jung_al2404tsaan-1717.png b/local/media/images/product/jung_al2404tsaan-1717.png new file mode 100644 index 00000000..d7d28e3f Binary files /dev/null and b/local/media/images/product/jung_al2404tsaan-1717.png differ diff --git a/local/media/images/product/jung_al2969-1ua-2765.png b/local/media/images/product/jung_al2969-1ua-2765.png new file mode 100644 index 00000000..9395c3b1 Binary files /dev/null and b/local/media/images/product/jung_al2969-1ua-2765.png differ diff --git a/local/media/images/product/jung_al2969-1uaan-2762.png b/local/media/images/product/jung_al2969-1uaan-2762.png new file mode 100644 index 00000000..4c55a525 Binary files /dev/null and b/local/media/images/product/jung_al2969-1uaan-2762.png differ diff --git a/local/media/images/product/jung_al2969-1uad-2764.png b/local/media/images/product/jung_al2969-1uad-2764.png new file mode 100644 index 00000000..b1858522 Binary files /dev/null and b/local/media/images/product/jung_al2969-1uad-2764.png differ diff --git a/local/media/images/product/jung_al2969-2ua-2757.png b/local/media/images/product/jung_al2969-2ua-2757.png new file mode 100644 index 00000000..351b364b Binary files /dev/null and b/local/media/images/product/jung_al2969-2ua-2757.png differ diff --git a/local/media/images/product/jung_al2969-2uaan-2754.png b/local/media/images/product/jung_al2969-2uaan-2754.png new file mode 100644 index 00000000..2a2f09d8 Binary files /dev/null and b/local/media/images/product/jung_al2969-2uaan-2754.png differ diff --git a/local/media/images/product/jung_al2969-2uad-2756.png b/local/media/images/product/jung_al2969-2uad-2756.png new file mode 100644 index 00000000..0ff1173e Binary files /dev/null and b/local/media/images/product/jung_al2969-2uad-2756.png differ diff --git a/local/media/images/product/jung_al2969t-2508.png b/local/media/images/product/jung_al2969t-2508.png new file mode 100644 index 00000000..6da852ab Binary files /dev/null and b/local/media/images/product/jung_al2969t-2508.png differ diff --git a/local/media/images/product/jung_al2969tan-2509.png b/local/media/images/product/jung_al2969tan-2509.png new file mode 100644 index 00000000..9301daba Binary files /dev/null and b/local/media/images/product/jung_al2969tan-2509.png differ diff --git a/local/media/images/product/jung_al2969td-2511.png b/local/media/images/product/jung_al2969td-2511.png new file mode 100644 index 00000000..ff5bd2f1 Binary files /dev/null and b/local/media/images/product/jung_al2969td-2511.png differ diff --git a/local/media/images/product/jung_al2981-1718.png b/local/media/images/product/jung_al2981-1718.png new file mode 100644 index 00000000..e35cdca9 Binary files /dev/null and b/local/media/images/product/jung_al2981-1718.png differ diff --git a/local/media/images/product/jung_al2981-2773.png b/local/media/images/product/jung_al2981-2773.png new file mode 100644 index 00000000..ea47b40b Binary files /dev/null and b/local/media/images/product/jung_al2981-2773.png differ diff --git a/local/media/images/product/jung_al2981an-1628.png b/local/media/images/product/jung_al2981an-1628.png new file mode 100644 index 00000000..8494458e Binary files /dev/null and b/local/media/images/product/jung_al2981an-1628.png differ diff --git a/local/media/images/product/jung_al2981an-2770.png b/local/media/images/product/jung_al2981an-2770.png new file mode 100644 index 00000000..4fc5bf0b Binary files /dev/null and b/local/media/images/product/jung_al2981an-2770.png differ diff --git a/local/media/images/product/jung_al2981d-2772.png b/local/media/images/product/jung_al2981d-2772.png new file mode 100644 index 00000000..d5cc79e3 Binary files /dev/null and b/local/media/images/product/jung_al2981d-2772.png differ diff --git a/local/media/images/product/jung_al2982-1719.png b/local/media/images/product/jung_al2982-1719.png new file mode 100644 index 00000000..7c4e0cb9 Binary files /dev/null and b/local/media/images/product/jung_al2982-1719.png differ diff --git a/local/media/images/product/jung_al2982-2781.png b/local/media/images/product/jung_al2982-2781.png new file mode 100644 index 00000000..7c4e0cb9 Binary files /dev/null and b/local/media/images/product/jung_al2982-2781.png differ diff --git a/local/media/images/product/jung_al2982an-1629.png b/local/media/images/product/jung_al2982an-1629.png new file mode 100644 index 00000000..42ac783b Binary files /dev/null and b/local/media/images/product/jung_al2982an-1629.png differ diff --git a/local/media/images/product/jung_al2982an-2778.png b/local/media/images/product/jung_al2982an-2778.png new file mode 100644 index 00000000..42ac783b Binary files /dev/null and b/local/media/images/product/jung_al2982an-2778.png differ diff --git a/local/media/images/product/jung_al2982d-1637.png b/local/media/images/product/jung_al2982d-1637.png new file mode 100644 index 00000000..2ebe3ad5 Binary files /dev/null and b/local/media/images/product/jung_al2982d-1637.png differ diff --git a/local/media/images/product/jung_al2982d-2780.png b/local/media/images/product/jung_al2982d-2780.png new file mode 100644 index 00000000..d1eb6bcc Binary files /dev/null and b/local/media/images/product/jung_al2982d-2780.png differ diff --git a/local/media/images/product/jung_al2983-1720.png b/local/media/images/product/jung_al2983-1720.png new file mode 100644 index 00000000..d63ff72f Binary files /dev/null and b/local/media/images/product/jung_al2983-1720.png differ diff --git a/local/media/images/product/jung_al2983-2789.png b/local/media/images/product/jung_al2983-2789.png new file mode 100644 index 00000000..d63ff72f Binary files /dev/null and b/local/media/images/product/jung_al2983-2789.png differ diff --git a/local/media/images/product/jung_al2983-2845.png b/local/media/images/product/jung_al2983-2845.png new file mode 100644 index 00000000..d63ff72f Binary files /dev/null and b/local/media/images/product/jung_al2983-2845.png differ diff --git a/local/media/images/product/jung_al2983an-1630.png b/local/media/images/product/jung_al2983an-1630.png new file mode 100644 index 00000000..1bd6772e Binary files /dev/null and b/local/media/images/product/jung_al2983an-1630.png differ diff --git a/local/media/images/product/jung_al2983an-2786.png b/local/media/images/product/jung_al2983an-2786.png new file mode 100644 index 00000000..1bd6772e Binary files /dev/null and b/local/media/images/product/jung_al2983an-2786.png differ diff --git a/local/media/images/product/jung_al2983d-2788.png b/local/media/images/product/jung_al2983d-2788.png new file mode 100644 index 00000000..47ed82d6 Binary files /dev/null and b/local/media/images/product/jung_al2983d-2788.png differ diff --git a/local/media/images/product/jung_al2984-1721.png b/local/media/images/product/jung_al2984-1721.png new file mode 100644 index 00000000..a9c5f4b5 Binary files /dev/null and b/local/media/images/product/jung_al2984-1721.png differ diff --git a/local/media/images/product/jung_al2984-2797.png b/local/media/images/product/jung_al2984-2797.png new file mode 100644 index 00000000..a9c5f4b5 Binary files /dev/null and b/local/media/images/product/jung_al2984-2797.png differ diff --git a/local/media/images/product/jung_al2984an-1631.png b/local/media/images/product/jung_al2984an-1631.png new file mode 100644 index 00000000..ec4b5cb6 Binary files /dev/null and b/local/media/images/product/jung_al2984an-1631.png differ diff --git a/local/media/images/product/jung_al2984an-2794.png b/local/media/images/product/jung_al2984an-2794.png new file mode 100644 index 00000000..ec4b5cb6 Binary files /dev/null and b/local/media/images/product/jung_al2984an-2794.png differ diff --git a/local/media/images/product/jung_al2984d-2796.png b/local/media/images/product/jung_al2984d-2796.png new file mode 100644 index 00000000..8300ac9f Binary files /dev/null and b/local/media/images/product/jung_al2984d-2796.png differ diff --git a/local/media/images/product/jung_al2985-1722.png b/local/media/images/product/jung_al2985-1722.png new file mode 100644 index 00000000..cfa4f604 Binary files /dev/null and b/local/media/images/product/jung_al2985-1722.png differ diff --git a/local/media/images/product/jung_al2985-2805.png b/local/media/images/product/jung_al2985-2805.png new file mode 100644 index 00000000..cfa4f604 Binary files /dev/null and b/local/media/images/product/jung_al2985-2805.png differ diff --git a/local/media/images/product/jung_al2985an-1632.png b/local/media/images/product/jung_al2985an-1632.png new file mode 100644 index 00000000..80d4cde3 Binary files /dev/null and b/local/media/images/product/jung_al2985an-1632.png differ diff --git a/local/media/images/product/jung_al2985an-2802.png b/local/media/images/product/jung_al2985an-2802.png new file mode 100644 index 00000000..80d4cde3 Binary files /dev/null and b/local/media/images/product/jung_al2985an-2802.png differ diff --git a/local/media/images/product/jung_al2985d-2804.png b/local/media/images/product/jung_al2985d-2804.png new file mode 100644 index 00000000..bda40e48 Binary files /dev/null and b/local/media/images/product/jung_al2985d-2804.png differ diff --git a/local/media/images/product/jung_al2990-2715.png b/local/media/images/product/jung_al2990-2715.png new file mode 100644 index 00000000..bc20cd7e Binary files /dev/null and b/local/media/images/product/jung_al2990-2715.png differ diff --git a/local/media/images/product/jung_al2990a-2888.png b/local/media/images/product/jung_al2990a-2888.png new file mode 100644 index 00000000..9c017a67 Binary files /dev/null and b/local/media/images/product/jung_al2990a-2888.png differ diff --git a/local/media/images/product/jung_al2990aan-2887.png b/local/media/images/product/jung_al2990aan-2887.png new file mode 100644 index 00000000..173cf1d2 Binary files /dev/null and b/local/media/images/product/jung_al2990aan-2887.png differ diff --git a/local/media/images/product/jung_al2990ad-2886.png b/local/media/images/product/jung_al2990ad-2886.png new file mode 100644 index 00000000..8ff478c8 Binary files /dev/null and b/local/media/images/product/jung_al2990ad-2886.png differ diff --git a/local/media/images/product/jung_al2990an-2712.png b/local/media/images/product/jung_al2990an-2712.png new file mode 100644 index 00000000..85a35cfe Binary files /dev/null and b/local/media/images/product/jung_al2990an-2712.png differ diff --git a/local/media/images/product/jung_al2990d-2714.png b/local/media/images/product/jung_al2990d-2714.png new file mode 100644 index 00000000..224ad931 Binary files /dev/null and b/local/media/images/product/jung_al2990d-2714.png differ diff --git a/local/media/images/product/jung_al2990kl-2748.png b/local/media/images/product/jung_al2990kl-2748.png new file mode 100644 index 00000000..3789a36d Binary files /dev/null and b/local/media/images/product/jung_al2990kl-2748.png differ diff --git a/local/media/images/product/jung_al2990klan-2746.png b/local/media/images/product/jung_al2990klan-2746.png new file mode 100644 index 00000000..7178ab1b Binary files /dev/null and b/local/media/images/product/jung_al2990klan-2746.png differ diff --git a/local/media/images/product/jung_al2990kld-2747.png b/local/media/images/product/jung_al2990kld-2747.png new file mode 100644 index 00000000..3eebbc54 Binary files /dev/null and b/local/media/images/product/jung_al2990kld-2747.png differ diff --git a/local/media/images/product/jung_al2990ko5-1694.png b/local/media/images/product/jung_al2990ko5-1694.png new file mode 100644 index 00000000..21f3a811 Binary files /dev/null and b/local/media/images/product/jung_al2990ko5-1694.png differ diff --git a/local/media/images/product/jung_al2990ko5-1695.png b/local/media/images/product/jung_al2990ko5-1695.png new file mode 100644 index 00000000..21f3a811 Binary files /dev/null and b/local/media/images/product/jung_al2990ko5-1695.png differ diff --git a/local/media/images/product/jung_al2990ko5an-1712.png b/local/media/images/product/jung_al2990ko5an-1712.png new file mode 100644 index 00000000..a4634540 Binary files /dev/null and b/local/media/images/product/jung_al2990ko5an-1712.png differ diff --git a/local/media/images/product/jung_al2990ko5an-1713.png b/local/media/images/product/jung_al2990ko5an-1713.png new file mode 100644 index 00000000..a4634540 Binary files /dev/null and b/local/media/images/product/jung_al2990ko5an-1713.png differ diff --git a/local/media/images/product/jung_al2990sat-2769.png b/local/media/images/product/jung_al2990sat-2769.png new file mode 100644 index 00000000..60a8c379 Binary files /dev/null and b/local/media/images/product/jung_al2990sat-2769.png differ diff --git a/local/media/images/product/jung_al2990sat_sample-1841.png b/local/media/images/product/jung_al2990sat_sample-1841.png new file mode 100644 index 00000000..7679771d Binary files /dev/null and b/local/media/images/product/jung_al2990sat_sample-1841.png differ diff --git a/local/media/images/product/jung_al2990satd-2766.png b/local/media/images/product/jung_al2990satd-2766.png new file mode 100644 index 00000000..605a2d15 Binary files /dev/null and b/local/media/images/product/jung_al2990satd-2766.png differ diff --git a/local/media/images/product/jung_al2990satd-2768.png b/local/media/images/product/jung_al2990satd-2768.png new file mode 100644 index 00000000..605a2d15 Binary files /dev/null and b/local/media/images/product/jung_al2990satd-2768.png differ diff --git a/local/media/images/product/jung_al2990satd_sample-1842.png b/local/media/images/product/jung_al2990satd_sample-1842.png new file mode 100644 index 00000000..7679771d Binary files /dev/null and b/local/media/images/product/jung_al2990satd_sample-1842.png differ diff --git a/local/media/images/product/jung_al2994b-2740.png b/local/media/images/product/jung_al2994b-2740.png new file mode 100644 index 00000000..a203210b Binary files /dev/null and b/local/media/images/product/jung_al2994b-2740.png differ diff --git a/local/media/images/product/jung_al2994ban-2737.png b/local/media/images/product/jung_al2994ban-2737.png new file mode 100644 index 00000000..c661f57e Binary files /dev/null and b/local/media/images/product/jung_al2994ban-2737.png differ diff --git a/local/media/images/product/jung_al2994bd-2739.png b/local/media/images/product/jung_al2994bd-2739.png new file mode 100644 index 00000000..057d4190 Binary files /dev/null and b/local/media/images/product/jung_al2994bd-2739.png differ diff --git a/local/media/images/product/jung_al2995-2732.png b/local/media/images/product/jung_al2995-2732.png new file mode 100644 index 00000000..339eef1b Binary files /dev/null and b/local/media/images/product/jung_al2995-2732.png differ diff --git a/local/media/images/product/jung_al2995an-2729.png b/local/media/images/product/jung_al2995an-2729.png new file mode 100644 index 00000000..6527be5b Binary files /dev/null and b/local/media/images/product/jung_al2995an-2729.png differ diff --git a/local/media/images/product/jung_al2995d-2731.png b/local/media/images/product/jung_al2995d-2731.png new file mode 100644 index 00000000..4c87acd9 Binary files /dev/null and b/local/media/images/product/jung_al2995d-2731.png differ diff --git a/local/media/images/product/jung_al2995ko5-1696.png b/local/media/images/product/jung_al2995ko5-1696.png new file mode 100644 index 00000000..534b105c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5-1696.png differ diff --git a/local/media/images/product/jung_al2995ko5-1697.png b/local/media/images/product/jung_al2995ko5-1697.png new file mode 100644 index 00000000..534b105c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5-1697.png differ diff --git a/local/media/images/product/jung_al2995ko5-1770.png b/local/media/images/product/jung_al2995ko5-1770.png new file mode 100644 index 00000000..534b105c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5-1770.png differ diff --git a/local/media/images/product/jung_al2995ko5-2724.png b/local/media/images/product/jung_al2995ko5-2724.png new file mode 100644 index 00000000..117d2d71 Binary files /dev/null and b/local/media/images/product/jung_al2995ko5-2724.png differ diff --git a/local/media/images/product/jung_al2995ko5an-1714.png b/local/media/images/product/jung_al2995ko5an-1714.png new file mode 100644 index 00000000..8ed07f7c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5an-1714.png differ diff --git a/local/media/images/product/jung_al2995ko5an-1715.png b/local/media/images/product/jung_al2995ko5an-1715.png new file mode 100644 index 00000000..8ed07f7c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5an-1715.png differ diff --git a/local/media/images/product/jung_al2995ko5an-1771.png b/local/media/images/product/jung_al2995ko5an-1771.png new file mode 100644 index 00000000..8ed07f7c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5an-1771.png differ diff --git a/local/media/images/product/jung_al2995ko5an-2720.png b/local/media/images/product/jung_al2995ko5an-2720.png new file mode 100644 index 00000000..c8af1b74 Binary files /dev/null and b/local/media/images/product/jung_al2995ko5an-2720.png differ diff --git a/local/media/images/product/jung_al2995ko5d-2722.png b/local/media/images/product/jung_al2995ko5d-2722.png new file mode 100644 index 00000000..fa6b109c Binary files /dev/null and b/local/media/images/product/jung_al2995ko5d-2722.png differ diff --git a/local/media/images/product/jung_al2995ko5d_sample-1772.png b/local/media/images/product/jung_al2995ko5d_sample-1772.png new file mode 100644 index 00000000..2b7269ed Binary files /dev/null and b/local/media/images/product/jung_al2995ko5d_sample-1772.png differ diff --git a/local/media/images/product/jung_aluminiumal2982-913.png b/local/media/images/product/jung_aluminiumal2982-913.png new file mode 100644 index 00000000..b9b8ebb9 Binary files /dev/null and b/local/media/images/product/jung_aluminiumal2982-913.png differ diff --git a/local/media/images/product/jung_aluminiumal2995ko5p-2154.png b/local/media/images/product/jung_aluminiumal2995ko5p-2154.png new file mode 100644 index 00000000..e804316c Binary files /dev/null and b/local/media/images/product/jung_aluminiumal2995ko5p-2154.png differ diff --git a/local/media/images/product/jung_aluminiumal2995p-2148.png b/local/media/images/product/jung_aluminiumal2995p-2148.png new file mode 100644 index 00000000..80842e58 Binary files /dev/null and b/local/media/images/product/jung_aluminiumal2995p-2148.png differ diff --git a/local/media/images/product/jung_blancls5232ww-2172.png b/local/media/images/product/jung_blancls5232ww-2172.png new file mode 100644 index 00000000..95815425 Binary files /dev/null and b/local/media/images/product/jung_blancls5232ww-2172.png differ diff --git a/local/media/images/product/jung_blancls981ww-2062.png b/local/media/images/product/jung_blancls981ww-2062.png new file mode 100644 index 00000000..2a080768 Binary files /dev/null and b/local/media/images/product/jung_blancls981ww-2062.png differ diff --git a/local/media/images/product/jung_blancls982ww-894.png b/local/media/images/product/jung_blancls982ww-894.png new file mode 100644 index 00000000..f3542a2c Binary files /dev/null and b/local/media/images/product/jung_blancls982ww-894.png differ diff --git a/local/media/images/product/jung_blancls995ko5pww-2153.png b/local/media/images/product/jung_blancls995ko5pww-2153.png new file mode 100644 index 00000000..92ce737a Binary files /dev/null and b/local/media/images/product/jung_blancls995ko5pww-2153.png differ diff --git a/local/media/images/product/jung_blancls995pww-2147.png b/local/media/images/product/jung_blancls995pww-2147.png new file mode 100644 index 00000000..38d35204 Binary files /dev/null and b/local/media/images/product/jung_blancls995pww-2147.png differ diff --git a/local/media/images/product/jung_canonfusilme2982d-912.png b/local/media/images/product/jung_canonfusilme2982d-912.png new file mode 100644 index 00000000..ea5aa3a7 Binary files /dev/null and b/local/media/images/product/jung_canonfusilme2982d-912.png differ diff --git a/local/media/images/product/jung_chromegcr2982-909.png b/local/media/images/product/jung_chromegcr2982-909.png new file mode 100644 index 00000000..c3ed8e8f Binary files /dev/null and b/local/media/images/product/jung_chromegcr2982-909.png differ diff --git a/local/media/images/product/jung_es1561.07-2475.png b/local/media/images/product/jung_es1561.07-2475.png new file mode 100644 index 00000000..c37e52b9 Binary files /dev/null and b/local/media/images/product/jung_es1561.07-2475.png differ diff --git a/local/media/images/product/jung_es2402tsa-1704.png b/local/media/images/product/jung_es2402tsa-1704.png new file mode 100644 index 00000000..aa26b8d6 Binary files /dev/null and b/local/media/images/product/jung_es2402tsa-1704.png differ diff --git a/local/media/images/product/jung_es2404tsa-1705.png b/local/media/images/product/jung_es2404tsa-1705.png new file mode 100644 index 00000000..5fd0cfff Binary files /dev/null and b/local/media/images/product/jung_es2404tsa-1705.png differ diff --git a/local/media/images/product/jung_es2969-1ua-2763.png b/local/media/images/product/jung_es2969-1ua-2763.png new file mode 100644 index 00000000..e020b8b7 Binary files /dev/null and b/local/media/images/product/jung_es2969-1ua-2763.png differ diff --git a/local/media/images/product/jung_es2969-2ua-2755.png b/local/media/images/product/jung_es2969-2ua-2755.png new file mode 100644 index 00000000..38cdc008 Binary files /dev/null and b/local/media/images/product/jung_es2969-2ua-2755.png differ diff --git a/local/media/images/product/jung_es2969t-2510.png b/local/media/images/product/jung_es2969t-2510.png new file mode 100644 index 00000000..68c6f40a Binary files /dev/null and b/local/media/images/product/jung_es2969t-2510.png differ diff --git a/local/media/images/product/jung_es2981-1726.png b/local/media/images/product/jung_es2981-1726.png new file mode 100644 index 00000000..44fc2e5f Binary files /dev/null and b/local/media/images/product/jung_es2981-1726.png differ diff --git a/local/media/images/product/jung_es2981-2771.png b/local/media/images/product/jung_es2981-2771.png new file mode 100644 index 00000000..ef7cd863 Binary files /dev/null and b/local/media/images/product/jung_es2981-2771.png differ diff --git a/local/media/images/product/jung_es2982-1727.png b/local/media/images/product/jung_es2982-1727.png new file mode 100644 index 00000000..f317ae5d Binary files /dev/null and b/local/media/images/product/jung_es2982-1727.png differ diff --git a/local/media/images/product/jung_es2982-2779.png b/local/media/images/product/jung_es2982-2779.png new file mode 100644 index 00000000..f317ae5d Binary files /dev/null and b/local/media/images/product/jung_es2982-2779.png differ diff --git a/local/media/images/product/jung_es2983-1728.png b/local/media/images/product/jung_es2983-1728.png new file mode 100644 index 00000000..5eb31b60 Binary files /dev/null and b/local/media/images/product/jung_es2983-1728.png differ diff --git a/local/media/images/product/jung_es2983-2787.png b/local/media/images/product/jung_es2983-2787.png new file mode 100644 index 00000000..5eb31b60 Binary files /dev/null and b/local/media/images/product/jung_es2983-2787.png differ diff --git a/local/media/images/product/jung_es2984-1729.png b/local/media/images/product/jung_es2984-1729.png new file mode 100644 index 00000000..1bca8a4a Binary files /dev/null and b/local/media/images/product/jung_es2984-1729.png differ diff --git a/local/media/images/product/jung_es2984-2795.png b/local/media/images/product/jung_es2984-2795.png new file mode 100644 index 00000000..1bca8a4a Binary files /dev/null and b/local/media/images/product/jung_es2984-2795.png differ diff --git a/local/media/images/product/jung_es2985-1730.png b/local/media/images/product/jung_es2985-1730.png new file mode 100644 index 00000000..3ef959af Binary files /dev/null and b/local/media/images/product/jung_es2985-1730.png differ diff --git a/local/media/images/product/jung_es2985-2803.png b/local/media/images/product/jung_es2985-2803.png new file mode 100644 index 00000000..3ef959af Binary files /dev/null and b/local/media/images/product/jung_es2985-2803.png differ diff --git a/local/media/images/product/jung_es2990-2713.png b/local/media/images/product/jung_es2990-2713.png new file mode 100644 index 00000000..ad5a3f29 Binary files /dev/null and b/local/media/images/product/jung_es2990-2713.png differ diff --git a/local/media/images/product/jung_es2990a-2889.png b/local/media/images/product/jung_es2990a-2889.png new file mode 100644 index 00000000..36e4b23b Binary files /dev/null and b/local/media/images/product/jung_es2990a-2889.png differ diff --git a/local/media/images/product/jung_es2990kl-1784.png b/local/media/images/product/jung_es2990kl-1784.png new file mode 100644 index 00000000..4934f290 Binary files /dev/null and b/local/media/images/product/jung_es2990kl-1784.png differ diff --git a/local/media/images/product/jung_es2990kl-2745.png b/local/media/images/product/jung_es2990kl-2745.png new file mode 100644 index 00000000..1d65e6fa Binary files /dev/null and b/local/media/images/product/jung_es2990kl-2745.png differ diff --git a/local/media/images/product/jung_es2990ko5-1700.png b/local/media/images/product/jung_es2990ko5-1700.png new file mode 100644 index 00000000..1f65433a Binary files /dev/null and b/local/media/images/product/jung_es2990ko5-1700.png differ diff --git a/local/media/images/product/jung_es2990ko5-1701.png b/local/media/images/product/jung_es2990ko5-1701.png new file mode 100644 index 00000000..1f65433a Binary files /dev/null and b/local/media/images/product/jung_es2990ko5-1701.png differ diff --git a/local/media/images/product/jung_es2990sat-2767.png b/local/media/images/product/jung_es2990sat-2767.png new file mode 100644 index 00000000..79101b3e Binary files /dev/null and b/local/media/images/product/jung_es2990sat-2767.png differ diff --git a/local/media/images/product/jung_es2994b-2738.png b/local/media/images/product/jung_es2994b-2738.png new file mode 100644 index 00000000..28601881 Binary files /dev/null and b/local/media/images/product/jung_es2994b-2738.png differ diff --git a/local/media/images/product/jung_es2995-2730.png b/local/media/images/product/jung_es2995-2730.png new file mode 100644 index 00000000..3e81ea95 Binary files /dev/null and b/local/media/images/product/jung_es2995-2730.png differ diff --git a/local/media/images/product/jung_es2995ko5-1702.png b/local/media/images/product/jung_es2995ko5-1702.png new file mode 100644 index 00000000..54da1f19 Binary files /dev/null and b/local/media/images/product/jung_es2995ko5-1702.png differ diff --git a/local/media/images/product/jung_es2995ko5-1703.png b/local/media/images/product/jung_es2995ko5-1703.png new file mode 100644 index 00000000..54da1f19 Binary files /dev/null and b/local/media/images/product/jung_es2995ko5-1703.png differ diff --git a/local/media/images/product/jung_es2995ko5-1773.png b/local/media/images/product/jung_es2995ko5-1773.png new file mode 100644 index 00000000..54da1f19 Binary files /dev/null and b/local/media/images/product/jung_es2995ko5-1773.png differ diff --git a/local/media/images/product/jung_es2995ko5-2721.png b/local/media/images/product/jung_es2995ko5-2721.png new file mode 100644 index 00000000..54da1f19 Binary files /dev/null and b/local/media/images/product/jung_es2995ko5-2721.png differ diff --git a/local/media/images/product/jung_fd981lg-1621.png b/local/media/images/product/jung_fd981lg-1621.png new file mode 100644 index 00000000..e67b1b2a Binary files /dev/null and b/local/media/images/product/jung_fd981lg-1621.png differ diff --git a/local/media/images/product/jung_fd981sw-1739.png b/local/media/images/product/jung_fd981sw-1739.png new file mode 100644 index 00000000..0d436916 Binary files /dev/null and b/local/media/images/product/jung_fd981sw-1739.png differ diff --git a/local/media/images/product/jung_fd981w-1670.png b/local/media/images/product/jung_fd981w-1670.png new file mode 100644 index 00000000..dfb7b3ab Binary files /dev/null and b/local/media/images/product/jung_fd981w-1670.png differ diff --git a/local/media/images/product/jung_fd982lg-1619.png b/local/media/images/product/jung_fd982lg-1619.png new file mode 100644 index 00000000..1f76c02a Binary files /dev/null and b/local/media/images/product/jung_fd982lg-1619.png differ diff --git a/local/media/images/product/jung_fd982sw-1740.png b/local/media/images/product/jung_fd982sw-1740.png new file mode 100644 index 00000000..764ffa8b Binary files /dev/null and b/local/media/images/product/jung_fd982sw-1740.png differ diff --git a/local/media/images/product/jung_fd982w-1671.png b/local/media/images/product/jung_fd982w-1671.png new file mode 100644 index 00000000..683e0596 Binary files /dev/null and b/local/media/images/product/jung_fd982w-1671.png differ diff --git a/local/media/images/product/jung_fd983lg_sample-1622.png b/local/media/images/product/jung_fd983lg_sample-1622.png new file mode 100644 index 00000000..8c7a533a Binary files /dev/null and b/local/media/images/product/jung_fd983lg_sample-1622.png differ diff --git a/local/media/images/product/jung_fd983sw_sample-1741.png b/local/media/images/product/jung_fd983sw_sample-1741.png new file mode 100644 index 00000000..8cd94763 Binary files /dev/null and b/local/media/images/product/jung_fd983sw_sample-1741.png differ diff --git a/local/media/images/product/jung_fd983w_sample-1672.png b/local/media/images/product/jung_fd983w_sample-1672.png new file mode 100644 index 00000000..e9c532a7 Binary files /dev/null and b/local/media/images/product/jung_fd983w_sample-1672.png differ diff --git a/local/media/images/product/jung_fdal2981-1723.png b/local/media/images/product/jung_fdal2981-1723.png new file mode 100644 index 00000000..5b0d790a Binary files /dev/null and b/local/media/images/product/jung_fdal2981-1723.png differ diff --git a/local/media/images/product/jung_fdal2981an-1633.png b/local/media/images/product/jung_fdal2981an-1633.png new file mode 100644 index 00000000..54d402ca Binary files /dev/null and b/local/media/images/product/jung_fdal2981an-1633.png differ diff --git a/local/media/images/product/jung_fdal2982-1724.png b/local/media/images/product/jung_fdal2982-1724.png new file mode 100644 index 00000000..21c32a09 Binary files /dev/null and b/local/media/images/product/jung_fdal2982-1724.png differ diff --git a/local/media/images/product/jung_fdal2982an-1634.png b/local/media/images/product/jung_fdal2982an-1634.png new file mode 100644 index 00000000..4f356a18 Binary files /dev/null and b/local/media/images/product/jung_fdal2982an-1634.png differ diff --git a/local/media/images/product/jung_fdal2983_sample-1725.png b/local/media/images/product/jung_fdal2983_sample-1725.png new file mode 100644 index 00000000..ed69f1bf Binary files /dev/null and b/local/media/images/product/jung_fdal2983_sample-1725.png differ diff --git a/local/media/images/product/jung_fdal2983an_sample-1635.png b/local/media/images/product/jung_fdal2983an_sample-1635.png new file mode 100644 index 00000000..97edb7a1 Binary files /dev/null and b/local/media/images/product/jung_fdal2983an_sample-1635.png differ diff --git a/local/media/images/product/jung_fdes2981-1731.png b/local/media/images/product/jung_fdes2981-1731.png new file mode 100644 index 00000000..8c48cd73 Binary files /dev/null and b/local/media/images/product/jung_fdes2981-1731.png differ diff --git a/local/media/images/product/jung_fdes2982-1732.png b/local/media/images/product/jung_fdes2982-1732.png new file mode 100644 index 00000000..0f22176f Binary files /dev/null and b/local/media/images/product/jung_fdes2982-1732.png differ diff --git a/local/media/images/product/jung_fdes2983_sample-1733.png b/local/media/images/product/jung_fdes2983_sample-1733.png new file mode 100644 index 00000000..4715c64a Binary files /dev/null and b/local/media/images/product/jung_fdes2983_sample-1733.png differ diff --git a/local/media/images/product/jung_fdme2981at-1647.png b/local/media/images/product/jung_fdme2981at-1647.png new file mode 100644 index 00000000..e843c39e Binary files /dev/null and b/local/media/images/product/jung_fdme2981at-1647.png differ diff --git a/local/media/images/product/jung_fdme2981c-1655.png b/local/media/images/product/jung_fdme2981c-1655.png new file mode 100644 index 00000000..abeed83a Binary files /dev/null and b/local/media/images/product/jung_fdme2981c-1655.png differ diff --git a/local/media/images/product/jung_fdme2982at-1648.png b/local/media/images/product/jung_fdme2982at-1648.png new file mode 100644 index 00000000..b572aa0c Binary files /dev/null and b/local/media/images/product/jung_fdme2982at-1648.png differ diff --git a/local/media/images/product/jung_fdme2982c-1656.png b/local/media/images/product/jung_fdme2982c-1656.png new file mode 100644 index 00000000..6371b432 Binary files /dev/null and b/local/media/images/product/jung_fdme2982c-1656.png differ diff --git a/local/media/images/product/jung_fdme2983at_sample-1649.png b/local/media/images/product/jung_fdme2983at_sample-1649.png new file mode 100644 index 00000000..24b290d3 Binary files /dev/null and b/local/media/images/product/jung_fdme2983at_sample-1649.png differ diff --git a/local/media/images/product/jung_fdme2983c_sample-1657.png b/local/media/images/product/jung_fdme2983c_sample-1657.png new file mode 100644 index 00000000..ab673320 Binary files /dev/null and b/local/media/images/product/jung_fdme2983c_sample-1657.png differ diff --git a/local/media/images/product/jung_gcr1561.07-2479.png b/local/media/images/product/jung_gcr1561.07-2479.png new file mode 100644 index 00000000..a606bdfd Binary files /dev/null and b/local/media/images/product/jung_gcr1561.07-2479.png differ diff --git a/local/media/images/product/jung_gcr2969t-2512.png b/local/media/images/product/jung_gcr2969t-2512.png new file mode 100644 index 00000000..13b4a47e Binary files /dev/null and b/local/media/images/product/jung_gcr2969t-2512.png differ diff --git a/local/media/images/product/jung_gcr2981-1660.png b/local/media/images/product/jung_gcr2981-1660.png new file mode 100644 index 00000000..7cf9fabf Binary files /dev/null and b/local/media/images/product/jung_gcr2981-1660.png differ diff --git a/local/media/images/product/jung_gcr2982-1659.png b/local/media/images/product/jung_gcr2982-1659.png new file mode 100644 index 00000000..709444f7 Binary files /dev/null and b/local/media/images/product/jung_gcr2982-1659.png differ diff --git a/local/media/images/product/jung_gcr2983-1661.png b/local/media/images/product/jung_gcr2983-1661.png new file mode 100644 index 00000000..bbf33d51 Binary files /dev/null and b/local/media/images/product/jung_gcr2983-1661.png differ diff --git a/local/media/images/product/jung_gcr2984-1662.png b/local/media/images/product/jung_gcr2984-1662.png new file mode 100644 index 00000000..e358b03b Binary files /dev/null and b/local/media/images/product/jung_gcr2984-1662.png differ diff --git a/local/media/images/product/jung_gcr2985-1663.png b/local/media/images/product/jung_gcr2985-1663.png new file mode 100644 index 00000000..207455ca Binary files /dev/null and b/local/media/images/product/jung_gcr2985-1663.png differ diff --git a/local/media/images/product/jung_gcr2990ko5-1755.png b/local/media/images/product/jung_gcr2990ko5-1755.png new file mode 100644 index 00000000..bcda4007 Binary files /dev/null and b/local/media/images/product/jung_gcr2990ko5-1755.png differ diff --git a/local/media/images/product/jung_gcr2990ko5-1756.png b/local/media/images/product/jung_gcr2990ko5-1756.png new file mode 100644 index 00000000..bcda4007 Binary files /dev/null and b/local/media/images/product/jung_gcr2990ko5-1756.png differ diff --git a/local/media/images/product/jung_gcr2995ko5-1757.png b/local/media/images/product/jung_gcr2995ko5-1757.png new file mode 100644 index 00000000..51b4fccc Binary files /dev/null and b/local/media/images/product/jung_gcr2995ko5-1757.png differ diff --git a/local/media/images/product/jung_gcr2995ko5-1758.png b/local/media/images/product/jung_gcr2995ko5-1758.png new file mode 100644 index 00000000..51b4fccc Binary files /dev/null and b/local/media/images/product/jung_gcr2995ko5-1758.png differ diff --git a/local/media/images/product/jung_gcr2995ko5-1774.png b/local/media/images/product/jung_gcr2995ko5-1774.png new file mode 100644 index 00000000..51b4fccc Binary files /dev/null and b/local/media/images/product/jung_gcr2995ko5-1774.png differ diff --git a/local/media/images/product/jung_go1561.07-2476.png b/local/media/images/product/jung_go1561.07-2476.png new file mode 100644 index 00000000..648ec928 Binary files /dev/null and b/local/media/images/product/jung_go1561.07-2476.png differ diff --git a/local/media/images/product/jung_go2981-1746.png b/local/media/images/product/jung_go2981-1746.png new file mode 100644 index 00000000..452afb55 Binary files /dev/null and b/local/media/images/product/jung_go2981-1746.png differ diff --git a/local/media/images/product/jung_go2982-1747.png b/local/media/images/product/jung_go2982-1747.png new file mode 100644 index 00000000..fc2db9a7 Binary files /dev/null and b/local/media/images/product/jung_go2982-1747.png differ diff --git a/local/media/images/product/jung_go2983-1748.png b/local/media/images/product/jung_go2983-1748.png new file mode 100644 index 00000000..25ee6ce8 Binary files /dev/null and b/local/media/images/product/jung_go2983-1748.png differ diff --git a/local/media/images/product/jung_go2984-1749.png b/local/media/images/product/jung_go2984-1749.png new file mode 100644 index 00000000..ac8da83c Binary files /dev/null and b/local/media/images/product/jung_go2984-1749.png differ diff --git a/local/media/images/product/jung_go2985-1750.png b/local/media/images/product/jung_go2985-1750.png new file mode 100644 index 00000000..748362f0 Binary files /dev/null and b/local/media/images/product/jung_go2985-1750.png differ diff --git a/local/media/images/product/jung_go2990ko5-1751.png b/local/media/images/product/jung_go2990ko5-1751.png new file mode 100644 index 00000000..f3f08957 Binary files /dev/null and b/local/media/images/product/jung_go2990ko5-1751.png differ diff --git a/local/media/images/product/jung_go2990ko5-1752.png b/local/media/images/product/jung_go2990ko5-1752.png new file mode 100644 index 00000000..f3f08957 Binary files /dev/null and b/local/media/images/product/jung_go2990ko5-1752.png differ diff --git a/local/media/images/product/jung_go2990sat-1840.png b/local/media/images/product/jung_go2990sat-1840.png new file mode 100644 index 00000000..a4dd738c Binary files /dev/null and b/local/media/images/product/jung_go2990sat-1840.png differ diff --git a/local/media/images/product/jung_go2995ko5-1753.png b/local/media/images/product/jung_go2995ko5-1753.png new file mode 100644 index 00000000..78538c83 Binary files /dev/null and b/local/media/images/product/jung_go2995ko5-1753.png differ diff --git a/local/media/images/product/jung_go2995ko5-1754.png b/local/media/images/product/jung_go2995ko5-1754.png new file mode 100644 index 00000000..78538c83 Binary files /dev/null and b/local/media/images/product/jung_go2995ko5-1754.png differ diff --git a/local/media/images/product/jung_go2995ko5-1775.png b/local/media/images/product/jung_go2995ko5-1775.png new file mode 100644 index 00000000..78538c83 Binary files /dev/null and b/local/media/images/product/jung_go2995ko5-1775.png differ diff --git a/local/media/images/product/jung_grisclairls5232lg-2176.png b/local/media/images/product/jung_grisclairls5232lg-2176.png new file mode 100644 index 00000000..a88deaba Binary files /dev/null and b/local/media/images/product/jung_grisclairls5232lg-2176.png differ diff --git a/local/media/images/product/jung_grisclairls981lg-2069.png b/local/media/images/product/jung_grisclairls981lg-2069.png new file mode 100644 index 00000000..adf594f6 Binary files /dev/null and b/local/media/images/product/jung_grisclairls981lg-2069.png differ diff --git a/local/media/images/product/jung_grisclairls982lg-895.png b/local/media/images/product/jung_grisclairls982lg-895.png new file mode 100644 index 00000000..9e831b58 Binary files /dev/null and b/local/media/images/product/jung_grisclairls982lg-895.png differ diff --git a/local/media/images/product/jung_grisclairls995ko5plg-2155.png b/local/media/images/product/jung_grisclairls995ko5plg-2155.png new file mode 100644 index 00000000..af6f6248 Binary files /dev/null and b/local/media/images/product/jung_grisclairls995ko5plg-2155.png differ diff --git a/local/media/images/product/jung_grisclairls995plg-2149.png b/local/media/images/product/jung_grisclairls995plg-2149.png new file mode 100644 index 00000000..6ec8f1ac Binary files /dev/null and b/local/media/images/product/jung_grisclairls995plg-2149.png differ diff --git a/local/media/images/product/jung_inoxes2995ko5p-2156.png b/local/media/images/product/jung_inoxes2995ko5p-2156.png new file mode 100644 index 00000000..352a8f2a Binary files /dev/null and b/local/media/images/product/jung_inoxes2995ko5p-2156.png differ diff --git a/local/media/images/product/jung_inoxes2995p-2150.png b/local/media/images/product/jung_inoxes2995p-2150.png new file mode 100644 index 00000000..a957e115 Binary files /dev/null and b/local/media/images/product/jung_inoxes2995p-2150.png differ diff --git a/local/media/images/product/jung_ipr200reg-829.png b/local/media/images/product/jung_ipr200reg-829.png new file mode 100644 index 00000000..26db79cd Binary files /dev/null and b/local/media/images/product/jung_ipr200reg-829.png differ diff --git a/local/media/images/product/jung_ips200reg-830.png b/local/media/images/product/jung_ips200reg-830.png new file mode 100644 index 00000000..990ba4f0 Binary files /dev/null and b/local/media/images/product/jung_ips200reg-830.png differ diff --git a/local/media/images/product/jung_ivoirels5232-2178.png b/local/media/images/product/jung_ivoirels5232-2178.png new file mode 100644 index 00000000..869d3f4c Binary files /dev/null and b/local/media/images/product/jung_ivoirels5232-2178.png differ diff --git a/local/media/images/product/jung_ivoirels981w-2068.png b/local/media/images/product/jung_ivoirels981w-2068.png new file mode 100644 index 00000000..ed77b520 Binary files /dev/null and b/local/media/images/product/jung_ivoirels981w-2068.png differ diff --git a/local/media/images/product/jung_ivoirels982w-896.png b/local/media/images/product/jung_ivoirels982w-896.png new file mode 100644 index 00000000..dd06fa3b Binary files /dev/null and b/local/media/images/product/jung_ivoirels982w-896.png differ diff --git a/local/media/images/product/jung_ivoirels995ko5p-2157.png b/local/media/images/product/jung_ivoirels995ko5p-2157.png new file mode 100644 index 00000000..fd0e2655 Binary files /dev/null and b/local/media/images/product/jung_ivoirels995ko5p-2157.png differ diff --git a/local/media/images/product/jung_ivoirels995p-2151.png b/local/media/images/product/jung_ivoirels995p-2151.png new file mode 100644 index 00000000..e7b967f3 Binary files /dev/null and b/local/media/images/product/jung_ivoirels995p-2151.png differ diff --git a/local/media/images/product/jung_laitonancienme2982at-911.png b/local/media/images/product/jung_laitonancienme2982at-911.png new file mode 100644 index 00000000..0123c2a0 Binary files /dev/null and b/local/media/images/product/jung_laitonancienme2982at-911.png differ diff --git a/local/media/images/product/jung_laitondoreme2982c-910.png b/local/media/images/product/jung_laitondoreme2982c-910.png new file mode 100644 index 00000000..6179c79a Binary files /dev/null and b/local/media/images/product/jung_laitondoreme2982c-910.png differ diff --git a/local/media/images/product/jung_ls1561.07-2473.png b/local/media/images/product/jung_ls1561.07-2473.png new file mode 100644 index 00000000..1a323eae Binary files /dev/null and b/local/media/images/product/jung_ls1561.07-2473.png differ diff --git a/local/media/images/product/jung_ls1561.07lg-2472.png b/local/media/images/product/jung_ls1561.07lg-2472.png new file mode 100644 index 00000000..40177a80 Binary files /dev/null and b/local/media/images/product/jung_ls1561.07lg-2472.png differ diff --git a/local/media/images/product/jung_ls1561.07sw-2471.png b/local/media/images/product/jung_ls1561.07sw-2471.png new file mode 100644 index 00000000..f0bc469b Binary files /dev/null and b/local/media/images/product/jung_ls1561.07sw-2471.png differ diff --git a/local/media/images/product/jung_ls1561.07ww-2470.png b/local/media/images/product/jung_ls1561.07ww-2470.png new file mode 100644 index 00000000..74578972 Binary files /dev/null and b/local/media/images/product/jung_ls1561.07ww-2470.png differ diff --git a/local/media/images/product/jung_ls402tsa-1693.png b/local/media/images/product/jung_ls402tsa-1693.png new file mode 100644 index 00000000..b1f1542b Binary files /dev/null and b/local/media/images/product/jung_ls402tsa-1693.png differ diff --git a/local/media/images/product/jung_ls402tsalg-1687.png b/local/media/images/product/jung_ls402tsalg-1687.png new file mode 100644 index 00000000..e072effb Binary files /dev/null and b/local/media/images/product/jung_ls402tsalg-1687.png differ diff --git a/local/media/images/product/jung_ls402tsasw-1710.png b/local/media/images/product/jung_ls402tsasw-1710.png new file mode 100644 index 00000000..41519a5b Binary files /dev/null and b/local/media/images/product/jung_ls402tsasw-1710.png differ diff --git a/local/media/images/product/jung_ls404tsa-1689.png b/local/media/images/product/jung_ls404tsa-1689.png new file mode 100644 index 00000000..1a57e253 Binary files /dev/null and b/local/media/images/product/jung_ls404tsa-1689.png differ diff --git a/local/media/images/product/jung_ls404tsalg-1688.png b/local/media/images/product/jung_ls404tsalg-1688.png new file mode 100644 index 00000000..30ca51a3 Binary files /dev/null and b/local/media/images/product/jung_ls404tsalg-1688.png differ diff --git a/local/media/images/product/jung_ls404tsasw-1711.png b/local/media/images/product/jung_ls404tsasw-1711.png new file mode 100644 index 00000000..564b7fbd Binary files /dev/null and b/local/media/images/product/jung_ls404tsasw-1711.png differ diff --git a/local/media/images/product/jung_ls920fki_sample-1587.png b/local/media/images/product/jung_ls920fki_sample-1587.png new file mode 100644 index 00000000..cb305c5b Binary files /dev/null and b/local/media/images/product/jung_ls920fki_sample-1587.png differ diff --git a/local/media/images/product/jung_ls969-2ua-2750.png b/local/media/images/product/jung_ls969-2ua-2750.png new file mode 100644 index 00000000..ef1430c1 Binary files /dev/null and b/local/media/images/product/jung_ls969-2ua-2750.png differ diff --git a/local/media/images/product/jung_ls969-2ualg-2752.png b/local/media/images/product/jung_ls969-2ualg-2752.png new file mode 100644 index 00000000..aff4ea6c Binary files /dev/null and b/local/media/images/product/jung_ls969-2ualg-2752.png differ diff --git a/local/media/images/product/jung_ls969-2ualg_sample-1686.png b/local/media/images/product/jung_ls969-2ualg_sample-1686.png new file mode 100644 index 00000000..e2309549 Binary files /dev/null and b/local/media/images/product/jung_ls969-2ualg_sample-1686.png differ diff --git a/local/media/images/product/jung_ls969-2uasw-2751.png b/local/media/images/product/jung_ls969-2uasw-2751.png new file mode 100644 index 00000000..a20a04c7 Binary files /dev/null and b/local/media/images/product/jung_ls969-2uasw-2751.png differ diff --git a/local/media/images/product/jung_ls969-2uaww-2753.png b/local/media/images/product/jung_ls969-2uaww-2753.png new file mode 100644 index 00000000..a7144d8e Binary files /dev/null and b/local/media/images/product/jung_ls969-2uaww-2753.png differ diff --git a/local/media/images/product/jung_ls969t-2513.png b/local/media/images/product/jung_ls969t-2513.png new file mode 100644 index 00000000..3dfe0335 Binary files /dev/null and b/local/media/images/product/jung_ls969t-2513.png differ diff --git a/local/media/images/product/jung_ls969tlg-2515.png b/local/media/images/product/jung_ls969tlg-2515.png new file mode 100644 index 00000000..1f2622c1 Binary files /dev/null and b/local/media/images/product/jung_ls969tlg-2515.png differ diff --git a/local/media/images/product/jung_ls969tsw-2514.png b/local/media/images/product/jung_ls969tsw-2514.png new file mode 100644 index 00000000..6479aade Binary files /dev/null and b/local/media/images/product/jung_ls969tsw-2514.png differ diff --git a/local/media/images/product/jung_ls969tww-2517.png b/local/media/images/product/jung_ls969tww-2517.png new file mode 100644 index 00000000..6332ef49 Binary files /dev/null and b/local/media/images/product/jung_ls969tww-2517.png differ diff --git a/local/media/images/product/jung_ls981ggo-1835.png b/local/media/images/product/jung_ls981ggo-1835.png new file mode 100644 index 00000000..2b443f9e Binary files /dev/null and b/local/media/images/product/jung_ls981ggo-1835.png differ diff --git a/local/media/images/product/jung_ls981lg-1676.png b/local/media/images/product/jung_ls981lg-1676.png new file mode 100644 index 00000000..cc4f5ea1 Binary files /dev/null and b/local/media/images/product/jung_ls981lg-1676.png differ diff --git a/local/media/images/product/jung_ls981sw-1734.png b/local/media/images/product/jung_ls981sw-1734.png new file mode 100644 index 00000000..5f689af5 Binary files /dev/null and b/local/media/images/product/jung_ls981sw-1734.png differ diff --git a/local/media/images/product/jung_ls981w-1665.png b/local/media/images/product/jung_ls981w-1665.png new file mode 100644 index 00000000..101194e8 Binary files /dev/null and b/local/media/images/product/jung_ls981w-1665.png differ diff --git a/local/media/images/product/jung_ls982ggo-1834.png b/local/media/images/product/jung_ls982ggo-1834.png new file mode 100644 index 00000000..daaddea9 Binary files /dev/null and b/local/media/images/product/jung_ls982ggo-1834.png differ diff --git a/local/media/images/product/jung_ls982lg-1679.png b/local/media/images/product/jung_ls982lg-1679.png new file mode 100644 index 00000000..75cc3e34 Binary files /dev/null and b/local/media/images/product/jung_ls982lg-1679.png differ diff --git a/local/media/images/product/jung_ls982lg-2776.png b/local/media/images/product/jung_ls982lg-2776.png new file mode 100644 index 00000000..75cc3e34 Binary files /dev/null and b/local/media/images/product/jung_ls982lg-2776.png differ diff --git a/local/media/images/product/jung_ls982sw-1735.png b/local/media/images/product/jung_ls982sw-1735.png new file mode 100644 index 00000000..6e37b8a9 Binary files /dev/null and b/local/media/images/product/jung_ls982sw-1735.png differ diff --git a/local/media/images/product/jung_ls982sw-2775.png b/local/media/images/product/jung_ls982sw-2775.png new file mode 100644 index 00000000..6e37b8a9 Binary files /dev/null and b/local/media/images/product/jung_ls982sw-2775.png differ diff --git a/local/media/images/product/jung_ls982w-1666.png b/local/media/images/product/jung_ls982w-1666.png new file mode 100644 index 00000000..1f7e1ac6 Binary files /dev/null and b/local/media/images/product/jung_ls982w-1666.png differ diff --git a/local/media/images/product/jung_ls982w-2774.png b/local/media/images/product/jung_ls982w-2774.png new file mode 100644 index 00000000..1f7e1ac6 Binary files /dev/null and b/local/media/images/product/jung_ls982w-2774.png differ diff --git a/local/media/images/product/jung_ls982ww-2777.png b/local/media/images/product/jung_ls982ww-2777.png new file mode 100644 index 00000000..afb165a1 Binary files /dev/null and b/local/media/images/product/jung_ls982ww-2777.png differ diff --git a/local/media/images/product/jung_ls983ggo-1837.png b/local/media/images/product/jung_ls983ggo-1837.png new file mode 100644 index 00000000..8802a215 Binary files /dev/null and b/local/media/images/product/jung_ls983ggo-1837.png differ diff --git a/local/media/images/product/jung_ls983lg-1678.png b/local/media/images/product/jung_ls983lg-1678.png new file mode 100644 index 00000000..30d14652 Binary files /dev/null and b/local/media/images/product/jung_ls983lg-1678.png differ diff --git a/local/media/images/product/jung_ls983lg-2784.png b/local/media/images/product/jung_ls983lg-2784.png new file mode 100644 index 00000000..30d14652 Binary files /dev/null and b/local/media/images/product/jung_ls983lg-2784.png differ diff --git a/local/media/images/product/jung_ls983sw-1736.png b/local/media/images/product/jung_ls983sw-1736.png new file mode 100644 index 00000000..11964ab7 Binary files /dev/null and b/local/media/images/product/jung_ls983sw-1736.png differ diff --git a/local/media/images/product/jung_ls983sw-2783.png b/local/media/images/product/jung_ls983sw-2783.png new file mode 100644 index 00000000..11964ab7 Binary files /dev/null and b/local/media/images/product/jung_ls983sw-2783.png differ diff --git a/local/media/images/product/jung_ls983w-1667.png b/local/media/images/product/jung_ls983w-1667.png new file mode 100644 index 00000000..eade6588 Binary files /dev/null and b/local/media/images/product/jung_ls983w-1667.png differ diff --git a/local/media/images/product/jung_ls983w-2782.png b/local/media/images/product/jung_ls983w-2782.png new file mode 100644 index 00000000..eade6588 Binary files /dev/null and b/local/media/images/product/jung_ls983w-2782.png differ diff --git a/local/media/images/product/jung_ls983ww-2785.png b/local/media/images/product/jung_ls983ww-2785.png new file mode 100644 index 00000000..a7bbbb87 Binary files /dev/null and b/local/media/images/product/jung_ls983ww-2785.png differ diff --git a/local/media/images/product/jung_ls984ggo-1839.png b/local/media/images/product/jung_ls984ggo-1839.png new file mode 100644 index 00000000..d1ec8bc1 Binary files /dev/null and b/local/media/images/product/jung_ls984ggo-1839.png differ diff --git a/local/media/images/product/jung_ls984lg-1680.png b/local/media/images/product/jung_ls984lg-1680.png new file mode 100644 index 00000000..4819d268 Binary files /dev/null and b/local/media/images/product/jung_ls984lg-1680.png differ diff --git a/local/media/images/product/jung_ls984lg-2792.png b/local/media/images/product/jung_ls984lg-2792.png new file mode 100644 index 00000000..4819d268 Binary files /dev/null and b/local/media/images/product/jung_ls984lg-2792.png differ diff --git a/local/media/images/product/jung_ls984sw-1737.png b/local/media/images/product/jung_ls984sw-1737.png new file mode 100644 index 00000000..7f55e556 Binary files /dev/null and b/local/media/images/product/jung_ls984sw-1737.png differ diff --git a/local/media/images/product/jung_ls984sw-2791.png b/local/media/images/product/jung_ls984sw-2791.png new file mode 100644 index 00000000..7f55e556 Binary files /dev/null and b/local/media/images/product/jung_ls984sw-2791.png differ diff --git a/local/media/images/product/jung_ls984w-1668.png b/local/media/images/product/jung_ls984w-1668.png new file mode 100644 index 00000000..e0030e0b Binary files /dev/null and b/local/media/images/product/jung_ls984w-1668.png differ diff --git a/local/media/images/product/jung_ls984w-2790.png b/local/media/images/product/jung_ls984w-2790.png new file mode 100644 index 00000000..e0030e0b Binary files /dev/null and b/local/media/images/product/jung_ls984w-2790.png differ diff --git a/local/media/images/product/jung_ls984ww-2793.png b/local/media/images/product/jung_ls984ww-2793.png new file mode 100644 index 00000000..c4422098 Binary files /dev/null and b/local/media/images/product/jung_ls984ww-2793.png differ diff --git a/local/media/images/product/jung_ls985lg-1681.png b/local/media/images/product/jung_ls985lg-1681.png new file mode 100644 index 00000000..f8c2ac42 Binary files /dev/null and b/local/media/images/product/jung_ls985lg-1681.png differ diff --git a/local/media/images/product/jung_ls985lg-2800.png b/local/media/images/product/jung_ls985lg-2800.png new file mode 100644 index 00000000..f8c2ac42 Binary files /dev/null and b/local/media/images/product/jung_ls985lg-2800.png differ diff --git a/local/media/images/product/jung_ls985sw-1738.png b/local/media/images/product/jung_ls985sw-1738.png new file mode 100644 index 00000000..d7b7bf5f Binary files /dev/null and b/local/media/images/product/jung_ls985sw-1738.png differ diff --git a/local/media/images/product/jung_ls985sw-2799.png b/local/media/images/product/jung_ls985sw-2799.png new file mode 100644 index 00000000..d7b7bf5f Binary files /dev/null and b/local/media/images/product/jung_ls985sw-2799.png differ diff --git a/local/media/images/product/jung_ls985w-1669.png b/local/media/images/product/jung_ls985w-1669.png new file mode 100644 index 00000000..b0371305 Binary files /dev/null and b/local/media/images/product/jung_ls985w-1669.png differ diff --git a/local/media/images/product/jung_ls985w-2798.png b/local/media/images/product/jung_ls985w-2798.png new file mode 100644 index 00000000..b0371305 Binary files /dev/null and b/local/media/images/product/jung_ls985w-2798.png differ diff --git a/local/media/images/product/jung_ls985ww-2801.png b/local/media/images/product/jung_ls985ww-2801.png new file mode 100644 index 00000000..4e02f814 Binary files /dev/null and b/local/media/images/product/jung_ls985ww-2801.png differ diff --git a/local/media/images/product/jung_ls990-2708.png b/local/media/images/product/jung_ls990-2708.png new file mode 100644 index 00000000..5aa5b96a Binary files /dev/null and b/local/media/images/product/jung_ls990-2708.png differ diff --git a/local/media/images/product/jung_ls990a-2884.png b/local/media/images/product/jung_ls990a-2884.png new file mode 100644 index 00000000..6e416c02 Binary files /dev/null and b/local/media/images/product/jung_ls990a-2884.png differ diff --git a/local/media/images/product/jung_ls990alg-2882.png b/local/media/images/product/jung_ls990alg-2882.png new file mode 100644 index 00000000..a9db40d3 Binary files /dev/null and b/local/media/images/product/jung_ls990alg-2882.png differ diff --git a/local/media/images/product/jung_ls990asw-2883.png b/local/media/images/product/jung_ls990asw-2883.png new file mode 100644 index 00000000..3de99e75 Binary files /dev/null and b/local/media/images/product/jung_ls990asw-2883.png differ diff --git a/local/media/images/product/jung_ls990aww-2885.png b/local/media/images/product/jung_ls990aww-2885.png new file mode 100644 index 00000000..1ab2321c Binary files /dev/null and b/local/media/images/product/jung_ls990aww-2885.png differ diff --git a/local/media/images/product/jung_ls990kl-2741.png b/local/media/images/product/jung_ls990kl-2741.png new file mode 100644 index 00000000..e0739456 Binary files /dev/null and b/local/media/images/product/jung_ls990kl-2741.png differ diff --git a/local/media/images/product/jung_ls990kl_sample-1586.png b/local/media/images/product/jung_ls990kl_sample-1586.png new file mode 100644 index 00000000..ab49a8dc Binary files /dev/null and b/local/media/images/product/jung_ls990kl_sample-1586.png differ diff --git a/local/media/images/product/jung_ls990kllg-2743.png b/local/media/images/product/jung_ls990kllg-2743.png new file mode 100644 index 00000000..5ff2b25e Binary files /dev/null and b/local/media/images/product/jung_ls990kllg-2743.png differ diff --git a/local/media/images/product/jung_ls990klsw-2742.png b/local/media/images/product/jung_ls990klsw-2742.png new file mode 100644 index 00000000..99247cc9 Binary files /dev/null and b/local/media/images/product/jung_ls990klsw-2742.png differ diff --git a/local/media/images/product/jung_ls990klww-2744.png b/local/media/images/product/jung_ls990klww-2744.png new file mode 100644 index 00000000..cfc39512 Binary files /dev/null and b/local/media/images/product/jung_ls990klww-2744.png differ diff --git a/local/media/images/product/jung_ls990ko5-1675.png b/local/media/images/product/jung_ls990ko5-1675.png new file mode 100644 index 00000000..5162f1ce Binary files /dev/null and b/local/media/images/product/jung_ls990ko5-1675.png differ diff --git a/local/media/images/product/jung_ls990ko5-1691.png b/local/media/images/product/jung_ls990ko5-1691.png new file mode 100644 index 00000000..5162f1ce Binary files /dev/null and b/local/media/images/product/jung_ls990ko5-1691.png differ diff --git a/local/media/images/product/jung_ls990ko5lg-1683.png b/local/media/images/product/jung_ls990ko5lg-1683.png new file mode 100644 index 00000000..0490b509 Binary files /dev/null and b/local/media/images/product/jung_ls990ko5lg-1683.png differ diff --git a/local/media/images/product/jung_ls990ko5lg-1684.png b/local/media/images/product/jung_ls990ko5lg-1684.png new file mode 100644 index 00000000..0490b509 Binary files /dev/null and b/local/media/images/product/jung_ls990ko5lg-1684.png differ diff --git a/local/media/images/product/jung_ls990ko5sw-1706.png b/local/media/images/product/jung_ls990ko5sw-1706.png new file mode 100644 index 00000000..aaca89c4 Binary files /dev/null and b/local/media/images/product/jung_ls990ko5sw-1706.png differ diff --git a/local/media/images/product/jung_ls990ko5sw-1707.png b/local/media/images/product/jung_ls990ko5sw-1707.png new file mode 100644 index 00000000..aaca89c4 Binary files /dev/null and b/local/media/images/product/jung_ls990ko5sw-1707.png differ diff --git a/local/media/images/product/jung_ls990ko5ww-1604.jpg b/local/media/images/product/jung_ls990ko5ww-1604.jpg new file mode 100644 index 00000000..866d634d Binary files /dev/null and b/local/media/images/product/jung_ls990ko5ww-1604.jpg differ diff --git a/local/media/images/product/jung_ls990ko5ww-1885.jpg b/local/media/images/product/jung_ls990ko5ww-1885.jpg new file mode 100644 index 00000000..866d634d Binary files /dev/null and b/local/media/images/product/jung_ls990ko5ww-1885.jpg differ diff --git a/local/media/images/product/jung_ls990lg-2710.png b/local/media/images/product/jung_ls990lg-2710.png new file mode 100644 index 00000000..29ce4d17 Binary files /dev/null and b/local/media/images/product/jung_ls990lg-2710.png differ diff --git a/local/media/images/product/jung_ls990sw-2709.png b/local/media/images/product/jung_ls990sw-2709.png new file mode 100644 index 00000000..95675ec6 Binary files /dev/null and b/local/media/images/product/jung_ls990sw-2709.png differ diff --git a/local/media/images/product/jung_ls990ww-2711.png b/local/media/images/product/jung_ls990ww-2711.png new file mode 100644 index 00000000..acf8cfbe Binary files /dev/null and b/local/media/images/product/jung_ls990ww-2711.png differ diff --git a/local/media/images/product/jung_ls994b-2733.png b/local/media/images/product/jung_ls994b-2733.png new file mode 100644 index 00000000..0fa1c557 Binary files /dev/null and b/local/media/images/product/jung_ls994b-2733.png differ diff --git a/local/media/images/product/jung_ls994blg-2735.png b/local/media/images/product/jung_ls994blg-2735.png new file mode 100644 index 00000000..9e3af457 Binary files /dev/null and b/local/media/images/product/jung_ls994blg-2735.png differ diff --git a/local/media/images/product/jung_ls994bsw-2734.png b/local/media/images/product/jung_ls994bsw-2734.png new file mode 100644 index 00000000..0ca761e7 Binary files /dev/null and b/local/media/images/product/jung_ls994bsw-2734.png differ diff --git a/local/media/images/product/jung_ls994bww-2736.png b/local/media/images/product/jung_ls994bww-2736.png new file mode 100644 index 00000000..f4037e37 Binary files /dev/null and b/local/media/images/product/jung_ls994bww-2736.png differ diff --git a/local/media/images/product/jung_ls995-2725.png b/local/media/images/product/jung_ls995-2725.png new file mode 100644 index 00000000..20b5af66 Binary files /dev/null and b/local/media/images/product/jung_ls995-2725.png differ diff --git a/local/media/images/product/jung_ls995ko5-1690.png b/local/media/images/product/jung_ls995ko5-1690.png new file mode 100644 index 00000000..464511cd Binary files /dev/null and b/local/media/images/product/jung_ls995ko5-1690.png differ diff --git a/local/media/images/product/jung_ls995ko5-1692.png b/local/media/images/product/jung_ls995ko5-1692.png new file mode 100644 index 00000000..464511cd Binary files /dev/null and b/local/media/images/product/jung_ls995ko5-1692.png differ diff --git a/local/media/images/product/jung_ls995ko5-1776.png b/local/media/images/product/jung_ls995ko5-1776.png new file mode 100644 index 00000000..464511cd Binary files /dev/null and b/local/media/images/product/jung_ls995ko5-1776.png differ diff --git a/local/media/images/product/jung_ls995ko5-2716.png b/local/media/images/product/jung_ls995ko5-2716.png new file mode 100644 index 00000000..9cfad32a Binary files /dev/null and b/local/media/images/product/jung_ls995ko5-2716.png differ diff --git a/local/media/images/product/jung_ls995ko5lg-1682.png b/local/media/images/product/jung_ls995ko5lg-1682.png new file mode 100644 index 00000000..8c18d0e6 Binary files /dev/null and b/local/media/images/product/jung_ls995ko5lg-1682.png differ diff --git a/local/media/images/product/jung_ls995ko5lg-1685.png b/local/media/images/product/jung_ls995ko5lg-1685.png new file mode 100644 index 00000000..8c18d0e6 Binary files /dev/null and b/local/media/images/product/jung_ls995ko5lg-1685.png differ diff --git a/local/media/images/product/jung_ls995ko5lg-1777.png b/local/media/images/product/jung_ls995ko5lg-1777.png new file mode 100644 index 00000000..8c18d0e6 Binary files /dev/null and b/local/media/images/product/jung_ls995ko5lg-1777.png differ diff --git a/local/media/images/product/jung_ls995ko5lg-2718.png b/local/media/images/product/jung_ls995ko5lg-2718.png new file mode 100644 index 00000000..969308fd Binary files /dev/null and b/local/media/images/product/jung_ls995ko5lg-2718.png differ diff --git a/local/media/images/product/jung_ls995ko5sw-1708.png b/local/media/images/product/jung_ls995ko5sw-1708.png new file mode 100644 index 00000000..7d719bf7 Binary files /dev/null and b/local/media/images/product/jung_ls995ko5sw-1708.png differ diff --git a/local/media/images/product/jung_ls995ko5sw-1709.png b/local/media/images/product/jung_ls995ko5sw-1709.png new file mode 100644 index 00000000..7d719bf7 Binary files /dev/null and b/local/media/images/product/jung_ls995ko5sw-1709.png differ diff --git a/local/media/images/product/jung_ls995ko5sw-1778.png b/local/media/images/product/jung_ls995ko5sw-1778.png new file mode 100644 index 00000000..7d719bf7 Binary files /dev/null and b/local/media/images/product/jung_ls995ko5sw-1778.png differ diff --git a/local/media/images/product/jung_ls995ko5sw-2717.png b/local/media/images/product/jung_ls995ko5sw-2717.png new file mode 100644 index 00000000..598c042a Binary files /dev/null and b/local/media/images/product/jung_ls995ko5sw-2717.png differ diff --git a/local/media/images/product/jung_ls995ko5ww-1606.jpg b/local/media/images/product/jung_ls995ko5ww-1606.jpg new file mode 100644 index 00000000..e535a0bd Binary files /dev/null and b/local/media/images/product/jung_ls995ko5ww-1606.jpg differ diff --git a/local/media/images/product/jung_ls995ko5ww-1769.png b/local/media/images/product/jung_ls995ko5ww-1769.png new file mode 100644 index 00000000..181c045c Binary files /dev/null and b/local/media/images/product/jung_ls995ko5ww-1769.png differ diff --git a/local/media/images/product/jung_ls995ko5ww-1887.jpg b/local/media/images/product/jung_ls995ko5ww-1887.jpg new file mode 100644 index 00000000..e535a0bd Binary files /dev/null and b/local/media/images/product/jung_ls995ko5ww-1887.jpg differ diff --git a/local/media/images/product/jung_ls995ko5ww-2719.png b/local/media/images/product/jung_ls995ko5ww-2719.png new file mode 100644 index 00000000..181c045c Binary files /dev/null and b/local/media/images/product/jung_ls995ko5ww-2719.png differ diff --git a/local/media/images/product/jung_ls995lg-2727.png b/local/media/images/product/jung_ls995lg-2727.png new file mode 100644 index 00000000..921588f9 Binary files /dev/null and b/local/media/images/product/jung_ls995lg-2727.png differ diff --git a/local/media/images/product/jung_ls995sw-2726.png b/local/media/images/product/jung_ls995sw-2726.png new file mode 100644 index 00000000..eb1f30cb Binary files /dev/null and b/local/media/images/product/jung_ls995sw-2726.png differ diff --git a/local/media/images/product/jung_ls995ww-2728.png b/local/media/images/product/jung_ls995ww-2728.png new file mode 100644 index 00000000..cede2f08 Binary files /dev/null and b/local/media/images/product/jung_ls995ww-2728.png differ diff --git a/local/media/images/product/jung_lsmal4-1804.png b/local/media/images/product/jung_lsmal4-1804.png new file mode 100644 index 00000000..cdd3e3fd Binary files /dev/null and b/local/media/images/product/jung_lsmal4-1804.png differ diff --git a/local/media/images/product/jung_lsmal4an-1803.png b/local/media/images/product/jung_lsmal4an-1803.png new file mode 100644 index 00000000..af281c5f Binary files /dev/null and b/local/media/images/product/jung_lsmal4an-1803.png differ diff --git a/local/media/images/product/jung_lsmes4-1806.png b/local/media/images/product/jung_lsmes4-1806.png new file mode 100644 index 00000000..db3d68c6 Binary files /dev/null and b/local/media/images/product/jung_lsmes4-1806.png differ diff --git a/local/media/images/product/jung_lsmls4-1808.png b/local/media/images/product/jung_lsmls4-1808.png new file mode 100644 index 00000000..d3854fd0 Binary files /dev/null and b/local/media/images/product/jung_lsmls4-1808.png differ diff --git a/local/media/images/product/jung_lsmls4lg-1807.png b/local/media/images/product/jung_lsmls4lg-1807.png new file mode 100644 index 00000000..260efdbc Binary files /dev/null and b/local/media/images/product/jung_lsmls4lg-1807.png differ diff --git a/local/media/images/product/jung_lsmls4sw-1809.png b/local/media/images/product/jung_lsmls4sw-1809.png new file mode 100644 index 00000000..a2a30669 Binary files /dev/null and b/local/media/images/product/jung_lsmls4sw-1809.png differ diff --git a/local/media/images/product/jung_lsmls4ww-1810.png b/local/media/images/product/jung_lsmls4ww-1810.png new file mode 100644 index 00000000..109dce4a Binary files /dev/null and b/local/media/images/product/jung_lsmls4ww-1810.png differ diff --git a/local/media/images/product/jung_me1561.07at-2477.png b/local/media/images/product/jung_me1561.07at-2477.png new file mode 100644 index 00000000..40585b0b Binary files /dev/null and b/local/media/images/product/jung_me1561.07at-2477.png differ diff --git a/local/media/images/product/jung_me1561.07c-2478.png b/local/media/images/product/jung_me1561.07c-2478.png new file mode 100644 index 00000000..12b86a8b Binary files /dev/null and b/local/media/images/product/jung_me1561.07c-2478.png differ diff --git a/local/media/images/product/jung_me2404tsaat_sample-1853.png b/local/media/images/product/jung_me2404tsaat_sample-1853.png new file mode 100644 index 00000000..f1a62647 Binary files /dev/null and b/local/media/images/product/jung_me2404tsaat_sample-1853.png differ diff --git a/local/media/images/product/jung_me2521fkinac_sample-1883.png b/local/media/images/product/jung_me2521fkinac_sample-1883.png new file mode 100644 index 00000000..10c3954b Binary files /dev/null and b/local/media/images/product/jung_me2521fkinac_sample-1883.png differ diff --git a/local/media/images/product/jung_me2981at-1642.png b/local/media/images/product/jung_me2981at-1642.png new file mode 100644 index 00000000..9b9ec31c Binary files /dev/null and b/local/media/images/product/jung_me2981at-1642.png differ diff --git a/local/media/images/product/jung_me2981c-1650.png b/local/media/images/product/jung_me2981c-1650.png new file mode 100644 index 00000000..7003a4db Binary files /dev/null and b/local/media/images/product/jung_me2981c-1650.png differ diff --git a/local/media/images/product/jung_me2982at-1643.png b/local/media/images/product/jung_me2982at-1643.png new file mode 100644 index 00000000..6c4753ff Binary files /dev/null and b/local/media/images/product/jung_me2982at-1643.png differ diff --git a/local/media/images/product/jung_me2982c-1651.png b/local/media/images/product/jung_me2982c-1651.png new file mode 100644 index 00000000..70c9a3a4 Binary files /dev/null and b/local/media/images/product/jung_me2982c-1651.png differ diff --git a/local/media/images/product/jung_me2983at-1644.png b/local/media/images/product/jung_me2983at-1644.png new file mode 100644 index 00000000..c3b11b69 Binary files /dev/null and b/local/media/images/product/jung_me2983at-1644.png differ diff --git a/local/media/images/product/jung_me2983c-1652.png b/local/media/images/product/jung_me2983c-1652.png new file mode 100644 index 00000000..aafadd16 Binary files /dev/null and b/local/media/images/product/jung_me2983c-1652.png differ diff --git a/local/media/images/product/jung_me2984at-1645.png b/local/media/images/product/jung_me2984at-1645.png new file mode 100644 index 00000000..3524a976 Binary files /dev/null and b/local/media/images/product/jung_me2984at-1645.png differ diff --git a/local/media/images/product/jung_me2984c-1653.png b/local/media/images/product/jung_me2984c-1653.png new file mode 100644 index 00000000..e744bd27 Binary files /dev/null and b/local/media/images/product/jung_me2984c-1653.png differ diff --git a/local/media/images/product/jung_me2985at-1646.png b/local/media/images/product/jung_me2985at-1646.png new file mode 100644 index 00000000..0c39f912 Binary files /dev/null and b/local/media/images/product/jung_me2985at-1646.png differ diff --git a/local/media/images/product/jung_me2985c-1654.png b/local/media/images/product/jung_me2985c-1654.png new file mode 100644 index 00000000..09c2ef40 Binary files /dev/null and b/local/media/images/product/jung_me2985c-1654.png differ diff --git a/local/media/images/product/jung_me2990klc_sample-1882.png b/local/media/images/product/jung_me2990klc_sample-1882.png new file mode 100644 index 00000000..013d5e99 Binary files /dev/null and b/local/media/images/product/jung_me2990klc_sample-1882.png differ diff --git a/local/media/images/product/jung_me2990ko5at-1759.png b/local/media/images/product/jung_me2990ko5at-1759.png new file mode 100644 index 00000000..752580ce Binary files /dev/null and b/local/media/images/product/jung_me2990ko5at-1759.png differ diff --git a/local/media/images/product/jung_me2990ko5at-1760.png b/local/media/images/product/jung_me2990ko5at-1760.png new file mode 100644 index 00000000..752580ce Binary files /dev/null and b/local/media/images/product/jung_me2990ko5at-1760.png differ diff --git a/local/media/images/product/jung_me2990ko5c-1742.png b/local/media/images/product/jung_me2990ko5c-1742.png new file mode 100644 index 00000000..08892462 Binary files /dev/null and b/local/media/images/product/jung_me2990ko5c-1742.png differ diff --git a/local/media/images/product/jung_me2990ko5c-1743.png b/local/media/images/product/jung_me2990ko5c-1743.png new file mode 100644 index 00000000..08892462 Binary files /dev/null and b/local/media/images/product/jung_me2990ko5c-1743.png differ diff --git a/local/media/images/product/jung_me2990satc_sample-1884.png b/local/media/images/product/jung_me2990satc_sample-1884.png new file mode 100644 index 00000000..7679771d Binary files /dev/null and b/local/media/images/product/jung_me2990satc_sample-1884.png differ diff --git a/local/media/images/product/jung_me2995at-1763.png b/local/media/images/product/jung_me2995at-1763.png new file mode 100644 index 00000000..b40c6f13 Binary files /dev/null and b/local/media/images/product/jung_me2995at-1763.png differ diff --git a/local/media/images/product/jung_me2995ko5at-1779.png b/local/media/images/product/jung_me2995ko5at-1779.png new file mode 100644 index 00000000..1559846c Binary files /dev/null and b/local/media/images/product/jung_me2995ko5at-1779.png differ diff --git a/local/media/images/product/jung_me2995ko5c-1744.png b/local/media/images/product/jung_me2995ko5c-1744.png new file mode 100644 index 00000000..686cfdc2 Binary files /dev/null and b/local/media/images/product/jung_me2995ko5c-1744.png differ diff --git a/local/media/images/product/jung_me2995ko5c-1745.png b/local/media/images/product/jung_me2995ko5c-1745.png new file mode 100644 index 00000000..686cfdc2 Binary files /dev/null and b/local/media/images/product/jung_me2995ko5c-1745.png differ diff --git a/local/media/images/product/jung_me2995ko5c-1780.png b/local/media/images/product/jung_me2995ko5c-1780.png new file mode 100644 index 00000000..686cfdc2 Binary files /dev/null and b/local/media/images/product/jung_me2995ko5c-1780.png differ diff --git a/local/media/images/product/jung_metalinoxes2982-1476.png b/local/media/images/product/jung_metalinoxes2982-1476.png new file mode 100644 index 00000000..e3ce2165 Binary files /dev/null and b/local/media/images/product/jung_metalinoxes2982-1476.png differ diff --git a/local/media/images/product/jung_noirls5232sw-2181.png b/local/media/images/product/jung_noirls5232sw-2181.png new file mode 100644 index 00000000..6e590cb9 Binary files /dev/null and b/local/media/images/product/jung_noirls5232sw-2181.png differ diff --git a/local/media/images/product/jung_noirls981sw-2071.png b/local/media/images/product/jung_noirls981sw-2071.png new file mode 100644 index 00000000..fc408d22 Binary files /dev/null and b/local/media/images/product/jung_noirls981sw-2071.png differ diff --git a/local/media/images/product/jung_noirls982sw-897.png b/local/media/images/product/jung_noirls982sw-897.png new file mode 100644 index 00000000..c078fc93 Binary files /dev/null and b/local/media/images/product/jung_noirls982sw-897.png differ diff --git a/local/media/images/product/jung_noirls995ko5psw-2158.png b/local/media/images/product/jung_noirls995ko5psw-2158.png new file mode 100644 index 00000000..1cff9278 Binary files /dev/null and b/local/media/images/product/jung_noirls995ko5psw-2158.png differ diff --git a/local/media/images/product/jung_noirls995psw-2152.png b/local/media/images/product/jung_noirls995psw-2152.png new file mode 100644 index 00000000..7b85d3b5 Binary files /dev/null and b/local/media/images/product/jung_noirls995psw-2152.png differ diff --git a/local/media/images/product/jung_nt2415regvdc-1996.png b/local/media/images/product/jung_nt2415regvdc-1996.png new file mode 100644 index 00000000..4eddb2c9 Binary files /dev/null and b/local/media/images/product/jung_nt2415regvdc-1996.png differ diff --git a/local/media/images/product/jung_orplaquels982ggo-898.png b/local/media/images/product/jung_orplaquels982ggo-898.png new file mode 100644 index 00000000..dc62913f Binary files /dev/null and b/local/media/images/product/jung_orplaquels982ggo-898.png differ diff --git a/local/media/images/product/jung_ortraitego2982-907.png b/local/media/images/product/jung_ortraitego2982-907.png new file mode 100644 index 00000000..5a561802 Binary files /dev/null and b/local/media/images/product/jung_ortraitego2982-907.png differ diff --git a/local/media/images/product/jung_ortraitego5232-2182.png b/local/media/images/product/jung_ortraitego5232-2182.png new file mode 100644 index 00000000..f61cb992 Binary files /dev/null and b/local/media/images/product/jung_ortraitego5232-2182.png differ diff --git a/local/media/images/product/jung_radls908sw-1801.png b/local/media/images/product/jung_radls908sw-1801.png new file mode 100644 index 00000000..7f73b4c4 Binary files /dev/null and b/local/media/images/product/jung_radls908sw-1801.png differ diff --git a/local/media/images/product/jung_radls908ww-1802.png b/local/media/images/product/jung_radls908ww-1802.png new file mode 100644 index 00000000..35d9f188 Binary files /dev/null and b/local/media/images/product/jung_radls908ww-1802.png differ diff --git a/local/media/images/product/jung_radls918sw-876.png b/local/media/images/product/jung_radls918sw-876.png new file mode 100644 index 00000000..cd74f3c7 Binary files /dev/null and b/local/media/images/product/jung_radls918sw-876.png differ diff --git a/local/media/images/product/jung_radls918ww-877.png b/local/media/images/product/jung_radls918ww-877.png new file mode 100644 index 00000000..2d59cdb1 Binary files /dev/null and b/local/media/images/product/jung_radls918ww-877.png differ diff --git a/local/media/images/product/jung_radls928sw-878.png b/local/media/images/product/jung_radls928sw-878.png new file mode 100644 index 00000000..26261771 Binary files /dev/null and b/local/media/images/product/jung_radls928sw-878.png differ diff --git a/local/media/images/product/jung_radls928ww-879.png b/local/media/images/product/jung_radls928ww-879.png new file mode 100644 index 00000000..cab80452 Binary files /dev/null and b/local/media/images/product/jung_radls928ww-879.png differ diff --git a/local/media/images/product/jung_ranal2914-1794.png b/local/media/images/product/jung_ranal2914-1794.png new file mode 100644 index 00000000..46be6f45 Binary files /dev/null and b/local/media/images/product/jung_ranal2914-1794.png differ diff --git a/local/media/images/product/jung_ranal2914an-1795.png b/local/media/images/product/jung_ranal2914an-1795.png new file mode 100644 index 00000000..f7a03826 Binary files /dev/null and b/local/media/images/product/jung_ranal2914an-1795.png differ diff --git a/local/media/images/product/jung_ranes2914-1796.png b/local/media/images/product/jung_ranes2914-1796.png new file mode 100644 index 00000000..cd24f535 Binary files /dev/null and b/local/media/images/product/jung_ranes2914-1796.png differ diff --git a/local/media/images/product/jung_ranls914lg-1797.png b/local/media/images/product/jung_ranls914lg-1797.png new file mode 100644 index 00000000..409605a0 Binary files /dev/null and b/local/media/images/product/jung_ranls914lg-1797.png differ diff --git a/local/media/images/product/jung_ranls914sw-1798.png b/local/media/images/product/jung_ranls914sw-1798.png new file mode 100644 index 00000000..a339016c Binary files /dev/null and b/local/media/images/product/jung_ranls914sw-1798.png differ diff --git a/local/media/images/product/jung_ranls914w-1799.png b/local/media/images/product/jung_ranls914w-1799.png new file mode 100644 index 00000000..3e0370b6 Binary files /dev/null and b/local/media/images/product/jung_ranls914w-1799.png differ diff --git a/local/media/images/product/jung_ranls914ww-1800.png b/local/media/images/product/jung_ranls914ww-1800.png new file mode 100644 index 00000000..fea89643 Binary files /dev/null and b/local/media/images/product/jung_ranls914ww-1800.png differ diff --git a/local/media/images/product/jung_titaneal2982an-906.png b/local/media/images/product/jung_titaneal2982an-906.png new file mode 100644 index 00000000..01adecc4 Binary files /dev/null and b/local/media/images/product/jung_titaneal2982an-906.png differ diff --git a/local/media/images/product/jung_titaneal2995ko5pan-2452.png b/local/media/images/product/jung_titaneal2995ko5pan-2452.png new file mode 100644 index 00000000..3da60d4d Binary files /dev/null and b/local/media/images/product/jung_titaneal2995ko5pan-2452.png differ diff --git a/local/media/images/product/jung_uae8-8upok6-1831.png b/local/media/images/product/jung_uae8-8upok6-1831.png new file mode 100644 index 00000000..6f56adf6 Binary files /dev/null and b/local/media/images/product/jung_uae8-8upok6-1831.png differ diff --git a/local/media/images/product/jung_uae8upok6-1832.png b/local/media/images/product/jung_uae8upok6-1832.png new file mode 100644 index 00000000..f14bf32a Binary files /dev/null and b/local/media/images/product/jung_uae8upok6-1832.png differ diff --git a/local/media/images/product/jung_usb21-2-2507.png b/local/media/images/product/jung_usb21-2-2507.png new file mode 100644 index 00000000..45857358 Binary files /dev/null and b/local/media/images/product/jung_usb21-2-2507.png differ diff --git a/local/media/images/product/jung_usb21-2ww-2506.png b/local/media/images/product/jung_usb21-2ww-2506.png new file mode 100644 index 00000000..f7de543e Binary files /dev/null and b/local/media/images/product/jung_usb21-2ww-2506.png differ diff --git a/local/media/images/product/jv31739pbmc6_web-2699.png b/local/media/images/product/jv31739pbmc6_web-2699.png new file mode 100644 index 00000000..57a91be7 Binary files /dev/null and b/local/media/images/product/jv31739pbmc6_web-2699.png differ diff --git a/local/media/images/product/kipi_370x361-2894.png b/local/media/images/product/kipi_370x361-2894.png new file mode 100644 index 00000000..a7b9dc9e Binary files /dev/null and b/local/media/images/product/kipi_370x361-2894.png differ diff --git a/local/media/images/product/kitclimadd-858.png b/local/media/images/product/kitclimadd-858.png new file mode 100644 index 00000000..b67118d5 Binary files /dev/null and b/local/media/images/product/kitclimadd-858.png differ diff --git a/local/media/images/product/kitclimat-855.png b/local/media/images/product/kitclimat-855.png new file mode 100644 index 00000000..858d5ec9 Binary files /dev/null and b/local/media/images/product/kitclimat-855.png differ diff --git a/local/media/images/product/kits_3_pieces_habitation-863.png b/local/media/images/product/kits_3_pieces_habitation-863.png new file mode 100644 index 00000000..4cef26a9 Binary files /dev/null and b/local/media/images/product/kits_3_pieces_habitation-863.png differ diff --git a/local/media/images/product/kitvr16sorties200200-852.png b/local/media/images/product/kitvr16sorties200200-852.png new file mode 100644 index 00000000..c741cd3a Binary files /dev/null and b/local/media/images/product/kitvr16sorties200200-852.png differ diff --git a/local/media/images/product/kitvr8sortie200200-854.png b/local/media/images/product/kitvr8sortie200200-854.png new file mode 100644 index 00000000..782b492f Binary files /dev/null and b/local/media/images/product/kitvr8sortie200200-854.png differ diff --git a/local/media/images/product/klic-da-1441.png b/local/media/images/product/klic-da-1441.png new file mode 100644 index 00000000..753992eb Binary files /dev/null and b/local/media/images/product/klic-da-1441.png differ diff --git a/local/media/images/product/klic_di-1440.png b/local/media/images/product/klic_di-1440.png new file mode 100644 index 00000000..3e6243d5 Binary files /dev/null and b/local/media/images/product/klic_di-1440.png differ diff --git a/local/media/images/product/klic_lg1_370x361-2895.png b/local/media/images/product/klic_lg1_370x361-2895.png new file mode 100644 index 00000000..3357b2bc Binary files /dev/null and b/local/media/images/product/klic_lg1_370x361-2895.png differ diff --git a/local/media/images/product/klic_pa_370x361-2898.png b/local/media/images/product/klic_pa_370x361-2898.png new file mode 100644 index 00000000..388106aa Binary files /dev/null and b/local/media/images/product/klic_pa_370x361-2898.png differ diff --git a/local/media/images/product/klicdd3_370x361-2497.png b/local/media/images/product/klicdd3_370x361-2497.png new file mode 100644 index 00000000..39edcc50 Binary files /dev/null and b/local/media/images/product/klicdd3_370x361-2497.png differ diff --git a/local/media/images/product/klicfj370x361-2896.png b/local/media/images/product/klicfj370x361-2896.png new file mode 100644 index 00000000..670c7f00 Binary files /dev/null and b/local/media/images/product/klicfj370x361-2896.png differ diff --git a/local/media/images/product/klicmitt_370x361-2498.jpg b/local/media/images/product/klicmitt_370x361-2498.jpg new file mode 100644 index 00000000..511b44d8 Binary files /dev/null and b/local/media/images/product/klicmitt_370x361-2498.jpg differ diff --git a/local/media/images/product/klicts370x361-2897.png b/local/media/images/product/klicts370x361-2897.png new file mode 100644 index 00000000..866b0476 Binary files /dev/null and b/local/media/images/product/klicts370x361-2897.png differ diff --git a/local/media/images/product/knx-actionneur-tor4-sortiescourbec-2304.16regchm-1454.png b/local/media/images/product/knx-actionneur-tor4-sortiescourbec-2304.16regchm-1454.png new file mode 100644 index 00000000..ee029389 Binary files /dev/null and b/local/media/images/product/knx-actionneur-tor4-sortiescourbec-2304.16regchm-1454.png differ diff --git a/local/media/images/product/knx-proserv-2001.png b/local/media/images/product/knx-proserv-2001.png new file mode 100644 index 00000000..f5591edf Binary files /dev/null and b/local/media/images/product/knx-proserv-2001.png differ diff --git a/local/media/images/product/knxactionneurtor8sorties2308.16reghm-1457.png b/local/media/images/product/knxactionneurtor8sorties2308.16reghm-1457.png new file mode 100644 index 00000000..80f31333 Binary files /dev/null and b/local/media/images/product/knxactionneurtor8sorties2308.16reghm-1457.png differ diff --git a/local/media/images/product/knxalimentationstabilise320ma2005reg-1468.png b/local/media/images/product/knxalimentationstabilise320ma2005reg-1468.png new file mode 100644 index 00000000..6580ec57 Binary files /dev/null and b/local/media/images/product/knxalimentationstabilise320ma2005reg-1468.png differ diff --git a/local/media/images/product/knxalimentationstabilise640ma2002reg-1467.png b/local/media/images/product/knxalimentationstabilise640ma2002reg-1467.png new file mode 100644 index 00000000..3d41f265 Binary files /dev/null and b/local/media/images/product/knxalimentationstabilise640ma2002reg-1467.png differ diff --git a/local/media/images/product/lc3_361-2899.png b/local/media/images/product/lc3_361-2899.png new file mode 100644 index 00000000..9535b319 Binary files /dev/null and b/local/media/images/product/lc3_361-2899.png differ diff --git a/local/media/images/product/ldx4_370x361-2901.png b/local/media/images/product/ldx4_370x361-2901.png new file mode 100644 index 00000000..de5577f6 Binary files /dev/null and b/local/media/images/product/ldx4_370x361-2901.png differ diff --git a/local/media/images/product/legrand-2600.png b/local/media/images/product/legrand-2600.png new file mode 100644 index 00000000..11d87f9f Binary files /dev/null and b/local/media/images/product/legrand-2600.png differ diff --git a/local/media/images/product/logologochronopostv2-2468.jpg b/local/media/images/product/logologochronopostv2-2468.jpg new file mode 100644 index 00000000..1d04c719 Binary files /dev/null and b/local/media/images/product/logologochronopostv2-2468.jpg differ diff --git a/local/media/images/product/logoteleassitance-2337.jpg b/local/media/images/product/logoteleassitance-2337.jpg new file mode 100644 index 00000000..37e9b33a Binary files /dev/null and b/local/media/images/product/logoteleassitance-2337.jpg differ diff --git a/local/media/images/product/ls-990-serienschalter-2334.png b/local/media/images/product/ls-990-serienschalter-2334.png new file mode 100644 index 00000000..b28293ae Binary files /dev/null and b/local/media/images/product/ls-990-serienschalter-2334.png differ diff --git a/local/media/images/product/lumento_c4_370x361-2902.png b/local/media/images/product/lumento_c4_370x361-2902.png new file mode 100644 index 00000000..d95ee37e Binary files /dev/null and b/local/media/images/product/lumento_c4_370x361-2902.png differ diff --git a/local/media/images/product/lumentox3-1450.png b/local/media/images/product/lumentox3-1450.png new file mode 100644 index 00000000..a7cc62c6 Binary files /dev/null and b/local/media/images/product/lumentox3-1450.png differ diff --git a/local/media/images/product/lumentox3_2-1451.png b/local/media/images/product/lumentox3_2-1451.png new file mode 100644 index 00000000..d5ae988a Binary files /dev/null and b/local/media/images/product/lumentox3_2-1451.png differ diff --git a/local/media/images/product/lumentox4-1452.png b/local/media/images/product/lumentox4-1452.png new file mode 100644 index 00000000..51b2629d Binary files /dev/null and b/local/media/images/product/lumentox4-1452.png differ diff --git a/local/media/images/product/lumentox4-1453.jpg b/local/media/images/product/lumentox4-1453.jpg new file mode 100644 index 00000000..ee71e955 Binary files /dev/null and b/local/media/images/product/lumentox4-1453.jpg differ diff --git a/local/media/images/product/luna131s-868.png b/local/media/images/product/luna131s-868.png new file mode 100644 index 00000000..35299e00 Binary files /dev/null and b/local/media/images/product/luna131s-868.png differ diff --git a/local/media/images/product/maxinbox16-1442.png b/local/media/images/product/maxinbox16-1442.png new file mode 100644 index 00000000..0ef2556c Binary files /dev/null and b/local/media/images/product/maxinbox16-1442.png differ diff --git a/local/media/images/product/maxinbox16_2-1443.png b/local/media/images/product/maxinbox16_2-1443.png new file mode 100644 index 00000000..ec992b58 Binary files /dev/null and b/local/media/images/product/maxinbox16_2-1443.png differ diff --git a/local/media/images/product/maxinbox16_2-2372.png b/local/media/images/product/maxinbox16_2-2372.png new file mode 100644 index 00000000..ec992b58 Binary files /dev/null and b/local/media/images/product/maxinbox16_2-2372.png differ diff --git a/local/media/images/product/maxinbox16_2-2375.png b/local/media/images/product/maxinbox16_2-2375.png new file mode 100644 index 00000000..ec992b58 Binary files /dev/null and b/local/media/images/product/maxinbox16_2-2375.png differ diff --git a/local/media/images/product/maxinbox16_plus_370x361-2006.png b/local/media/images/product/maxinbox16_plus_370x361-2006.png new file mode 100644 index 00000000..3e424b85 Binary files /dev/null and b/local/media/images/product/maxinbox16_plus_370x361-2006.png differ diff --git a/local/media/images/product/maxinbox16_plus_370x361-2480.png b/local/media/images/product/maxinbox16_plus_370x361-2480.png new file mode 100644 index 00000000..3e424b85 Binary files /dev/null and b/local/media/images/product/maxinbox16_plus_370x361-2480.png differ diff --git a/local/media/images/product/maxinbox8-1444.png b/local/media/images/product/maxinbox8-1444.png new file mode 100644 index 00000000..09411479 Binary files /dev/null and b/local/media/images/product/maxinbox8-1444.png differ diff --git a/local/media/images/product/maxinbox8_plus_370x361-2481.png b/local/media/images/product/maxinbox8_plus_370x361-2481.png new file mode 100644 index 00000000..8fe76ea0 Binary files /dev/null and b/local/media/images/product/maxinbox8_plus_370x361-2481.png differ diff --git a/local/media/images/product/maxinbox8_v2-1445.png b/local/media/images/product/maxinbox8_v2-1445.png new file mode 100644 index 00000000..26fce53a Binary files /dev/null and b/local/media/images/product/maxinbox8_v2-1445.png differ diff --git a/local/media/images/product/maxinbox8_v2-1594.png b/local/media/images/product/maxinbox8_v2-1594.png new file mode 100644 index 00000000..26fce53a Binary files /dev/null and b/local/media/images/product/maxinbox8_v2-1594.png differ diff --git a/local/media/images/product/maxinbox_66_v1-1593.jpg b/local/media/images/product/maxinbox_66_v1-1593.jpg new file mode 100644 index 00000000..012c4c6d Binary files /dev/null and b/local/media/images/product/maxinbox_66_v1-1593.jpg differ diff --git a/local/media/images/product/me2990kldrc-2824.png b/local/media/images/product/me2990kldrc-2824.png new file mode 100644 index 00000000..0c5066d1 Binary files /dev/null and b/local/media/images/product/me2990kldrc-2824.png differ diff --git a/local/media/images/product/me2990kldrg-2825.png b/local/media/images/product/me2990kldrg-2825.png new file mode 100644 index 00000000..af6cae64 Binary files /dev/null and b/local/media/images/product/me2990kldrg-2825.png differ diff --git a/local/media/images/product/mean-well-dr-15-12-2220.jpg b/local/media/images/product/mean-well-dr-15-12-2220.jpg new file mode 100644 index 00000000..1183688e Binary files /dev/null and b/local/media/images/product/mean-well-dr-15-12-2220.jpg differ diff --git a/local/media/images/product/mecanismealimentationled.png-2301.png b/local/media/images/product/mecanismealimentationled.png-2301.png new file mode 100644 index 00000000..09935419 Binary files /dev/null and b/local/media/images/product/mecanismealimentationled.png-2301.png differ diff --git a/local/media/images/product/minibox20-2494.png b/local/media/images/product/minibox20-2494.png new file mode 100644 index 00000000..43747381 Binary files /dev/null and b/local/media/images/product/minibox20-2494.png differ diff --git a/local/media/images/product/minibox_45_370x361-2495.png b/local/media/images/product/minibox_45_370x361-2495.png new file mode 100644 index 00000000..e4237dbd Binary files /dev/null and b/local/media/images/product/minibox_45_370x361-2495.png differ diff --git a/local/media/images/product/mn25370x361-2496.png b/local/media/images/product/mn25370x361-2496.png new file mode 100644 index 00000000..ee84fd0d Binary files /dev/null and b/local/media/images/product/mn25370x361-2496.png differ diff --git a/local/media/images/product/mnquatro370x361-2569.png b/local/media/images/product/mnquatro370x361-2569.png new file mode 100644 index 00000000..6f4cfd54 Binary files /dev/null and b/local/media/images/product/mnquatro370x361-2569.png differ diff --git a/local/media/images/product/module-en-saillie-pour-freespace-3s-schemas-et-dimensions-controlsound-division-professionnelle-2419.jpg b/local/media/images/product/module-en-saillie-pour-freespace-3s-schemas-et-dimensions-controlsound-division-professionnelle-2419.jpg new file mode 100644 index 00000000..082e0d70 Binary files /dev/null and b/local/media/images/product/module-en-saillie-pour-freespace-3s-schemas-et-dimensions-controlsound-division-professionnelle-2419.jpg differ diff --git a/local/media/images/product/module-en-saillie-pour-freespace-3s-schemas-et-dimensions-controlsound-division-professionnelle-2420.jpg b/local/media/images/product/module-en-saillie-pour-freespace-3s-schemas-et-dimensions-controlsound-division-professionnelle-2420.jpg new file mode 100644 index 00000000..082e0d70 Binary files /dev/null and b/local/media/images/product/module-en-saillie-pour-freespace-3s-schemas-et-dimensions-controlsound-division-professionnelle-2420.jpg differ diff --git a/local/media/images/product/moduletouche2voies-aluminium-fdal2902tsa-2047.png b/local/media/images/product/moduletouche2voies-aluminium-fdal2902tsa-2047.png new file mode 100644 index 00000000..26e45ba5 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-aluminium-fdal2902tsa-2047.png differ diff --git a/local/media/images/product/moduletouche2voies-blanc-fd902tsaww-2048.png b/local/media/images/product/moduletouche2voies-blanc-fd902tsaww-2048.png new file mode 100644 index 00000000..6b845354 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-blanc-fd902tsaww-2048.png differ diff --git a/local/media/images/product/moduletouche2voies-grisclair-fd902tsalg-2049.png b/local/media/images/product/moduletouche2voies-grisclair-fd902tsalg-2049.png new file mode 100644 index 00000000..6ca4d98b Binary files /dev/null and b/local/media/images/product/moduletouche2voies-grisclair-fd902tsalg-2049.png differ diff --git a/local/media/images/product/moduletouche2voies-ivoire-fd902tsa-2050.png b/local/media/images/product/moduletouche2voies-ivoire-fd902tsa-2050.png new file mode 100644 index 00000000..b448371b Binary files /dev/null and b/local/media/images/product/moduletouche2voies-ivoire-fd902tsa-2050.png differ diff --git a/local/media/images/product/moduletouche2voies-metalinox-fdes2902tsa-2051.png b/local/media/images/product/moduletouche2voies-metalinox-fdes2902tsa-2051.png new file mode 100644 index 00000000..d8c218d3 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-metalinox-fdes2902tsa-2051.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-aluminium-al2402tsa-2040.png b/local/media/images/product/moduletouche2voies-multifonction-aluminium-al2402tsa-2040.png new file mode 100644 index 00000000..723d5153 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-aluminium-al2402tsa-2040.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-blanc-ls402tsaww-1620.png b/local/media/images/product/moduletouche2voies-multifonction-blanc-ls402tsaww-1620.png new file mode 100644 index 00000000..9ff61f47 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-blanc-ls402tsaww-1620.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-blanc-ls402tsaww-2031.png b/local/media/images/product/moduletouche2voies-multifonction-blanc-ls402tsaww-2031.png new file mode 100644 index 00000000..9ff61f47 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-blanc-ls402tsaww-2031.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-canonfusil-me2402tsad-2032.png b/local/media/images/product/moduletouche2voies-multifonction-canonfusil-me2402tsad-2032.png new file mode 100644 index 00000000..49bd7e47 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-canonfusil-me2402tsad-2032.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-grisclair-ls402tsalg-2033.png b/local/media/images/product/moduletouche2voies-multifonction-grisclair-ls402tsalg-2033.png new file mode 100644 index 00000000..095ec13a Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-grisclair-ls402tsalg-2033.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-ivoire-ls402tsa-2034.png b/local/media/images/product/moduletouche2voies-multifonction-ivoire-ls402tsa-2034.png new file mode 100644 index 00000000..9723c82b Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-ivoire-ls402tsa-2034.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-laitonancien-me2402tsaat-2035.png b/local/media/images/product/moduletouche2voies-multifonction-laitonancien-me2402tsaat-2035.png new file mode 100644 index 00000000..b756bf3b Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-laitonancien-me2402tsaat-2035.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-laitondore-me2402tsac-2036.png b/local/media/images/product/moduletouche2voies-multifonction-laitondore-me2402tsac-2036.png new file mode 100644 index 00000000..9c27ee58 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-laitondore-me2402tsac-2036.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-metalinox-es2402tsa-2037.png b/local/media/images/product/moduletouche2voies-multifonction-metalinox-es2402tsa-2037.png new file mode 100644 index 00000000..b4f94ab6 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-metalinox-es2402tsa-2037.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-noir-ls402tsasw-2038.png b/local/media/images/product/moduletouche2voies-multifonction-noir-ls402tsasw-2038.png new file mode 100644 index 00000000..00f6d855 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-noir-ls402tsasw-2038.png differ diff --git a/local/media/images/product/moduletouche2voies-multifonction-titane-al2402tsaan-2039.png b/local/media/images/product/moduletouche2voies-multifonction-titane-al2402tsaan-2039.png new file mode 100644 index 00000000..4126b429 Binary files /dev/null and b/local/media/images/product/moduletouche2voies-multifonction-titane-al2402tsaan-2039.png differ diff --git a/local/media/images/product/moduletouche2voies-titane-fdal2902tsaan-2052.png b/local/media/images/product/moduletouche2voies-titane-fdal2902tsaan-2052.png new file mode 100644 index 00000000..25ee608d Binary files /dev/null and b/local/media/images/product/moduletouche2voies-titane-fdal2902tsaan-2052.png differ diff --git a/local/media/images/product/moduletouche4voies-aluminium-fdal2904tsa-2042.png b/local/media/images/product/moduletouche4voies-aluminium-fdal2904tsa-2042.png new file mode 100644 index 00000000..9daf40fd Binary files /dev/null and b/local/media/images/product/moduletouche4voies-aluminium-fdal2904tsa-2042.png differ diff --git a/local/media/images/product/moduletouche4voies-blanc-fd904tsaww-2041.png b/local/media/images/product/moduletouche4voies-blanc-fd904tsaww-2041.png new file mode 100644 index 00000000..d3b29e3c Binary files /dev/null and b/local/media/images/product/moduletouche4voies-blanc-fd904tsaww-2041.png differ diff --git a/local/media/images/product/moduletouche4voies-grisclair-fd904tsalg-2043.png b/local/media/images/product/moduletouche4voies-grisclair-fd904tsalg-2043.png new file mode 100644 index 00000000..cdcce82b Binary files /dev/null and b/local/media/images/product/moduletouche4voies-grisclair-fd904tsalg-2043.png differ diff --git a/local/media/images/product/moduletouche4voies-ivoire-fd904tsa-2044.png b/local/media/images/product/moduletouche4voies-ivoire-fd904tsa-2044.png new file mode 100644 index 00000000..d669057b Binary files /dev/null and b/local/media/images/product/moduletouche4voies-ivoire-fd904tsa-2044.png differ diff --git a/local/media/images/product/moduletouche4voies-metalinox-fdes2904tsa-2045.png b/local/media/images/product/moduletouche4voies-metalinox-fdes2904tsa-2045.png new file mode 100644 index 00000000..74b779e8 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-metalinox-fdes2904tsa-2045.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-aluminium-al2404tsa-2025.png b/local/media/images/product/moduletouche4voies-multifonction-aluminium-al2404tsa-2025.png new file mode 100644 index 00000000..44e2a91b Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-aluminium-al2404tsa-2025.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-blanc-ls404tsaww-1618.png b/local/media/images/product/moduletouche4voies-multifonction-blanc-ls404tsaww-1618.png new file mode 100644 index 00000000..80c4a2d5 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-blanc-ls404tsaww-1618.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-blanc-ls404tsaww-2023.png b/local/media/images/product/moduletouche4voies-multifonction-blanc-ls404tsaww-2023.png new file mode 100644 index 00000000..80c4a2d5 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-blanc-ls404tsaww-2023.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-grisclair-ls404tsalg-2026.png b/local/media/images/product/moduletouche4voies-multifonction-grisclair-ls404tsalg-2026.png new file mode 100644 index 00000000..98b286ec Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-grisclair-ls404tsalg-2026.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-ivoire-ls404tsa-2024.png b/local/media/images/product/moduletouche4voies-multifonction-ivoire-ls404tsa-2024.png new file mode 100644 index 00000000..c7a968f7 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-ivoire-ls404tsa-2024.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-laitondore-me2404tsac-2027.png b/local/media/images/product/moduletouche4voies-multifonction-laitondore-me2404tsac-2027.png new file mode 100644 index 00000000..5ecd8916 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-laitondore-me2404tsac-2027.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-metalinox-es2404tsa-2028.png b/local/media/images/product/moduletouche4voies-multifonction-metalinox-es2404tsa-2028.png new file mode 100644 index 00000000..faa2c29c Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-metalinox-es2404tsa-2028.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-noir-ls404tsasw-2030.png b/local/media/images/product/moduletouche4voies-multifonction-noir-ls404tsasw-2030.png new file mode 100644 index 00000000..ca799ade Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-noir-ls404tsasw-2030.png differ diff --git a/local/media/images/product/moduletouche4voies-multifonction-titane-al2404tsaan-2029.png b/local/media/images/product/moduletouche4voies-multifonction-titane-al2404tsaan-2029.png new file mode 100644 index 00000000..2fa9afa6 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-multifonction-titane-al2404tsaan-2029.png differ diff --git a/local/media/images/product/moduletouche4voies-titane-fdal2904tsaan-2046.png b/local/media/images/product/moduletouche4voies-titane-fdal2904tsaan-2046.png new file mode 100644 index 00000000..a0cf4b62 Binary files /dev/null and b/local/media/images/product/moduletouche4voies-titane-fdal2904tsaan-2046.png differ diff --git a/local/media/images/product/multiroomtrivum-2354.jpg b/local/media/images/product/multiroomtrivum-2354.jpg new file mode 100644 index 00000000..89733078 Binary files /dev/null and b/local/media/images/product/multiroomtrivum-2354.jpg differ diff --git a/local/media/images/product/mx-232-io-box-2572.jpg b/local/media/images/product/mx-232-io-box-2572.jpg new file mode 100644 index 00000000..b50d8ac6 Binary files /dev/null and b/local/media/images/product/mx-232-io-box-2572.jpg differ diff --git a/local/media/images/product/mx-c25-d016-3-2223.jpg b/local/media/images/product/mx-c25-d016-3-2223.jpg new file mode 100644 index 00000000..c982d56b Binary files /dev/null and b/local/media/images/product/mx-c25-d016-3-2223.jpg differ diff --git a/local/media/images/product/mx-c25m-sec1-1948.jpg b/local/media/images/product/mx-c25m-sec1-1948.jpg new file mode 100644 index 00000000..fb84cf91 Binary files /dev/null and b/local/media/images/product/mx-c25m-sec1-1948.jpg differ diff --git a/local/media/images/product/mx-keypad-ambre-1902.png b/local/media/images/product/mx-keypad-ambre-1902.png new file mode 100644 index 00000000..a4e000d4 Binary files /dev/null and b/local/media/images/product/mx-keypad-ambre-1902.png differ diff --git a/local/media/images/product/mx-keypad-argentmetallise-1904.png b/local/media/images/product/mx-keypad-argentmetallise-1904.png new file mode 100644 index 00000000..0419dc79 Binary files /dev/null and b/local/media/images/product/mx-keypad-argentmetallise-1904.png differ diff --git a/local/media/images/product/mx-keypad-blanc-1900.png b/local/media/images/product/mx-keypad-blanc-1900.png new file mode 100644 index 00000000..72ec2151 Binary files /dev/null and b/local/media/images/product/mx-keypad-blanc-1900.png differ diff --git a/local/media/images/product/mx-keypad-grisfonce-1903.png b/local/media/images/product/mx-keypad-grisfonce-1903.png new file mode 100644 index 00000000..4ac18c4a Binary files /dev/null and b/local/media/images/product/mx-keypad-grisfonce-1903.png differ diff --git a/local/media/images/product/mx-keypad-noir-1901.png b/local/media/images/product/mx-keypad-noir-1901.png new file mode 100644 index 00000000..5454dffd Binary files /dev/null and b/local/media/images/product/mx-keypad-noir-1901.png differ diff --git a/local/media/images/product/mx-moduleinfo-ambre-1907.png b/local/media/images/product/mx-moduleinfo-ambre-1907.png new file mode 100644 index 00000000..0899e14d Binary files /dev/null and b/local/media/images/product/mx-moduleinfo-ambre-1907.png differ diff --git a/local/media/images/product/mx-moduleinfo-argentmettalise-1909.png b/local/media/images/product/mx-moduleinfo-argentmettalise-1909.png new file mode 100644 index 00000000..c13053e5 Binary files /dev/null and b/local/media/images/product/mx-moduleinfo-argentmettalise-1909.png differ diff --git a/local/media/images/product/mx-moduleinfo-blanc-1905.png b/local/media/images/product/mx-moduleinfo-blanc-1905.png new file mode 100644 index 00000000..84dea802 Binary files /dev/null and b/local/media/images/product/mx-moduleinfo-blanc-1905.png differ diff --git a/local/media/images/product/mx-moduleinfo-grisfonce-1908.png b/local/media/images/product/mx-moduleinfo-grisfonce-1908.png new file mode 100644 index 00000000..fc9bddaf Binary files /dev/null and b/local/media/images/product/mx-moduleinfo-grisfonce-1908.png differ diff --git a/local/media/images/product/mx-moduleinfo-noir-1906.png b/local/media/images/product/mx-moduleinfo-noir-1906.png new file mode 100644 index 00000000..af510dd3 Binary files /dev/null and b/local/media/images/product/mx-moduleinfo-noir-1906.png differ diff --git a/local/media/images/product/mx-p25-d016-2-2224.jpg b/local/media/images/product/mx-p25-d016-2-2224.jpg new file mode 100644 index 00000000..c468f220 Binary files /dev/null and b/local/media/images/product/mx-p25-d016-2-2224.jpg differ diff --git a/local/media/images/product/mx-t25-ambre-1897.png b/local/media/images/product/mx-t25-ambre-1897.png new file mode 100644 index 00000000..8d21d166 Binary files /dev/null and b/local/media/images/product/mx-t25-ambre-1897.png differ diff --git a/local/media/images/product/mx-t25-argentmetallise-1899.png b/local/media/images/product/mx-t25-argentmetallise-1899.png new file mode 100644 index 00000000..676943f4 Binary files /dev/null and b/local/media/images/product/mx-t25-argentmetallise-1899.png differ diff --git a/local/media/images/product/mx-t25-blanc-1895.png b/local/media/images/product/mx-t25-blanc-1895.png new file mode 100644 index 00000000..f5bf00fd Binary files /dev/null and b/local/media/images/product/mx-t25-blanc-1895.png differ diff --git a/local/media/images/product/mx-t25-grisfonce-1898.png b/local/media/images/product/mx-t25-grisfonce-1898.png new file mode 100644 index 00000000..c8cd044f Binary files /dev/null and b/local/media/images/product/mx-t25-grisfonce-1898.png differ diff --git a/local/media/images/product/mx-t25-noir-1896.png b/local/media/images/product/mx-t25-noir-1896.png new file mode 100644 index 00000000..d3e0193c Binary files /dev/null and b/local/media/images/product/mx-t25-noir-1896.png differ diff --git a/local/media/images/product/mx2wire-2456.jpg b/local/media/images/product/mx2wire-2456.jpg new file mode 100644 index 00000000..95a95422 Binary files /dev/null and b/local/media/images/product/mx2wire-2456.jpg differ diff --git a/local/media/images/product/mx2wire_led2_spiegel_reli-2455.jpg b/local/media/images/product/mx2wire_led2_spiegel_reli-2455.jpg new file mode 100644 index 00000000..e4c458b7 Binary files /dev/null and b/local/media/images/product/mx2wire_led2_spiegel_reli-2455.jpg differ diff --git a/local/media/images/product/mx_305_products_q26_930x520-2566.png b/local/media/images/product/mx_305_products_q26_930x520-2566.png new file mode 100644 index 00000000..f5cf50ca Binary files /dev/null and b/local/media/images/product/mx_305_products_q26_930x520-2566.png differ diff --git a/local/media/images/product/mx_i25_xx_distributeur_grossiste_beip-2225.jpg b/local/media/images/product/mx_i25_xx_distributeur_grossiste_beip-2225.jpg new file mode 100644 index 00000000..24888dcc Binary files /dev/null and b/local/media/images/product/mx_i25_xx_distributeur_grossiste_beip-2225.jpg differ diff --git a/local/media/images/product/mx_mpp_i25_wallmountperspr_1200-2562.jpg b/local/media/images/product/mx_mpp_i25_wallmountperspr_1200-2562.jpg new file mode 100644 index 00000000..dfeea61c Binary files /dev/null and b/local/media/images/product/mx_mpp_i25_wallmountperspr_1200-2562.jpg differ diff --git a/local/media/images/product/nes100-1854.jpg b/local/media/images/product/nes100-1854.jpg new file mode 100644 index 00000000..e70e71fe Binary files /dev/null and b/local/media/images/product/nes100-1854.jpg differ diff --git a/local/media/images/product/noir-2706.png b/local/media/images/product/noir-2706.png new file mode 100644 index 00000000..4a01020f Binary files /dev/null and b/local/media/images/product/noir-2706.png differ diff --git a/local/media/images/product/pack4volets-2359.png b/local/media/images/product/pack4volets-2359.png new file mode 100644 index 00000000..5c195fdf Binary files /dev/null and b/local/media/images/product/pack4volets-2359.png differ diff --git a/local/media/images/product/pack8volets-2360.jpg b/local/media/images/product/pack8volets-2360.jpg new file mode 100644 index 00000000..d99bd94b Binary files /dev/null and b/local/media/images/product/pack8volets-2360.jpg differ diff --git a/local/media/images/product/packeclairagemaison-2363.jpg b/local/media/images/product/packeclairagemaison-2363.jpg new file mode 100644 index 00000000..3ef2865d Binary files /dev/null and b/local/media/images/product/packeclairagemaison-2363.jpg differ diff --git a/local/media/images/product/page01-2856.jpg b/local/media/images/product/page01-2856.jpg new file mode 100644 index 00000000..51f72c01 Binary files /dev/null and b/local/media/images/product/page01-2856.jpg differ diff --git a/local/media/images/product/page01-2864.jpg b/local/media/images/product/page01-2864.jpg new file mode 100644 index 00000000..8819e71e Binary files /dev/null and b/local/media/images/product/page01-2864.jpg differ diff --git a/local/media/images/product/page02-2857.jpg b/local/media/images/product/page02-2857.jpg new file mode 100644 index 00000000..d7af3b42 Binary files /dev/null and b/local/media/images/product/page02-2857.jpg differ diff --git a/local/media/images/product/pc_b1_bass-2412.jpg b/local/media/images/product/pc_b1_bass-2412.jpg new file mode 100644 index 00000000..d7715cb9 Binary files /dev/null and b/local/media/images/product/pc_b1_bass-2412.jpg differ diff --git a/local/media/images/product/photospot-2947.png b/local/media/images/product/photospot-2947.png new file mode 100644 index 00000000..ed6b875b Binary files /dev/null and b/local/media/images/product/photospot-2947.png differ diff --git a/local/media/images/product/photospot-2949.png b/local/media/images/product/photospot-2949.png new file mode 100644 index 00000000..ed6b875b Binary files /dev/null and b/local/media/images/product/photospot-2949.png differ diff --git a/local/media/images/product/pilotagesaunald-page-001-2865.jpg b/local/media/images/product/pilotagesaunald-page-001-2865.jpg new file mode 100644 index 00000000..fd7fc155 Binary files /dev/null and b/local/media/images/product/pilotagesaunald-page-001-2865.jpg differ diff --git a/local/media/images/product/piscinepompechaleur-2920.png b/local/media/images/product/piscinepompechaleur-2920.png new file mode 100644 index 00000000..04e6194c Binary files /dev/null and b/local/media/images/product/piscinepompechaleur-2920.png differ diff --git a/local/media/images/product/plan3dtrivum010-2358.jpg b/local/media/images/product/plan3dtrivum010-2358.jpg new file mode 100644 index 00000000..fc724ff9 Binary files /dev/null and b/local/media/images/product/plan3dtrivum010-2358.jpg differ diff --git a/local/media/images/product/plaqueled.png-2300.png b/local/media/images/product/plaqueled.png-2300.png new file mode 100644 index 00000000..e29140ce Binary files /dev/null and b/local/media/images/product/plaqueled.png-2300.png differ diff --git a/local/media/images/product/plaqueledalu.png-2306.png b/local/media/images/product/plaqueledalu.png-2306.png new file mode 100644 index 00000000..1d164fa8 Binary files /dev/null and b/local/media/images/product/plaqueledalu.png-2306.png differ diff --git a/local/media/images/product/plaqueledinox.png-2304.png b/local/media/images/product/plaqueledinox.png-2304.png new file mode 100644 index 00000000..73029f51 Binary files /dev/null and b/local/media/images/product/plaqueledinox.png-2304.png differ diff --git a/local/media/images/product/plaquelednoir.png-2305.png b/local/media/images/product/plaquelednoir.png-2305.png new file mode 100644 index 00000000..2c3102f4 Binary files /dev/null and b/local/media/images/product/plaquelednoir.png-2305.png differ diff --git a/local/media/images/product/plaqueledtitane.png-2303.png b/local/media/images/product/plaqueledtitane.png-2303.png new file mode 100644 index 00000000..9eef65f7 Binary files /dev/null and b/local/media/images/product/plaqueledtitane.png-2303.png differ diff --git a/local/media/images/product/plaqueplexi-2408.jpg b/local/media/images/product/plaqueplexi-2408.jpg new file mode 100644 index 00000000..2ad6c5d4 Binary files /dev/null and b/local/media/images/product/plaqueplexi-2408.jpg differ diff --git a/local/media/images/product/plaqueplexi-2409.jpg b/local/media/images/product/plaqueplexi-2409.jpg new file mode 100644 index 00000000..2ad6c5d4 Binary files /dev/null and b/local/media/images/product/plaqueplexi-2409.jpg differ diff --git a/local/media/images/product/platine1voie-multifonction-4091tsm-2053.png b/local/media/images/product/platine1voie-multifonction-4091tsm-2053.png new file mode 100644 index 00000000..95da0d8c Binary files /dev/null and b/local/media/images/product/platine1voie-multifonction-4091tsm-2053.png differ diff --git a/local/media/images/product/platine1voie-multifonction-4091tsm-925.png b/local/media/images/product/platine1voie-multifonction-4091tsm-925.png new file mode 100644 index 00000000..95da0d8c Binary files /dev/null and b/local/media/images/product/platine1voie-multifonction-4091tsm-925.png differ diff --git a/local/media/images/product/platine2voies-3072tsm-928.png b/local/media/images/product/platine2voies-3072tsm-928.png new file mode 100644 index 00000000..4a99e5ac Binary files /dev/null and b/local/media/images/product/platine2voies-3072tsm-928.png differ diff --git a/local/media/images/product/platine2voies-multifonction-4092tsm-2054.png b/local/media/images/product/platine2voies-multifonction-4092tsm-2054.png new file mode 100644 index 00000000..460e3745 Binary files /dev/null and b/local/media/images/product/platine2voies-multifonction-4092tsm-2054.png differ diff --git a/local/media/images/product/platine2voies-multifonction-4092tsm-926.png b/local/media/images/product/platine2voies-multifonction-4092tsm-926.png new file mode 100644 index 00000000..8eb06364 Binary files /dev/null and b/local/media/images/product/platine2voies-multifonction-4092tsm-926.png differ diff --git a/local/media/images/product/platine3voies-multifonction-4093tsm-2055.png b/local/media/images/product/platine3voies-multifonction-4093tsm-2055.png new file mode 100644 index 00000000..85a0642c Binary files /dev/null and b/local/media/images/product/platine3voies-multifonction-4093tsm-2055.png differ diff --git a/local/media/images/product/platine4voies-3074tsm-929.png b/local/media/images/product/platine4voies-3074tsm-929.png new file mode 100644 index 00000000..4371705a Binary files /dev/null and b/local/media/images/product/platine4voies-3074tsm-929.png differ diff --git a/local/media/images/product/platine4voies-multifonction-4094tsm-2056.png b/local/media/images/product/platine4voies-multifonction-4094tsm-2056.png new file mode 100644 index 00000000..8ee7e35b Binary files /dev/null and b/local/media/images/product/platine4voies-multifonction-4094tsm-2056.png differ diff --git a/local/media/images/product/platine4voies-multifonction-4094tsm-927.png b/local/media/images/product/platine4voies-multifonction-4094tsm-927.png new file mode 100644 index 00000000..63825cbf Binary files /dev/null and b/local/media/images/product/platine4voies-multifonction-4094tsm-927.png differ diff --git a/local/media/images/product/plexi6.jpg-2316.jpg b/local/media/images/product/plexi6.jpg-2316.jpg new file mode 100644 index 00000000..1e2845f3 Binary files /dev/null and b/local/media/images/product/plexi6.jpg-2316.jpg differ diff --git a/local/media/images/product/plexiquattre-2315-2403.png b/local/media/images/product/plexiquattre-2315-2403.png new file mode 100644 index 00000000..a05e9539 Binary files /dev/null and b/local/media/images/product/plexiquattre-2315-2403.png differ diff --git a/local/media/images/product/plexitrois-2407.png b/local/media/images/product/plexitrois-2407.png new file mode 100644 index 00000000..f9266c4f Binary files /dev/null and b/local/media/images/product/plexitrois-2407.png differ diff --git a/local/media/images/product/plexiun-2317.png b/local/media/images/product/plexiun-2317.png new file mode 100644 index 00000000..93738aa4 Binary files /dev/null and b/local/media/images/product/plexiun-2317.png differ diff --git a/local/media/images/product/pourtoutlemondecopier18-2560.png b/local/media/images/product/pourtoutlemondecopier18-2560.png new file mode 100644 index 00000000..ad33b35f Binary files /dev/null and b/local/media/images/product/pourtoutlemondecopier18-2560.png differ diff --git a/local/media/images/product/presencelightnoir-869.png b/local/media/images/product/presencelightnoir-869.png new file mode 100644 index 00000000..72ecb308 Binary files /dev/null and b/local/media/images/product/presencelightnoir-869.png differ diff --git a/local/media/images/product/presencelights-870.png b/local/media/images/product/presencelights-870.png new file mode 100644 index 00000000..18ea0ccf Binary files /dev/null and b/local/media/images/product/presencelights-870.png differ diff --git a/local/media/images/product/prisecourant-blanc-ls921fkiww-1478.png b/local/media/images/product/prisecourant-blanc-ls921fkiww-1478.png new file mode 100644 index 00000000..e03861b4 Binary files /dev/null and b/local/media/images/product/prisecourant-blanc-ls921fkiww-1478.png differ diff --git a/local/media/images/product/prisecourant-blanc-ls921fkiww-1578.png b/local/media/images/product/prisecourant-blanc-ls921fkiww-1578.png new file mode 100644 index 00000000..e03861b4 Binary files /dev/null and b/local/media/images/product/prisecourant-blanc-ls921fkiww-1578.png differ diff --git a/local/media/images/product/prisecourant-blanc-ls921fkiww-1611.png b/local/media/images/product/prisecourant-blanc-ls921fkiww-1611.png new file mode 100644 index 00000000..e03861b4 Binary files /dev/null and b/local/media/images/product/prisecourant-blanc-ls921fkiww-1611.png differ diff --git a/local/media/images/product/prisecourant-metalinox-es2521fki-1479.png b/local/media/images/product/prisecourant-metalinox-es2521fki-1479.png new file mode 100644 index 00000000..06cfde89 Binary files /dev/null and b/local/media/images/product/prisecourant-metalinox-es2521fki-1479.png differ diff --git a/local/media/images/product/prisetv-blanc-ls990satww-1582.png b/local/media/images/product/prisetv-blanc-ls990satww-1582.png new file mode 100644 index 00000000..bf4f533a Binary files /dev/null and b/local/media/images/product/prisetv-blanc-ls990satww-1582.png differ diff --git a/local/media/images/product/prisetv-blanc-ls990satww-1610.png b/local/media/images/product/prisetv-blanc-ls990satww-1610.png new file mode 100644 index 00000000..06d5fb3c Binary files /dev/null and b/local/media/images/product/prisetv-blanc-ls990satww-1610.png differ diff --git a/local/media/images/product/prisetv-chrome-gcr2990sat-1789.png b/local/media/images/product/prisetv-chrome-gcr2990sat-1789.png new file mode 100644 index 00000000..252bdce7 Binary files /dev/null and b/local/media/images/product/prisetv-chrome-gcr2990sat-1789.png differ diff --git a/local/media/images/product/prisetv-grisclair-ls990satlg-1484.png b/local/media/images/product/prisetv-grisclair-ls990satlg-1484.png new file mode 100644 index 00000000..b530a6a8 Binary files /dev/null and b/local/media/images/product/prisetv-grisclair-ls990satlg-1484.png differ diff --git a/local/media/images/product/prisetv-grisclair-ls990satlg-1673.png b/local/media/images/product/prisetv-grisclair-ls990satlg-1673.png new file mode 100644 index 00000000..b530a6a8 Binary files /dev/null and b/local/media/images/product/prisetv-grisclair-ls990satlg-1673.png differ diff --git a/local/media/images/product/prisetv-ivoire-ls990sat-1482.png b/local/media/images/product/prisetv-ivoire-ls990sat-1482.png new file mode 100644 index 00000000..54564206 Binary files /dev/null and b/local/media/images/product/prisetv-ivoire-ls990sat-1482.png differ diff --git a/local/media/images/product/prisetv-ivoire-ls990sat-1585.png b/local/media/images/product/prisetv-ivoire-ls990sat-1585.png new file mode 100644 index 00000000..b68ceaf6 Binary files /dev/null and b/local/media/images/product/prisetv-ivoire-ls990sat-1585.png differ diff --git a/local/media/images/product/prisetv-metalinox-es2990sat-1764.png b/local/media/images/product/prisetv-metalinox-es2990sat-1764.png new file mode 100644 index 00000000..e45dcd19 Binary files /dev/null and b/local/media/images/product/prisetv-metalinox-es2990sat-1764.png differ diff --git a/local/media/images/product/prisetv-noir-ls990satsw-1483.png b/local/media/images/product/prisetv-noir-ls990satsw-1483.png new file mode 100644 index 00000000..b3d4a908 Binary files /dev/null and b/local/media/images/product/prisetv-noir-ls990satsw-1483.png differ diff --git a/local/media/images/product/prisetv-noir-ls990satsw-1783.png b/local/media/images/product/prisetv-noir-ls990satsw-1783.png new file mode 100644 index 00000000..d69ddf3e Binary files /dev/null and b/local/media/images/product/prisetv-noir-ls990satsw-1783.png differ diff --git a/local/media/images/product/prisetv-titane-al2990satan-1786.png b/local/media/images/product/prisetv-titane-al2990satan-1786.png new file mode 100644 index 00000000..046a79be Binary files /dev/null and b/local/media/images/product/prisetv-titane-al2990satan-1786.png differ diff --git a/local/media/images/product/projecteur100wct-3077.png b/local/media/images/product/projecteur100wct-3077.png new file mode 100644 index 00000000..3d1ebacd Binary files /dev/null and b/local/media/images/product/projecteur100wct-3077.png differ diff --git a/local/media/images/product/projecteur100wfacearrire-3078.png b/local/media/images/product/projecteur100wfacearrire-3078.png new file mode 100644 index 00000000..ddd980f6 Binary files /dev/null and b/local/media/images/product/projecteur100wfacearrire-3078.png differ diff --git a/local/media/images/product/projecteur100wfaceavant-3076.png b/local/media/images/product/projecteur100wfaceavant-3076.png new file mode 100644 index 00000000..c394897f Binary files /dev/null and b/local/media/images/product/projecteur100wfaceavant-3076.png differ diff --git a/local/media/images/product/projecteur100wfaceavantblancchaud-3087.png b/local/media/images/product/projecteur100wfaceavantblancchaud-3087.png new file mode 100644 index 00000000..2d5de384 Binary files /dev/null and b/local/media/images/product/projecteur100wfaceavantblancchaud-3087.png differ diff --git a/local/media/images/product/projecteur100wfaceavantblancfroid-3088.png b/local/media/images/product/projecteur100wfaceavantblancfroid-3088.png new file mode 100644 index 00000000..fdec0d7a Binary files /dev/null and b/local/media/images/product/projecteur100wfaceavantblancfroid-3088.png differ diff --git a/local/media/images/product/projecteur50warrire-3075.png b/local/media/images/product/projecteur50warrire-3075.png new file mode 100644 index 00000000..3c4fde53 Binary files /dev/null and b/local/media/images/product/projecteur50warrire-3075.png differ diff --git a/local/media/images/product/projecteur50wct-3074.png b/local/media/images/product/projecteur50wct-3074.png new file mode 100644 index 00000000..6091821a Binary files /dev/null and b/local/media/images/product/projecteur50wct-3074.png differ diff --git a/local/media/images/product/projecteur50wfaceavantavecalu-3073.png b/local/media/images/product/projecteur50wfaceavantavecalu-3073.png new file mode 100644 index 00000000..1dd6d33c Binary files /dev/null and b/local/media/images/product/projecteur50wfaceavantavecalu-3073.png differ diff --git a/local/media/images/product/projecteur50wfaceavantblancchaud-3086.png b/local/media/images/product/projecteur50wfaceavantblancchaud-3086.png new file mode 100644 index 00000000..5b630b38 Binary files /dev/null and b/local/media/images/product/projecteur50wfaceavantblancchaud-3086.png differ diff --git a/local/media/images/product/projecteur50wfaceavantblancfroid-3085.png b/local/media/images/product/projecteur50wfaceavantblancfroid-3085.png new file mode 100644 index 00000000..f53f1b3c Binary files /dev/null and b/local/media/images/product/projecteur50wfaceavantblancfroid-3085.png differ diff --git a/local/media/images/product/prsencelight180blanc-866.png b/local/media/images/product/prsencelight180blanc-866.png new file mode 100644 index 00000000..df89137d Binary files /dev/null and b/local/media/images/product/prsencelight180blanc-866.png differ diff --git a/local/media/images/product/prsencelight180blanc-871.png b/local/media/images/product/prsencelight180blanc-871.png new file mode 100644 index 00000000..df89137d Binary files /dev/null and b/local/media/images/product/prsencelight180blanc-871.png differ diff --git a/local/media/images/product/pupitremicrook-2321.jpg b/local/media/images/product/pupitremicrook-2321.jpg new file mode 100644 index 00000000..b8eeea3a Binary files /dev/null and b/local/media/images/product/pupitremicrook-2321.jpg differ diff --git a/local/media/images/product/qmx3.p37-1971.png b/local/media/images/product/qmx3.p37-1971.png new file mode 100644 index 00000000..05c0fcb1 Binary files /dev/null and b/local/media/images/product/qmx3.p37-1971.png differ diff --git a/local/media/images/product/quad-1828.png b/local/media/images/product/quad-1828.png new file mode 100644 index 00000000..c8d2d7e3 Binary files /dev/null and b/local/media/images/product/quad-1828.png differ diff --git a/local/media/images/product/reg_rp310-2227.png b/local/media/images/product/reg_rp310-2227.png new file mode 100644 index 00000000..0f6d3ab2 Binary files /dev/null and b/local/media/images/product/reg_rp310-2227.png differ diff --git a/local/media/images/product/reg_rp311-1963.png b/local/media/images/product/reg_rp311-1963.png new file mode 100644 index 00000000..d5865314 Binary files /dev/null and b/local/media/images/product/reg_rp311-1963.png differ diff --git a/local/media/images/product/reg_rp340-1964.png b/local/media/images/product/reg_rp340-1964.png new file mode 100644 index 00000000..ff519fef Binary files /dev/null and b/local/media/images/product/reg_rp340-1964.png differ diff --git a/local/media/images/product/reg_rp341-1965.png b/local/media/images/product/reg_rp341-1965.png new file mode 100644 index 00000000..f2fa941f Binary files /dev/null and b/local/media/images/product/reg_rp341-1965.png differ diff --git a/local/media/images/product/rj45double-blanc-ls969-2uaww-1609.png b/local/media/images/product/rj45double-blanc-ls969-2uaww-1609.png new file mode 100644 index 00000000..ee9dbaa4 Binary files /dev/null and b/local/media/images/product/rj45double-blanc-ls969-2uaww-1609.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-aluminium-al2969-2naua-1544.png b/local/media/images/product/rj45doubleportetiquette-aluminium-al2969-2naua-1544.png new file mode 100644 index 00000000..d332196c Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-aluminium-al2969-2naua-1544.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-blanc-ls969-2nauaww-1537.png b/local/media/images/product/rj45doubleportetiquette-blanc-ls969-2nauaww-1537.png new file mode 100644 index 00000000..22184ed3 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-blanc-ls969-2nauaww-1537.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-blanc-ls969-2nauaww-1545.png b/local/media/images/product/rj45doubleportetiquette-blanc-ls969-2nauaww-1545.png new file mode 100644 index 00000000..22184ed3 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-blanc-ls969-2nauaww-1545.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-canonfusil-me2969-2nauad-1543.png b/local/media/images/product/rj45doubleportetiquette-canonfusil-me2969-2nauad-1543.png new file mode 100644 index 00000000..36f15fa7 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-canonfusil-me2969-2nauad-1543.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-chrome-gcr2969-2naua-1540.png b/local/media/images/product/rj45doubleportetiquette-chrome-gcr2969-2naua-1540.png new file mode 100644 index 00000000..995c12d3 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-chrome-gcr2969-2naua-1540.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-grisclair-ls969-2naualg-1536.png b/local/media/images/product/rj45doubleportetiquette-grisclair-ls969-2naualg-1536.png new file mode 100644 index 00000000..43777bc8 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-grisclair-ls969-2naualg-1536.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-laitonancien-me2969-2nauaat-1542.png b/local/media/images/product/rj45doubleportetiquette-laitonancien-me2969-2nauaat-1542.png new file mode 100644 index 00000000..66bbbe58 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-laitonancien-me2969-2nauaat-1542.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-laitondore-me2969-2nauac-1541.png b/local/media/images/product/rj45doubleportetiquette-laitondore-me2969-2nauac-1541.png new file mode 100644 index 00000000..ff22f803 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-laitondore-me2969-2nauac-1541.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-noir-ls969-2nauasw-1535.png b/local/media/images/product/rj45doubleportetiquette-noir-ls969-2nauasw-1535.png new file mode 100644 index 00000000..6c74fc0e Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-noir-ls969-2nauasw-1535.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-or24carats-go2969-2naua-1539.png b/local/media/images/product/rj45doubleportetiquette-or24carats-go2969-2naua-1539.png new file mode 100644 index 00000000..252c6022 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-or24carats-go2969-2naua-1539.png differ diff --git a/local/media/images/product/rj45doubleportetiquette-titane-al2969-2nauaan-1538.png b/local/media/images/product/rj45doubleportetiquette-titane-al2969-2nauaan-1538.png new file mode 100644 index 00000000..a83e2640 Binary files /dev/null and b/local/media/images/product/rj45doubleportetiquette-titane-al2969-2nauaan-1538.png differ diff --git a/local/media/images/product/rj45simple-blanc-ls969-1uaww-1498.png b/local/media/images/product/rj45simple-blanc-ls969-1uaww-1498.png new file mode 100644 index 00000000..45c955a1 Binary files /dev/null and b/local/media/images/product/rj45simple-blanc-ls969-1uaww-1498.png differ diff --git a/local/media/images/product/rj45simple-blanc-ls969-1uaww-1608.png b/local/media/images/product/rj45simple-blanc-ls969-1uaww-1608.png new file mode 100644 index 00000000..172fee18 Binary files /dev/null and b/local/media/images/product/rj45simple-blanc-ls969-1uaww-1608.png differ diff --git a/local/media/images/product/rj45simple-grisclair-ls969-1ualg-1497.png b/local/media/images/product/rj45simple-grisclair-ls969-1ualg-1497.png new file mode 100644 index 00000000..3340da4d Binary files /dev/null and b/local/media/images/product/rj45simple-grisclair-ls969-1ualg-1497.png differ diff --git a/local/media/images/product/rj45simple-ivoire-ls969-1ua-1495.png b/local/media/images/product/rj45simple-ivoire-ls969-1ua-1495.png new file mode 100644 index 00000000..75186959 Binary files /dev/null and b/local/media/images/product/rj45simple-ivoire-ls969-1ua-1495.png differ diff --git a/local/media/images/product/rj45simple-ivoire-ls969-1ua-1583.png b/local/media/images/product/rj45simple-ivoire-ls969-1ua-1583.png new file mode 100644 index 00000000..a9ae103a Binary files /dev/null and b/local/media/images/product/rj45simple-ivoire-ls969-1ua-1583.png differ diff --git a/local/media/images/product/rj45simple-noir-ls969-1uasw-1496.png b/local/media/images/product/rj45simple-noir-ls969-1uasw-1496.png new file mode 100644 index 00000000..76f16d58 Binary files /dev/null and b/local/media/images/product/rj45simple-noir-ls969-1uasw-1496.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-aluminium-al2969-1naua-1520.png b/local/media/images/product/rj45simpleportetiquette-aluminium-al2969-1naua-1520.png new file mode 100644 index 00000000..4e4893de Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-aluminium-al2969-1naua-1520.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-blanc-ls969-1nauaww-1510.png b/local/media/images/product/rj45simpleportetiquette-blanc-ls969-1nauaww-1510.png new file mode 100644 index 00000000..5023aa6c Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-blanc-ls969-1nauaww-1510.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-canonfusil-me2969-1nauad-1519.png b/local/media/images/product/rj45simpleportetiquette-canonfusil-me2969-1nauad-1519.png new file mode 100644 index 00000000..496915c6 Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-canonfusil-me2969-1nauad-1519.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-chrome-gcr2969-1naua-1516.png b/local/media/images/product/rj45simpleportetiquette-chrome-gcr2969-1naua-1516.png new file mode 100644 index 00000000..431ffb61 Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-chrome-gcr2969-1naua-1516.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-grisclair-ls969-1naualg-1512.png b/local/media/images/product/rj45simpleportetiquette-grisclair-ls969-1naualg-1512.png new file mode 100644 index 00000000..e2fbbd2b Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-grisclair-ls969-1naualg-1512.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-laitonancien-me2969-1nauaat-1518.png b/local/media/images/product/rj45simpleportetiquette-laitonancien-me2969-1nauaat-1518.png new file mode 100644 index 00000000..344f7ff1 Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-laitonancien-me2969-1nauaat-1518.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-laitondore-me2969-1nauac-1517.png b/local/media/images/product/rj45simpleportetiquette-laitondore-me2969-1nauac-1517.png new file mode 100644 index 00000000..18a6291d Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-laitondore-me2969-1nauac-1517.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-metalinox-es2969-1naua-1514.png b/local/media/images/product/rj45simpleportetiquette-metalinox-es2969-1naua-1514.png new file mode 100644 index 00000000..16ffb0dc Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-metalinox-es2969-1naua-1514.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-noir-ls969-1nauasw-1511.png b/local/media/images/product/rj45simpleportetiquette-noir-ls969-1nauasw-1511.png new file mode 100644 index 00000000..86f62870 Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-noir-ls969-1nauasw-1511.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-or24carats-go2969-1naua-1515.png b/local/media/images/product/rj45simpleportetiquette-or24carats-go2969-1naua-1515.png new file mode 100644 index 00000000..a368ba2a Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-or24carats-go2969-1naua-1515.png differ diff --git a/local/media/images/product/rj45simpleportetiquette-titane-al2969-1nauaan-1513.png b/local/media/images/product/rj45simpleportetiquette-titane-al2969-1nauaan-1513.png new file mode 100644 index 00000000..97588dba Binary files /dev/null and b/local/media/images/product/rj45simpleportetiquette-titane-al2969-1nauaan-1513.png differ diff --git a/local/media/images/product/rm31707pbmg8_web-2697.png b/local/media/images/product/rm31707pbmg8_web-2697.png new file mode 100644 index 00000000..a2ba439a Binary files /dev/null and b/local/media/images/product/rm31707pbmg8_web-2697.png differ diff --git a/local/media/images/product/roomcontrolerjung-2335.jpg b/local/media/images/product/roomcontrolerjung-2335.jpg new file mode 100644 index 00000000..39f2dfc6 Binary files /dev/null and b/local/media/images/product/roomcontrolerjung-2335.jpg differ diff --git a/local/media/images/product/rs100-788.jpg b/local/media/images/product/rs100-788.jpg new file mode 100644 index 00000000..e70e71fe Binary files /dev/null and b/local/media/images/product/rs100-788.jpg differ diff --git a/local/media/images/product/saillieblancct-2912.png b/local/media/images/product/saillieblancct-2912.png new file mode 100644 index 00000000..56ca695f Binary files /dev/null and b/local/media/images/product/saillieblancct-2912.png differ diff --git a/local/media/images/product/saillieblancface-2913.png b/local/media/images/product/saillieblancface-2913.png new file mode 100644 index 00000000..17170368 Binary files /dev/null and b/local/media/images/product/saillieblancface-2913.png differ diff --git a/local/media/images/product/saillieblancgrad-2914.png b/local/media/images/product/saillieblancgrad-2914.png new file mode 100644 index 00000000..9a769d77 Binary files /dev/null and b/local/media/images/product/saillieblancgrad-2914.png differ diff --git a/local/media/images/product/saillienoirct-2915.png b/local/media/images/product/saillienoirct-2915.png new file mode 100644 index 00000000..0b606a7e Binary files /dev/null and b/local/media/images/product/saillienoirct-2915.png differ diff --git a/local/media/images/product/saillienoirface-2916.png b/local/media/images/product/saillienoirface-2916.png new file mode 100644 index 00000000..c1d76807 Binary files /dev/null and b/local/media/images/product/saillienoirface-2916.png differ diff --git a/local/media/images/product/saillienoirgrad-2917.png b/local/media/images/product/saillienoirgrad-2917.png new file mode 100644 index 00000000..1dc8fdb1 Binary files /dev/null and b/local/media/images/product/saillienoirgrad-2917.png differ diff --git a/local/media/images/product/samartradio-noir-850.png b/local/media/images/product/samartradio-noir-850.png new file mode 100644 index 00000000..95512f94 Binary files /dev/null and b/local/media/images/product/samartradio-noir-850.png differ diff --git a/local/media/images/product/samartradio-noir-851.png b/local/media/images/product/samartradio-noir-851.png new file mode 100644 index 00000000..95512f94 Binary files /dev/null and b/local/media/images/product/samartradio-noir-851.png differ diff --git a/local/media/images/product/sanstitre-1-3041.png b/local/media/images/product/sanstitre-1-3041.png new file mode 100644 index 00000000..1f7a554e Binary files /dev/null and b/local/media/images/product/sanstitre-1-3041.png differ diff --git a/local/media/images/product/sanstitre-1-3043.png b/local/media/images/product/sanstitre-1-3043.png new file mode 100644 index 00000000..b0b62fda Binary files /dev/null and b/local/media/images/product/sanstitre-1-3043.png differ diff --git a/local/media/images/product/sanstitre-1-3046.png b/local/media/images/product/sanstitre-1-3046.png new file mode 100644 index 00000000..b95c6e9f Binary files /dev/null and b/local/media/images/product/sanstitre-1-3046.png differ diff --git a/local/media/images/product/sanstitre-1-3047.png b/local/media/images/product/sanstitre-1-3047.png new file mode 100644 index 00000000..44d06674 Binary files /dev/null and b/local/media/images/product/sanstitre-1-3047.png differ diff --git a/local/media/images/product/sanstitre-2391.jpg b/local/media/images/product/sanstitre-2391.jpg new file mode 100644 index 00000000..00f2c8ad Binary files /dev/null and b/local/media/images/product/sanstitre-2391.jpg differ diff --git a/local/media/images/product/sauna-2919.png b/local/media/images/product/sauna-2919.png new file mode 100644 index 00000000..532ef677 Binary files /dev/null and b/local/media/images/product/sauna-2919.png differ diff --git a/local/media/images/product/sensor-1851.png b/local/media/images/product/sensor-1851.png new file mode 100644 index 00000000..4de70168 Binary files /dev/null and b/local/media/images/product/sensor-1851.png differ diff --git a/local/media/images/product/sensor-1852.png b/local/media/images/product/sensor-1852.png new file mode 100644 index 00000000..4de70168 Binary files /dev/null and b/local/media/images/product/sensor-1852.png differ diff --git a/local/media/images/product/sensorsinzcalo370x361-2505.png b/local/media/images/product/sensorsinzcalo370x361-2505.png new file mode 100644 index 00000000..31dce67d Binary files /dev/null and b/local/media/images/product/sensorsinzcalo370x361-2505.png differ diff --git a/local/media/images/product/smartradioenceintecw165-780.png b/local/media/images/product/smartradioenceintecw165-780.png new file mode 100644 index 00000000..408e61a8 Binary files /dev/null and b/local/media/images/product/smartradioenceintecw165-780.png differ diff --git a/local/media/images/product/smartradioenceintecw165s-781.png b/local/media/images/product/smartradioenceintecw165s-781.png new file mode 100644 index 00000000..2688efdd Binary files /dev/null and b/local/media/images/product/smartradioenceintecw165s-781.png differ diff --git a/local/media/images/product/sonda_epoxi-1827.jpg b/local/media/images/product/sonda_epoxi-1827.jpg new file mode 100644 index 00000000..83a9bb0e Binary files /dev/null and b/local/media/images/product/sonda_epoxi-1827.jpg differ diff --git a/local/media/images/product/sondechlorecarree-2611.jpg b/local/media/images/product/sondechlorecarree-2611.jpg new file mode 100644 index 00000000..4e7f2851 Binary files /dev/null and b/local/media/images/product/sondechlorecarree-2611.jpg differ diff --git a/local/media/images/product/sondeconductivitcarr-2613.jpg b/local/media/images/product/sondeconductivitcarr-2613.jpg new file mode 100644 index 00000000..cdb9efe5 Binary files /dev/null and b/local/media/images/product/sondeconductivitcarr-2613.jpg differ diff --git a/local/media/images/product/sondephcarr-2609.jpg b/local/media/images/product/sondephcarr-2609.jpg new file mode 100644 index 00000000..e1d41bf9 Binary files /dev/null and b/local/media/images/product/sondephcarr-2609.jpg differ diff --git a/local/media/images/product/spot20-min-2957.png b/local/media/images/product/spot20-min-2957.png new file mode 100644 index 00000000..5e7b8418 Binary files /dev/null and b/local/media/images/product/spot20-min-2957.png differ diff --git a/local/media/images/product/spot20-min-2958.png b/local/media/images/product/spot20-min-2958.png new file mode 100644 index 00000000..5e7b8418 Binary files /dev/null and b/local/media/images/product/spot20-min-2958.png differ diff --git a/local/media/images/product/spotblanc-2944.png b/local/media/images/product/spotblanc-2944.png new file mode 100644 index 00000000..7ee466f6 Binary files /dev/null and b/local/media/images/product/spotblanc-2944.png differ diff --git a/local/media/images/product/spotblanc-min-2931.png b/local/media/images/product/spotblanc-min-2931.png new file mode 100644 index 00000000..5e161992 Binary files /dev/null and b/local/media/images/product/spotblanc-min-2931.png differ diff --git a/local/media/images/product/spotblanc2-2945.png b/local/media/images/product/spotblanc2-2945.png new file mode 100644 index 00000000..52c388a6 Binary files /dev/null and b/local/media/images/product/spotblanc2-2945.png differ diff --git a/local/media/images/product/spotblanc2-min-2930.png b/local/media/images/product/spotblanc2-min-2930.png new file mode 100644 index 00000000..350b45eb Binary files /dev/null and b/local/media/images/product/spotblanc2-min-2930.png differ diff --git a/local/media/images/product/spotblanc3-2946.png b/local/media/images/product/spotblanc3-2946.png new file mode 100644 index 00000000..c0e4aeea Binary files /dev/null and b/local/media/images/product/spotblanc3-2946.png differ diff --git a/local/media/images/product/spotblanc3-min-2929.png b/local/media/images/product/spotblanc3-min-2929.png new file mode 100644 index 00000000..17140cbe Binary files /dev/null and b/local/media/images/product/spotblanc3-min-2929.png differ diff --git a/local/media/images/product/spotnoir-2943.png b/local/media/images/product/spotnoir-2943.png new file mode 100644 index 00000000..6b65560e Binary files /dev/null and b/local/media/images/product/spotnoir-2943.png differ diff --git a/local/media/images/product/spotnoir-min-2934.png b/local/media/images/product/spotnoir-min-2934.png new file mode 100644 index 00000000..ad66b8ae Binary files /dev/null and b/local/media/images/product/spotnoir-min-2934.png differ diff --git a/local/media/images/product/spotnoir2-2941.png b/local/media/images/product/spotnoir2-2941.png new file mode 100644 index 00000000..c6436aa2 Binary files /dev/null and b/local/media/images/product/spotnoir2-2941.png differ diff --git a/local/media/images/product/spotnoir2-min-2932.png b/local/media/images/product/spotnoir2-min-2932.png new file mode 100644 index 00000000..b11b7296 Binary files /dev/null and b/local/media/images/product/spotnoir2-min-2932.png differ diff --git a/local/media/images/product/spotnoir3-2942.png b/local/media/images/product/spotnoir3-2942.png new file mode 100644 index 00000000..34b96852 Binary files /dev/null and b/local/media/images/product/spotnoir3-2942.png differ diff --git a/local/media/images/product/spotnoir3-min-2933.png b/local/media/images/product/spotnoir3-min-2933.png new file mode 100644 index 00000000..3296b438 Binary files /dev/null and b/local/media/images/product/spotnoir3-min-2933.png differ diff --git a/local/media/images/product/spots5wencastre-2881.png b/local/media/images/product/spots5wencastre-2881.png new file mode 100644 index 00000000..32007bd0 Binary files /dev/null and b/local/media/images/product/spots5wencastre-2881.png differ diff --git a/local/media/images/product/spotsmaisonrailblanc-2908.png b/local/media/images/product/spotsmaisonrailblanc-2908.png new file mode 100644 index 00000000..afdc51f4 Binary files /dev/null and b/local/media/images/product/spotsmaisonrailblanc-2908.png differ diff --git a/local/media/images/product/spotsmaisonrailnoir-2909.png b/local/media/images/product/spotsmaisonrailnoir-2909.png new file mode 100644 index 00000000..de2373f7 Binary files /dev/null and b/local/media/images/product/spotsmaisonrailnoir-2909.png differ diff --git a/local/media/images/product/spotsmaisonrailtaille-2910.png b/local/media/images/product/spotsmaisonrailtaille-2910.png new file mode 100644 index 00000000..82990473 Binary files /dev/null and b/local/media/images/product/spotsmaisonrailtaille-2910.png differ diff --git a/local/media/images/product/spotsmaisonsaillie-2911.png b/local/media/images/product/spotsmaisonsaillie-2911.png new file mode 100644 index 00000000..710dde9f Binary files /dev/null and b/local/media/images/product/spotsmaisonsaillie-2911.png differ diff --git a/local/media/images/product/sqamb_black_370x361-2501.png b/local/media/images/product/sqamb_black_370x361-2501.png new file mode 100644 index 00000000..d89df92b Binary files /dev/null and b/local/media/images/product/sqamb_black_370x361-2501.png differ diff --git a/local/media/images/product/sqamb_grey_370x361-2500.png b/local/media/images/product/sqamb_grey_370x361-2500.png new file mode 100644 index 00000000..b89c4a17 Binary files /dev/null and b/local/media/images/product/sqamb_grey_370x361-2500.png differ diff --git a/local/media/images/product/sqamb_white_370x361-2499.png b/local/media/images/product/sqamb_white_370x361-2499.png new file mode 100644 index 00000000..66e185b6 Binary files /dev/null and b/local/media/images/product/sqamb_white_370x361-2499.png differ diff --git a/local/media/images/product/square-tmd-1985.png b/local/media/images/product/square-tmd-1985.png new file mode 100644 index 00000000..697d64ae Binary files /dev/null and b/local/media/images/product/square-tmd-1985.png differ diff --git a/local/media/images/product/square-tmd-display-1-1976.png b/local/media/images/product/square-tmd-display-1-1976.png new file mode 100644 index 00000000..94437507 Binary files /dev/null and b/local/media/images/product/square-tmd-display-1-1976.png differ diff --git a/local/media/images/product/square-tmd-display-2-1974.png b/local/media/images/product/square-tmd-display-2-1974.png new file mode 100644 index 00000000..a780e079 Binary files /dev/null and b/local/media/images/product/square-tmd-display-2-1974.png differ diff --git a/local/media/images/product/square-tmd-display-blanc-1973.png b/local/media/images/product/square-tmd-display-blanc-1973.png new file mode 100644 index 00000000..81134917 Binary files /dev/null and b/local/media/images/product/square-tmd-display-blanc-1973.png differ diff --git a/local/media/images/product/square-tmd-display-noir-1972.png b/local/media/images/product/square-tmd-display-noir-1972.png new file mode 100644 index 00000000..3dc4cedb Binary files /dev/null and b/local/media/images/product/square-tmd-display-noir-1972.png differ diff --git a/local/media/images/product/square-tmd-display-or-1975.png b/local/media/images/product/square-tmd-display-or-1975.png new file mode 100644 index 00000000..1a59f0b8 Binary files /dev/null and b/local/media/images/product/square-tmd-display-or-1975.png differ diff --git a/local/media/images/product/square-tmd1-1986.png b/local/media/images/product/square-tmd1-1986.png new file mode 100644 index 00000000..379674d0 Binary files /dev/null and b/local/media/images/product/square-tmd1-1986.png differ diff --git a/local/media/images/product/square-tmd2-1992.png b/local/media/images/product/square-tmd2-1992.png new file mode 100644 index 00000000..ef133fe2 Binary files /dev/null and b/local/media/images/product/square-tmd2-1992.png differ diff --git a/local/media/images/product/square-tmd3-1991.png b/local/media/images/product/square-tmd3-1991.png new file mode 100644 index 00000000..044578c1 Binary files /dev/null and b/local/media/images/product/square-tmd3-1991.png differ diff --git a/local/media/images/product/square-tmd4-1993.png b/local/media/images/product/square-tmd4-1993.png new file mode 100644 index 00000000..eefd4669 Binary files /dev/null and b/local/media/images/product/square-tmd4-1993.png differ diff --git a/local/media/images/product/square-tmd5-1988.png b/local/media/images/product/square-tmd5-1988.png new file mode 100644 index 00000000..f6079c3d Binary files /dev/null and b/local/media/images/product/square-tmd5-1988.png differ diff --git a/local/media/images/product/square-tmd6-1989.png b/local/media/images/product/square-tmd6-1989.png new file mode 100644 index 00000000..d5677ada Binary files /dev/null and b/local/media/images/product/square-tmd6-1989.png differ diff --git a/local/media/images/product/square-tmd7-1990.png b/local/media/images/product/square-tmd7-1990.png new file mode 100644 index 00000000..cdac553c Binary files /dev/null and b/local/media/images/product/square-tmd7-1990.png differ diff --git a/local/media/images/product/square-tmd8-1994.png b/local/media/images/product/square-tmd8-1994.png new file mode 100644 index 00000000..e584cfcf Binary files /dev/null and b/local/media/images/product/square-tmd8-1994.png differ diff --git a/local/media/images/product/square-tmd9-1995.png b/local/media/images/product/square-tmd9-1995.png new file mode 100644 index 00000000..f9707cc9 Binary files /dev/null and b/local/media/images/product/square-tmd9-1995.png differ diff --git a/local/media/images/product/tableaux-2602.png b/local/media/images/product/tableaux-2602.png new file mode 100644 index 00000000..ca5fa6bf Binary files /dev/null and b/local/media/images/product/tableaux-2602.png differ diff --git a/local/media/images/product/theserva_01_fr-2000.gif b/local/media/images/product/theserva_01_fr-2000.gif new file mode 100644 index 00000000..5c3d07f8 Binary files /dev/null and b/local/media/images/product/theserva_01_fr-2000.gif differ diff --git a/local/media/images/product/theservas110-couverture-2003.png b/local/media/images/product/theservas110-couverture-2003.png new file mode 100644 index 00000000..4a20dbf8 Binary files /dev/null and b/local/media/images/product/theservas110-couverture-2003.png differ diff --git a/local/media/images/product/titane-2707.png b/local/media/images/product/titane-2707.png new file mode 100644 index 00000000..108e30ef Binary files /dev/null and b/local/media/images/product/titane-2707.png differ diff --git a/local/media/images/product/tl-sf1008pun5.0-03_1493263016730f-2571.jpg b/local/media/images/product/tl-sf1008pun5.0-03_1493263016730f-2571.jpg new file mode 100644 index 00000000..93a2ec08 Binary files /dev/null and b/local/media/images/product/tl-sf1008pun5.0-03_1493263016730f-2571.jpg differ diff --git a/local/media/images/product/tlvariateurjung.png-2324.png b/local/media/images/product/tlvariateurjung.png-2324.png new file mode 100644 index 00000000..c8231450 Binary files /dev/null and b/local/media/images/product/tlvariateurjung.png-2324.png differ diff --git a/local/media/images/product/tlvariateurjung2sorties.png-2325.png b/local/media/images/product/tlvariateurjung2sorties.png-2325.png new file mode 100644 index 00000000..a191c422 Binary files /dev/null and b/local/media/images/product/tlvariateurjung2sorties.png-2325.png differ diff --git a/local/media/images/product/tlvariateurjung4sorties.png-2326.png b/local/media/images/product/tlvariateurjung4sorties.png-2326.png new file mode 100644 index 00000000..450613f7 Binary files /dev/null and b/local/media/images/product/tlvariateurjung4sorties.png-2326.png differ diff --git a/local/media/images/product/tmd-display1-2-1980.png b/local/media/images/product/tmd-display1-2-1980.png new file mode 100644 index 00000000..1c6329ce Binary files /dev/null and b/local/media/images/product/tmd-display1-2-1980.png differ diff --git a/local/media/images/product/tmd-display1-3-1981.png b/local/media/images/product/tmd-display1-3-1981.png new file mode 100644 index 00000000..1dded6fe Binary files /dev/null and b/local/media/images/product/tmd-display1-3-1981.png differ diff --git a/local/media/images/product/tmd-display1-5-1982.png b/local/media/images/product/tmd-display1-5-1982.png new file mode 100644 index 00000000..cc46ca6a Binary files /dev/null and b/local/media/images/product/tmd-display1-5-1982.png differ diff --git a/local/media/images/product/tmd-display1-6-1983.png b/local/media/images/product/tmd-display1-6-1983.png new file mode 100644 index 00000000..28bb9905 Binary files /dev/null and b/local/media/images/product/tmd-display1-6-1983.png differ diff --git a/local/media/images/product/tmd-display1-7-1984.png b/local/media/images/product/tmd-display1-7-1984.png new file mode 100644 index 00000000..74516316 Binary files /dev/null and b/local/media/images/product/tmd-display1-7-1984.png differ diff --git a/local/media/images/product/tmd-plus_picture_estandar_gris-2532.png b/local/media/images/product/tmd-plus_picture_estandar_gris-2532.png new file mode 100644 index 00000000..7250361b Binary files /dev/null and b/local/media/images/product/tmd-plus_picture_estandar_gris-2532.png differ diff --git a/local/media/images/product/tmd-plus_picture_estandar_negro-2535.png b/local/media/images/product/tmd-plus_picture_estandar_negro-2535.png new file mode 100644 index 00000000..951688b1 Binary files /dev/null and b/local/media/images/product/tmd-plus_picture_estandar_negro-2535.png differ diff --git a/local/media/images/product/tmd-plus_picture_standar_white-2534.png b/local/media/images/product/tmd-plus_picture_standar_white-2534.png new file mode 100644 index 00000000..728398f2 Binary files /dev/null and b/local/media/images/product/tmd-plus_picture_standar_white-2534.png differ diff --git a/local/media/images/product/tmdhorizontal6b-1307.png b/local/media/images/product/tmdhorizontal6b-1307.png new file mode 100644 index 00000000..c7330b9a Binary files /dev/null and b/local/media/images/product/tmdhorizontal6b-1307.png differ diff --git a/local/media/images/product/tmdhorizontal6bdancer-1311.png b/local/media/images/product/tmdhorizontal6bdancer-1311.png new file mode 100644 index 00000000..914c3108 Binary files /dev/null and b/local/media/images/product/tmdhorizontal6bdancer-1311.png differ diff --git a/local/media/images/product/tmdhorizontal6bviolon-1312.png b/local/media/images/product/tmdhorizontal6bviolon-1312.png new file mode 100644 index 00000000..67a3dd0a Binary files /dev/null and b/local/media/images/product/tmdhorizontal6bviolon-1312.png differ diff --git a/local/media/images/product/tmdhorizontal8broyalzennhotel-1310.png b/local/media/images/product/tmdhorizontal8broyalzennhotel-1310.png new file mode 100644 index 00000000..0b10cdf5 Binary files /dev/null and b/local/media/images/product/tmdhorizontal8broyalzennhotel-1310.png differ diff --git a/local/media/images/product/tmdhorizontalrealstate-1306.png b/local/media/images/product/tmdhorizontalrealstate-1306.png new file mode 100644 index 00000000..175761aa Binary files /dev/null and b/local/media/images/product/tmdhorizontalrealstate-1306.png differ diff --git a/local/media/images/product/tmdvertical6barqeletcanns-1313.png b/local/media/images/product/tmdvertical6barqeletcanns-1313.png new file mode 100644 index 00000000..f6c7a149 Binary files /dev/null and b/local/media/images/product/tmdvertical6barqeletcanns-1313.png differ diff --git a/local/media/images/product/tmdvertical6bbuiltin-1308.png b/local/media/images/product/tmdvertical6bbuiltin-1308.png new file mode 100644 index 00000000..998ee0ca Binary files /dev/null and b/local/media/images/product/tmdvertical6bbuiltin-1308.png differ diff --git a/local/media/images/product/tmdvertical8bimperialplacehotel-1309.png b/local/media/images/product/tmdvertical8bimperialplacehotel-1309.png new file mode 100644 index 00000000..e43e5fe3 Binary files /dev/null and b/local/media/images/product/tmdvertical8bimperialplacehotel-1309.png differ diff --git a/local/media/images/product/touch_pad-1856.png b/local/media/images/product/touch_pad-1856.png new file mode 100644 index 00000000..2dc48166 Binary files /dev/null and b/local/media/images/product/touch_pad-1856.png differ diff --git a/local/media/images/product/tq31702pbma6_web-2695.png b/local/media/images/product/tq31702pbma6_web-2695.png new file mode 100644 index 00000000..95089cf5 Binary files /dev/null and b/local/media/images/product/tq31702pbma6_web-2695.png differ diff --git a/local/media/images/product/trivum_cw165-839.jpg b/local/media/images/product/trivum_cw165-839.jpg new file mode 100644 index 00000000..bdec2336 Binary files /dev/null and b/local/media/images/product/trivum_cw165-839.jpg differ diff --git a/local/media/images/product/trivum_cw1651-838.jpg b/local/media/images/product/trivum_cw1651-838.jpg new file mode 100644 index 00000000..2250db11 Binary files /dev/null and b/local/media/images/product/trivum_cw1651-838.jpg differ diff --git a/local/media/images/product/trivum_cw165s-841.jpg b/local/media/images/product/trivum_cw165s-841.jpg new file mode 100644 index 00000000..29574da1 Binary files /dev/null and b/local/media/images/product/trivum_cw165s-841.jpg differ diff --git a/local/media/images/product/trivum_cw165s1-840.jpg b/local/media/images/product/trivum_cw165s1-840.jpg new file mode 100644 index 00000000..a03e8aa0 Binary files /dev/null and b/local/media/images/product/trivum_cw165s1-840.jpg differ diff --git a/local/media/images/product/trivum_supportecran-2004.png b/local/media/images/product/trivum_supportecran-2004.png new file mode 100644 index 00000000..a2116676 Binary files /dev/null and b/local/media/images/product/trivum_supportecran-2004.png differ diff --git a/local/media/images/product/trivum_touchpad-black1-1325.png b/local/media/images/product/trivum_touchpad-black1-1325.png new file mode 100644 index 00000000..f39eb0dd Binary files /dev/null and b/local/media/images/product/trivum_touchpad-black1-1325.png differ diff --git a/local/media/images/product/trivum_touchpad-black2-1329.png b/local/media/images/product/trivum_touchpad-black2-1329.png new file mode 100644 index 00000000..28e8864b Binary files /dev/null and b/local/media/images/product/trivum_touchpad-black2-1329.png differ diff --git a/local/media/images/product/trivum_touchpad-silver1-1328.png b/local/media/images/product/trivum_touchpad-silver1-1328.png new file mode 100644 index 00000000..1cc7cfab Binary files /dev/null and b/local/media/images/product/trivum_touchpad-silver1-1328.png differ diff --git a/local/media/images/product/trivumrp010-2355.png b/local/media/images/product/trivumrp010-2355.png new file mode 100644 index 00000000..56404dfc Binary files /dev/null and b/local/media/images/product/trivumrp010-2355.png differ diff --git a/local/media/images/product/unnamed-2551.png b/local/media/images/product/unnamed-2551.png new file mode 100644 index 00000000..3972f8c6 Binary files /dev/null and b/local/media/images/product/unnamed-2551.png differ diff --git a/local/media/images/product/usbmural-2519.jpg b/local/media/images/product/usbmural-2519.jpg new file mode 100644 index 00000000..afd12590 Binary files /dev/null and b/local/media/images/product/usbmural-2519.jpg differ diff --git a/local/media/images/product/v1-2017-21-ico-2607.jpg b/local/media/images/product/v1-2017-21-ico-2607.jpg new file mode 100644 index 00000000..6426ac84 Binary files /dev/null and b/local/media/images/product/v1-2017-21-ico-2607.jpg differ diff --git a/local/media/images/product/v1-2017-22-ico-2608.png b/local/media/images/product/v1-2017-22-ico-2608.png new file mode 100644 index 00000000..800718fa Binary files /dev/null and b/local/media/images/product/v1-2017-22-ico-2608.png differ diff --git a/local/media/images/product/v1-2017-3-ico-2605.png b/local/media/images/product/v1-2017-3-ico-2605.png new file mode 100644 index 00000000..39bfb9d0 Binary files /dev/null and b/local/media/images/product/v1-2017-3-ico-2605.png differ diff --git a/local/media/images/product/v1-2017-6-ico-2618.png b/local/media/images/product/v1-2017-6-ico-2618.png new file mode 100644 index 00000000..79f76c5f Binary files /dev/null and b/local/media/images/product/v1-2017-6-ico-2618.png differ diff --git a/local/media/images/product/z41-smartphoneapp-1967.png b/local/media/images/product/z41-smartphoneapp-1967.png new file mode 100644 index 00000000..5072e827 Binary files /dev/null and b/local/media/images/product/z41-smartphoneapp-1967.png differ diff --git a/local/media/images/product/z41-smartphoneapp-2202.png b/local/media/images/product/z41-smartphoneapp-2202.png new file mode 100644 index 00000000..c5d647a1 Binary files /dev/null and b/local/media/images/product/z41-smartphoneapp-2202.png differ diff --git a/local/media/images/product/z41_2.0_black-1321.png b/local/media/images/product/z41_2.0_black-1321.png new file mode 100644 index 00000000..85f45628 Binary files /dev/null and b/local/media/images/product/z41_2.0_black-1321.png differ diff --git a/local/media/images/product/z41_2.0_black-2199.png b/local/media/images/product/z41_2.0_black-2199.png new file mode 100644 index 00000000..85f45628 Binary files /dev/null and b/local/media/images/product/z41_2.0_black-2199.png differ diff --git a/local/media/images/product/z41_2.0_silver-1320.png b/local/media/images/product/z41_2.0_silver-1320.png new file mode 100644 index 00000000..9374b537 Binary files /dev/null and b/local/media/images/product/z41_2.0_silver-1320.png differ diff --git a/local/media/images/product/z41_2.0_silver-2200.png b/local/media/images/product/z41_2.0_silver-2200.png new file mode 100644 index 00000000..9374b537 Binary files /dev/null and b/local/media/images/product/z41_2.0_silver-2200.png differ diff --git a/local/media/images/product/z41_2.0_white-1319.png b/local/media/images/product/z41_2.0_white-1319.png new file mode 100644 index 00000000..c3331cf1 Binary files /dev/null and b/local/media/images/product/z41_2.0_white-1319.png differ diff --git a/local/media/images/product/z41_2.0_white-2198.png b/local/media/images/product/z41_2.0_white-2198.png new file mode 100644 index 00000000..c3331cf1 Binary files /dev/null and b/local/media/images/product/z41_2.0_white-2198.png differ diff --git a/local/media/images/product/z41_2.2_black-2484.png b/local/media/images/product/z41_2.2_black-2484.png new file mode 100644 index 00000000..64c51012 Binary files /dev/null and b/local/media/images/product/z41_2.2_black-2484.png differ diff --git a/local/media/images/product/z41_2.2_black-2486.png b/local/media/images/product/z41_2.2_black-2486.png new file mode 100644 index 00000000..64c51012 Binary files /dev/null and b/local/media/images/product/z41_2.2_black-2486.png differ diff --git a/local/media/images/product/z41_color-2871.png b/local/media/images/product/z41_color-2871.png new file mode 100644 index 00000000..78745e14 Binary files /dev/null and b/local/media/images/product/z41_color-2871.png differ diff --git a/local/media/images/product/z41_color-2877.png b/local/media/images/product/z41_color-2877.png new file mode 100644 index 00000000..06eaa260 Binary files /dev/null and b/local/media/images/product/z41_color-2877.png differ diff --git a/local/media/images/product/z41_horizontalblack_home_es_370x361-2483.png b/local/media/images/product/z41_horizontalblack_home_es_370x361-2483.png new file mode 100644 index 00000000..51b640d5 Binary files /dev/null and b/local/media/images/product/z41_horizontalblack_home_es_370x361-2483.png differ diff --git a/local/media/images/product/z41_horizontalblack_home_es_370x361-2485.png b/local/media/images/product/z41_horizontalblack_home_es_370x361-2485.png new file mode 100644 index 00000000..51b640d5 Binary files /dev/null and b/local/media/images/product/z41_horizontalblack_home_es_370x361-2485.png differ diff --git a/local/media/images/product/z41_smatphoneapp-2366.png b/local/media/images/product/z41_smatphoneapp-2366.png new file mode 100644 index 00000000..0e45f900 Binary files /dev/null and b/local/media/images/product/z41_smatphoneapp-2366.png differ diff --git a/local/media/images/product/z41_smatphoneapp-2368.png b/local/media/images/product/z41_smatphoneapp-2368.png new file mode 100644 index 00000000..0e45f900 Binary files /dev/null and b/local/media/images/product/z41_smatphoneapp-2368.png differ diff --git a/local/media/images/product/z41_smatphoneapp-2371.png b/local/media/images/product/z41_smatphoneapp-2371.png new file mode 100644 index 00000000..0e45f900 Binary files /dev/null and b/local/media/images/product/z41_smatphoneapp-2371.png differ diff --git a/local/media/images/product/z41_smatphoneapp-2373.png b/local/media/images/product/z41_smatphoneapp-2373.png new file mode 100644 index 00000000..0e45f900 Binary files /dev/null and b/local/media/images/product/z41_smatphoneapp-2373.png differ diff --git a/local/media/images/product/z41_smatphoneapp-2374.png b/local/media/images/product/z41_smatphoneapp-2374.png new file mode 100644 index 00000000..0e45f900 Binary files /dev/null and b/local/media/images/product/z41_smatphoneapp-2374.png differ diff --git a/local/media/images/product/z41remoteapp1-1960.png b/local/media/images/product/z41remoteapp1-1960.png new file mode 100644 index 00000000..6dad0fc3 Binary files /dev/null and b/local/media/images/product/z41remoteapp1-1960.png differ diff --git a/local/media/images/product/z41tel-2487.png b/local/media/images/product/z41tel-2487.png new file mode 100644 index 00000000..2106980b Binary files /dev/null and b/local/media/images/product/z41tel-2487.png differ diff --git a/local/media/images/product/zennio_alimentationzps160mpa-2382.png b/local/media/images/product/zennio_alimentationzps160mpa-2382.png new file mode 100644 index 00000000..6b5e1d99 Binary files /dev/null and b/local/media/images/product/zennio_alimentationzps160mpa-2382.png differ diff --git a/local/media/images/product/zennio_klic-dd-2384.png b/local/media/images/product/zennio_klic-dd-2384.png new file mode 100644 index 00000000..8aa430e0 Binary files /dev/null and b/local/media/images/product/zennio_klic-dd-2384.png differ diff --git a/local/media/images/product/zennio_klic-di-2381.png b/local/media/images/product/zennio_klic-di-2381.png new file mode 100644 index 00000000..a69e920e Binary files /dev/null and b/local/media/images/product/zennio_klic-di-2381.png differ diff --git a/local/media/images/product/zennio_z38ialuminium-1303.png b/local/media/images/product/zennio_z38ialuminium-1303.png new file mode 100644 index 00000000..eaf79241 Binary files /dev/null and b/local/media/images/product/zennio_z38ialuminium-1303.png differ diff --git a/local/media/images/product/zennio_z38ialuminium-2205.png b/local/media/images/product/zennio_z38ialuminium-2205.png new file mode 100644 index 00000000..eaf79241 Binary files /dev/null and b/local/media/images/product/zennio_z38ialuminium-2205.png differ diff --git a/local/media/images/product/zennio_z38ialuminium1-1302.png b/local/media/images/product/zennio_z38ialuminium1-1302.png new file mode 100644 index 00000000..e33d80c5 Binary files /dev/null and b/local/media/images/product/zennio_z38ialuminium1-1302.png differ diff --git a/local/media/images/product/zennio_z38iblanc-1304.png b/local/media/images/product/zennio_z38iblanc-1304.png new file mode 100644 index 00000000..3fe1bb10 Binary files /dev/null and b/local/media/images/product/zennio_z38iblanc-1304.png differ diff --git a/local/media/images/product/zennio_z38iblanc-2203.png b/local/media/images/product/zennio_z38iblanc-2203.png new file mode 100644 index 00000000..3fe1bb10 Binary files /dev/null and b/local/media/images/product/zennio_z38iblanc-2203.png differ diff --git a/local/media/images/product/zennio_z38iblanc1-1301.png b/local/media/images/product/zennio_z38iblanc1-1301.png new file mode 100644 index 00000000..36ee4dd6 Binary files /dev/null and b/local/media/images/product/zennio_z38iblanc1-1301.png differ diff --git a/local/media/images/product/zennio_z38iblanc1-2206.png b/local/media/images/product/zennio_z38iblanc1-2206.png new file mode 100644 index 00000000..36ee4dd6 Binary files /dev/null and b/local/media/images/product/zennio_z38iblanc1-2206.png differ diff --git a/local/media/images/product/zennio_z38inoir-1305.png b/local/media/images/product/zennio_z38inoir-1305.png new file mode 100644 index 00000000..1e962693 Binary files /dev/null and b/local/media/images/product/zennio_z38inoir-1305.png differ diff --git a/local/media/images/product/zennio_z38inoir-2204.png b/local/media/images/product/zennio_z38inoir-2204.png new file mode 100644 index 00000000..1e962693 Binary files /dev/null and b/local/media/images/product/zennio_z38inoir-2204.png differ diff --git a/local/media/images/product/zennio_z38inoir1-1300.png b/local/media/images/product/zennio_z38inoir1-1300.png new file mode 100644 index 00000000..bb9244ab Binary files /dev/null and b/local/media/images/product/zennio_z38inoir1-1300.png differ diff --git a/local/media/images/product/zennio_z38inoir1-2207.png b/local/media/images/product/zennio_z38inoir1-2207.png new file mode 100644 index 00000000..bb9244ab Binary files /dev/null and b/local/media/images/product/zennio_z38inoir1-2207.png differ diff --git a/local/media/images/product/zennio_z41argent-2298.jpg b/local/media/images/product/zennio_z41argent-2298.jpg new file mode 100644 index 00000000..3cff93e8 Binary files /dev/null and b/local/media/images/product/zennio_z41argent-2298.jpg differ diff --git a/local/media/images/product/zennio_z41blanc-2296.jpg b/local/media/images/product/zennio_z41blanc-2296.jpg new file mode 100644 index 00000000..1ce3ddb4 Binary files /dev/null and b/local/media/images/product/zennio_z41blanc-2296.jpg differ diff --git a/local/media/images/product/zennio_z41noir-2297.jpg b/local/media/images/product/zennio_z41noir-2297.jpg new file mode 100644 index 00000000..6df7d7e9 Binary files /dev/null and b/local/media/images/product/zennio_z41noir-2297.jpg differ diff --git a/local/media/images/product/zennio_z41noir1-2201.png b/local/media/images/product/zennio_z41noir1-2201.png new file mode 100644 index 00000000..764f00ee Binary files /dev/null and b/local/media/images/product/zennio_z41noir1-2201.png differ diff --git a/local/media/images/product/zennio_z41noirgrisblanc-2299.jpg b/local/media/images/product/zennio_z41noirgrisblanc-2299.jpg new file mode 100644 index 00000000..30d71760 Binary files /dev/null and b/local/media/images/product/zennio_z41noirgrisblanc-2299.jpg differ diff --git a/local/media/images/product/zenniomaxinbox8.jpg-2367.jpg b/local/media/images/product/zenniomaxinbox8.jpg-2367.jpg new file mode 100644 index 00000000..944e960b Binary files /dev/null and b/local/media/images/product/zenniomaxinbox8.jpg-2367.jpg differ diff --git a/local/media/images/product/zenniomaxinbox8.jpg-2369.jpg b/local/media/images/product/zenniomaxinbox8.jpg-2369.jpg new file mode 100644 index 00000000..944e960b Binary files /dev/null and b/local/media/images/product/zenniomaxinbox8.jpg-2369.jpg differ diff --git a/local/media/images/product/zenniomaxinbox8.jpg-2370.jpg b/local/media/images/product/zenniomaxinbox8.jpg-2370.jpg new file mode 100644 index 00000000..944e960b Binary files /dev/null and b/local/media/images/product/zenniomaxinbox8.jpg-2370.jpg differ diff --git a/local/media/images/product/zps160mpa-1466.png b/local/media/images/product/zps160mpa-1466.png new file mode 100644 index 00000000..ad201b1a Binary files /dev/null and b/local/media/images/product/zps160mpa-1466.png differ diff --git a/local/media/images/product/zps320mpa_230-1465.png b/local/media/images/product/zps320mpa_230-1465.png new file mode 100644 index 00000000..b3526ecc Binary files /dev/null and b/local/media/images/product/zps320mpa_230-1465.png differ diff --git a/local/media/images/product/zps640mpa230-1463.png b/local/media/images/product/zps640mpa230-1463.png new file mode 100644 index 00000000..5b735371 Binary files /dev/null and b/local/media/images/product/zps640mpa230-1463.png differ diff --git a/local/media/images/product/zps640mpa230-2433.jpg b/local/media/images/product/zps640mpa230-2433.jpg new file mode 100644 index 00000000..b4a1ea1b Binary files /dev/null and b/local/media/images/product/zps640mpa230-2433.jpg differ diff --git a/local/media/images/product/zx22490pwpw6_web-2694.png b/local/media/images/product/zx22490pwpw6_web-2694.png new file mode 100644 index 00000000..3a7bd126 Binary files /dev/null and b/local/media/images/product/zx22490pwpw6_web-2694.png differ diff --git a/local/modules/.gitkeep b/local/modules/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/local/modules/Carousel/CHANGELOG.md b/local/modules/Carousel/CHANGELOG.md new file mode 100644 index 00000000..b4525a3b --- /dev/null +++ b/local/modules/Carousel/CHANGELOG.md @@ -0,0 +1,6 @@ +# 2.3.0-alpha1 + +- Moved the images from the directory 'media' in the module to thelia/local/media/images/carousel. +- The current images will be automatically copied in the new directory during the update of the module +- Removed AdminIncludes directory +- All html,js and css files are now in 'templates' \ No newline at end of file diff --git a/local/modules/Carousel/Carousel.php b/local/modules/Carousel/Carousel.php new file mode 100644 index 00000000..b0caadf0 --- /dev/null +++ b/local/modules/Carousel/Carousel.php @@ -0,0 +1,89 @@ + + */ +class Carousel extends BaseModule +{ + const DOMAIN_NAME = 'carousel'; + + public function preActivation(ConnectionInterface $con = null) + { + if (! $this->getConfigValue('is_initialized', false)) { + $database = new Database($con); + + $database->insertSql(null, array(__DIR__ . '/Config/thelia.sql')); + + $this->setConfigValue('is_initialized', true); + } + + return true; + } + + public function destroy(ConnectionInterface $con = null, $deleteModuleData = false) + { + $database = new Database($con); + + $database->insertSql(null, array(__DIR__ . '/Config/sql/destroy.sql')); + } + + public function getUploadDir() + { + $uploadDir = ConfigQuery::read('images_library_path'); + + if ($uploadDir === null) { + $uploadDir = THELIA_LOCAL_DIR . 'media' . DS . 'images'; + } else { + $uploadDir = THELIA_ROOT . $uploadDir; + } + + return $uploadDir . DS . Carousel::DOMAIN_NAME; + } + + /** + * @param string $currentVersion + * @param string $newVersion + * @param ConnectionInterface $con + * @author Thomas Arnaud + */ + public function update($currentVersion, $newVersion, ConnectionInterface $con = null) + { + $uploadDir = $this->getUploadDir(); + $fileSystem = new Filesystem(); + + if (!$fileSystem->exists($uploadDir) && $fileSystem->exists(__DIR__ . DS . 'media' . DS . 'carousel')) { + $finder = new Finder(); + $finder->files()->in(__DIR__ . DS . 'media' . DS . 'carousel'); + + $fileSystem->mkdir($uploadDir); + + /** @var SplFileInfo $file */ + foreach ($finder as $file) { + copy($file, $uploadDir . DS . $file->getRelativePathname()); + } + $fileSystem->remove(__DIR__ . DS . 'media'); + } + } +} diff --git a/local/modules/Carousel/Config/config.xml b/local/modules/Carousel/Config/config.xml new file mode 100644 index 00000000..54642a77 --- /dev/null +++ b/local/modules/Carousel/Config/config.xml @@ -0,0 +1,25 @@ + + + + + + + + +
+ + + + + + + + + + + + + + diff --git a/local/modules/Carousel/Config/module.xml b/local/modules/Carousel/Config/module.xml new file mode 100644 index 00000000..f8ae9add --- /dev/null +++ b/local/modules/Carousel/Config/module.xml @@ -0,0 +1,24 @@ + + + Carousel\Carousel + + An image carousel + + + Un carrousel d'images + + + en_US + fr_FR + + 2.3.1 + + Manuel Raynaud, Franck Allimant + manu@raynaud.io, franck@cqfdev.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/Carousel/Config/routing.xml b/local/modules/Carousel/Config/routing.xml new file mode 100644 index 00000000..44e95906 --- /dev/null +++ b/local/modules/Carousel/Config/routing.xml @@ -0,0 +1,42 @@ + + + + + + + Carousel\Controller\ConfigurationController::uploadImage + + + + Carousel\Controller\ConfigurationController::updateAction + + + + Carousel\Controller\ConfigurationController::deleteAction + + + diff --git a/local/modules/Carousel/Config/schema.xml b/local/modules/Carousel/Config/schema.xml new file mode 100644 index 00000000..20ae4d3a --- /dev/null +++ b/local/modules/Carousel/Config/schema.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + +
+ + +
diff --git a/local/modules/Carousel/Config/sql/destroy.sql b/local/modules/Carousel/Config/sql/destroy.sql new file mode 100644 index 00000000..e6116063 --- /dev/null +++ b/local/modules/Carousel/Config/sql/destroy.sql @@ -0,0 +1,6 @@ +SET FOREIGN_KEY_CHECKS = 0; + +DROP TABLE IF EXISTS `carousel`; +DROP TABLE IF EXISTS `carousel_i18n`; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/local/modules/Carousel/Config/thelia.sql b/local/modules/Carousel/Config/thelia.sql new file mode 100644 index 00000000..71aa0d49 --- /dev/null +++ b/local/modules/Carousel/Config/thelia.sql @@ -0,0 +1,43 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- carousel +-- --------------------------------------------------------------------- + +CREATE TABLE IF NOT EXISTS `carousel` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `file` VARCHAR(255), + `position` INTEGER, + `url` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- carousel_i18n +-- --------------------------------------------------------------------- + + + +CREATE TABLE IF NOT EXISTS `carousel_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `alt` VARCHAR(255), + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `carousel_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `carousel` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/Carousel/Controller/ConfigurationController.php b/local/modules/Carousel/Controller/ConfigurationController.php new file mode 100644 index 00000000..f602762e --- /dev/null +++ b/local/modules/Carousel/Controller/ConfigurationController.php @@ -0,0 +1,184 @@ + + */ +class ConfigurationController extends BaseAdminController +{ + + public function uploadImage() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, ['carousel'], AccessManager::CREATE)) { + return $response; + } + + $request = $this->getRequest(); + $form = $this->createForm('carousel.image'); + $error_message = null; + try { + $this->validateForm($form); + + /** @var \Symfony\Component\HttpFoundation\File\UploadedFile $fileBeingUploaded */ + $fileBeingUploaded = $request->files->get(sprintf('%s[file]', $form->getName()), null, true); + + $fileModel = new Carousel(); + + $fileCreateOrUpdateEvent = new FileCreateOrUpdateEvent(1); + $fileCreateOrUpdateEvent->setModel($fileModel); + $fileCreateOrUpdateEvent->setUploadedFile($fileBeingUploaded); + + $this->dispatch( + TheliaEvents::IMAGE_SAVE, + $fileCreateOrUpdateEvent + ); + + // Compensate issue #1005 + $langs = LangQuery::create()->find(); + + /** @var Lang $lang */ + foreach ($langs as $lang) { + $fileCreateOrUpdateEvent->getModel()->setLocale($lang->getLocale())->setTitle('')->save(); + } + + $response = $this->redirectToConfigurationPage(); + + } catch (FormValidationException $e) { + $error_message = $this->createStandardFormValidationErrorMessage($e); + } + + if (null !== $error_message) { + $this->setupFormErrorContext( + 'carousel upload', + $error_message, + $form + ); + + $response = $this->render( + "module-configure", + [ + 'module_code' => 'Carousel' + ] + ); + } + + return $response; + } + + /** + * @param Form $form + * @param string $fieldName + * @param int $id + * @return string + */ + protected function getFormFieldValue($form, $fieldName, $id) + { + $value = $form->get(sprintf('%s%d', $fieldName, $id))->getData(); + + return $value; + } + + public function updateAction() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, ['carousel'], AccessManager::UPDATE)) { + return $response; + } + + $form = $this->createForm('carousel.update'); + + $error_message = null; + + try { + $updateForm = $this->validateForm($form); + + $carousels = CarouselQuery::create()->findAllByPosition(); + + $locale = $this->getCurrentEditionLocale(); + + /** @var Carousel $carousel */ + foreach ($carousels as $carousel) { + $id = $carousel->getId(); + + $carousel + ->setPosition($this->getFormFieldValue($updateForm, 'position', $id)) + ->setUrl($this->getFormFieldValue($updateForm, 'url', $id)) + ->setLocale($locale) + ->setTitle($this->getFormFieldValue($updateForm, 'title', $id)) + ->setAlt($this->getFormFieldValue($updateForm, 'alt', $id)) + ->setChapo($this->getFormFieldValue($updateForm, 'chapo', $id)) + ->setDescription($this->getFormFieldValue($updateForm, 'description', $id)) + ->setPostscriptum($this->getFormFieldValue($updateForm, 'postscriptum', $id)) + ->save(); + } + + $response = $this->redirectToConfigurationPage(); + + } catch (FormValidationException $e) { + $error_message = $this->createStandardFormValidationErrorMessage($e); + } + + if (null !== $error_message) { + $this->setupFormErrorContext( + 'carousel upload', + $error_message, + $form + ); + + $response = $this->render("module-configure", [ 'module_code' => 'Carousel' ]); + } + + return $response; + + } + + public function deleteAction() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, ['carousel'], AccessManager::DELETE)) { + return $response; + } + + $imageId = $this->getRequest()->request->get('image_id'); + + if ($imageId != "") { + $carousel = CarouselQuery::create()->findPk($imageId); + + if (null !== $carousel) { + $carousel->delete(); + } + } + + return $this->redirectToConfigurationPage(); + } + + protected function redirectToConfigurationPage() + { + return RedirectResponse::create(URL::getInstance()->absoluteUrl('/admin/module/Carousel')); + } +} \ No newline at end of file diff --git a/local/modules/Carousel/Form/CarouselImageForm.php b/local/modules/Carousel/Form/CarouselImageForm.php new file mode 100644 index 00000000..5ad985e3 --- /dev/null +++ b/local/modules/Carousel/Form/CarouselImageForm.php @@ -0,0 +1,56 @@ + + */ +class CarouselImageForm extends BaseForm +{ + /** + * @inheritdoc + */ + protected function buildForm() + { + $translator = Translator::getInstance(); + $this->formBuilder + ->add( + 'file', + 'file', + [ + 'constraints' => [ + new Image() + ], + 'label' => $translator->trans('Carousel image', [], Carousel::DOMAIN_NAME), + 'label_attr' => [ + 'for' => 'file' + ] + ] + ); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'carousel_image'; + } +} \ No newline at end of file diff --git a/local/modules/Carousel/Form/CarouselUpdateForm.php b/local/modules/Carousel/Form/CarouselUpdateForm.php new file mode 100644 index 00000000..3bf3a14d --- /dev/null +++ b/local/modules/Carousel/Form/CarouselUpdateForm.php @@ -0,0 +1,166 @@ + + */ +class CarouselUpdateForm extends BaseForm +{ + /** + * @inheritdoc + */ + protected function buildForm() + { + $formBuilder = $this->formBuilder; + + $carousels = CarouselQuery::create()->orderByPosition()->find(); + + /** @var \Carousel\Model\Carousel $carousel */ + foreach ($carousels as $carousel) { + $id = $carousel->getId(); + + $formBuilder->add( + 'position' . $id, + 'text', + [ + 'label' => $this->translator->trans('Image position in carousel', [], Carousel::DOMAIN_NAME), + 'label_attr' => [ + 'for' => 'position' . $id + ], + 'required' => false, + 'attr' => [ + 'placeholder' => $this->translator->trans( + 'Image position in carousel', + [], + Carousel::DOMAIN_NAME + ) + ] + ] + )->add( + 'alt' . $id, + 'text', + [ + 'label' => $this->translator->trans('Alternative image text', [], Carousel::DOMAIN_NAME), + 'label_attr' => [ + 'for' => 'alt' . $id + ], + 'required' => false, + 'attr' => [ + 'placeholder' => $this->translator->trans( + 'Displayed when image is not visible', + [], + Carousel::DOMAIN_NAME + ) + ] + ] + )->add( + 'url' . $id, + 'url', + [ + 'label' => $this->translator->trans('Image URL', [], Carousel::DOMAIN_NAME), + 'label_attr' => [ + 'for' => 'url' . $id + ], + 'required' => false, + 'attr' => [ + 'placeholder' => $this->translator->trans( + 'Please enter a valid URL', + [], + Carousel::DOMAIN_NAME + ) + ] + ] + )->add( + 'title' . $id, + 'text', + [ + 'constraints' => [], + 'required' => false, + 'label' => $this->translator->trans('Title'), + 'label_attr' => [ + 'for' => 'title_field' . $id + ], + 'attr' => [ + 'placeholder' => $this->translator->trans('A descriptive title') + ] + ] + )->add( + 'chapo' . $id, + 'textarea', + [ + 'constraints' => [], + 'required' => false, + 'label' => $this->translator->trans('Summary'), + 'label_attr' => [ + 'for' => 'summary_field' . $id, + 'help' => $this->translator->trans( + 'A short description, used when a summary or an introduction is required' + ) + ], + 'attr' => [ + 'rows' => 3, + 'placeholder' => $this->translator->trans('Short description text') + ] + ] + )->add( + 'description' . $id, + 'textarea', + [ + 'constraints' => [], + 'required' => false, + 'label' => $this->translator->trans('Detailed description'), + 'label_attr' => [ + 'for' => 'detailed_description_field' . $id, + 'help' => $this->translator->trans('The detailed description.') + ], + 'attr' => [ + 'rows' => 5 + ] + ] + )->add( + 'postscriptum' . $id, + 'textarea', + [ + 'constraints' => [], + 'required' => false, + 'label' => $this->translator->trans('Conclusion'), + 'label_attr' => [ + 'for' => 'conclusion_field' . $id, + 'help' => $this->translator->trans( + 'A short text, used when an additional or supplemental information is required.' + ) + ], + 'attr' => [ + 'placeholder' => $this->translator->trans('Short additional text'), + 'rows' => 3, + ] + ] + ); + } + } + + /** + * @inheritdoc + */ + public function getName() + { + return "carousel_update"; + } +} \ No newline at end of file diff --git a/local/modules/Carousel/Hook/BackHook.php b/local/modules/Carousel/Hook/BackHook.php new file mode 100644 index 00000000..b033670d --- /dev/null +++ b/local/modules/Carousel/Hook/BackHook.php @@ -0,0 +1,48 @@ + + */ +class BackHook extends BaseHook +{ + + /** + * Add a new entry in the admin tools menu + * + * should add to event a fragment with fields : id,class,url,title + * + * @param HookRenderBlockEvent $event + */ + public function onMainTopMenuTools(HookRenderBlockEvent $event) + { + $event->add( + [ + 'id' => 'tools_menu_carousel', + 'class' => '', + 'url' => URL::getInstance()->absoluteUrl('/admin/module/Carousel'), + 'title' => $this->trans('Edit your carousel', [], Carousel::DOMAIN_NAME) + ] + ); + } +} diff --git a/local/modules/Carousel/I18n/backOffice/default/de_DE.php b/local/modules/Carousel/I18n/backOffice/default/de_DE.php new file mode 100644 index 00000000..f94af4bc --- /dev/null +++ b/local/modules/Carousel/I18n/backOffice/default/de_DE.php @@ -0,0 +1,13 @@ + 'Ein Bild zu Karussell hinzufügen', + 'Add this image to the carousel' => 'Dieses Bild zu Karussell hinzufügen', + 'Carousel image' => 'Karussell-Bild', + 'Carousel images' => 'Karussell-Bilder', + 'Delete a carousel image' => 'Ein Karussell-Bild löschen', + 'Do you really want to remove this image from the carousel ?' => 'Wollen Sie dieses Bild wirklich aus dem Karussell entfernen?', + 'Edit your carousel.' => 'Karussell bearbeiten.', + 'Remove this image' => 'Dieses Bild entfernen', + 'Your carousel contains no image. Please add one using the form above.' => 'Das Karussell enthält kein Bild. Bitte fügen Sie mit dem Formular oben eines hinzu.', +]; diff --git a/local/modules/Carousel/I18n/backOffice/default/en_US.php b/local/modules/Carousel/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..6fafe4b8 --- /dev/null +++ b/local/modules/Carousel/I18n/backOffice/default/en_US.php @@ -0,0 +1,13 @@ + 'Add an image to the carousel', + 'Add this image to the carousel' => 'Add this image to the carousel', + 'Carousel image' => 'Carousel image', + 'Carousel images' => 'Carousel images', + 'Delete a carousel image' => 'Delete a carousel image', + 'Do you really want to remove this image from the carousel ?' => 'Do you really want to remove this image from the carousel ?', + 'Edit your carousel.' => 'Edit your carousel.', + 'Remove this image' => 'Remove this image', + 'Your carousel contains no image. Please add one using the form above.' => 'Your carousel contains no image. Please add one using the form above.', +); diff --git a/local/modules/Carousel/I18n/backOffice/default/fr_FR.php b/local/modules/Carousel/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..afc15e1a --- /dev/null +++ b/local/modules/Carousel/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,13 @@ + 'Ajouter une image au carrousel', + 'Add this image to the carousel' => 'Ajouter l\'image au carrousel', + 'Carousel image' => 'Image du carrousel', + 'Carousel images' => 'Images du carrousel', + 'Delete a carousel image' => 'Supprimer une image du carrousel', + 'Do you really want to remove this image from the carousel ?' => 'Voulez-vous vraiment retirer cette image du carrousel ?', + 'Edit your carousel.' => 'Modifier votre carrousel', + 'Remove this image' => 'Supprimer cette image', + 'Your carousel contains no image. Please add one using the form above.' => 'Votre carrousel ne contient aucune image. Ajoutez votre première image avec le formulaire ci-dessus', +]; diff --git a/local/modules/Carousel/I18n/backOffice/default/tr_TR.php b/local/modules/Carousel/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..eb1e51f1 --- /dev/null +++ b/local/modules/Carousel/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,13 @@ + 'Slayt için bir resim ekle', + 'Add this image to the carousel' => 'slayt için bu resim ekleme', + 'Carousel image' => 'slayt görüntü', + 'Carousel images' => 'slayt görüntüleri', + 'Delete a carousel image' => 'Bir slayt resmi silme', + 'Do you really want to remove this image from the carousel ?' => 'Bu görüntüyü slayttan kaldırmak istiyor musunuz?', + 'Edit your carousel.' => 'slayt düzenleyin.', + 'Remove this image' => 'Bu resmi kaldırma', + 'Your carousel contains no image. Please add one using the form above.' => 'Senin slayt hiçbir görüntü içermiyor . Lütfen yukarıdaki formu kullanarak ekleyin.', +]; diff --git a/local/modules/Carousel/I18n/de_DE.php b/local/modules/Carousel/I18n/de_DE.php new file mode 100644 index 00000000..35b35e10 --- /dev/null +++ b/local/modules/Carousel/I18n/de_DE.php @@ -0,0 +1,20 @@ + 'Beschreibungstitel', + 'A short description, used when a summary or an introduction is required' => 'Eine kurze beschreibung, benutzt wenn eine Zusammenfassung order eine Einleitung ist nötig', + 'A short text, used when an additional or supplemental information is required.' => 'Ein kurzer Text, der verwendet wird, wenn eine zusätzliche oder ergänzende Information erforderlich ist.', + 'Alternative image text' => 'Alternativer Bildtext', + 'Carousel image' => 'Karussell-Bild', + 'Conclusion' => 'Abschluss', + 'Detailed description' => 'Detaillierte Beschreibung', + 'Displayed when image is not visible' => 'Angezeigt, wenn das Bild nicht sichtbar ist', + 'Image URL' => 'Bild-URL', + 'Image position in carousel' => 'Position des Bildes im Karussell', + 'Please enter a valid URL' => 'Bitte geben Sie eine gültige URL ein', + 'Short additional text' => 'Kurzer zusätzlicher Text', + 'Short description text' => 'Kurzes Beschreibungstext', + 'Summary' => 'Zusammenfassung', + 'The detailed description.' => 'Die detaillierte Beschreibung.', + 'Title' => 'Titel', +]; diff --git a/local/modules/Carousel/I18n/en_US.php b/local/modules/Carousel/I18n/en_US.php new file mode 100644 index 00000000..dcc5d1c4 --- /dev/null +++ b/local/modules/Carousel/I18n/en_US.php @@ -0,0 +1,20 @@ + 'A descriptive title', + 'A short description, used when a summary or an introduction is required' => 'A short description, used when a summary or an introduction is required', + 'A short text, used when an additional or supplemental information is required.' => 'A short text, used when an additional or supplemental information is required.', + 'Alternative image text' => 'Alternative image text', + 'Carousel image' => 'Carousel image', + 'Conclusion' => 'Conclusion', + 'Detailed description' => 'Detailed description', + 'Displayed when image is not visible' => 'Displayed when image is not visible', + 'Image URL' => 'Image URL', + 'Image position in carousel' => 'Image position in carousel', + 'Please enter a valid URL' => 'Please enter a valid URL', + 'Short additional text' => 'Short additional text', + 'Short description text' => 'Short description text', + 'Summary' => 'Summary', + 'The detailed description.' => 'The detailed description.', + 'Title' => 'Title', +); diff --git a/local/modules/Carousel/I18n/fr_FR.php b/local/modules/Carousel/I18n/fr_FR.php new file mode 100644 index 00000000..f5318231 --- /dev/null +++ b/local/modules/Carousel/I18n/fr_FR.php @@ -0,0 +1,20 @@ + 'Un titre descriptif', + 'A short description, used when a summary or an introduction is required' => 'Une courte description, utilisée lorsqu\'un résumé ou une introduction est requise', + 'A short text, used when an additional or supplemental information is required.' => 'Un texte court, utilisé quand une conclusion ou une information complémentaire est nécessaire.', + 'Alternative image text' => 'Texte alternatif de l\'image', + 'Carousel image' => 'Image du carrousel', + 'Conclusion' => 'Conclusion', + 'Detailed description' => 'Description détaillée', + 'Displayed when image is not visible' => 'Affiché lorsque l\'image n\'est pas visible', + 'Image URL' => 'URL de l\'image', + 'Image position in carousel' => 'Position de l\'image dans le carrousel', + 'Please enter a valid URL' => 'Merci d\'ndiquer une URL valide', + 'Short additional text' => 'Un court texte supplémentaire', + 'Short description text' => 'Un court texte de description', + 'Summary' => 'Résumé', + 'The detailed description.' => 'La description détaillée.', + 'Title' => 'Titre', +]; diff --git a/local/modules/Carousel/I18n/it_IT.php b/local/modules/Carousel/I18n/it_IT.php new file mode 100644 index 00000000..3919d98b --- /dev/null +++ b/local/modules/Carousel/I18n/it_IT.php @@ -0,0 +1,11 @@ + 'Un titolo descrittivo', + 'A short description, used when a summary or an introduction is required' => 'Una breve descrizione, utilizzata quando è necessario un sommario o un\'introduzione', + 'Conclusion' => 'Conclusione', + 'Detailed description' => 'Descrizione dettagliata', + 'Summary' => 'Riassunto', + 'The detailed description.' => 'La descrizione dettagliata.', + 'Title' => 'Titolo', +]; diff --git a/local/modules/Carousel/I18n/tr_TR.php b/local/modules/Carousel/I18n/tr_TR.php new file mode 100644 index 00000000..e8505474 --- /dev/null +++ b/local/modules/Carousel/I18n/tr_TR.php @@ -0,0 +1,20 @@ + 'Açıklayıcı bir başlık', + 'A short description, used when a summary or an introduction is required' => 'Bir Özeti veya giriş gerekli olduğunda kullanılan kısa bir açıklama', + 'A short text, used when an additional or supplemental information is required.' => 'Bir ek ya da tamamlayıcı bilgi gerekli olduğunda kullanılan kısa bir metin.', + 'Alternative image text' => 'Alternatif resim metini', + 'Carousel image' => 'slayt görüntü', + 'Conclusion' => 'Sonuç', + 'Detailed description' => 'Detaylı açıklama', + 'Displayed when image is not visible' => 'resim görünür olmadığında görüntülenen', + 'Image URL' => 'Resim Bağlantı [Link]', + 'Image position in carousel' => 'slayt bulunduğu resim', + 'Please enter a valid URL' => 'Lütfen geçerli bir URL girin', + 'Short additional text' => 'Kısa ek metin', + 'Short description text' => 'Kısa açıklama metni', + 'Summary' => 'Özet', + 'The detailed description.' => 'Ayrıntılı açıklama.', + 'Title' => 'Başlık', +]; diff --git a/local/modules/Carousel/Loop/CarouselLoop.php b/local/modules/Carousel/Loop/CarouselLoop.php new file mode 100644 index 00000000..5813a551 --- /dev/null +++ b/local/modules/Carousel/Loop/CarouselLoop.php @@ -0,0 +1,190 @@ + + */ +class CarouselLoop extends Image +{ + + + /** + * @inheritdoc + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntTypeArgument('width'), + Argument::createIntTypeArgument('height'), + Argument::createIntTypeArgument('rotation', 0), + Argument::createAnyTypeArgument('background_color'), + Argument::createIntTypeArgument('quality'), + new Argument( + 'resize_mode', + new TypeCollection( + new EnumType(array('crop', 'borders', 'none')) + ), + 'none' + ), + new Argument( + 'order', + new TypeCollection( + new EnumListType(array('alpha', 'alpha-reverse', 'manual', 'manual-reverse', 'random')) + ), + 'manual' + ), + Argument::createAnyTypeArgument('effects'), + Argument::createBooleanTypeArgument('allow_zoom', false) + ); + } + + /** + * @param LoopResult $loopResult + * + * @return LoopResult + */ + public function parseResults(LoopResult $loopResult) + { + /** @var \Carousel\Model\Carousel $carousel */ + foreach ($loopResult->getResultDataCollection() as $carousel) { + $loopResultRow = new LoopResultRow($carousel); + + $event = new ImageEvent(); + $event->setSourceFilepath($carousel->getUploadDir() . DS . $carousel->getFile()) + ->setCacheSubdirectory('carousel'); + + switch ($this->getResizeMode()) { + case 'crop': + $resize_mode = \Thelia\Action\Image::EXACT_RATIO_WITH_CROP; + break; + + case 'borders': + $resize_mode = \Thelia\Action\Image::EXACT_RATIO_WITH_BORDERS; + break; + + case 'none': + default: + $resize_mode = \Thelia\Action\Image::KEEP_IMAGE_RATIO; + + } + + // Prepare tranformations + $width = $this->getWidth(); + $height = $this->getHeight(); + $rotation = $this->getRotation(); + $background_color = $this->getBackgroundColor(); + $quality = $this->getQuality(); + $effects = $this->getEffects(); + + if (!is_null($width)) { + $event->setWidth($width); + } + if (!is_null($height)) { + $event->setHeight($height); + } + $event->setResizeMode($resize_mode); + if (!is_null($rotation)) { + $event->setRotation($rotation); + } + if (!is_null($background_color)) { + $event->setBackgroundColor($background_color); + } + if (!is_null($quality)) { + $event->setQuality($quality); + } + if (!is_null($effects)) { + $event->setEffects($effects); + } + + $event->setAllowZoom($this->getAllowZoom()); + + // Dispatch image processing event + $this->dispatcher->dispatch(TheliaEvents::IMAGE_PROCESS, $event); + + $loopResultRow + ->set('ID', $carousel->getId()) + ->set("LOCALE", $this->locale) + ->set("IMAGE_URL", $event->getFileUrl()) + ->set("ORIGINAL_IMAGE_URL", $event->getOriginalFileUrl()) + ->set("IMAGE_PATH", $event->getCacheFilepath()) + ->set("ORIGINAL_IMAGE_PATH", $event->getSourceFilepath()) + ->set("TITLE", $carousel->getVirtualColumn('i18n_TITLE')) + ->set("CHAPO", $carousel->getVirtualColumn('i18n_CHAPO')) + ->set("DESCRIPTION", $carousel->getVirtualColumn('i18n_DESCRIPTION')) + ->set("POSTSCRIPTUM", $carousel->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("ALT", $carousel->getVirtualColumn('i18n_ALT')) + ->set("URL", $carousel->getUrl()) + ->set('POSITION', $carousel->getPosition()) + ; + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + /** + * this method returns a Propel ModelCriteria + * + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria() + { + $search = CarouselQuery::create(); + + $this->configureI18nProcessing($search, [ 'ALT', 'TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM' ]); + + $orders = $this->getOrder(); + + // Results ordering + foreach ($orders as $order) { + switch ($order) { + case "alpha": + $search->addAscendingOrderByColumn('i18n_TITLE'); + break; + case "alpha-reverse": + $search->addDescendingOrderByColumn('i18n_TITLE'); + break; + case "manual-reverse": + $search->orderByPosition(Criteria::DESC); + break; + case "manual": + $search->orderByPosition(Criteria::ASC); + break; + case "random": + $search->clearOrderByColumns(); + $search->addAscendingOrderByColumn('RAND()'); + break(2); + break; + } + } + + return $search; + } +} diff --git a/local/modules/Carousel/Model/Base/Carousel.php b/local/modules/Carousel/Model/Base/Carousel.php new file mode 100644 index 00000000..591337fb --- /dev/null +++ b/local/modules/Carousel/Model/Base/Carousel.php @@ -0,0 +1,1932 @@ +modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another Carousel instance. If + * obj is an instance of Carousel, delegates to + * equals(Carousel). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return Carousel The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return Carousel The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [file] column value. + * + * @return string + */ + public function getFile() + { + + return $this->file; + } + + /** + * Get the [position] column value. + * + * @return int + */ + public function getPosition() + { + + return $this->position; + } + + /** + * Get the [url] column value. + * + * @return string + */ + public function getUrl() + { + + return $this->url; + } + + /** + * Get the [optionally formatted] temporal [created_at] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the raw \DateTime object will be returned. + * + * @return mixed Formatted date/time value as string or \DateTime object (if format is NULL), NULL if column is NULL, and 0 if column value is 0000-00-00 00:00:00 + * + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getCreatedAt($format = NULL) + { + if ($format === null) { + return $this->created_at; + } else { + return $this->created_at instanceof \DateTime ? $this->created_at->format($format) : null; + } + } + + /** + * Get the [optionally formatted] temporal [updated_at] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the raw \DateTime object will be returned. + * + * @return mixed Formatted date/time value as string or \DateTime object (if format is NULL), NULL if column is NULL, and 0 if column value is 0000-00-00 00:00:00 + * + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getUpdatedAt($format = NULL) + { + if ($format === null) { + return $this->updated_at; + } else { + return $this->updated_at instanceof \DateTime ? $this->updated_at->format($format) : null; + } + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[CarouselTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [file] column. + * + * @param string $v new value + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function setFile($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->file !== $v) { + $this->file = $v; + $this->modifiedColumns[CarouselTableMap::FILE] = true; + } + + + return $this; + } // setFile() + + /** + * Set the value of [position] column. + * + * @param int $v new value + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function setPosition($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->position !== $v) { + $this->position = $v; + $this->modifiedColumns[CarouselTableMap::POSITION] = true; + } + + + return $this; + } // setPosition() + + /** + * Set the value of [url] column. + * + * @param string $v new value + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function setUrl($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->url !== $v) { + $this->url = $v; + $this->modifiedColumns[CarouselTableMap::URL] = true; + } + + + return $this; + } // setUrl() + + /** + * Sets the value of [created_at] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or \DateTime value. + * Empty strings are treated as NULL. + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function setCreatedAt($v) + { + $dt = PropelDateTime::newInstance($v, null, '\DateTime'); + if ($this->created_at !== null || $dt !== null) { + if ($dt !== $this->created_at) { + $this->created_at = $dt; + $this->modifiedColumns[CarouselTableMap::CREATED_AT] = true; + } + } // if either are not null + + + return $this; + } // setCreatedAt() + + /** + * Sets the value of [updated_at] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or \DateTime value. + * Empty strings are treated as NULL. + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function setUpdatedAt($v) + { + $dt = PropelDateTime::newInstance($v, null, '\DateTime'); + if ($this->updated_at !== null || $dt !== null) { + if ($dt !== $this->updated_at) { + $this->updated_at = $dt; + $this->modifiedColumns[CarouselTableMap::UPDATED_AT] = true; + } + } // if either are not null + + + return $this; + } // setUpdatedAt() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : CarouselTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : CarouselTableMap::translateFieldName('File', TableMap::TYPE_PHPNAME, $indexType)]; + $this->file = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : CarouselTableMap::translateFieldName('Position', TableMap::TYPE_PHPNAME, $indexType)]; + $this->position = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : CarouselTableMap::translateFieldName('Url', TableMap::TYPE_PHPNAME, $indexType)]; + $this->url = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : CarouselTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)]; + if ($col === '0000-00-00 00:00:00') { + $col = null; + } + $this->created_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : CarouselTableMap::translateFieldName('UpdatedAt', TableMap::TYPE_PHPNAME, $indexType)]; + if ($col === '0000-00-00 00:00:00') { + $col = null; + } + $this->updated_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 6; // 6 = CarouselTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \Carousel\Model\Carousel object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(CarouselTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildCarouselQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collCarouselI18ns = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see Carousel::setDeleted() + * @see Carousel::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildCarouselQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + // timestampable behavior + if (!$this->isColumnModified(CarouselTableMap::CREATED_AT)) { + $this->setCreatedAt(time()); + } + if (!$this->isColumnModified(CarouselTableMap::UPDATED_AT)) { + $this->setUpdatedAt(time()); + } + } else { + $ret = $ret && $this->preUpdate($con); + // timestampable behavior + if ($this->isModified() && !$this->isColumnModified(CarouselTableMap::UPDATED_AT)) { + $this->setUpdatedAt(time()); + } + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CarouselTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->carouselI18nsScheduledForDeletion !== null) { + if (!$this->carouselI18nsScheduledForDeletion->isEmpty()) { + \Carousel\Model\CarouselI18nQuery::create() + ->filterByPrimaryKeys($this->carouselI18nsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->carouselI18nsScheduledForDeletion = null; + } + } + + if ($this->collCarouselI18ns !== null) { + foreach ($this->collCarouselI18ns as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[CarouselTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CarouselTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CarouselTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(CarouselTableMap::FILE)) { + $modifiedColumns[':p' . $index++] = 'FILE'; + } + if ($this->isColumnModified(CarouselTableMap::POSITION)) { + $modifiedColumns[':p' . $index++] = 'POSITION'; + } + if ($this->isColumnModified(CarouselTableMap::URL)) { + $modifiedColumns[':p' . $index++] = 'URL'; + } + if ($this->isColumnModified(CarouselTableMap::CREATED_AT)) { + $modifiedColumns[':p' . $index++] = 'CREATED_AT'; + } + if ($this->isColumnModified(CarouselTableMap::UPDATED_AT)) { + $modifiedColumns[':p' . $index++] = 'UPDATED_AT'; + } + + $sql = sprintf( + 'INSERT INTO carousel (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'FILE': + $stmt->bindValue($identifier, $this->file, PDO::PARAM_STR); + break; + case 'POSITION': + $stmt->bindValue($identifier, $this->position, PDO::PARAM_INT); + break; + case 'URL': + $stmt->bindValue($identifier, $this->url, PDO::PARAM_STR); + break; + case 'CREATED_AT': + $stmt->bindValue($identifier, $this->created_at ? $this->created_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); + break; + case 'UPDATED_AT': + $stmt->bindValue($identifier, $this->updated_at ? $this->updated_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = CarouselTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getFile(); + break; + case 2: + return $this->getPosition(); + break; + case 3: + return $this->getUrl(); + break; + case 4: + return $this->getCreatedAt(); + break; + case 5: + return $this->getUpdatedAt(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['Carousel'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['Carousel'][$this->getPrimaryKey()] = true; + $keys = CarouselTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getFile(), + $keys[2] => $this->getPosition(), + $keys[3] => $this->getUrl(), + $keys[4] => $this->getCreatedAt(), + $keys[5] => $this->getUpdatedAt(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collCarouselI18ns) { + $result['CarouselI18ns'] = $this->collCarouselI18ns->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = CarouselTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setFile($value); + break; + case 2: + $this->setPosition($value); + break; + case 3: + $this->setUrl($value); + break; + case 4: + $this->setCreatedAt($value); + break; + case 5: + $this->setUpdatedAt($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = CarouselTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setFile($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setPosition($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setUrl($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setCreatedAt($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setUpdatedAt($arr[$keys[5]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CarouselTableMap::DATABASE_NAME); + + if ($this->isColumnModified(CarouselTableMap::ID)) $criteria->add(CarouselTableMap::ID, $this->id); + if ($this->isColumnModified(CarouselTableMap::FILE)) $criteria->add(CarouselTableMap::FILE, $this->file); + if ($this->isColumnModified(CarouselTableMap::POSITION)) $criteria->add(CarouselTableMap::POSITION, $this->position); + if ($this->isColumnModified(CarouselTableMap::URL)) $criteria->add(CarouselTableMap::URL, $this->url); + if ($this->isColumnModified(CarouselTableMap::CREATED_AT)) $criteria->add(CarouselTableMap::CREATED_AT, $this->created_at); + if ($this->isColumnModified(CarouselTableMap::UPDATED_AT)) $criteria->add(CarouselTableMap::UPDATED_AT, $this->updated_at); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CarouselTableMap::DATABASE_NAME); + $criteria->add(CarouselTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Carousel\Model\Carousel (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setFile($this->getFile()); + $copyObj->setPosition($this->getPosition()); + $copyObj->setUrl($this->getUrl()); + $copyObj->setCreatedAt($this->getCreatedAt()); + $copyObj->setUpdatedAt($this->getUpdatedAt()); + + if ($deepCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + + foreach ($this->getCarouselI18ns() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addCarouselI18n($relObj->copy($deepCopy)); + } + } + + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Carousel\Model\Carousel Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('CarouselI18n' == $relationName) { + return $this->initCarouselI18ns(); + } + } + + /** + * Clears out the collCarouselI18ns collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return void + * @see addCarouselI18ns() + */ + public function clearCarouselI18ns() + { + $this->collCarouselI18ns = null; // important to set this to NULL since that means it is uninitialized + } + + /** + * Reset is the collCarouselI18ns collection loaded partially. + */ + public function resetPartialCarouselI18ns($v = true) + { + $this->collCarouselI18nsPartial = $v; + } + + /** + * Initializes the collCarouselI18ns collection. + * + * By default this just sets the collCarouselI18ns collection to an empty array (like clearcollCarouselI18ns()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initCarouselI18ns($overrideExisting = true) + { + if (null !== $this->collCarouselI18ns && !$overrideExisting) { + return; + } + $this->collCarouselI18ns = new ObjectCollection(); + $this->collCarouselI18ns->setModel('\Carousel\Model\CarouselI18n'); + } + + /** + * Gets an array of ChildCarouselI18n objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this ChildCarousel is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param ConnectionInterface $con optional connection object + * @return Collection|ChildCarouselI18n[] List of ChildCarouselI18n objects + * @throws PropelException + */ + public function getCarouselI18ns($criteria = null, ConnectionInterface $con = null) + { + $partial = $this->collCarouselI18nsPartial && !$this->isNew(); + if (null === $this->collCarouselI18ns || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCarouselI18ns) { + // return empty collection + $this->initCarouselI18ns(); + } else { + $collCarouselI18ns = ChildCarouselI18nQuery::create(null, $criteria) + ->filterByCarousel($this) + ->find($con); + + if (null !== $criteria) { + if (false !== $this->collCarouselI18nsPartial && count($collCarouselI18ns)) { + $this->initCarouselI18ns(false); + + foreach ($collCarouselI18ns as $obj) { + if (false == $this->collCarouselI18ns->contains($obj)) { + $this->collCarouselI18ns->append($obj); + } + } + + $this->collCarouselI18nsPartial = true; + } + + reset($collCarouselI18ns); + + return $collCarouselI18ns; + } + + if ($partial && $this->collCarouselI18ns) { + foreach ($this->collCarouselI18ns as $obj) { + if ($obj->isNew()) { + $collCarouselI18ns[] = $obj; + } + } + } + + $this->collCarouselI18ns = $collCarouselI18ns; + $this->collCarouselI18nsPartial = false; + } + } + + return $this->collCarouselI18ns; + } + + /** + * Sets a collection of CarouselI18n objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param Collection $carouselI18ns A Propel collection. + * @param ConnectionInterface $con Optional connection object + * @return ChildCarousel The current object (for fluent API support) + */ + public function setCarouselI18ns(Collection $carouselI18ns, ConnectionInterface $con = null) + { + $carouselI18nsToDelete = $this->getCarouselI18ns(new Criteria(), $con)->diff($carouselI18ns); + + + //since at least one column in the foreign key is at the same time a PK + //we can not just set a PK to NULL in the lines below. We have to store + //a backup of all values, so we are able to manipulate these items based on the onDelete value later. + $this->carouselI18nsScheduledForDeletion = clone $carouselI18nsToDelete; + + foreach ($carouselI18nsToDelete as $carouselI18nRemoved) { + $carouselI18nRemoved->setCarousel(null); + } + + $this->collCarouselI18ns = null; + foreach ($carouselI18ns as $carouselI18n) { + $this->addCarouselI18n($carouselI18n); + } + + $this->collCarouselI18ns = $carouselI18ns; + $this->collCarouselI18nsPartial = false; + + return $this; + } + + /** + * Returns the number of related CarouselI18n objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param ConnectionInterface $con + * @return int Count of related CarouselI18n objects. + * @throws PropelException + */ + public function countCarouselI18ns(Criteria $criteria = null, $distinct = false, ConnectionInterface $con = null) + { + $partial = $this->collCarouselI18nsPartial && !$this->isNew(); + if (null === $this->collCarouselI18ns || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collCarouselI18ns) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getCarouselI18ns()); + } + + $query = ChildCarouselI18nQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByCarousel($this) + ->count($con); + } + + return count($this->collCarouselI18ns); + } + + /** + * Method called to associate a ChildCarouselI18n object to this object + * through the ChildCarouselI18n foreign key attribute. + * + * @param ChildCarouselI18n $l ChildCarouselI18n + * @return \Carousel\Model\Carousel The current object (for fluent API support) + */ + public function addCarouselI18n(ChildCarouselI18n $l) + { + if ($l && $locale = $l->getLocale()) { + $this->setLocale($locale); + $this->currentTranslations[$locale] = $l; + } + if ($this->collCarouselI18ns === null) { + $this->initCarouselI18ns(); + $this->collCarouselI18nsPartial = true; + } + + if (!in_array($l, $this->collCarouselI18ns->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddCarouselI18n($l); + } + + return $this; + } + + /** + * @param CarouselI18n $carouselI18n The carouselI18n object to add. + */ + protected function doAddCarouselI18n($carouselI18n) + { + $this->collCarouselI18ns[]= $carouselI18n; + $carouselI18n->setCarousel($this); + } + + /** + * @param CarouselI18n $carouselI18n The carouselI18n object to remove. + * @return ChildCarousel The current object (for fluent API support) + */ + public function removeCarouselI18n($carouselI18n) + { + if ($this->getCarouselI18ns()->contains($carouselI18n)) { + $this->collCarouselI18ns->remove($this->collCarouselI18ns->search($carouselI18n)); + if (null === $this->carouselI18nsScheduledForDeletion) { + $this->carouselI18nsScheduledForDeletion = clone $this->collCarouselI18ns; + $this->carouselI18nsScheduledForDeletion->clear(); + } + $this->carouselI18nsScheduledForDeletion[]= clone $carouselI18n; + $carouselI18n->setCarousel(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->file = null; + $this->position = null; + $this->url = null; + $this->created_at = null; + $this->updated_at = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + if ($this->collCarouselI18ns) { + foreach ($this->collCarouselI18ns as $o) { + $o->clearAllReferences($deep); + } + } + } // if ($deep) + + // i18n behavior + $this->currentLocale = 'en_US'; + $this->currentTranslations = null; + + $this->collCarouselI18ns = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CarouselTableMap::DEFAULT_STRING_FORMAT); + } + + // timestampable behavior + + /** + * Mark the current object so that the update date doesn't get updated during next save + * + * @return ChildCarousel The current object (for fluent API support) + */ + public function keepUpdateDateUnchanged() + { + $this->modifiedColumns[CarouselTableMap::UPDATED_AT] = true; + + return $this; + } + + // i18n behavior + + /** + * Sets the locale for translations + * + * @param string $locale Locale to use for the translation, e.g. 'fr_FR' + * + * @return ChildCarousel The current object (for fluent API support) + */ + public function setLocale($locale = 'en_US') + { + $this->currentLocale = $locale; + + return $this; + } + + /** + * Gets the locale for translations + * + * @return string $locale Locale to use for the translation, e.g. 'fr_FR' + */ + public function getLocale() + { + return $this->currentLocale; + } + + /** + * Returns the current translation for a given locale + * + * @param string $locale Locale to use for the translation, e.g. 'fr_FR' + * @param ConnectionInterface $con an optional connection object + * + * @return ChildCarouselI18n */ + public function getTranslation($locale = 'en_US', ConnectionInterface $con = null) + { + if (!isset($this->currentTranslations[$locale])) { + if (null !== $this->collCarouselI18ns) { + foreach ($this->collCarouselI18ns as $translation) { + if ($translation->getLocale() == $locale) { + $this->currentTranslations[$locale] = $translation; + + return $translation; + } + } + } + if ($this->isNew()) { + $translation = new ChildCarouselI18n(); + $translation->setLocale($locale); + } else { + $translation = ChildCarouselI18nQuery::create() + ->filterByPrimaryKey(array($this->getPrimaryKey(), $locale)) + ->findOneOrCreate($con); + $this->currentTranslations[$locale] = $translation; + } + $this->addCarouselI18n($translation); + } + + return $this->currentTranslations[$locale]; + } + + /** + * Remove the translation for a given locale + * + * @param string $locale Locale to use for the translation, e.g. 'fr_FR' + * @param ConnectionInterface $con an optional connection object + * + * @return ChildCarousel The current object (for fluent API support) + */ + public function removeTranslation($locale = 'en_US', ConnectionInterface $con = null) + { + if (!$this->isNew()) { + ChildCarouselI18nQuery::create() + ->filterByPrimaryKey(array($this->getPrimaryKey(), $locale)) + ->delete($con); + } + if (isset($this->currentTranslations[$locale])) { + unset($this->currentTranslations[$locale]); + } + foreach ($this->collCarouselI18ns as $key => $translation) { + if ($translation->getLocale() == $locale) { + unset($this->collCarouselI18ns[$key]); + break; + } + } + + return $this; + } + + /** + * Returns the current translation + * + * @param ConnectionInterface $con an optional connection object + * + * @return ChildCarouselI18n */ + public function getCurrentTranslation(ConnectionInterface $con = null) + { + return $this->getTranslation($this->getLocale(), $con); + } + + + /** + * Get the [alt] column value. + * + * @return string + */ + public function getAlt() + { + return $this->getCurrentTranslation()->getAlt(); + } + + + /** + * Set the value of [alt] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setAlt($v) + { $this->getCurrentTranslation()->setAlt($v); + + return $this; + } + + + /** + * Get the [title] column value. + * + * @return string + */ + public function getTitle() + { + return $this->getCurrentTranslation()->getTitle(); + } + + + /** + * Set the value of [title] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setTitle($v) + { $this->getCurrentTranslation()->setTitle($v); + + return $this; + } + + + /** + * Get the [description] column value. + * + * @return string + */ + public function getDescription() + { + return $this->getCurrentTranslation()->getDescription(); + } + + + /** + * Set the value of [description] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setDescription($v) + { $this->getCurrentTranslation()->setDescription($v); + + return $this; + } + + + /** + * Get the [chapo] column value. + * + * @return string + */ + public function getChapo() + { + return $this->getCurrentTranslation()->getChapo(); + } + + + /** + * Set the value of [chapo] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setChapo($v) + { $this->getCurrentTranslation()->setChapo($v); + + return $this; + } + + + /** + * Get the [postscriptum] column value. + * + * @return string + */ + public function getPostscriptum() + { + return $this->getCurrentTranslation()->getPostscriptum(); + } + + + /** + * Set the value of [postscriptum] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setPostscriptum($v) + { $this->getCurrentTranslation()->setPostscriptum($v); + + return $this; + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/Carousel/Model/Base/CarouselI18n.php b/local/modules/Carousel/Model/Base/CarouselI18n.php new file mode 100644 index 00000000..0f993bf8 --- /dev/null +++ b/local/modules/Carousel/Model/Base/CarouselI18n.php @@ -0,0 +1,1500 @@ +locale = 'en_US'; + } + + /** + * Initializes internal state of Carousel\Model\Base\CarouselI18n object. + * @see applyDefaults() + */ + public function __construct() + { + $this->applyDefaultValues(); + } + + /** + * Returns whether the object has been modified. + * + * @return boolean True if the object has been modified. + */ + public function isModified() + { + return !!$this->modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another CarouselI18n instance. If + * obj is an instance of CarouselI18n, delegates to + * equals(CarouselI18n). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return CarouselI18n The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return CarouselI18n The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [locale] column value. + * + * @return string + */ + public function getLocale() + { + + return $this->locale; + } + + /** + * Get the [alt] column value. + * + * @return string + */ + public function getAlt() + { + + return $this->alt; + } + + /** + * Get the [title] column value. + * + * @return string + */ + public function getTitle() + { + + return $this->title; + } + + /** + * Get the [description] column value. + * + * @return string + */ + public function getDescription() + { + + return $this->description; + } + + /** + * Get the [chapo] column value. + * + * @return string + */ + public function getChapo() + { + + return $this->chapo; + } + + /** + * Get the [postscriptum] column value. + * + * @return string + */ + public function getPostscriptum() + { + + return $this->postscriptum; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[CarouselI18nTableMap::ID] = true; + } + + if ($this->aCarousel !== null && $this->aCarousel->getId() !== $v) { + $this->aCarousel = null; + } + + + return $this; + } // setId() + + /** + * Set the value of [locale] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setLocale($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->locale !== $v) { + $this->locale = $v; + $this->modifiedColumns[CarouselI18nTableMap::LOCALE] = true; + } + + + return $this; + } // setLocale() + + /** + * Set the value of [alt] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setAlt($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->alt !== $v) { + $this->alt = $v; + $this->modifiedColumns[CarouselI18nTableMap::ALT] = true; + } + + + return $this; + } // setAlt() + + /** + * Set the value of [title] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->title !== $v) { + $this->title = $v; + $this->modifiedColumns[CarouselI18nTableMap::TITLE] = true; + } + + + return $this; + } // setTitle() + + /** + * Set the value of [description] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setDescription($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->description !== $v) { + $this->description = $v; + $this->modifiedColumns[CarouselI18nTableMap::DESCRIPTION] = true; + } + + + return $this; + } // setDescription() + + /** + * Set the value of [chapo] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setChapo($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->chapo !== $v) { + $this->chapo = $v; + $this->modifiedColumns[CarouselI18nTableMap::CHAPO] = true; + } + + + return $this; + } // setChapo() + + /** + * Set the value of [postscriptum] column. + * + * @param string $v new value + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + */ + public function setPostscriptum($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->postscriptum !== $v) { + $this->postscriptum = $v; + $this->modifiedColumns[CarouselI18nTableMap::POSTSCRIPTUM] = true; + } + + + return $this; + } // setPostscriptum() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->locale !== 'en_US') { + return false; + } + + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : CarouselI18nTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : CarouselI18nTableMap::translateFieldName('Locale', TableMap::TYPE_PHPNAME, $indexType)]; + $this->locale = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : CarouselI18nTableMap::translateFieldName('Alt', TableMap::TYPE_PHPNAME, $indexType)]; + $this->alt = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : CarouselI18nTableMap::translateFieldName('Title', TableMap::TYPE_PHPNAME, $indexType)]; + $this->title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : CarouselI18nTableMap::translateFieldName('Description', TableMap::TYPE_PHPNAME, $indexType)]; + $this->description = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : CarouselI18nTableMap::translateFieldName('Chapo', TableMap::TYPE_PHPNAME, $indexType)]; + $this->chapo = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : CarouselI18nTableMap::translateFieldName('Postscriptum', TableMap::TYPE_PHPNAME, $indexType)]; + $this->postscriptum = (null !== $col) ? (string) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 7; // 7 = CarouselI18nTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \Carousel\Model\CarouselI18n object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + if ($this->aCarousel !== null && $this->id !== $this->aCarousel->getId()) { + $this->aCarousel = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(CarouselI18nTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildCarouselI18nQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCarousel = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see CarouselI18n::setDeleted() + * @see CarouselI18n::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselI18nTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildCarouselI18nQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselI18nTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CarouselI18nTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCarousel !== null) { + if ($this->aCarousel->isModified() || $this->aCarousel->isNew()) { + $affectedRows += $this->aCarousel->save($con); + } + $this->setCarousel($this->aCarousel); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CarouselI18nTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(CarouselI18nTableMap::LOCALE)) { + $modifiedColumns[':p' . $index++] = 'LOCALE'; + } + if ($this->isColumnModified(CarouselI18nTableMap::ALT)) { + $modifiedColumns[':p' . $index++] = 'ALT'; + } + if ($this->isColumnModified(CarouselI18nTableMap::TITLE)) { + $modifiedColumns[':p' . $index++] = 'TITLE'; + } + if ($this->isColumnModified(CarouselI18nTableMap::DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = 'DESCRIPTION'; + } + if ($this->isColumnModified(CarouselI18nTableMap::CHAPO)) { + $modifiedColumns[':p' . $index++] = 'CHAPO'; + } + if ($this->isColumnModified(CarouselI18nTableMap::POSTSCRIPTUM)) { + $modifiedColumns[':p' . $index++] = 'POSTSCRIPTUM'; + } + + $sql = sprintf( + 'INSERT INTO carousel_i18n (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'LOCALE': + $stmt->bindValue($identifier, $this->locale, PDO::PARAM_STR); + break; + case 'ALT': + $stmt->bindValue($identifier, $this->alt, PDO::PARAM_STR); + break; + case 'TITLE': + $stmt->bindValue($identifier, $this->title, PDO::PARAM_STR); + break; + case 'DESCRIPTION': + $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); + break; + case 'CHAPO': + $stmt->bindValue($identifier, $this->chapo, PDO::PARAM_STR); + break; + case 'POSTSCRIPTUM': + $stmt->bindValue($identifier, $this->postscriptum, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = CarouselI18nTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getLocale(); + break; + case 2: + return $this->getAlt(); + break; + case 3: + return $this->getTitle(); + break; + case 4: + return $this->getDescription(); + break; + case 5: + return $this->getChapo(); + break; + case 6: + return $this->getPostscriptum(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['CarouselI18n'][serialize($this->getPrimaryKey())])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['CarouselI18n'][serialize($this->getPrimaryKey())] = true; + $keys = CarouselI18nTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getLocale(), + $keys[2] => $this->getAlt(), + $keys[3] => $this->getTitle(), + $keys[4] => $this->getDescription(), + $keys[5] => $this->getChapo(), + $keys[6] => $this->getPostscriptum(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCarousel) { + $result['Carousel'] = $this->aCarousel->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = CarouselI18nTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setLocale($value); + break; + case 2: + $this->setAlt($value); + break; + case 3: + $this->setTitle($value); + break; + case 4: + $this->setDescription($value); + break; + case 5: + $this->setChapo($value); + break; + case 6: + $this->setPostscriptum($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = CarouselI18nTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setLocale($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setAlt($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setTitle($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setDescription($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setChapo($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setPostscriptum($arr[$keys[6]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CarouselI18nTableMap::DATABASE_NAME); + + if ($this->isColumnModified(CarouselI18nTableMap::ID)) $criteria->add(CarouselI18nTableMap::ID, $this->id); + if ($this->isColumnModified(CarouselI18nTableMap::LOCALE)) $criteria->add(CarouselI18nTableMap::LOCALE, $this->locale); + if ($this->isColumnModified(CarouselI18nTableMap::ALT)) $criteria->add(CarouselI18nTableMap::ALT, $this->alt); + if ($this->isColumnModified(CarouselI18nTableMap::TITLE)) $criteria->add(CarouselI18nTableMap::TITLE, $this->title); + if ($this->isColumnModified(CarouselI18nTableMap::DESCRIPTION)) $criteria->add(CarouselI18nTableMap::DESCRIPTION, $this->description); + if ($this->isColumnModified(CarouselI18nTableMap::CHAPO)) $criteria->add(CarouselI18nTableMap::CHAPO, $this->chapo); + if ($this->isColumnModified(CarouselI18nTableMap::POSTSCRIPTUM)) $criteria->add(CarouselI18nTableMap::POSTSCRIPTUM, $this->postscriptum); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CarouselI18nTableMap::DATABASE_NAME); + $criteria->add(CarouselI18nTableMap::ID, $this->id); + $criteria->add(CarouselI18nTableMap::LOCALE, $this->locale); + + return $criteria; + } + + /** + * Returns the composite primary key for this object. + * The array elements will be in same order as specified in XML. + * @return array + */ + public function getPrimaryKey() + { + $pks = array(); + $pks[0] = $this->getId(); + $pks[1] = $this->getLocale(); + + return $pks; + } + + /** + * Set the [composite] primary key. + * + * @param array $keys The elements of the composite key (order must match the order in XML file). + * @return void + */ + public function setPrimaryKey($keys) + { + $this->setId($keys[0]); + $this->setLocale($keys[1]); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return (null === $this->getId()) && (null === $this->getLocale()); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Carousel\Model\CarouselI18n (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setId($this->getId()); + $copyObj->setLocale($this->getLocale()); + $copyObj->setAlt($this->getAlt()); + $copyObj->setTitle($this->getTitle()); + $copyObj->setDescription($this->getDescription()); + $copyObj->setChapo($this->getChapo()); + $copyObj->setPostscriptum($this->getPostscriptum()); + if ($makeNew) { + $copyObj->setNew(true); + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Carousel\Model\CarouselI18n Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Declares an association between this object and a ChildCarousel object. + * + * @param ChildCarousel $v + * @return \Carousel\Model\CarouselI18n The current object (for fluent API support) + * @throws PropelException + */ + public function setCarousel(ChildCarousel $v = null) + { + if ($v === null) { + $this->setId(NULL); + } else { + $this->setId($v->getId()); + } + + $this->aCarousel = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the ChildCarousel object, it will not be re-added. + if ($v !== null) { + $v->addCarouselI18n($this); + } + + + return $this; + } + + + /** + * Get the associated ChildCarousel object + * + * @param ConnectionInterface $con Optional Connection object. + * @return ChildCarousel The associated ChildCarousel object. + * @throws PropelException + */ + public function getCarousel(ConnectionInterface $con = null) + { + if ($this->aCarousel === null && ($this->id !== null)) { + $this->aCarousel = ChildCarouselQuery::create()->findPk($this->id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCarousel->addCarouselI18ns($this); + */ + } + + return $this->aCarousel; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->locale = null; + $this->alt = null; + $this->title = null; + $this->description = null; + $this->chapo = null; + $this->postscriptum = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + $this->aCarousel = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CarouselI18nTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/Carousel/Model/Base/CarouselI18nQuery.php b/local/modules/Carousel/Model/Base/CarouselI18nQuery.php new file mode 100644 index 00000000..51711281 --- /dev/null +++ b/local/modules/Carousel/Model/Base/CarouselI18nQuery.php @@ -0,0 +1,640 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(array(12, 34), $con); + * + * + * @param array[$id, $locale] $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildCarouselI18n|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CarouselI18nTableMap::getInstanceFromPool(serialize(array((string) $key[0], (string) $key[1]))))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(CarouselI18nTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildCarouselI18n A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, LOCALE, ALT, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM FROM carousel_i18n WHERE ID = :p0 AND LOCALE = :p1'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key[0], PDO::PARAM_INT); + $stmt->bindValue(':p1', $key[1], PDO::PARAM_STR); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildCarouselI18n(); + $obj->hydrate($row); + CarouselI18nTableMap::addInstanceToPool($obj, serialize(array((string) $key[0], (string) $key[1]))); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildCarouselI18n|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(array(12, 56), array(832, 123), array(123, 456)), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + $this->addUsingAlias(CarouselI18nTableMap::ID, $key[0], Criteria::EQUAL); + $this->addUsingAlias(CarouselI18nTableMap::LOCALE, $key[1], Criteria::EQUAL); + + return $this; + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + if (empty($keys)) { + return $this->add(null, '1<>1', Criteria::CUSTOM); + } + foreach ($keys as $key) { + $cton0 = $this->getNewCriterion(CarouselI18nTableMap::ID, $key[0], Criteria::EQUAL); + $cton1 = $this->getNewCriterion(CarouselI18nTableMap::LOCALE, $key[1], Criteria::EQUAL); + $cton0->addAnd($cton1); + $this->addOr($cton0); + } + + return $this; + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @see filterByCarousel() + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CarouselI18nTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CarouselI18nTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the locale column + * + * Example usage: + * + * $query->filterByLocale('fooValue'); // WHERE locale = 'fooValue' + * $query->filterByLocale('%fooValue%'); // WHERE locale LIKE '%fooValue%' + * + * + * @param string $locale The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByLocale($locale = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($locale)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $locale)) { + $locale = str_replace('*', '%', $locale); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::LOCALE, $locale, $comparison); + } + + /** + * Filter the query on the alt column + * + * Example usage: + * + * $query->filterByAlt('fooValue'); // WHERE alt = 'fooValue' + * $query->filterByAlt('%fooValue%'); // WHERE alt LIKE '%fooValue%' + * + * + * @param string $alt The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByAlt($alt = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($alt)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $alt)) { + $alt = str_replace('*', '%', $alt); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::ALT, $alt, $comparison); + } + + /** + * Filter the query on the title column + * + * Example usage: + * + * $query->filterByTitle('fooValue'); // WHERE title = 'fooValue' + * $query->filterByTitle('%fooValue%'); // WHERE title LIKE '%fooValue%' + * + * + * @param string $title The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByTitle($title = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($title)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $title)) { + $title = str_replace('*', '%', $title); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::TITLE, $title, $comparison); + } + + /** + * Filter the query on the description column + * + * Example usage: + * + * $query->filterByDescription('fooValue'); // WHERE description = 'fooValue' + * $query->filterByDescription('%fooValue%'); // WHERE description LIKE '%fooValue%' + * + * + * @param string $description The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByDescription($description = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($description)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $description)) { + $description = str_replace('*', '%', $description); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::DESCRIPTION, $description, $comparison); + } + + /** + * Filter the query on the chapo column + * + * Example usage: + * + * $query->filterByChapo('fooValue'); // WHERE chapo = 'fooValue' + * $query->filterByChapo('%fooValue%'); // WHERE chapo LIKE '%fooValue%' + * + * + * @param string $chapo The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByChapo($chapo = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($chapo)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $chapo)) { + $chapo = str_replace('*', '%', $chapo); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::CHAPO, $chapo, $comparison); + } + + /** + * Filter the query on the postscriptum column + * + * Example usage: + * + * $query->filterByPostscriptum('fooValue'); // WHERE postscriptum = 'fooValue' + * $query->filterByPostscriptum('%fooValue%'); // WHERE postscriptum LIKE '%fooValue%' + * + * + * @param string $postscriptum The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByPostscriptum($postscriptum = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($postscriptum)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $postscriptum)) { + $postscriptum = str_replace('*', '%', $postscriptum); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselI18nTableMap::POSTSCRIPTUM, $postscriptum, $comparison); + } + + /** + * Filter the query by a related \Carousel\Model\Carousel object + * + * @param \Carousel\Model\Carousel|ObjectCollection $carousel The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function filterByCarousel($carousel, $comparison = null) + { + if ($carousel instanceof \Carousel\Model\Carousel) { + return $this + ->addUsingAlias(CarouselI18nTableMap::ID, $carousel->getId(), $comparison); + } elseif ($carousel instanceof ObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CarouselI18nTableMap::ID, $carousel->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterByCarousel() only accepts arguments of type \Carousel\Model\Carousel or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the Carousel relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function joinCarousel($relationAlias = null, $joinType = 'LEFT JOIN') + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('Carousel'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'Carousel'); + } + + return $this; + } + + /** + * Use the Carousel relation Carousel object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Carousel\Model\CarouselQuery A secondary query class using the current class as primary query + */ + public function useCarouselQuery($relationAlias = null, $joinType = 'LEFT JOIN') + { + return $this + ->joinCarousel($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'Carousel', '\Carousel\Model\CarouselQuery'); + } + + /** + * Exclude object from result + * + * @param ChildCarouselI18n $carouselI18n Object to remove from the list of results + * + * @return ChildCarouselI18nQuery The current query, for fluid interface + */ + public function prune($carouselI18n = null) + { + if ($carouselI18n) { + $this->addCond('pruneCond0', $this->getAliasedColName(CarouselI18nTableMap::ID), $carouselI18n->getId(), Criteria::NOT_EQUAL); + $this->addCond('pruneCond1', $this->getAliasedColName(CarouselI18nTableMap::LOCALE), $carouselI18n->getLocale(), Criteria::NOT_EQUAL); + $this->combine(array('pruneCond0', 'pruneCond1'), Criteria::LOGICAL_OR); + } + + return $this; + } + + /** + * Deletes all rows from the carousel_i18n table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselI18nTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CarouselI18nTableMap::clearInstancePool(); + CarouselI18nTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildCarouselI18n or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildCarouselI18n object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselI18nTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(CarouselI18nTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + CarouselI18nTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + CarouselI18nTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // CarouselI18nQuery diff --git a/local/modules/Carousel/Model/Base/CarouselQuery.php b/local/modules/Carousel/Model/Base/CarouselQuery.php new file mode 100644 index 00000000..b9387e00 --- /dev/null +++ b/local/modules/Carousel/Model/Base/CarouselQuery.php @@ -0,0 +1,753 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildCarousel|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CarouselTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(CarouselTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildCarousel A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, FILE, POSITION, URL, CREATED_AT, UPDATED_AT FROM carousel WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildCarousel(); + $obj->hydrate($row); + CarouselTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildCarousel|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CarouselTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CarouselTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CarouselTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CarouselTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CarouselTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the file column + * + * Example usage: + * + * $query->filterByFile('fooValue'); // WHERE file = 'fooValue' + * $query->filterByFile('%fooValue%'); // WHERE file LIKE '%fooValue%' + * + * + * @param string $file The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByFile($file = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($file)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $file)) { + $file = str_replace('*', '%', $file); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselTableMap::FILE, $file, $comparison); + } + + /** + * Filter the query on the position column + * + * Example usage: + * + * $query->filterByPosition(1234); // WHERE position = 1234 + * $query->filterByPosition(array(12, 34)); // WHERE position IN (12, 34) + * $query->filterByPosition(array('min' => 12)); // WHERE position > 12 + * + * + * @param mixed $position The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByPosition($position = null, $comparison = null) + { + if (is_array($position)) { + $useMinMax = false; + if (isset($position['min'])) { + $this->addUsingAlias(CarouselTableMap::POSITION, $position['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($position['max'])) { + $this->addUsingAlias(CarouselTableMap::POSITION, $position['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CarouselTableMap::POSITION, $position, $comparison); + } + + /** + * Filter the query on the url column + * + * Example usage: + * + * $query->filterByUrl('fooValue'); // WHERE url = 'fooValue' + * $query->filterByUrl('%fooValue%'); // WHERE url LIKE '%fooValue%' + * + * + * @param string $url The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByUrl($url = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($url)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $url)) { + $url = str_replace('*', '%', $url); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CarouselTableMap::URL, $url, $comparison); + } + + /** + * Filter the query on the created_at column + * + * Example usage: + * + * $query->filterByCreatedAt('2011-03-14'); // WHERE created_at = '2011-03-14' + * $query->filterByCreatedAt('now'); // WHERE created_at = '2011-03-14' + * $query->filterByCreatedAt(array('max' => 'yesterday')); // WHERE created_at > '2011-03-13' + * + * + * @param mixed $createdAt The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByCreatedAt($createdAt = null, $comparison = null) + { + if (is_array($createdAt)) { + $useMinMax = false; + if (isset($createdAt['min'])) { + $this->addUsingAlias(CarouselTableMap::CREATED_AT, $createdAt['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($createdAt['max'])) { + $this->addUsingAlias(CarouselTableMap::CREATED_AT, $createdAt['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CarouselTableMap::CREATED_AT, $createdAt, $comparison); + } + + /** + * Filter the query on the updated_at column + * + * Example usage: + * + * $query->filterByUpdatedAt('2011-03-14'); // WHERE updated_at = '2011-03-14' + * $query->filterByUpdatedAt('now'); // WHERE updated_at = '2011-03-14' + * $query->filterByUpdatedAt(array('max' => 'yesterday')); // WHERE updated_at > '2011-03-13' + * + * + * @param mixed $updatedAt The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByUpdatedAt($updatedAt = null, $comparison = null) + { + if (is_array($updatedAt)) { + $useMinMax = false; + if (isset($updatedAt['min'])) { + $this->addUsingAlias(CarouselTableMap::UPDATED_AT, $updatedAt['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($updatedAt['max'])) { + $this->addUsingAlias(CarouselTableMap::UPDATED_AT, $updatedAt['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CarouselTableMap::UPDATED_AT, $updatedAt, $comparison); + } + + /** + * Filter the query by a related \Carousel\Model\CarouselI18n object + * + * @param \Carousel\Model\CarouselI18n|ObjectCollection $carouselI18n the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function filterByCarouselI18n($carouselI18n, $comparison = null) + { + if ($carouselI18n instanceof \Carousel\Model\CarouselI18n) { + return $this + ->addUsingAlias(CarouselTableMap::ID, $carouselI18n->getId(), $comparison); + } elseif ($carouselI18n instanceof ObjectCollection) { + return $this + ->useCarouselI18nQuery() + ->filterByPrimaryKeys($carouselI18n->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterByCarouselI18n() only accepts arguments of type \Carousel\Model\CarouselI18n or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the CarouselI18n relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function joinCarouselI18n($relationAlias = null, $joinType = 'LEFT JOIN') + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('CarouselI18n'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'CarouselI18n'); + } + + return $this; + } + + /** + * Use the CarouselI18n relation CarouselI18n object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Carousel\Model\CarouselI18nQuery A secondary query class using the current class as primary query + */ + public function useCarouselI18nQuery($relationAlias = null, $joinType = 'LEFT JOIN') + { + return $this + ->joinCarouselI18n($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CarouselI18n', '\Carousel\Model\CarouselI18nQuery'); + } + + /** + * Exclude object from result + * + * @param ChildCarousel $carousel Object to remove from the list of results + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function prune($carousel = null) + { + if ($carousel) { + $this->addUsingAlias(CarouselTableMap::ID, $carousel->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the carousel table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CarouselTableMap::clearInstancePool(); + CarouselTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildCarousel or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildCarousel object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(CarouselTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + CarouselTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + CarouselTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + + // timestampable behavior + + /** + * Filter by the latest updated + * + * @param int $nbDays Maximum age of the latest update in days + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function recentlyUpdated($nbDays = 7) + { + return $this->addUsingAlias(CarouselTableMap::UPDATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); + } + + /** + * Filter by the latest created + * + * @param int $nbDays Maximum age of in days + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function recentlyCreated($nbDays = 7) + { + return $this->addUsingAlias(CarouselTableMap::CREATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); + } + + /** + * Order by update date desc + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function lastUpdatedFirst() + { + return $this->addDescendingOrderByColumn(CarouselTableMap::UPDATED_AT); + } + + /** + * Order by update date asc + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function firstUpdatedFirst() + { + return $this->addAscendingOrderByColumn(CarouselTableMap::UPDATED_AT); + } + + /** + * Order by create date desc + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function lastCreatedFirst() + { + return $this->addDescendingOrderByColumn(CarouselTableMap::CREATED_AT); + } + + /** + * Order by create date asc + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function firstCreatedFirst() + { + return $this->addAscendingOrderByColumn(CarouselTableMap::CREATED_AT); + } + + // i18n behavior + + /** + * Adds a JOIN clause to the query using the i18n relation + * + * @param string $locale Locale to use for the join condition, e.g. 'fr_FR' + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'. Defaults to left join. + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function joinI18n($locale = 'en_US', $relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $relationName = $relationAlias ? $relationAlias : 'CarouselI18n'; + + return $this + ->joinCarouselI18n($relationAlias, $joinType) + ->addJoinCondition($relationName, $relationName . '.Locale = ?', $locale); + } + + /** + * Adds a JOIN clause to the query and hydrates the related I18n object. + * Shortcut for $c->joinI18n($locale)->with() + * + * @param string $locale Locale to use for the join condition, e.g. 'fr_FR' + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'. Defaults to left join. + * + * @return ChildCarouselQuery The current query, for fluid interface + */ + public function joinWithI18n($locale = 'en_US', $joinType = Criteria::LEFT_JOIN) + { + $this + ->joinI18n($locale, null, $joinType) + ->with('CarouselI18n'); + $this->with['CarouselI18n']->setIsWithOneToMany(false); + + return $this; + } + + /** + * Use the I18n relation query object + * + * @see useQuery() + * + * @param string $locale Locale to use for the join condition, e.g. 'fr_FR' + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'. Defaults to left join. + * + * @return ChildCarouselI18nQuery A secondary query class using the current class as primary query + */ + public function useI18nQuery($locale = 'en_US', $relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinI18n($locale, $relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'CarouselI18n', '\Carousel\Model\CarouselI18nQuery'); + } + +} // CarouselQuery diff --git a/local/modules/Carousel/Model/Carousel.php b/local/modules/Carousel/Model/Carousel.php new file mode 100644 index 00000000..50971104 --- /dev/null +++ b/local/modules/Carousel/Model/Carousel.php @@ -0,0 +1,113 @@ +remove($carousel->getUploadDir() . DS . $this->getFile()); + + return true; + } catch (IOException $e) { + return false; + } + } + + /** + * Set file parent id + * + * @param int $parentId parent id + * + * @return $this + */ + public function setParentId($parentId) + { + return $this; + } + + /** + * Get file parent id + * + * @return int parent id + */ + public function getParentId() + { + return $this->getId(); + } + + /** + * @return FileModelParentInterface the parent file model + */ + public function getParentFileModel() + { + return new static; + } + + /** + * Get the ID of the form used to change this object information + * + * @return BaseForm the form + */ + public function getUpdateFormId() + { + return 'carousel.image'; + } + + /** + * @return string the path to the upload directory where files are stored, without final slash + */ + public function getUploadDir() + { + $carousel = new \Carousel\Carousel(); + return $carousel->getUploadDir(); + } + + /** + * @param int $objectId the object ID + * + * @return string the URL to redirect to after update from the back-office + */ + public function getRedirectionUrl() + { + return '/admin/module/Carousel'; + } + + /** + * Get the Query instance for this object + * + * @return ModelCriteria + */ + public function getQueryInstance() + { + return CarouselQuery::create(); + } + + /** + * @param bool $visible true if the file is visible, false otherwise + * @return FileModelInterface + */ + public function setVisible($visible) + { + // Not implemented + + return $this; + } +} diff --git a/local/modules/Carousel/Model/CarouselI18n.php b/local/modules/Carousel/Model/CarouselI18n.php new file mode 100644 index 00000000..d03081e3 --- /dev/null +++ b/local/modules/Carousel/Model/CarouselI18n.php @@ -0,0 +1,10 @@ +orderByPosition() + ->find(); + } +} // CarouselQuery diff --git a/local/modules/Carousel/Model/Map/CarouselI18nTableMap.php b/local/modules/Carousel/Model/Map/CarouselI18nTableMap.php new file mode 100644 index 00000000..e63326c5 --- /dev/null +++ b/local/modules/Carousel/Model/Map/CarouselI18nTableMap.php @@ -0,0 +1,506 @@ + array('Id', 'Locale', 'Alt', 'Title', 'Description', 'Chapo', 'Postscriptum', ), + self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'alt', 'title', 'description', 'chapo', 'postscriptum', ), + self::TYPE_COLNAME => array(CarouselI18nTableMap::ID, CarouselI18nTableMap::LOCALE, CarouselI18nTableMap::ALT, CarouselI18nTableMap::TITLE, CarouselI18nTableMap::DESCRIPTION, CarouselI18nTableMap::CHAPO, CarouselI18nTableMap::POSTSCRIPTUM, ), + self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'ALT', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', ), + self::TYPE_FIELDNAME => array('id', 'locale', 'alt', 'title', 'description', 'chapo', 'postscriptum', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Alt' => 2, 'Title' => 3, 'Description' => 4, 'Chapo' => 5, 'Postscriptum' => 6, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'alt' => 2, 'title' => 3, 'description' => 4, 'chapo' => 5, 'postscriptum' => 6, ), + self::TYPE_COLNAME => array(CarouselI18nTableMap::ID => 0, CarouselI18nTableMap::LOCALE => 1, CarouselI18nTableMap::ALT => 2, CarouselI18nTableMap::TITLE => 3, CarouselI18nTableMap::DESCRIPTION => 4, CarouselI18nTableMap::CHAPO => 5, CarouselI18nTableMap::POSTSCRIPTUM => 6, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'ALT' => 2, 'TITLE' => 3, 'DESCRIPTION' => 4, 'CHAPO' => 5, 'POSTSCRIPTUM' => 6, ), + self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'alt' => 2, 'title' => 3, 'description' => 4, 'chapo' => 5, 'postscriptum' => 6, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('carousel_i18n'); + $this->setPhpName('CarouselI18n'); + $this->setClassName('\\Carousel\\Model\\CarouselI18n'); + $this->setPackage('Carousel.Model'); + $this->setUseIdGenerator(false); + // columns + $this->addForeignPrimaryKey('ID', 'Id', 'INTEGER' , 'carousel', 'ID', true, null, null); + $this->addPrimaryKey('LOCALE', 'Locale', 'VARCHAR', true, 5, 'en_US'); + $this->addColumn('ALT', 'Alt', 'VARCHAR', false, 255, null); + $this->addColumn('TITLE', 'Title', 'VARCHAR', false, 255, null); + $this->addColumn('DESCRIPTION', 'Description', 'CLOB', false, null, null); + $this->addColumn('CHAPO', 'Chapo', 'LONGVARCHAR', false, null, null); + $this->addColumn('POSTSCRIPTUM', 'Postscriptum', 'LONGVARCHAR', false, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('Carousel', '\\Carousel\\Model\\Carousel', RelationMap::MANY_TO_ONE, array('id' => 'id', ), 'CASCADE', null); + } // buildRelations() + + /** + * Adds an object to the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases you may need to explicitly add objects + * to the cache in order to ensure that the same objects are always returned by find*() + * and findPk*() calls. + * + * @param \Carousel\Model\CarouselI18n $obj A \Carousel\Model\CarouselI18n object. + * @param string $key (optional) key to use for instance map (for performance boost if key was already calculated externally). + */ + public static function addInstanceToPool($obj, $key = null) + { + if (Propel::isInstancePoolingEnabled()) { + if (null === $key) { + $key = serialize(array((string) $obj->getId(), (string) $obj->getLocale())); + } // if key === null + self::$instances[$key] = $obj; + } + } + + /** + * Removes an object from the instance pool. + * + * Propel keeps cached copies of objects in an instance pool when they are retrieved + * from the database. In some cases -- especially when you override doDelete + * methods in your stub classes -- you may need to explicitly remove objects + * from the cache in order to prevent returning objects that no longer exist. + * + * @param mixed $value A \Carousel\Model\CarouselI18n object or a primary key value. + */ + public static function removeInstanceFromPool($value) + { + if (Propel::isInstancePoolingEnabled() && null !== $value) { + if (is_object($value) && $value instanceof \Carousel\Model\CarouselI18n) { + $key = serialize(array((string) $value->getId(), (string) $value->getLocale())); + + } elseif (is_array($value) && count($value) === 2) { + // assume we've been passed a primary key"; + $key = serialize(array((string) $value[0], (string) $value[1])); + } elseif ($value instanceof Criteria) { + self::$instances = []; + + return; + } else { + $e = new PropelException("Invalid value passed to removeInstanceFromPool(). Expected primary key or \Carousel\Model\CarouselI18n object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value, true))); + throw $e; + } + + unset(self::$instances[$key]); + } + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null && $row[TableMap::TYPE_NUM == $indexType ? 1 + $offset : static::translateFieldName('Locale', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return serialize(array((string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)], (string) $row[TableMap::TYPE_NUM == $indexType ? 1 + $offset : static::translateFieldName('Locale', TableMap::TYPE_PHPNAME, $indexType)])); + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return $pks; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? CarouselI18nTableMap::CLASS_DEFAULT : CarouselI18nTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (CarouselI18n object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = CarouselI18nTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = CarouselI18nTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + CarouselI18nTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = CarouselI18nTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + CarouselI18nTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = CarouselI18nTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = CarouselI18nTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CarouselI18nTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CarouselI18nTableMap::ID); + $criteria->addSelectColumn(CarouselI18nTableMap::LOCALE); + $criteria->addSelectColumn(CarouselI18nTableMap::ALT); + $criteria->addSelectColumn(CarouselI18nTableMap::TITLE); + $criteria->addSelectColumn(CarouselI18nTableMap::DESCRIPTION); + $criteria->addSelectColumn(CarouselI18nTableMap::CHAPO); + $criteria->addSelectColumn(CarouselI18nTableMap::POSTSCRIPTUM); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.LOCALE'); + $criteria->addSelectColumn($alias . '.ALT'); + $criteria->addSelectColumn($alias . '.TITLE'); + $criteria->addSelectColumn($alias . '.DESCRIPTION'); + $criteria->addSelectColumn($alias . '.CHAPO'); + $criteria->addSelectColumn($alias . '.POSTSCRIPTUM'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(CarouselI18nTableMap::DATABASE_NAME)->getTable(CarouselI18nTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(CarouselI18nTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(CarouselI18nTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new CarouselI18nTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a CarouselI18n or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or CarouselI18n object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselI18nTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Carousel\Model\CarouselI18n) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CarouselI18nTableMap::DATABASE_NAME); + // primary key is composite; we therefore, expect + // the primary key passed to be an array of pkey values + if (count($values) == count($values, COUNT_RECURSIVE)) { + // array is not multi-dimensional + $values = array($values); + } + foreach ($values as $value) { + $criterion = $criteria->getNewCriterion(CarouselI18nTableMap::ID, $value[0]); + $criterion->addAnd($criteria->getNewCriterion(CarouselI18nTableMap::LOCALE, $value[1])); + $criteria->addOr($criterion); + } + } + + $query = CarouselI18nQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { CarouselI18nTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { CarouselI18nTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the carousel_i18n table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return CarouselI18nQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a CarouselI18n or Criteria object. + * + * @param mixed $criteria Criteria or CarouselI18n object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselI18nTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from CarouselI18n object + } + + + // Set the correct dbName + $query = CarouselI18nQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // CarouselI18nTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +CarouselI18nTableMap::buildTableMap(); diff --git a/local/modules/Carousel/Model/Map/CarouselTableMap.php b/local/modules/Carousel/Model/Map/CarouselTableMap.php new file mode 100644 index 00000000..ca7b8883 --- /dev/null +++ b/local/modules/Carousel/Model/Map/CarouselTableMap.php @@ -0,0 +1,475 @@ + array('Id', 'File', 'Position', 'Url', 'CreatedAt', 'UpdatedAt', ), + self::TYPE_STUDLYPHPNAME => array('id', 'file', 'position', 'url', 'createdAt', 'updatedAt', ), + self::TYPE_COLNAME => array(CarouselTableMap::ID, CarouselTableMap::FILE, CarouselTableMap::POSITION, CarouselTableMap::URL, CarouselTableMap::CREATED_AT, CarouselTableMap::UPDATED_AT, ), + self::TYPE_RAW_COLNAME => array('ID', 'FILE', 'POSITION', 'URL', 'CREATED_AT', 'UPDATED_AT', ), + self::TYPE_FIELDNAME => array('id', 'file', 'position', 'url', 'created_at', 'updated_at', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'File' => 1, 'Position' => 2, 'Url' => 3, 'CreatedAt' => 4, 'UpdatedAt' => 5, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'file' => 1, 'position' => 2, 'url' => 3, 'createdAt' => 4, 'updatedAt' => 5, ), + self::TYPE_COLNAME => array(CarouselTableMap::ID => 0, CarouselTableMap::FILE => 1, CarouselTableMap::POSITION => 2, CarouselTableMap::URL => 3, CarouselTableMap::CREATED_AT => 4, CarouselTableMap::UPDATED_AT => 5, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'FILE' => 1, 'POSITION' => 2, 'URL' => 3, 'CREATED_AT' => 4, 'UPDATED_AT' => 5, ), + self::TYPE_FIELDNAME => array('id' => 0, 'file' => 1, 'position' => 2, 'url' => 3, 'created_at' => 4, 'updated_at' => 5, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('carousel'); + $this->setPhpName('Carousel'); + $this->setClassName('\\Carousel\\Model\\Carousel'); + $this->setPackage('Carousel.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addColumn('FILE', 'File', 'VARCHAR', false, 255, null); + $this->addColumn('POSITION', 'Position', 'INTEGER', false, null, null); + $this->addColumn('URL', 'Url', 'VARCHAR', false, 255, null); + $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); + $this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('CarouselI18n', '\\Carousel\\Model\\CarouselI18n', RelationMap::ONE_TO_MANY, array('id' => 'id', ), 'CASCADE', null, 'CarouselI18ns'); + } // buildRelations() + + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), + 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'alt, title, description, chapo, postscriptum', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), + ); + } // getBehaviors() + /** + * Method to invalidate the instance pool of all tables related to carousel * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + CarouselI18nTableMap::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? CarouselTableMap::CLASS_DEFAULT : CarouselTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (Carousel object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = CarouselTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = CarouselTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + CarouselTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = CarouselTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + CarouselTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = CarouselTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = CarouselTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CarouselTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CarouselTableMap::ID); + $criteria->addSelectColumn(CarouselTableMap::FILE); + $criteria->addSelectColumn(CarouselTableMap::POSITION); + $criteria->addSelectColumn(CarouselTableMap::URL); + $criteria->addSelectColumn(CarouselTableMap::CREATED_AT); + $criteria->addSelectColumn(CarouselTableMap::UPDATED_AT); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.FILE'); + $criteria->addSelectColumn($alias . '.POSITION'); + $criteria->addSelectColumn($alias . '.URL'); + $criteria->addSelectColumn($alias . '.CREATED_AT'); + $criteria->addSelectColumn($alias . '.UPDATED_AT'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(CarouselTableMap::DATABASE_NAME)->getTable(CarouselTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(CarouselTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(CarouselTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new CarouselTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a Carousel or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or Carousel object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Carousel\Model\Carousel) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CarouselTableMap::DATABASE_NAME); + $criteria->add(CarouselTableMap::ID, (array) $values, Criteria::IN); + } + + $query = CarouselQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { CarouselTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { CarouselTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the carousel table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return CarouselQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a Carousel or Criteria object. + * + * @param mixed $criteria Criteria or Carousel object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CarouselTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from Carousel object + } + + if ($criteria->containsKey(CarouselTableMap::ID) && $criteria->keyContainsValue(CarouselTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CarouselTableMap::ID.')'); + } + + + // Set the correct dbName + $query = CarouselQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // CarouselTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +CarouselTableMap::buildTableMap(); diff --git a/local/modules/Carousel/Readme.md b/local/modules/Carousel/Readme.md new file mode 100644 index 00000000..6b372438 --- /dev/null +++ b/local/modules/Carousel/Readme.md @@ -0,0 +1,62 @@ +# Carousel + +This module for Thelia add a customizable carousel on your home page. You can upload you own image and overload the default template in your template for using the carousel. + +## Installation + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is Carousel. +* Activate it in your thelia administration panel + +## Usage + +In the configuration panel of this module, you can upload as many images as you want. + +## Hook + +The carousel is installed in the "Home page - main area" (home.body) hook. + +## Loop + +Customize images with the `carousel` loop, which has the same arguments as the `image` loop. You can define a width, a height, and many other parameters + +### Input arguments + +|Argument |Description | +|--- |--- | +|**width** | A width in pixels, for resizing image. If only the width is provided, the image ratio is preserved. Example : width="200" | +|**height** | A height in pixels, for resizing image. If only the height is provided, the image ratio is preserved. example : height="200" | +|**rotation** |The rotation angle in degrees (positive or negative) applied to the image. The background color of the empty areas is the one specified by 'background_color'. example : rotation="90" | +|**background_color** |The color applied to empty image parts during processing. Use $rgb or $rrggbb color format. example : background_color="$cc8000"| +|**quality** |The generated image quality, from 0(!) to 100%. The default value is 75% (you can hange this in the Administration panel). example : quality="70"| +|**resize_mode** | If 'crop', the image will have the exact specified width and height, and will be cropped if required. If 'borders', the image will have the exact specified width and height, and some borders may be added. The border color is the one specified by 'background_color'. If 'none' or missing, the image ratio is preserved, and depending od this ratio, may not have the exact width and height required. resize_mode="crop"| +|**effects** |One or more comma separated effects definitions, that will be applied to the image in the specified order. Please see below a detailed description of available effects. Expected values :
  • gamma:value : change the image Gamma to the specified value. Example: gamma:0.7.
  • grayscale or greyscale : switch image to grayscale.
  • colorize:color : apply a color mask to the image. The color format is $rgb or $rrggbb. Example: colorize:$ff2244.
  • negative : transform the image in its negative equivalent.
  • vflip or vertical_flip : flip the image vertically.
  • hflip or horizontal_flip : flip the image horizontally.
example : effects="greyscale,gamma:0.7,vflip" | + +### Ouput arguments + +|Variable |Description | +|--- |--- | +|$ID |the image ID | +|$IMAGE_URL |The absolute URL to the generated image | +|$ORIGINAL_IMAGE_URL |The absolute URL to the original image | +|$IMAGE_PATH |The absolute path to the generated image file | +|$ORIGINAL_IMAGE_PATH |The absolute path to the original image file | +|$ALT |alt text | +|$TITLE |the image title | +|$CHAPO |the image summary | +|$DESCRIPTION |the image description | +|$POSTSCRIPTUM |the image conclusion | +|$LOCALE |the textual elements locale | +|$POSITION |the image position in the carousel | +|$URL |the related URL | + +### Exemple + +``` +{loop type="carousel" name="carousel.front" width="1200" height="390" resize_mode="borders"} + {$ALT} +{/loop} +``` + +## How to override ? + +If you want your own carousel in your tempalte, create the directory ```modules/Carousel``` then create the template ```carousel.html``` in this directory. Here you can create your own carousel and the replace the default template provided in the module. diff --git a/local/modules/Carousel/composer.json b/local/modules/Carousel/composer.json new file mode 100644 index 00000000..5cfd6d37 --- /dev/null +++ b/local/modules/Carousel/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/carousel-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "Carousel" + } +} diff --git a/local/modules/Carousel/templates/backOffice/default/assets/js/module-configuration.js b/local/modules/Carousel/templates/backOffice/default/assets/js/module-configuration.js new file mode 100644 index 00000000..54b03e5f --- /dev/null +++ b/local/modules/Carousel/templates/backOffice/default/assets/js/module-configuration.js @@ -0,0 +1,6 @@ +$(function() { + // Set proper image ID in delete from + $('a.image-delete').click(function(ev) { + $('#image_delete_id').val($(this).data('id')); + }); +}); diff --git a/local/modules/Carousel/templates/backOffice/default/module_configuration.html b/local/modules/Carousel/templates/backOffice/default/module_configuration.html new file mode 100644 index 00000000..c2467ce7 --- /dev/null +++ b/local/modules/Carousel/templates/backOffice/default/module_configuration.html @@ -0,0 +1,130 @@ +
+
+
+ {intl l='Edit your carousel.' d='carousel.bo.default'} +
+
+ +
+
+
+ {form name="carousel.image"} + + + {form_hidden_fields} + + {form_field field='file'} +
+ +
+ + + + +
+
+ {/form_field} + + {/form} +
+
+
+ +
+
+ {intl l='Carousel images' d='carousel.bo.default'} +
+
+ +
+
+
+ {ifloop rel="carousel.image"} + {form name="carousel.update"} +
+ + {include + file = "includes/inner-form-toolbar.html" + page_url = "{url path='/admin/module/Carousel'}" + close_url = "{url path='/admin/modules'}" + } + + {form_hidden_fields} + + {loop name="carousel.image" type="carousel" width="550" height="200" resize_mode="borders" backend_context="1" lang="$edit_language_id"} + + {* Not yet implemented *} + {form_field field="position{$ID}"} + + {/form_field} + +
+
+ + +
+ {* Not yet implemented + {render_form_field field="chapo{$ID} value=$CHAPO"} + *} + {render_form_field field="title{$ID}" value=$TITLE} + {render_form_field field="alt{$ID}" value=$ALT} + {render_form_field field="url{$ID}" value=$URL} + {render_form_field field="description{$ID}" extra_class="wysiwyg" value=$DESCRIPTION} + {* Not yet implemented + {render_form_field field="postscriptum{$ID}" value=$POSTSCRIPTUM} + *} +
+
+
+ {/loop} + + {include + file = "includes/inner-form-toolbar.html" + page_url = "{url path='/admin/module/Carousel'}" + close_url = "{url path='/admin/modules'}" + page_bottom = true + } +
+ {/form} + {/ifloop} + + {elseloop rel="carousel.image"} +
+ {intl d='carousel.bo.default' l="Your carousel contains no image. Please add one using the form above."} +
+ {/elseloop} +
+
+
+
+ +{capture "delete_dialog"} + +{/capture} + +{include +file = "includes/generic-confirm-dialog.html" + +dialog_id = "delete_carousel_dialog" +dialog_title = {intl l="Delete a carousel image" d="carousel.bo.default"} +dialog_message = {intl l="Do you really want to remove this image from the carousel ?" d="carousel.bo.default"} + +form_action = {url path='/admin/module/carousel/delete'} +form_content = {$smarty.capture.delete_dialog nofilter} +} + + + + diff --git a/local/modules/Carousel/templates/frontOffice/default/carousel.html b/local/modules/Carousel/templates/frontOffice/default/carousel.html new file mode 100644 index 00000000..6a714a5e --- /dev/null +++ b/local/modules/Carousel/templates/frontOffice/default/carousel.html @@ -0,0 +1,24 @@ +{ifloop rel="carousel.front"} + +{/ifloop} \ No newline at end of file diff --git a/local/modules/Cheque/Cheque.php b/local/modules/Cheque/Cheque.php new file mode 100644 index 00000000..b17bcb19 --- /dev/null +++ b/local/modules/Cheque/Cheque.php @@ -0,0 +1,73 @@ +getCurrentOrderTotalAmount() > 0; + } + + public function postActivation(ConnectionInterface $con = null) + { + $database = new Database($con); + + // Insert email message + $database->insertSql(null, array(__DIR__ . "/Config/setup.sql")); + } + + public function destroy(ConnectionInterface $con = null, $deleteModuleData = false) + { + // Delete our message + if (null !== $message = MessageQuery::create()->findOneByName('order_confirmation_cheque')) { + $message->delete($con); + } + + parent::destroy($con, $deleteModuleData); + } + + /** + * if you want, you can manage stock in your module instead of order process. + * Return false if you want to manage yourself the stock + * + * @return bool + */ + public function manageStockOnCreation() + { + return false; + } +} diff --git a/local/modules/Cheque/Config/config.xml b/local/modules/Cheque/Config/config.xml new file mode 100644 index 00000000..b09cf496 --- /dev/null +++ b/local/modules/Cheque/Config/config.xml @@ -0,0 +1,25 @@ + + + + + +
+ + + + + + + + + + + + + + + + + diff --git a/local/modules/Cheque/Config/module.xml b/local/modules/Cheque/Config/module.xml new file mode 100644 index 00000000..676397d6 --- /dev/null +++ b/local/modules/Cheque/Config/module.xml @@ -0,0 +1,25 @@ + + + Cheque\Cheque + + Cheque + + + Cheque + + images + + en_US + fr_FR + + 2.3.1 + + Manuel Raynaud + manu@raynaud.io + + payment + 2.2.0 + alpha + diff --git a/local/modules/Cheque/Config/routing.xml b/local/modules/Cheque/Config/routing.xml new file mode 100644 index 00000000..8c741c05 --- /dev/null +++ b/local/modules/Cheque/Config/routing.xml @@ -0,0 +1,9 @@ + + + + + Cheque\Controller\ConfigureController::configure + + diff --git a/local/modules/Cheque/Config/setup.sql b/local/modules/Cheque/Config/setup.sql new file mode 100644 index 00000000..2f91a0e7 --- /dev/null +++ b/local/modules/Cheque/Config/setup.sql @@ -0,0 +1,32 @@ +-- --------------------------------------------------------------------- +-- Mail template for cheque +-- --------------------------------------------------------------------- + +-- First, delete existing entries +SET @var := 0; +SELECT @var := `id` FROM `message` WHERE name="order_confirmation_cheque"; +DELETE FROM `message` WHERE `id`=@var; + +-- Then add new entries +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +-- insert message +INSERT INTO `message` (`id`, `name`, `secured`) VALUES + (@max, + 'order_confirmation_cheque', + '0' + ); +-- and mail templates +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES + (@max, + 'en_US', + 'Confirmation of payment by cheque', + 'Payment of order {$order_ref}', 'Dear customer,\r\nThis is a confirmation of the payment by cheque of your order {$order_ref} on our shop.\r\nYour invoice is now available in your customer account at {config key="url_site"}\r\nThank you again for your purchase.\r\nThe {config key="store_name"} team.', '\r\n\r\n\r\n \r\n courriel de confirmation de commande de {config key="url_site"} \r\n \r\n\r\n\r\n
\r\n
\r\n

{config key="store_name"}

\r\n

The payment of your order is confirmed

\r\n

Reference {$order_ref}

\r\n
\r\n

\r\n Your invoice is now available in your customer account on\r\n {config key="store_name"}.\r\n

\r\n

Thank you for your order !

\r\n

The {config key="store_name"} team.

\r\n
\r\n\r\n' + ), + (@max, + 'fr_FR', + 'Confirmation de paiement par chèque', + 'Paiement de la commande : {$order_ref}', + 'Cher client,\r\nCe message confirme le paiement par chèque de votre commande numero {$order_ref} sur notre boutique.\r\nVotre facture est maintenant disponible dans votre compte client à l''adresse {config key="url_site"}\r\nMerci encore pour votre achat !\r\nL''équipe {config key="store_name"}', '\r\n\r\n\r\n \r\n Confirmation du paiement de votre commande sur {config key="url_site"} \r\n \r\n\r\n\r\n
\r\n
\r\n

{config key="store_name"}

\r\n

Confirmation du paiement de votre commande

\r\n

N° {$order_ref}

\r\n
\r\n

\r\n Le suivi de votre commande est disponible dans la rubrique mon compte sur\r\n {config key="url_site"}\r\n

\r\n

Merci pour votre achat !

\r\n

L''équipe {config key="store_name"}

\r\n
\r\n\r\n' + ); diff --git a/local/modules/Cheque/Controller/ConfigureController.php b/local/modules/Cheque/Controller/ConfigureController.php new file mode 100644 index 00000000..5aea04ed --- /dev/null +++ b/local/modules/Cheque/Controller/ConfigureController.php @@ -0,0 +1,98 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Cheque\Controller; + +use Cheque\Cheque; +use Cheque\Form\ConfigurationForm; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Thelia\Controller\Admin\BaseAdminController; +use Thelia\Core\Security\AccessManager; +use Thelia\Core\Security\Resource\AdminResources; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Tools\URL; + +/** + * Class SetTransferConfig + * @package WireTransfer\Controller + * @author Thelia + */ +class ConfigureController extends BaseAdminController +{ + public function configure() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'Cheque', AccessManager::UPDATE)) { + return $response; + } + + // Initialize the potential exception + $ex = null; + + // Create the Form from the request + $configurationForm = $this->createForm('cheque.instructions.configure'); + + try { + // Check the form against constraints violations + $form = $this->validateForm($configurationForm, "POST"); + + // Get the form field values + $data = $form->getData(); + + Cheque::setConfigValue('instructions', $data['instructions'], $this->getCurrentEditionLocale()); + Cheque::setConfigValue('payable_to', $data['payable_to']); + + // Log configuration modification + $this->adminLogAppend( + "cheque.configuration.message", + AccessManager::UPDATE, + sprintf("Cheque instructions configuration updated") + ); + + // Everything is OK. + return new RedirectResponse(URL::getInstance()->absoluteUrl('/admin/module/Cheque')); + + } catch (FormValidationException $ex) { + // Form cannot be validated. Create the error message using + // the BaseAdminController helper method. + $error_msg = $this->createStandardFormValidationErrorMessage($ex); + } + catch (\Exception $ex) { + // Any other error + $error_msg = $ex->getMessage(); + } + + // At this point, the form has errors, and should be redisplayed. We don not redirect, + // just redisplay the same template. + // Setup the Form error context, to make error information available in the template. + $this->setupFormErrorContext( + $this->getTranslator()->trans("Cheque instructions configuration", [], Cheque::MESSAGE_DOMAIN), + $error_msg, + $configurationForm, + $ex + ); + + // Do not redirect at this point, or the error context will be lost. + // Just redisplay the current template. + return $this->render('module-configure', array('module_code' => 'Cheque')); + } +} \ No newline at end of file diff --git a/local/modules/Cheque/Form/ConfigurationForm.php b/local/modules/Cheque/Form/ConfigurationForm.php new file mode 100644 index 00000000..6ab4d5a0 --- /dev/null +++ b/local/modules/Cheque/Form/ConfigurationForm.php @@ -0,0 +1,90 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Cheque\Form; + +use Cheque\Cheque; +use Symfony\Component\Validator\Constraints\NotBlank; +use Thelia\Core\Translation\Translator; +use Thelia\Form\BaseForm; + +/** + * Class ConfigurationForm + * @package Cheque\Form + * @author Thelia + */ +class ConfigurationForm extends BaseForm +{ + protected function trans($str, $params = []) + { + return Translator::getInstance()->trans($str, $params, Cheque::MESSAGE_DOMAIN); + } + + protected function buildForm() + { + $this->formBuilder + ->add( + 'payable_to', + 'text', + [ + 'constraints' => [ new NotBlank() ], + 'label' => $this->trans('Cheque is payable to: '), + 'label_attr' => [ + 'for' => 'payable_to', + 'help' => $this->trans('The name to which the cheque shoud be payable to.') + ], + 'attr' => [ + 'rows' => 10, + 'placeholder' => $this->trans('Pay cheque to') + ] + ] + ) + ->add( + 'instructions', + 'textarea', + [ + 'constraints' => [], + 'required' => false, + 'label' => $this->trans('Cheque instructions'), + 'label_attr' => [ + 'for' => 'namefield', + 'help' => $this->trans('Please enter here the payment by cheque instructions') + ], + 'attr' => [ + 'rows' => 10, + 'placeholder' => $this->trans('Payment instruction') + ] + ] + ) + ; + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'cheque_configuration_instructions'; + } +} \ No newline at end of file diff --git a/local/modules/Cheque/Hook/HookManager.php b/local/modules/Cheque/Hook/HookManager.php new file mode 100644 index 00000000..c0798886 --- /dev/null +++ b/local/modules/Cheque/Hook/HookManager.php @@ -0,0 +1,34 @@ + + */ +class HookManager extends BaseHook { + + public function onAdditionalPaymentInfo(HookRenderEvent $event) + { + $content = $this->render("order-placed.additional-payment-info.html", [ + 'placed_order_id' => $event->getArgument('placed_order_id') + ]); + + $event->add($content); + } +} \ No newline at end of file diff --git a/local/modules/Cheque/I18n/backOffice/default/de_DE.php b/local/modules/Cheque/I18n/backOffice/default/de_DE.php new file mode 100644 index 00000000..6e6d3a79 --- /dev/null +++ b/local/modules/Cheque/I18n/backOffice/default/de_DE.php @@ -0,0 +1,5 @@ + 'Scheck-Anleitungen-Konfiguration', +]; diff --git a/local/modules/Cheque/I18n/backOffice/default/en_US.php b/local/modules/Cheque/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..2219a2f7 --- /dev/null +++ b/local/modules/Cheque/I18n/backOffice/default/en_US.php @@ -0,0 +1,5 @@ + 'Cheque instructions configuration', +); diff --git a/local/modules/Cheque/I18n/backOffice/default/fr_FR.php b/local/modules/Cheque/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..71ae3192 --- /dev/null +++ b/local/modules/Cheque/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,5 @@ + 'Instructions de paiement par chèque', +]; diff --git a/local/modules/Cheque/I18n/backOffice/default/tr_TR.php b/local/modules/Cheque/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..9490b898 --- /dev/null +++ b/local/modules/Cheque/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,5 @@ + 'Çek yönergeleri yapılandırma', +]; diff --git a/local/modules/Cheque/I18n/de_DE.php b/local/modules/Cheque/I18n/de_DE.php new file mode 100644 index 00000000..ffd4ad36 --- /dev/null +++ b/local/modules/Cheque/I18n/de_DE.php @@ -0,0 +1,11 @@ + 'Scheck-Anweisungen', + 'Cheque instructions configuration' => 'Scheck-Anleitungen-Konfiguration', + 'Cheque is payable to: ' => 'Scheck ist zahlbar an: ', + 'Pay cheque to' => 'Scheck bezahlen an', + 'Payment instruction' => 'Zahlungsanweisungen', + 'Please enter here the payment by cheque instructions' => 'Bitte geben Sie hier die Zahlung durch Scheck Anweisungen ein', + 'The name to which the cheque shoud be payable to.' => 'Der Name, an den der Scheck bezahlbar sein soll.', +]; diff --git a/local/modules/Cheque/I18n/en_US.php b/local/modules/Cheque/I18n/en_US.php new file mode 100644 index 00000000..9a0ebf14 --- /dev/null +++ b/local/modules/Cheque/I18n/en_US.php @@ -0,0 +1,11 @@ + 'Cheque instructions', + 'Cheque instructions configuration' => 'Cheque instructions configuration', + 'Cheque is payable to: ' => 'Cheque is payable to: ', + 'Pay cheque to' => 'Pay cheque to', + 'Payment instruction' => 'Payment instruction', + 'Please enter here the payment by cheque instructions' => 'Please enter here the payment by cheque instructions', + 'The name to which the cheque shoud be payable to.' => 'The name to which the cheque shoud be payable to.', +); diff --git a/local/modules/Cheque/I18n/fr_FR.php b/local/modules/Cheque/I18n/fr_FR.php new file mode 100644 index 00000000..b286ccaf --- /dev/null +++ b/local/modules/Cheque/I18n/fr_FR.php @@ -0,0 +1,11 @@ + 'Instructions de paiement', + 'Cheque instructions configuration' => 'Instructions de paiement par chèque', + 'Cheque is payable to: ' => 'Ordre du chèque', + 'Pay cheque to' => 'Ordre du chèque', + 'Payment instruction' => 'Instructions de paiement', + 'Please enter here the payment by cheque instructions' => 'Indiquez ici les instructions particulières de paiement par chèque', + 'The name to which the cheque shoud be payable to.' => 'Le nom à fare figurer sur le chèque', +]; diff --git a/local/modules/Cheque/I18n/frontOffice/default/de_DE.php b/local/modules/Cheque/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..b87c46ae --- /dev/null +++ b/local/modules/Cheque/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,6 @@ + 'Vergessen Sie nicht, Ihren Scheck zu unterschreiben !', + 'Please make your cheque payable to %name, and send it to the following address :' => 'Bitte stellen Sie den Scheck auf %name, und senden Sie es an die folgende Adresse : ', +]; diff --git a/local/modules/Cheque/I18n/frontOffice/default/en_US.php b/local/modules/Cheque/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..ac9f8aaa --- /dev/null +++ b/local/modules/Cheque/I18n/frontOffice/default/en_US.php @@ -0,0 +1,6 @@ + 'Be sure to sign your cheque !', + 'Please make your cheque payable to %name, and send it to the following address :' => 'Please make your cheque payable to %name, and send it to the following address :', +); diff --git a/local/modules/Cheque/I18n/frontOffice/default/fr_FR.php b/local/modules/Cheque/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..b2ac1579 --- /dev/null +++ b/local/modules/Cheque/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,6 @@ + 'N\'oubliez par de signer votre chèque !', + 'Please make your cheque payable to %name, and send it to the following address :' => 'Merci de libeller votre chèque à l\'ordre de %name, et de l\'expédier à l\'adresse suivante :', +]; diff --git a/local/modules/Cheque/I18n/frontOffice/default/tr_TR.php b/local/modules/Cheque/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..1337c364 --- /dev/null +++ b/local/modules/Cheque/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,6 @@ + 'Çekini imzalamak emin olun!', + 'Please make your cheque payable to %name, and send it to the following address :' => 'Lütfen, Çek %name için ödenecek olun ve aşağıdaki adrese gönderin:', +]; diff --git a/local/modules/Cheque/I18n/tr_TR.php b/local/modules/Cheque/I18n/tr_TR.php new file mode 100644 index 00000000..80a9c5e3 --- /dev/null +++ b/local/modules/Cheque/I18n/tr_TR.php @@ -0,0 +1,11 @@ + 'Çek yönergeleri', + 'Cheque instructions configuration' => 'Çek yönergeleri yapılandırma', + 'Cheque is payable to: ' => 'Çek için ödenir: ', + 'Pay cheque to' => 'Çek için ödeme', + 'Payment instruction' => 'Ödeme talimatı', + 'Please enter here the payment by cheque instructions' => 'Lütfen burada ödeme çek yönergeleri tarafından girin', + 'The name to which the cheque shoud be payable to.' => 'Adı için çek shoud için ödenecek.', +]; diff --git a/local/modules/Cheque/LICENSE.txt b/local/modules/Cheque/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/Cheque/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/Cheque/Listener/SendPaymentConfirmationEmail.php b/local/modules/Cheque/Listener/SendPaymentConfirmationEmail.php new file mode 100644 index 00000000..bad9482a --- /dev/null +++ b/local/modules/Cheque/Listener/SendPaymentConfirmationEmail.php @@ -0,0 +1,85 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Cheque\Listener; + +use Cheque\Cheque; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Thelia\Action\BaseAction; +use Thelia\Core\Event\Order\OrderEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Mailer\MailerFactory; + +/** + * Class SendEMail + * @package IciRelais\Listener + * @author Thelia + */ +class SendPaymentConfirmationEmail extends BaseAction implements EventSubscriberInterface +{ + /** + * @var MailerFactory + */ + protected $mailer; + + public function __construct(MailerFactory $mailer) + { + $this->mailer = $mailer; + } + + /** + * @param OrderEvent $event + * + * Check if we're the payment module, and send the payment confirmation email to the customer if it's the case. + */ + public function sendConfirmationEmail(OrderEvent $event) + { + if ($event->getOrder()->getPaymentModuleId() === Cheque::getModuleId()) { + + if ($event->getOrder()->isPaid()) { + + $order = $event->getOrder(); + + $this->mailer->sendEmailToCustomer( + 'order_confirmation_cheque', + $order->getCustomer(), + [ + 'order_id' => $order->getId(), + 'order_ref' => $order->getRef() + ] + ); + } + } + } + + /** + * @inheritdoc + */ + public static function getSubscribedEvents() + { + return array( + TheliaEvents::ORDER_UPDATE_STATUS => array("sendConfirmationEmail", 128) + ); + } + +} diff --git a/local/modules/Cheque/composer.json b/local/modules/Cheque/composer.json new file mode 100644 index 00000000..8dca2321 --- /dev/null +++ b/local/modules/Cheque/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/cheque-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "Cheque" + } +} diff --git a/local/modules/Cheque/images/cheque.png b/local/modules/Cheque/images/cheque.png new file mode 100644 index 00000000..0aad099e Binary files /dev/null and b/local/modules/Cheque/images/cheque.png differ diff --git a/local/modules/Cheque/templates/backOffice/default/module_configuration.html b/local/modules/Cheque/templates/backOffice/default/module_configuration.html new file mode 100644 index 00000000..5cdeb14b --- /dev/null +++ b/local/modules/Cheque/templates/backOffice/default/module_configuration.html @@ -0,0 +1,55 @@ +{if isset($smarty.get.errmes) && !empty($smarty.get.errmes)} +
+ {$smarty.get.errmes} +
+{/if} + +
+
+ +
+
+ {intl d='cheque.bo.default' l="Cheque instructions configuration"} +
+
+ +
+
+
+ + {form name="cheque.instructions.configure"} + + + + {include + file = "includes/inner-form-toolbar.html" + hide_submit_buttons = false + + page_url = {url path="/admin/module/Cheque"} + close_url = {url path="/admin/modules"} + } + + {form_hidden_fields} + + {if $form_error} +
+
+
{$form_error_message}
+
+
+ {/if} + + {loop type="module-config" name="get-payable-to" module="Cheque" variable="payable_to"} + {render_form_field field="payable_to" value=$VALUE} + {/loop} + + {loop type="module-config" name="get-instruction" module="Cheque" variable="instructions" locale=$edit_language_locale} + {render_form_field field="instructions" extra_class="wysiwyg" value=$VALUE} + {/loop} + + {/form} +
+
+
+
+
\ No newline at end of file diff --git a/local/modules/Cheque/templates/frontOffice/default/order-placed.additional-payment-info.html b/local/modules/Cheque/templates/frontOffice/default/order-placed.additional-payment-info.html new file mode 100644 index 00000000..dba86bfd --- /dev/null +++ b/local/modules/Cheque/templates/frontOffice/default/order-placed.additional-payment-info.html @@ -0,0 +1,21 @@ +{loop type="module-config" name="cheque-instructions" module="cheque" variable="payable_to"} +

{intl d='cheque.fo.default' l="Please make your cheque payable to %name, and send it to the following address :" name={$VALUE}}

+{/loop} + +
+ {config key="store_name"}
+ {config key="store_address1"}
+ {if ! empty({config key="store_address2"})}{config key="store_address2"}
{/if} + {if ! empty({config key="store_address3"})}{config key="store_address3"}
{/if} + {config key="store_zipcode"}, {config key="store_city"}
+ {if {config key="store_country"}} + {loop type="country" name="store_country" id={config key="store_country"}} + {$TITLE}
+ {/loop} + {/if} +
+

{intl d='cheque.fo.default' l="Be sure to sign your cheque !"}

+ +{loop type="module-config" name="cheque-instructions" module="cheque" variable="instructions"} +

{$VALUE nofilter}

+{/loop} \ No newline at end of file diff --git a/local/modules/Colissimo/Colissimo.php b/local/modules/Colissimo/Colissimo.php new file mode 100644 index 00000000..c1023908 --- /dev/null +++ b/local/modules/Colissimo/Colissimo.php @@ -0,0 +1,177 @@ +insertSql(null, array(__DIR__ . '/Config/thelia.sql')); + } + + public function isValidDelivery(Country $country) + { + if (0 == self::getConfigValue(ColissimoConfigValue::ENABLED, 1)) { + return false; + } + + if (null !== $area = $this->getAreaForCountry($country)) { + $areaId = $area->getId(); + + $prices = self::getPrices(); + + /* Check if Colissimo delivers the area */ + if (isset($prices[$areaId]) && isset($prices[$areaId]["slices"])) { + // Yes ! Check if the cart weight is below slice limit + $areaPrices = $prices[$areaId]["slices"]; + ksort($areaPrices); + + /* Check cart weight is below the maximum weight */ + end($areaPrices); + $maxWeight = key($areaPrices); + + $cartWeight = $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->getWeight(); + + if ($cartWeight <= $maxWeight) { + return true; + } + } + } + + return false; + } + + /** + * @param $areaId + * @param $weight + * + * @return mixed + * @throws \Thelia\Exception\OrderException + */ + public static function getPostageAmount($areaId, $weight) + { + $freeshipping = Colissimo::getConfigValue(ColissimoConfigValue::FREE_SHIPPING); + $postage = 0; + if (!$freeshipping) { + $prices = self::getPrices(); + + /* check if Colissimo delivers the asked area */ + if (!isset($prices[$areaId]) || !isset($prices[$areaId]["slices"])) { + throw new DeliveryException( + Translator::getInstance()->trans( + "Colissimo delivery unavailable for the delivery country", + [], + self::DOMAIN_NAME + ) + ); + } + + $areaPrices = $prices[$areaId]["slices"]; + ksort($areaPrices); + + /* Check cart weight is below the maximum weight */ + end($areaPrices); + $maxWeight = key($areaPrices); + if ($weight > $maxWeight) { + throw new DeliveryException( + Translator::getInstance()->trans( + "Colissimo delivery unavailable for this cart weight (%weight kg)", + array("%weight" => $weight), + self::DOMAIN_NAME + ) + ); + } + + $postage = current($areaPrices); + + while (prev($areaPrices)) { + if ($weight > key($areaPrices)) { + break; + } + + $postage = current($areaPrices); + } + } + return $postage; + + } + + /** + * + * calculate and return delivery price + * + * @param Country $country + * @return mixed + * @throws \Thelia\Exception\OrderException + */ + public function getPostage(Country $country) + { + $cartWeight = $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->getWeight(); + + $postage = self::getPostageAmount( + $this->getAreaForCountry($country)->getId(), + $cartWeight + ); + + return $postage; + } + + public function update($currentVersion, $newVersion, ConnectionInterface $con = null) + { + $uploadDir = __DIR__ . '/Config/prices.json'; + + $database = new Database($con); + + $tableExists = $database->execute("SHOW TABLES LIKE 'colissimo_freeshipping'")->rowCount(); + + if (Colissimo::getConfigValue(ColissimoConfigValue::FREE_SHIPPING, null) == null && $tableExists) { + $result = $database->execute('SELECT active FROM colissimo_freeshipping WHERE id=1')->fetch()["active"]; + Colissimo::setConfigValue(ColissimoConfigValue::FREE_SHIPPING, $result); + $database->execute("DROP TABLE `colissimo_freeshipping`"); + } + + if (is_readable($uploadDir) && Colissimo::getConfigValue(ColissimoConfigValue::PRICES, null) == null) { + Colissimo::setConfigValue(ColissimoConfigValue::PRICES, file_get_contents($uploadDir)); + } + } +} diff --git a/local/modules/Colissimo/Config/config.xml b/local/modules/Colissimo/Config/config.xml new file mode 100644 index 00000000..fb02632e --- /dev/null +++ b/local/modules/Colissimo/Config/config.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/Colissimo/Config/module.xml b/local/modules/Colissimo/Config/module.xml new file mode 100644 index 00000000..1bed4598 --- /dev/null +++ b/local/modules/Colissimo/Config/module.xml @@ -0,0 +1,18 @@ + + + Colissimo\Colissimo + + Colissimo delivery + + + Livraison par Colissimo + + 2.3.1 + + Manuel Raynaud + manu@raynaud.io + + delivery + 2.2.0 + alpha + diff --git a/local/modules/Colissimo/Config/prices.json b/local/modules/Colissimo/Config/prices.json new file mode 100644 index 00000000..53eacc3b --- /dev/null +++ b/local/modules/Colissimo/Config/prices.json @@ -0,0 +1,64 @@ +{"1": { + "_info": "area 1 : France", + "slices": { + "0.25": 5.23, + "0.5": 6.13, + "0.75": 6.89, + "1": 7.51, + "2": 8.50, + "5": 10.93, + "10": 15.68, + "30": 23.28 + } +}, "2": { + "_info": "area 2 : A Zone - Union Europ\u00e9enne et Suisse", + "slices": { + "0.5": 11.54, + "1": 14.11, + "2": 15.68, + "5": 20.14, + "10": 33.25, + "20": 55.10, + "30": 55.10 + } +}, "3": { + "_info": "area 3 : B Zone - Pays de l\u2019Europe de l\u2019Est (hors Union Europ\u00e9enne et Russie), Norv\u00e8ge, Maghreb", + "slices": { + "0.5": 15.39, + "1": 18.38, + "2": 20.00, + "5": 25.65, + "10": 42.75, + "20": 66.50 + } +}, "4": { + "_info": "area 4 : C Zone - Autres destinations", + "slices": { + "0.5": 22.52, + "1": 24.99, + "2": 34.30, + "5": 50.35, + "10": 95.00, + "20": 152.00 + } +}, "5": { + "_info": "area 5 : France OM1", + "slices": { + "0.5": 8.69, + "1": 13.16, + "2": 17.96, + "5": 26.60, + "10": 42.75, + "30": 95.95 + } +}, "6": { + "_info": "area 6 : France OM2", + "slices": { + "0.5": 10.40, + "1": 15.72, + "2": 27.74, + "5": 46.08, + "10": 90.25, + "30": 237.50 + } +}} diff --git a/local/modules/Colissimo/Config/routing.xml b/local/modules/Colissimo/Config/routing.xml new file mode 100644 index 00000000..4edcf64d --- /dev/null +++ b/local/modules/Colissimo/Config/routing.xml @@ -0,0 +1,21 @@ + + + + + Colissimo\Controller\EditPrices::editprices + + + + Colissimo\Controller\FreeShipping::set + + + + Colissimo\Controller\Export::exportAction + + + + Colissimo\Controller\Configuration::editConfiguration + + diff --git a/local/modules/Colissimo/Config/thelia.sql b/local/modules/Colissimo/Config/thelia.sql new file mode 100644 index 00000000..d44ef9fa --- /dev/null +++ b/local/modules/Colissimo/Config/thelia.sql @@ -0,0 +1,32 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- Mail templates for colissimo +-- --------------------------------------------------------------------- + +-- First, delete existing entries +SET @var := 0; +SELECT @var := `id` FROM `message` WHERE name="mail_colissimo"; +DELETE FROM `message` WHERE `id`=@var; +-- Try if ON DELETE constraint isn't set +DELETE FROM `message_i18n` WHERE `id`=@var; + +-- Then add new entries +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; +-- insert message +INSERT INTO `message` (`id`, `name`, `secured`) VALUES +(@max, +'mail_colissimo', +'0' +); + +-- and template fr_FR +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +(@max, 'en_US', 'Colissimo shipping message', 'Your order {$order_ref} has been shipped', '{loop type="customer" name="customer.order" current="false" id="$customer_id" backend_context="1"}\r\nDear {$FIRSTNAME} {$LASTNAME},\r\n{/loop}\r\nThank you for your order on our online store {config key="store_name"}.\r\nYour order {$order_ref} dated {format_date date=$order_date} has been shipped on {format_date date=$update_date}.\r\nThe tracking number for this delivery is {$package}. Please check the La Poste website for tracking your parcel: www.coliposte.net.\r\nYou can use this tracking number to get your parcel in your local La Poste office. If don''t get an advice in your mailbox after two working days, claim your parcel at your local La Poste office, using this tracking number.\r\nFeel free to contact us for any forther information\r\nBest Regards.', '{loop type="customer" name="customer.order" current="false" id="$customer_id" backend_context="1"}\r\n

Dear {$FIRSTNAME} {$LASTNAME},

\r\n{/loop}\r\n

Thank you for your order on our online store {config key="store_name"}.

\r\n

Your order {$order_ref} dated {format_date date=$order_date} has been shipped on {format_date date=$update_date}.\r\nThe tracking number for this delivery is {$package}. Please check the La Poste website for tracking your parcel: www.coliposte.net.

\r\n

You can use this tracking number to get your parcel in your local La Poste office. If don''t get an advice in your mailbox after two working days, claim your parcel at your local La Poste office, using this tracking number.

\r\n

Feel free to contact us for any forther information

\r\n

Best Regards.

'), +(@max, 'fr_FR', 'Message d''expédition de colissimo', 'Suivi colissimo commande : {$order_ref}', '{loop type="customer" name="customer.order" current="false" id="$customer_id" backend_context="1"}\r\n{$LASTNAME} {$FIRSTNAME},\r\n{/loop}\r\nNous vous remercions de votre commande sur notre site {config key="store_name"}\r\nUn colis concernant votre commande {$order_ref} du {format_date date=$order_date} a quitté nos entrepôts pour être pris en charge par La Poste le {format_date date=$update_date}.\r\nSon numéro de suivi est le suivant : {$package}\r\nIl vous permet de suivre votre colis en ligne sur le site de La Poste : www.coliposte.net\r\nIl vous sera, par ailleurs, très utile si vous étiez absent au moment de la livraison de votre colis : en fournissant ce numéro de Colissimo Suivi, vous pourrez retirer votre colis dans le bureau de Poste le plus proche.\r\nATTENTION ! Si vous ne trouvez pas l''avis de passage normalement déposé dans votre boîte aux lettres au bout de 48 Heures jours ouvrables, n''hésitez pas à aller le réclamer à votre bureau de Poste, muni de votre numéro de Colissimo Suivi.\r\nNous restons à votre disposition pour toute information complémentaire.\r\nCordialement', '{loop type="customer" name="customer.order" current="false" id="$customer_id" backend_context="1"}\r\n{$LASTNAME} {$FIRSTNAME},\r\n{/loop}\r\nNous vous remercions de votre commande sur notre site {config key="store_name"}\r\nUn colis concernant votre commande {$order_ref} du {format_date date=$order_date} a quitté nos entrepôts pour être pris en charge par La Poste le {format_date date=$update_date}.\r\nSon numéro de suivi est le suivant : {$package}\r\nIl vous permet de suivre votre colis en ligne sur le site de La Poste : www.coliposte.net\r\nIl vous sera, par ailleurs, très utile si vous étiez absent au moment de la livraison de votre colis : en fournissant ce numéro de Colissimo Suivi, vous pourrez retirer votre colis dans le bureau de Poste le plus proche.\r\nATTENTION ! Si vous ne trouvez pas l''avis de passage normalement déposé dans votre boîte aux lettres au bout de 48 Heures jours ouvrables, n''hésitez pas à aller le réclamer à votre bureau de Poste, muni de votre numéro de Colissimo Suivi.\r\nNous restons à votre disposition pour toute information complémentaire.\r\nCordialement'); + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/local/modules/Colissimo/Controller/Configuration.php b/local/modules/Colissimo/Controller/Configuration.php new file mode 100644 index 00000000..52f99df8 --- /dev/null +++ b/local/modules/Colissimo/Controller/Configuration.php @@ -0,0 +1,77 @@ + + */ +class Configuration extends BaseAdminController +{ + public function editConfiguration() + { + if (null !== $response = $this->checkAuth( + AdminResources::MODULE, + [Colissimo::DOMAIN_NAME], + AccessManager::UPDATE + )) { + return $response; + } + + $form = $this->createForm('colissimo.configuration'); + $error_message = null; + + try { + $validateForm = $this->validateForm($form); + $data = $validateForm->getData(); + + Colissimo::setConfigValue( + ColissimoConfigValue::ENABLED, + is_bool($data["enabled"]) ? (int) ($data["enabled"]) : $data["enabled"] + ); + + return $this->redirectToConfigurationPage(); + + } catch (FormValidationException $e) { + $error_message = $this->createStandardFormValidationErrorMessage($e); + } + + if (null !== $error_message) { + $this->setupFormErrorContext( + 'configuration', + $error_message, + $form + ); + $response = $this->render("module-configure", ['module_code' => 'Colissimo']); + } + return $response; + } + + /** + * Redirect to the configuration page + */ + protected function redirectToConfigurationPage() + { + return RedirectResponse::create(URL::getInstance()->absoluteUrl('/admin/module/Colissimo')); + } +} diff --git a/local/modules/Colissimo/Controller/EditPrices.php b/local/modules/Colissimo/Controller/EditPrices.php new file mode 100644 index 00000000..a4ed5083 --- /dev/null +++ b/local/modules/Colissimo/Controller/EditPrices.php @@ -0,0 +1,84 @@ + + */ +class EditPrices extends BaseAdminController +{ + public function editprices() + { + // Get data & treat + $post = $this->getRequest(); + $operation = $post->get('operation'); + $area = $post->get('area'); + $weight = $post->get('weight'); + $price = $post->get('price'); + + if (preg_match("#^add|delete$#", $operation) && + preg_match("#^\d+$#", $area) && + preg_match("#^\d+\.?\d*$#", $weight) + ) { + // check if area exists in db + $exists = AreaQuery::create() + ->findPK($area); + if ($exists !== null) { + + if (null !== $data = Colissimo::getConfigValue(ColissimoConfigValue::PRICES, null)) { + $json_data = json_decode( + $data, + true + ); + } + if ((float) $weight > 0 && $operation == "add" + && preg_match("#\d+\.?\d*#", $price)) { + $json_data[$area]['slices'][$weight] = $price; + } elseif ($operation == "delete") { + if (isset($json_data[$area]['slices'][$weight])) { + unset($json_data[$area]['slices'][$weight]); + } + } else { + throw new \Exception("Weight must be superior to 0"); + } + ksort($json_data[$area]['slices']); + + Colissimo::setConfigValue(ColissimoConfigValue::PRICES, json_encode($json_data)); + + } else { + throw new \Exception("Area not found"); + } + } else { + throw new \ErrorException("Arguments are missing or invalid"); + } + + return $this->redirectToConfigurationPage(); + } + + /** + * Redirect to the configuration page + */ + protected function redirectToConfigurationPage() + { + return RedirectResponse::create(URL::getInstance()->absoluteUrl('/admin/module/Colissimo')); + } +} diff --git a/local/modules/Colissimo/Controller/Export.php b/local/modules/Colissimo/Controller/Export.php new file mode 100644 index 00000000..ca82a68e --- /dev/null +++ b/local/modules/Colissimo/Controller/Export.php @@ -0,0 +1,166 @@ + + */ +class Export extends BaseAdminController +{ + const DEFAULT_PHONE = "0100000000"; + const DEFAULT_CELLPHONE = "0600000000"; + + public function exportAction() + { + if (null !== $response = $this->checkAuth(array(AdminResources::MODULE), array('Colissimo'), AccessManager::UPDATE)) { + return $response; + } + + $form = new FormExport($this->getRequest()); + + try { + $exportForm = $this->validateForm($form); + + // Get new status + $status_id = $exportForm->get('status_id')->getData(); + $status = OrderStatusQuery::create() + ->filterByCode($status_id) + ->findOne(); + + // Get Colissimo orders + $orders = ColissimoQuery::getOrders()->find(); + + $export = ""; + $store_name = ConfigQuery::getStoreName(); + + /** @var $order \Thelia\Model\Order */ + foreach ($orders as $order) { + + $value = $exportForm->get('order_'.$order->getId())->getData(); + + if ($value) { + + // Get order information + $customer = $order->getCustomer(); + $locale = $order->getLang()->getLocale(); + $address = $order->getOrderAddressRelatedByDeliveryOrderAddressId(); + $country = CountryQuery::create()->findPk($address->getCountryId()); + $country->setLocale($locale); + $customerTitle = CustomerTitleQuery::create()->findPk($address->getCustomerTitleId()); + $customerTitle->setLocale($locale); + $weight = $exportForm->get('order_weight_'.$order->getId())->getData(); + + if ($weight == 0) { + /** @var \Thelia\Model\OrderProduct $product */ + foreach ($order->getOrderProducts() as $product) { + $weight += (double)$product->getWeight(); + } + } + + /** + * Get user's phone & cellphone + * First get invoice address phone, + * If empty, try to get default address' phone. + * If still empty, set default value + */ + $phone = $address->getPhone(); + if (empty($phone)) { + $phone = $customer->getDefaultAddress()->getPhone(); + + if (empty($phone)) { + $phone = self::DEFAULT_PHONE; + } + } + + // Cellphone + $cellphone = $customer->getDefaultAddress()->getCellphone(); + + if (empty($cellphone)) { + $cellphone = $customer->getDefaultAddress()->getCellphone(); + + if (empty($cellphone)) { + $cellphone = self::DEFAULT_CELLPHONE; + } + } + + + $export .= + "\"".$order->getRef() + ."\";\"".$address->getLastname() + ."\";\"".$address->getFirstname() + ."\";\"".$address->getAddress1() + ."\";\"".$address->getAddress2() + ."\";\"".$address->getAddress3() + ."\";\"".$address->getZipcode() + ."\";\"".$address->getCity() + ."\";\"".$country->getIsoalpha2() + ."\";\"".$phone + ."\";\"".$cellphone + ."\";\"".$weight + ."\";\"".$customer->getEmail() + ."\";\"\";\"".$store_name + ."\";\"DOM\";\r\n"; + + if ($status) { + $event = new OrderEvent($order); + $event->setStatus($status->getId()); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event); + } + } + } + + return Response::create( + utf8_decode($export), + 200, + array( + "Content-Encoding"=>"ISO-8889-1", + "Content-Type"=>"application/csv-tab-delimited-table", + "Content-disposition"=>"filename=export.csv" + ) + ); + + } catch (FormValidationException $e) { + $this->setupFormErrorContext( + Translator::getInstance()->trans("colissimo expeditor export", [], Colissimo::DOMAIN_NAME), + $e->getMessage(), + $form, + $e + ); + + return $this->render( + "module-configure", + array( + "module_code" => "Colissimo", + ) + ); + } + } +} diff --git a/local/modules/Colissimo/Controller/FreeShipping.php b/local/modules/Colissimo/Controller/FreeShipping.php new file mode 100644 index 00000000..10d46e6f --- /dev/null +++ b/local/modules/Colissimo/Controller/FreeShipping.php @@ -0,0 +1,62 @@ + + */ +class FreeShipping extends BaseAdminController +{ + public function set() + { + $response = $this->checkAuth(AdminResources::MODULE, [Colissimo::DOMAIN_NAME], AccessManager::UPDATE); + if (null !== $response) { + return $response; + } + + $form = $this->createForm('colissimo.freeshipping.form'); + + + try { + $validateForm = $this->validateForm($form); + $data = $validateForm->getData(); + + Colissimo::setConfigValue(ColissimoConfigValue::FREE_SHIPPING, (int) ($data["freeshipping"])); + return $this->redirectToConfigurationPage(); + + } catch (\Exception $e) { + $response = JsonResponse::create(array("error"=>$e->getMessage()), 500); + } + + return $response; + } + + /** + * Redirect to the configuration page + */ + protected function redirectToConfigurationPage() + { + return RedirectResponse::create(URL::getInstance()->absoluteUrl('/admin/module/Colissimo')); + } +} diff --git a/local/modules/Colissimo/EventListener/AreaDeletedListener.php b/local/modules/Colissimo/EventListener/AreaDeletedListener.php new file mode 100644 index 00000000..c1eb3e41 --- /dev/null +++ b/local/modules/Colissimo/EventListener/AreaDeletedListener.php @@ -0,0 +1,53 @@ + + */ +class AreaDeletedListener implements EventSubscriberInterface +{ + /** + * @param AreaDeleteEvent $event + */ + public function updateConfig(AreaDeleteEvent $event) + { + if (null !== $data = Colissimo::getConfigValue(ColissimoConfigValue::PRICES, null)) { + $areaId = $event->getAreaId(); + $json_data = json_decode($data, true); + unset($json_data[$areaId]); + + Colissimo::setConfigValue(ColissimoConfigValue::PRICES, json_encode($json_data, true)); + } + } + + /** + * @return array + */ + public static function getSubscribedEvents() + { + return [ + TheliaEvents::AREA_DELETE => [ + 'updateConfig', 128 + ] + ]; + } +} diff --git a/local/modules/Colissimo/Form/Configuration.php b/local/modules/Colissimo/Form/Configuration.php new file mode 100644 index 00000000..bc9c58b3 --- /dev/null +++ b/local/modules/Colissimo/Form/Configuration.php @@ -0,0 +1,59 @@ + + */ +class Configuration extends BaseForm +{ + + protected function buildForm() + { + $this->formBuilder + ->add( + "enabled", + "checkbox", + array( + "label" => "Enabled", + "label_attr" => [ + "for" => "enabled", + "help" => Translator::getInstance()->trans( + 'Check if you want to activate Colissimo', + [], + Colissimo::DOMAIN_NAME + ) + ], + "required" => false, + "constraints" => array( + ), + "value" => Colissimo::getConfigValue(ColissimoConfigValue::ENABLED, 1), + ) + ); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "colissimo_enable"; + } +} diff --git a/local/modules/Colissimo/Form/Export.php b/local/modules/Colissimo/Form/Export.php new file mode 100644 index 00000000..47c8fddf --- /dev/null +++ b/local/modules/Colissimo/Form/Export.php @@ -0,0 +1,122 @@ + + */ +class Export extends BaseForm +{ + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + $orders = ColissimoQuery::getOrders() + ->find(); + + $this->formBuilder + ->add( + 'status_id', + 'text', + [ + 'constraints' => [ + new NotBlank(), + new Callback( + array("methods" => array(array($this, "verifyValue"))) + ) + ], + 'label' => Translator::getInstance()->trans( + 'Modify status export after export', + [], + Colissimo::DOMAIN_NAME + ), + 'label_attr' => [ + 'for' => 'status_id' + ] + ] + ); + + /** @var \Thelia\Model\Order $order */ + foreach ($orders as $order) { + $this->formBuilder + ->add( + "order_".$order->getId(), + "checkbox", + array( + 'label'=>$order->getRef(), + 'label_attr'=>array( + 'for'=>'export_'.$order->getId() + ) + ) + ) + ->add( + "order_nb_pkg_".$order->getId(), + 'number' + ) + ->add( + "order_weight_".$order->getId(), + 'number' + ); + } + } + + public function verifyValue($value, ExecutionContextInterface $context) + { + if (!preg_match("#^nochange|processing|sent$#", $value)) { + $context->addViolation( + Translator::getInstance()->trans( + 'select a valid status', + [], + Colissimo::DOMAIN_NAME + ) + ); + } + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "colissimo_export"; + } +} diff --git a/local/modules/Colissimo/Form/FreeShipping.php b/local/modules/Colissimo/Form/FreeShipping.php new file mode 100644 index 00000000..baea56e0 --- /dev/null +++ b/local/modules/Colissimo/Form/FreeShipping.php @@ -0,0 +1,62 @@ +formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + $this->formBuilder + ->add( + "freeshipping", + "checkbox", + array( + "label" => Translator::getInstance()->trans("Activate free shipping: ", [], Colissimo::DOMAIN_NAME), + "value" => Colissimo::getConfigValue(ColissimoConfigValue::FREE_SHIPPING, false), + ) + ); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "colissimofreeshipping"; + } +} diff --git a/local/modules/Colissimo/Hook/HookManager.php b/local/modules/Colissimo/Hook/HookManager.php new file mode 100644 index 00000000..7c8b15bb --- /dev/null +++ b/local/modules/Colissimo/Hook/HookManager.php @@ -0,0 +1,31 @@ + + */ +class HookManager extends BaseHook +{ + public function onModuleConfiguration(HookRenderEvent $event) + { + $module_id = self::getModule()->getModuleId(); + + $event->add($this->render("module_configuration.html", ['module_id' => $module_id])); + } +} diff --git a/local/modules/Colissimo/I18n/backOffice/default/de_DE.php b/local/modules/Colissimo/I18n/backOffice/default/de_DE.php new file mode 100644 index 00000000..10ed342f --- /dev/null +++ b/local/modules/Colissimo/I18n/backOffice/default/de_DE.php @@ -0,0 +1,25 @@ + '*Wenn Sie diese Option auswählen, sind die exportierten Bestellungen auf dieser Seite nicht mehr verfügbar', + 'Actions' => 'Aktionen', + 'An error occured' => 'Ein Fehler ist aufgetreten', + 'Area : ' => 'Bereich : ', + 'Cancel' => 'Abbrechen', + 'Change orders status after export' => 'Status der Bestellung nach dem Export ändern', + 'Colissimo Module allows to send your products all around the world with La Poste.' => 'Colissimo Modul ermöglicht, Ihre Produkte mit La Poste weltweit zu versenden.', + 'Create' => 'Erstellen', + 'Date' => 'Datum', + 'Delete' => 'Löschen', + 'Do not change' => 'Nicht ändern', + 'Edit' => 'Ändern', + 'Export' => 'Export', + 'Please change the access rights' => 'Bitte ändern Sie die Zugriffsrechte', + 'Price (€)' => 'Preis (€)', + 'Processing' => 'Bearbeitung', + 'REF' => 'REF', + 'Sent' => 'Gesendet', + 'There is currently not orders to export' => 'Es gibt derzeit keine Bestellungen, die exportiert werden können', + 'Total taxed amount' => 'Gesamter besteuerter Betrag', + 'Weight up to ... (kg)' => 'Gewicht bis zu ... (kg)', +]; diff --git a/local/modules/Colissimo/I18n/backOffice/default/en_US.php b/local/modules/Colissimo/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..0d48057a --- /dev/null +++ b/local/modules/Colissimo/I18n/backOffice/default/en_US.php @@ -0,0 +1,36 @@ + '*If you choose this option, the exported orders would not be available on this page anymore', + 'Actions' => 'Actions', + 'An error occured' => 'An error occured', + 'Area : ' => 'Area : ', + 'Cancel' => 'Cancel', + 'Change orders status after export' => 'Change orders status after export', + 'Colissimo Module allows to send your products all around the world with La Poste.' => 'Colissimo Module allows to send your products all around the world with La Poste.', + 'Create' => 'Create', + 'Create a new price slice' => 'Create a new price slice', + 'Create a price slice' => 'Create a price slice', + 'Date' => 'Date', + 'Delete' => 'Delete', + 'Delete a price slice' => 'Delete a price slice', + 'Delete this price slice' => 'Delete this price slice', + 'Do not change' => 'Do not change', + 'Do you really want to delete this slice ?' => 'Do you really want to delete this slice ?', + 'Edit' => 'Edit', + 'Edit a price slice' => 'Edit a price slice', + 'Edit this price slice' => 'Edit this price slice', + 'Export' => 'Export', + 'Export expeditor inet file' => 'Export expeditor inet file', + 'Please change the access rights' => 'Please change the access rights', + 'Price (€)' => 'Price (€)', + 'Price slices' => 'Price slices', + 'Processing' => 'Processing', + 'REF' => 'REF', + 'Sent' => 'Sent', + 'There is currently not orders to export' => 'There is currently no orders to export', + 'Total taxed amount' => 'Total taxed amount', + 'Weight up to ... (kg)' => 'Weight up to ... (kg)', + 'Number of packages' => 'Number of packages', + 'Packages weight' => 'Packages weight' +); diff --git a/local/modules/Colissimo/I18n/backOffice/default/fr_FR.php b/local/modules/Colissimo/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..d7237509 --- /dev/null +++ b/local/modules/Colissimo/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,37 @@ + '* Si vous choisissez cette option, les commandes exportées ne seront plus affichée sur cette page.', + 'Actions' => 'Actions', + 'An error occured' => 'Une erreur est survenue', + 'Area : ' => 'Zone de livraison : ', + 'Cancel' => 'Annuler', + 'Change orders status after export' => 'Modification du statut des commande après l\'export', + 'Colissimo Module allows to send your products all around the world with La Poste.' => 'Colissimo vous permet d’expédier vos colis dans le monde entier avec La Poste', + 'Create' => 'Créer', + 'Create a new price slice' => 'Créer une nouvelle tranche de prix', + 'Create a price slice' => 'Créer une tranche de prix', + 'Customer' => 'Client', + 'Date' => 'Date', + 'Delete' => 'Supprimer', + 'Delete a price slice' => 'Supprimer une tranche de prix', + 'Delete this price slice' => 'Supprimer cette tranche de prix', + 'Do not change' => 'Ne pas modifier', + 'Do you really want to delete this slice ?' => 'Confirmez-vous la suppression de cette tranche de prix', + 'Edit' => 'Modifier', + 'Edit a price slice' => 'Modifier une tranche de prix', + 'Edit this price slice' => 'Modifier cette tranche de prix', + 'Export' => 'Export', + 'Export expeditor inet file' => 'Exporter le fichier Expeditor INET', + 'Number of packages' => 'Nombre de colis', + 'Packages weight' => 'Poids des colis', + 'Please change the access rights' => 'Merci de modifier les droits d\'accès', + 'Price (€)' => 'Prix (€)', + 'Price slices' => 'Prix et poids', + 'Processing' => 'Traitement', + 'REF' => 'REF', + 'Sent' => 'Envoyée', + 'There is currently not orders to export' => 'Il n\'y a pas de commande à exporter pour le moment', + 'Total taxed amount' => 'Total TTC', + 'Weight up to ... (kg)' => 'Jusqu\'au poids (Kg)', +]; diff --git a/local/modules/Colissimo/I18n/backOffice/default/it_IT.php b/local/modules/Colissimo/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..58e711dc --- /dev/null +++ b/local/modules/Colissimo/I18n/backOffice/default/it_IT.php @@ -0,0 +1,13 @@ + 'Azioni', + 'Cancel' => 'Annulla', + 'Create' => 'Creare', + 'Date' => 'Data', + 'Delete' => 'Cancellare', + 'Edit' => 'Modifica', + 'Export' => 'Esporta', + 'Number of packages' => 'Numero di pacchetti', + 'Packages weight' => 'Peso pacchi', +]; diff --git a/local/modules/Colissimo/I18n/backOffice/default/tr_TR.php b/local/modules/Colissimo/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..a777927b --- /dev/null +++ b/local/modules/Colissimo/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,34 @@ + '* Bu seçeneği seçerseniz, ihracat siparişleri artık bu sayfadaki müsait olmaz', + 'Actions' => 'Eylemler', + 'An error occured' => 'Bir hata meydana geldi', + 'Area : ' => 'Alanı: ', + 'Cancel' => 'Vazgeç', + 'Change orders status after export' => 'İhracat sonra sipariş durumunu değiştir', + 'Colissimo Module allows to send your products all around the world with La Poste.' => 'Colissimo modülü sağlar ürünlerinizi göndermek için La Poste ile dünyanın her yerinden.', + 'Create' => 'Oluştur', + 'Create a new price slice' => 'Yeni fiyat dilimi oluşturmak', + 'Create a price slice' => 'Bir fiyat dilim oluşturma', + 'Date' => 'Tarih', + 'Delete' => 'sil', + 'Delete a price slice' => 'Bir fiyat dilim silmek', + 'Delete this price slice' => 'Bu fiyat dilim silmek', + 'Do not change' => 'Değiştirme', + 'Do you really want to delete this slice ?' => 'Gerçekten bu dosyayı silmek istiyor musunuz ?', + 'Edit' => 'Düzenle', + 'Edit a price slice' => 'Bir fiyat dilim Düzenle', + 'Edit this price slice' => 'Bu fiyat dilim Düzenle', + 'Export' => 'Dışa aktarma', + 'Export expeditor inet file' => 'Expeditor inet dosyası dışa aktarma', + 'Please change the access rights' => 'Lütfen erişim haklarını Değiştir', + 'Price (€)' => 'Fiyat (TL)', + 'Price slices' => 'Fiyat dilimleri', + 'Processing' => 'İşlem devam ediyor', + 'REF' => 'ÜRÜN KODU', + 'Sent' => 'Gönder', + 'There is currently not orders to export' => 'Şu anda hiçbir emir vermek için', + 'Total taxed amount' => 'Toplam Kdvtutarı', + 'Weight up to ... (kg)' => 'Fazla kilo... (kg)', +]; diff --git a/local/modules/Colissimo/I18n/de_DE.php b/local/modules/Colissimo/I18n/de_DE.php new file mode 100644 index 00000000..5198cfbd --- /dev/null +++ b/local/modules/Colissimo/I18n/de_DE.php @@ -0,0 +1,14 @@ + 'Kostenlose Lieferung aktivieren: ', + 'Can\'t read Config directory' => 'Config-Verzeichnis kann nicht gelesen werden', + 'Can\'t read file' => 'Datei kann nicht gelesen werden', + 'Can\'t write Config directory' => 'Config-Verzeichnis kann nicht beschrieben werden', + 'Can\'t write file' => 'Datei kann nicht geschrieben werden', + 'Colissimo delivery unavailable for the delivery country' => 'Eine Lieferung mit Colissimo ist für das Land nicht verfügbar', + 'Colissimo delivery unavailable for this cart weight (%weight kg)' => 'Eine Lieferung mit Colissimo ist für Warenkörbe mit diesem Gewicht (%weight kg) nicht verfügbar', + 'Modify status export after export' => 'Status der Bestellung nach dem Export ändern', + 'colissimo expeditor export' => 'Colissimo expeditor export', + 'select a valid status' => 'Wählen Sie einen gültigen Bestellungsstatus aus', +]; diff --git a/local/modules/Colissimo/I18n/en_US.php b/local/modules/Colissimo/I18n/en_US.php new file mode 100644 index 00000000..c060ae29 --- /dev/null +++ b/local/modules/Colissimo/I18n/en_US.php @@ -0,0 +1,14 @@ + 'Activate free shipping: ', + 'Can\'t read Config directory' => 'Can\'t read Config directory', + 'Can\'t read file' => 'Can\'t read file', + 'Can\'t write Config directory' => 'Can\'t write Config directory', + 'Can\'t write file' => 'Can\'t write file', + 'Colissimo delivery unavailable for the delivery country' => 'Colissimo delivery unavailable for the delivery country', + 'Colissimo delivery unavailable for this cart weight (%weight kg)' => 'Colissimo delivery unavailable for this cart weight (%weight kg)', + 'Modify status export after export' => 'Change orders status after export', + 'colissimo expeditor export' => 'Colissimo Expeditor export', + 'select a valid status' => 'Select a valid order status', +); diff --git a/local/modules/Colissimo/I18n/fr_FR.php b/local/modules/Colissimo/I18n/fr_FR.php new file mode 100644 index 00000000..92634b2c --- /dev/null +++ b/local/modules/Colissimo/I18n/fr_FR.php @@ -0,0 +1,14 @@ + 'Activer la livraison offerte: ', + 'Can\'t read Config directory' => 'Le dossier Config ne peut être lu', + 'Can\'t read file' => 'Le fichier suivant ne peut être lu', + 'Can\'t write Config directory' => 'Le dossier Config ne peut être écrit', + 'Can\'t write file' => 'Le fichier suivant ne peut être écrit', + 'Colissimo delivery unavailable for the delivery country' => 'La livraison par Colissimo n\'est pas disponible dans ce pays', + 'Colissimo delivery unavailable for this cart weight (%weight kg)' => 'La livraison par Colissimo n\'est pas disponible pour un panier de %weight Kg', + 'Modify status export after export' => 'Modification du statut des commandes après l\'export', + 'colissimo expeditor export' => 'Export pour le logiciel Expeditor', + 'select a valid status' => 'Choisissez un statut de commande valide.', +]; diff --git a/local/modules/Colissimo/I18n/tr_TR.php b/local/modules/Colissimo/I18n/tr_TR.php new file mode 100644 index 00000000..4d4ef3c5 --- /dev/null +++ b/local/modules/Colissimo/I18n/tr_TR.php @@ -0,0 +1,14 @@ + 'Ücretsiz nakliye etkinleştirmek için: ', + 'Can\'t read Config directory' => 'Yapılandırma dizini okunamıyor', + 'Can\'t read file' => 'Dosyayı okuyamıyor', + 'Can\'t write Config directory' => 'Dosyayı okuyamıyor', + 'Can\'t write file' => 'Dosyaya yazılamıyor', + 'Colissimo delivery unavailable for the delivery country' => 'Bu Teslimat Bu ülke için kullanılamaz Colissimo teslim', + 'Colissimo delivery unavailable for this cart weight (%weight kg)' => 'Colissimo teslimat için bu sepeti ağırlık (%weight kg) kullanılamaz', + 'Modify status export after export' => 'İhracat sonra sipariş durumunu değiştir', + 'colissimo expeditor export' => 'Colissimo Expeditor verme', + 'select a valid status' => 'Geçerli sipariş durumunu seçin', +]; diff --git a/local/modules/Colissimo/LICENSE.txt b/local/modules/Colissimo/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/Colissimo/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/Colissimo/Listener/SendMail.php b/local/modules/Colissimo/Listener/SendMail.php new file mode 100644 index 00000000..d8491e71 --- /dev/null +++ b/local/modules/Colissimo/Listener/SendMail.php @@ -0,0 +1,123 @@ + + */ +class SendMail implements EventSubscriberInterface +{ + + protected $parser; + + protected $mailer; + + public function __construct(ParserInterface $parser, MailerFactory $mailer) + { + $this->parser = $parser; + $this->mailer = $mailer; + } + + public function updateStatus(OrderEvent $event) + { + $order = $event->getOrder(); + $colissimo = new Colissimo(); + + if ($order->isSent() && $order->getDeliveryModuleId() == $colissimo->getModuleModel()->getId()) { + $contact_email = ConfigQuery::getStoreEmail(); + + if ($contact_email) { + + $message = MessageQuery::create() + ->filterByName('mail_colissimo') + ->findOne(); + + if (false === $message) { + throw new \Exception("Failed to load message 'order_confirmation'."); + } + + $order = $event->getOrder(); + $customer = $order->getCustomer(); + + $this->parser->assign('customer_id', $customer->getId()); + $this->parser->assign('order_ref', $order->getRef()); + $this->parser->assign('order_date', $order->getCreatedAt()); + $this->parser->assign('update_date', $order->getUpdatedAt()); + $this->parser->assign('package', $order->getDeliveryRef()); + + + $message + ->setLocale($order->getLang()->getLocale()); + + $instance = \Swift_Message::newInstance() + ->addTo($customer->getEmail(), $customer->getFirstname()." ".$customer->getLastname()) + ->addFrom($contact_email, ConfigQuery::getStoreName()) + ; + + // Build subject and body + + $message->buildMessage($this->parser, $instance); + + $this->mailer->send($instance); + + Tlog::getInstance()->debug("Colissimo shipping message sent to customer ".$customer->getEmail()); + } + else { + $customer = $order->getCustomer(); + Tlog::getInstance()->debug("Colissimo shipping message no contact email customer_id", $customer->getId()); + } + } + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return array( + TheliaEvents::ORDER_UPDATE_STATUS => array("updateStatus", 128) + ); + } +} diff --git a/local/modules/Colissimo/Loop/CheckRightsLoop.php b/local/modules/Colissimo/Loop/CheckRightsLoop.php new file mode 100644 index 00000000..d655f1ad --- /dev/null +++ b/local/modules/Colissimo/Loop/CheckRightsLoop.php @@ -0,0 +1,100 @@ + + */ +class CheckRightsLoop extends BaseLoop implements ArraySearchLoopInterface +{ + protected function getArgDefinitions() + { + return new ArgumentCollection(); + } + + public function buildArray() + { + $ret = array(); + $dir = __DIR__."/../Config/"; + if (!is_readable($dir)) { + + $ret[] = array( + "ERRMES"=>Translator::getInstance()->trans( + "Can't read Config directory", + [], + Colissimo::DOMAIN_NAME + ), + "ERRFILE"=>"" + ); + } + if (!is_writable($dir)) { + $ret[] = array( + "ERRMES"=>Translator::getInstance()->trans( + "Can't write Config directory", + [], + Colissimo::DOMAIN_NAME + ), + "ERRFILE"=>"" + ); + + } + if ($handle = opendir($dir)) { + while (false !== ($file = readdir($handle))) { + if (strlen($file) > 5 && substr($file, -5) === ".json") { + if (!is_readable($dir.$file)) { + + $ret[] = array( + "ERRMES"=>Translator::getInstance()->trans( + "Can't read file", + [], + Colissimo::DOMAIN_NAME + ), + "ERRFILE"=>"Colissimo/Config/".$file + ); + } + if (!is_writable($dir.$file)) { + $ret[] = array( + "ERRMES"=>Translator::getInstance()->trans( + "Can't write file", + [], + Colissimo::DOMAIN_NAME + ), + "ERRFILE"=>"Colissimo/Config/".$file + ); + + } + } + } + } + return $ret; + } + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $arr) { + $loopResultRow = new LoopResultRow(); + $loopResultRow->set("ERRMES", $arr["ERRMES"]) + ->set("ERRFILE", $arr["ERRFILE"]); + $loopResult->addRow($loopResultRow); + } + return $loopResult; + } +} diff --git a/local/modules/Colissimo/Loop/NotSendLoop.php b/local/modules/Colissimo/Loop/NotSendLoop.php new file mode 100644 index 00000000..b504924e --- /dev/null +++ b/local/modules/Colissimo/Loop/NotSendLoop.php @@ -0,0 +1,74 @@ + + */ +class NotSendLoop extends Order +{ + /** + * + * define all args used in your loop + * + * + * example : + * + * public function getArgDefinitions() + * { + * return new ArgumentCollection( + * Argument::createIntListTypeArgument('id'), + * new Argument( + * 'ref', + * new TypeCollection( + * new Type\AlphaNumStringListType() + * ) + * ), + * Argument::createIntListTypeArgument('category'), + * Argument::createBooleanTypeArgument('new'), + * Argument::createBooleanTypeArgument('promo'), + * Argument::createFloatTypeArgument('min_price'), + * Argument::createFloatTypeArgument('max_price'), + * Argument::createIntTypeArgument('min_stock'), + * Argument::createFloatTypeArgument('min_weight'), + * Argument::createFloatTypeArgument('max_weight'), + * Argument::createBooleanTypeArgument('current'), + * + * ); + * } + * + * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection + */ + public function getArgDefinitions() + { + return new ArgumentCollection(Argument::createBooleanTypeArgument('with_prev_next_info', false)); + } + + /** + * this method returns a Propel ModelCriteria + * + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria() + { + return ColissimoQuery::getOrders(); + } +} diff --git a/local/modules/Colissimo/Loop/Price.php b/local/modules/Colissimo/Loop/Price.php new file mode 100644 index 00000000..014f5eef --- /dev/null +++ b/local/modules/Colissimo/Loop/Price.php @@ -0,0 +1,73 @@ + + */ +class Price extends BaseLoop implements ArraySearchLoopInterface +{ + /* set countable to false since we need to preserve keys */ + protected $countable = false; + + /** + * @return ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntTypeArgument('area', null, true) + ); + } + + public function buildArray() + { + $area = $this->getArea(); + $prices = Colissimo::getPrices(); + + if (!isset($prices[$area]) || !isset($prices[$area]["slices"])) { + return array(); + } + + $areaPrices = $prices[$area]["slices"]; + ksort($areaPrices); + + return $areaPrices; + } + + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $maxWeight => $price) { + $loopResultRow = new LoopResultRow(); + $loopResultRow->set("MAX_WEIGHT", $maxWeight) + ->set("PRICE", $price); + + $loopResult->addRow($loopResultRow); + } + return $loopResult; + } +} diff --git a/local/modules/Colissimo/Model/ColissimoQuery.php b/local/modules/Colissimo/Model/ColissimoQuery.php new file mode 100644 index 00000000..2fb634c7 --- /dev/null +++ b/local/modules/Colissimo/Model/ColissimoQuery.php @@ -0,0 +1,66 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Colissimo\Model; + +use Colissimo\Colissimo; +use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Model\OrderQuery; +use Thelia\Model\OrderStatus; +use Thelia\Model\OrderStatusQuery; + +/** + * Class ColissimoQuery + * @package Colissimo\Model + * @author Manuel Raynaud + */ +class ColissimoQuery +{ + /** + * @return OrderQuery + */ + public static function getOrders() + { + $status = OrderStatusQuery::create() + ->filterByCode( + array( + OrderStatus::CODE_PAID, + OrderStatus::CODE_PROCESSING, + ), + Criteria::IN + ) + ->find() + ->toArray("code"); + + $query = OrderQuery::create() + ->filterByDeliveryModuleId((new Colissimo())->getModuleModel()->getId()) + ->filterByStatusId( + array( + $status[OrderStatus::CODE_PAID]['Id'], + $status[OrderStatus::CODE_PROCESSING]['Id']), + Criteria::IN + ); + + return $query; + } +} diff --git a/local/modules/Colissimo/Model/Config/Base/ColissimoConfigValue.php b/local/modules/Colissimo/Model/Config/Base/ColissimoConfigValue.php new file mode 100644 index 00000000..c481a36a --- /dev/null +++ b/local/modules/Colissimo/Model/Config/Base/ColissimoConfigValue.php @@ -0,0 +1,25 @@ + + */ +class ColissimoConfigValue +{ + const FREE_SHIPPING = "free_shipping"; + const PRICES = "prices"; + const ENABLED = "enabled"; +} diff --git a/local/modules/Colissimo/Model/Config/ColissimoConfigValue.php b/local/modules/Colissimo/Model/Config/ColissimoConfigValue.php new file mode 100644 index 00000000..d0cb0be1 --- /dev/null +++ b/local/modules/Colissimo/Model/Config/ColissimoConfigValue.php @@ -0,0 +1,24 @@ + + */ +class ColissimoConfigValue extends BaseColissimoConfigValue +{ +} diff --git a/local/modules/Colissimo/THELIA_INET.FMT b/local/modules/Colissimo/THELIA_INET.FMT new file mode 100644 index 00000000..2d3a67b6 --- /dev/null +++ b/local/modules/Colissimo/THELIA_INET.FMT @@ -0,0 +1,23 @@ +[GENERAL] +DELIMITE=O +SEPARATEUR=59 +DELIMITEUR=34 +FINDELIGNE=CRLF +Unité poids=KG +[CHAMPS] +ReferenceExpedition=1 +NomDestinataire=2 +Prenom=3 +Adresse1=4 +Adresse2=5 +Adresse3=6 +CodePostal=7 +Commune=8 +CodePays=9 +Telephone=10 +Portable=11 +Poids=12 +Mail=13 +CodePointRetrait=14 +CodeProduit=15 +NomCommercialChargeur=16 diff --git a/local/modules/Colissimo/composer.json b/local/modules/Colissimo/composer.json new file mode 100644 index 00000000..d84be8fd --- /dev/null +++ b/local/modules/Colissimo/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/colissimo-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "Colissimo" + } +} diff --git a/local/modules/Colissimo/documentation/TarifsAvril2013.pdf b/local/modules/Colissimo/documentation/TarifsAvril2013.pdf new file mode 100644 index 00000000..886a9983 Binary files /dev/null and b/local/modules/Colissimo/documentation/TarifsAvril2013.pdf differ diff --git a/local/modules/Colissimo/documentation/readme.txt b/local/modules/Colissimo/documentation/readme.txt new file mode 100644 index 00000000..b673e196 --- /dev/null +++ b/local/modules/Colissimo/documentation/readme.txt @@ -0,0 +1,3 @@ +Colissimo prices based on April 2013 pdf. +TarifsAvril2013.pdf is available in this module documentation folder. +You may update prices in Config/prices.json file. \ No newline at end of file diff --git a/local/modules/Colissimo/templates/backOffice/default/assets/js/module-configuration-js.html b/local/modules/Colissimo/templates/backOffice/default/assets/js/module-configuration-js.html new file mode 100644 index 00000000..a51dac94 --- /dev/null +++ b/local/modules/Colissimo/templates/backOffice/default/assets/js/module-configuration-js.html @@ -0,0 +1,36 @@ +{javascripts file="assets/js/bootstrap-switch/bootstrap-switch.js"} + +{/javascripts} + + \ No newline at end of file diff --git a/local/modules/Colissimo/templates/backOffice/default/module_configuration.html b/local/modules/Colissimo/templates/backOffice/default/module_configuration.html new file mode 100644 index 00000000..3c495353 --- /dev/null +++ b/local/modules/Colissimo/templates/backOffice/default/module_configuration.html @@ -0,0 +1,316 @@ +
+ + {loop name="checkrights.colissimo" type="colissimo.check.rights"} +
+

{$ERRMES} {$ERRFILE} | {intl d='colissimo.bo.default' l="Please change the access rights"}.

+
+ {/loop} +
+ +{elseloop rel="checkrights.colissimo"} + +
+

{intl d='colissimo.bo.default' l="Colissimo Module allows to send your products all around the world with La Poste."}

+
+ + + +
+
+
+ {form name="colissimo.configuration"} + + {form_hidden_fields form=$form} + + {form_field form=$form field="enabled"} +
+ + {if ! empty($label_attr.help)} + {$label_attr.help} + {/if} +
+ {/form_field} + + + + {/form} +
+
+
+ +
+
+
+ + + +
+ + +
+ {form name="colissimo.export.form"} + {if $form_error}
{$form_error_message}
{/if} +
+ {form_hidden_fields} +
+ +
+ {intl d='colissimo.bo.default' l="Change orders status after export"} +
+ +
+ + {form_field field="status_id"} + + + + + + + + + + + + + {/form_field} +
+   + + +
+   + + +
+   + + +
+ + {intl d='colissimo.ai' l="*If you choose this option, the exported orders would not be available on this page anymore"} +
+
+ + + + + + + + + + + + + + + {loop name="colissimo.notsend.loop" type="colissimo.notsend.loop"} + + + + + + + + + + {/loop} + {elseloop rel="colissimo.notsend.loop"} + + + + {/elseloop} + +
+ {intl d='colissimo.ai' l="REF"} + + {intl d='colissimo.ai' l="Customer"} + + {intl d='colissimo.ai' l="Date"} + + {intl d='colissimo.ai' l="Total taxed amount"} + + {intl d='colissimo.ai' l="Number of packages"} + + {intl d='colissimo.ai' l="Packages weight"} + + {intl d='colissimo.ai' l="Export"} +
+ {$REF} + + {loop type='customer' name='colissimo.customer' id=$CUSTOMER current='false'} + {$LASTNAME} {$FIRSTNAME} + {/loop} + + {$CREATE_DATE|date_format} + + {$TOTAL_TAXED_AMOUNT} {loop name="list.socolissimo.getcurrency" type="currency" id=$CURRENCY}{$SYMBOL}{/loop} + + {form_field form=$form field="order_nb_pkg_"|cat:$ID} + + {/form_field} + + {form_field form=$form field="order_weight_"|cat:$ID} + + {/form_field} + + {form_field field="order_"|cat:$ID} + + {/form_field} +
+
+
{intl d='colissimo.ai' l="There is currently not orders to export"}
+
+ + {ifloop rel="colissimo.notsend.loop"} + + {/ifloop} +
+ {/form} +
+ +
+ + {assign var="isColissimoFreeShipping" value=0} + {form name="colissimo.freeshipping.form"} +
+
+ {form_hidden_fields} + + {form_field field="freeshipping"} + + +
+ +
+ {/form_field} +
+ {/form} + +
+
+
+
+
+{/elseloop} diff --git a/local/modules/Comment/Action/CommentAction.php b/local/modules/Comment/Action/CommentAction.php new file mode 100644 index 00000000..d086153c --- /dev/null +++ b/local/modules/Comment/Action/CommentAction.php @@ -0,0 +1,666 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Comment\Action; + +use Comment\Comment as CommentModule; +use Comment\Events\CommentAbuseEvent; +use Comment\Events\CommentChangeStatusEvent; +use Comment\Events\CommentCheckOrderEvent; +use Comment\Events\CommentComputeRatingEvent; +use Comment\Events\CommentCreateEvent; +use Comment\Events\CommentDefinitionEvent; +use Comment\Events\CommentDeleteEvent; +use Comment\Events\CommentEvents; +use Comment\Events\CommentReferenceGetterEvent; +use Comment\Events\CommentUpdateEvent; +use Comment\Exception\InvalidDefinitionException; +use Comment\Model\Comment; +use Comment\Model\CommentQuery; +use Comment\Model\Map\CommentTableMap; +use DateInterval; +use DateTime; +use Propel\Runtime\ActiveQuery\Criteria; +use Propel\Runtime\ActiveQuery\Join; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Translation\TranslatorInterface; +use Thelia\Core\Template\ParserInterface; +use Thelia\Core\Translation\Translator; +use Thelia\Log\Tlog; +use Thelia\Mailer\MailerFactory; +use Thelia\Model\ConfigQuery; +use Thelia\Model\ContentQuery; +use Thelia\Model\CustomerQuery; +use Thelia\Model\LangQuery; +use Thelia\Model\Map\OrderProductTableMap; +use Thelia\Model\Map\OrderTableMap; +use Thelia\Model\Map\ProductSaleElementsTableMap; +use Thelia\Model\MessageQuery; +use Thelia\Model\MetaData; +use Thelia\Model\MetaDataQuery; +use Thelia\Model\OrderProductQuery; +use Thelia\Model\ProductQuery; +use Thelia\Tools\URL; + +/** + * + * CommentAction class where all actions are managed + * + * Class CommentAction + * @package Comment\Action + * @author Michaël Espeche + */ +class CommentAction implements EventSubscriberInterface +{ + /** @var null|TranslatorInterface */ + protected $translator = null; + + /** @var null|ParserInterface */ + protected $parser = null; + + /** @var null|MailerFactory */ + protected $mailer = null; + + public function __construct(TranslatorInterface $translator, ParserInterface $parser, MailerFactory $mailer) + { + $this->translator = $translator; + $this->parser = $parser; + $this->mailer = $mailer; + } + + public function create(CommentCreateEvent $event) + { + $comment = new Comment(); + + $comment + ->setRef($event->getRef()) + ->setRefId($event->getRefId()) + ->setCustomerId($event->getCustomerId()) + ->setUsername($event->getUsername()) + ->setEmail($event->getEmail()) + ->setLocale($event->getLocale()) + ->setTitle($event->getTitle()) + ->setContent($event->getContent()) + ->setStatus($event->getStatus()) + ->setVerified($event->isVerified()) + ->setRating($event->getRating()) + ->setAbuse($event->getAbuse()) + ->save(); + + $event->setComment($comment); + + if (Comment::ACCEPTED === $comment->getStatus()) { + $this->dispatchRatingCompute( + $event->getDispatcher(), + $comment->getRef(), + $comment->getRefId() + ); + } + } + + public function update(CommentUpdateEvent $event) + { + if (null !== $comment = CommentQuery::create()->findPk($event->getId())) { + $comment + ->setRef($event->getRef()) + ->setRefId($event->getRefId()) + ->setCustomerId($event->getCustomerId()) + ->setUsername($event->getUsername()) + ->setEmail($event->getEmail()) + ->setLocale($event->getLocale()) + ->setTitle($event->getTitle()) + ->setContent($event->getContent()) + ->setStatus($event->getStatus()) + ->setVerified($event->isVerified()) + ->setRating($event->getRating()) + ->setAbuse($event->getAbuse()) + ->save(); + $event->setComment($comment); + + $this->dispatchRatingCompute( + $event->getDispatcher(), + $comment->getRef(), + $comment->getRefId() + ); + } + } + + public function delete(CommentDeleteEvent $event) + { + if (null !== $comment = CommentQuery::create()->findPk($event->getId())) { + $comment->delete(); + + $event->setComment($comment); + + if (Comment::ACCEPTED === $comment->getStatus()) { + $this->dispatchRatingCompute( + $event->getDispatcher(), + $comment->getRef(), + $comment->getRefId() + ); + } + } + } + + public function abuse(CommentAbuseEvent $event) + { + if (null !== $comment = CommentQuery::create()->findPk($event->getId())) { + $comment->setAbuse($comment->getAbuse() + 1); + $comment->save(); + + $event->setComment($comment); + } + } + + public function statusChange(CommentChangeStatusEvent $event) + { + $changed = false; + + if (null !== $comment = CommentQuery::create()->findPk($event->getId())) { + if ($comment->getStatus() !== $event->getNewStatus()) { + $comment->setStatus($event->getNewStatus()); + $comment->save(); + + $event->setComment($comment); + + $this->dispatchRatingCompute( + $event->getDispatcher(), + $comment->getRef(), + $comment->getRefId() + ); + } + } + } + + public function productRatingCompute(CommentComputeRatingEvent $event) + { + if ('product' === $event->getRef()) { + + $product = ProductQuery::create()->findPk($event->getRefId()); + if (null !== $product) { + + $query = CommentQuery::create() + ->filterByRef('product') + ->filterByRefId($product->getId()) + ->filterByStatus(Comment::ACCEPTED) + ->withColumn("AVG(RATING)", 'AVG_RATING') + ->select('AVG_RATING'); + + $rating = $query->findOne(); + + if (null !== $rating) { + $rating = round($rating, 2); + + $event->setRating($rating); + + MetaDataQuery::setVal( + Comment::META_KEY_RATING, + MetaData::PRODUCT_KEY, + $product->getId(), + $rating + ); + } + } + } + } + + /** + * Dispatch an event to compute an average rating + * + * @param string $ref + * @param int $refId + */ + protected function dispatchRatingCompute($dispatcher, $ref, $refId) + { + $ratingEvent = new CommentComputeRatingEvent(); + + $ratingEvent + ->setRef($ref) + ->setRefId($refId); + + $dispatcher->dispatch( + CommentEvents::COMMENT_RATING_COMPUTE, + $ratingEvent + ); + } + + public function getRefrence(CommentReferenceGetterEvent $event) + { + if ('product' === $event->getRef()) { + $product = ProductQuery::create()->findPk($event->getRefId()); + if (null !== $product) { + $event->setTypeTitle($this->translator->trans('Product', [], 'core', $event->getLocale())); + $event->setTitle($product->getTitle()); + $event->setViewUrl($product->getUrl($event->getLocale())); + $event->setEditUrl( + URL::getInstance()->absoluteUrl( + '/admin/products/update', + ['product_id' => $product->getId()] + ) + ); + $event->setObject($product); + } + } elseif ('content' === $event->getRef()) { + $content = ContentQuery::create()->findPk($event->getRefId()); + if (null !== $content) { + $event->setTypeTitle($this->translator->trans('Content', [], 'core', $event->getLocale())); + $event->setTitle($content->getTitle()); + $event->setViewUrl($content->getUrl($event->getLocale())); + $event->setEditUrl( + URL::getInstance()->absoluteUrl( + '/admin/contents/update', + ['product_id' => $content->getId()] + ) + ); + $event->setObject($content); + } + } + } + + public function getDefinition(CommentDefinitionEvent $event) + { + $config = $event->getConfig(); + + if (!in_array($event->getRef(), $config['ref_allowed'])) { + throw new InvalidDefinitionException( + $this->translator->trans( + "Reference %ref is not allowed", + ['%ref' => $event->getRef()], + CommentModule::MESSAGE_DOMAIN + ) + ); + } + + $eventName = CommentEvents::COMMENT_GET_DEFINITION . "." . $event->getRef(); + $event->getDispatcher()->dispatch($eventName, $event); + + // is only customer is authorized to publish + if ($config['only_customer'] && null === $event->getCustomer()) { + throw new InvalidDefinitionException( + $this->translator->trans( + "Only customer are allowed to publish comment", + [], + CommentModule::MESSAGE_DOMAIN + ), + false + ); + } + + if (null !== $event->getCustomer()) { + // is customer already have published something + $comment = CommentQuery::create() + ->filterByCustomerId($event->getCustomer()->getId()) + ->filterByRef($event->getRef()) + ->filterByRefId($event->getRefId()) + ->findOne(); + + if (null !== $comment) { + $event->setComment($comment); + } + } + } + + + public function getProductDefinition(CommentDefinitionEvent $event) + { + $config = $event->getConfig(); + + $event->setRating(true); + + $product = ProductQuery::create()->findPk($event->getRefId()); + if (null === $product) { + throw new InvalidDefinitionException( + $this->translator->trans( + "Product %id does not exist", + ['%ref' => $event->getRef()], + CommentModule::MESSAGE_DOMAIN + ) + ); + } + + // is comment is authorized on this product + $commentProductActivated = MetaDataQuery::getVal( + Comment::META_KEY_ACTIVATED, + \Thelia\Model\MetaData::PRODUCT_KEY, + $product->getId() + ); + + // not defined, get the global config + if ("1" !== $commentProductActivated) { + if ("0" === $commentProductActivated || false === $config['activated']) { + throw new InvalidDefinitionException( + $this->translator->trans( + "Comment not activated on this element.", + ['%ref' => $event->getRef()], + CommentModule::MESSAGE_DOMAIN + ) + ); + } + } + + $verified = false; + if (null !== $event->getCustomer()) { + // customer has bought the product + $productBoughtCount = OrderProductQuery::getSaleStats( + $product->getRef(), + null, + null, + [2, 3, 4], + $event->getCustomer()->getId() + ); + + if ($config['only_verified']) { + if (0 === $productBoughtCount) { + throw new InvalidDefinitionException( + $this->translator->trans( + "Only customers who have bought this product can publish comment", + [], + CommentModule::MESSAGE_DOMAIN + ), + false + ); + } + } + + $verified = 0 !== $productBoughtCount; + } else { + $verified = false; + } + + $event->setVerified($verified); + } + + public function getContentDefinition(CommentDefinitionEvent $event) + { + $config = $event->getConfig(); + + $event->setVerified(true); + $event->setRating(false); + + // is comment is authorized on this product + $commentProductActivated = MetaDataQuery::getVal( + Comment::META_KEY_ACTIVATED, + \Thelia\Model\MetaData::CONTENT_KEY, + $event->getRefId() + ); + + // not defined, get the global config + if ("1" !== $commentProductActivated) { + if ("0" === $commentProductActivated || false === $config['activated']) { + throw new InvalidDefinitionException( + $this->translator->trans( + "Comment not activated on this element.", + ['%ref' => $event->getRef()], + CommentModule::MESSAGE_DOMAIN + ) + ); + } + } + } + + public function requestCustomerDemand(CommentCheckOrderEvent $event) + { + $config = \Comment\Comment::getConfig(); + $nbDays = $config["request_customer_ttl"]; + + if (0 !== $nbDays) { + + $endDate = new DateTime('NOW'); + $endDate->setTime(0, 0, 0); + $endDate->sub(new DateInterval('P' . $nbDays . 'D')); + + $startDate = clone $endDate; + $startDate->sub(new DateInterval('P1D')); + + $pseJoin = new Join( + OrderProductTableMap::PRODUCT_SALE_ELEMENTS_ID, + ProductSaleElementsTableMap::ID, + Criteria::INNER_JOIN + ); + + $products = OrderProductQuery::create() + ->useOrderQuery() + ->filterByInvoiceDate($startDate, Criteria::GREATER_EQUAL) + ->filterByInvoiceDate($endDate, Criteria::LESS_THAN) + ->addAsColumn('customerId', OrderTableMap::CUSTOMER_ID) + ->addAsColumn('orderId', OrderTableMap::ID) + ->endUse() + ->addJoinObject($pseJoin) + ->addAsColumn('pseId', OrderProductTableMap::PRODUCT_SALE_ELEMENTS_ID) + ->addAsColumn('productId', ProductSaleElementsTableMap::PRODUCT_ID) + ->select( + [ + 'customerId', + 'orderId', + 'pseId', + 'productId' + ] + ) + ->find() + ->toArray(); + + if (empty($products)) { + return; + } + + $customerProducts = array_reduce( + $products, + function ($result, $item) { + + if (!array_key_exists($item['customerId'], $result)) { + $result[$item['customerId']] = []; + } + if (!in_array($item['productId'], $result[$item['customerId']])) { + $result[$item['customerId']][] = $item['productId']; + } + + return $result; + }, + [] + ); + + $customerIds = array_keys($customerProducts); + + // check if comments already exists + $comments = CommentQuery::create() + ->filterByCustomerId($customerIds) + ->filterByRef(MetaData::PRODUCT_KEY) + ->addAsColumn('customerId', CommentTableMap::CUSTOMER_ID) + ->addAsColumn('productId', CommentTableMap::REF_ID) + ->select( + [ + 'customerId', + 'productId' + ] + ) + ->find() + ->toArray(); + + $customerComments = array_reduce( + $comments, + function ($result, $item) { + + if (!array_key_exists($item['customerId'], $result)) { + $result[$item['customerId']] = []; + } + $result[$item['customerId']][] = $item['productId']; + + return $result; + }, + [] + ); + + foreach ($customerIds as $customerId) { + $send = false; + + if (!array_key_exists($customerId, $customerComments)) { + $send = true; + } else { + $noCommentsPosted = array_intersect( + $customerComments[$customerId], + $customerProducts[$customerId] + ); + + if (empty($noCommentsPosted)) { + $send = true; + } + } + + if ($send) { + try { + $this->sendCommentRequestCustomerMail($customerId, $customerProducts[$customerId]); + } catch (\Exception $ex) { + Tlog::getInstance()->error($ex->getMessage()); + } + } + } + } + } + + protected function sendCommentRequestCustomerMail($customerId, array $productIds) + { + $contact_email = ConfigQuery::getStoreEmail(); + + if ($contact_email) { + $message = MessageQuery::create() + ->filterByName('comment_request_customer') + ->findOne(); + + if (null === $message) { + throw new \Exception("Failed to load message 'comment_request_customer'."); + } + + $customer = CustomerQuery::create()->findPk($customerId); + + if (null === $customer) { + throw new \Exception( + sprintf("Failed to load customer '%s'.", $customerId) + ); + } + + $parser = $this->parser; + + $locale = $customer->getCustomerLang()->getLocale(); + + $parser->assign('customer_id', $customer->getId()); + $parser->assign('product_ids', $productIds); + $parser->assign('lang_id', $customer->getCustomerLang()->getId()); + + $message->setLocale($locale); + + $instance = \Swift_Message::newInstance() + ->addTo($customer->getEmail(), $customer->getFirstname() . " " . $customer->getLastname()) + ->addFrom($contact_email, ConfigQuery::getStoreName()); + + // Build subject and body + $message->buildMessage($parser, $instance); + + $this->mailer->send($instance); + + Tlog::getInstance()->debug( + "Message sent to customer " . $customer->getEmail() . " to ask for comments" + ); + } + } + + /** + * Notify shop managers of a new comment. + * @param CommentCreateEvent $event + */ + public function notifyAdminOfNewComment(CommentCreateEvent $event) + { + $config = \Comment\Comment::getConfig(); + if (!$config["notify_admin_new_comment"]) { + return; + } + + $comment = $event->getComment(); + if ($comment === null) { + return; + } + + // get the default shop locale + $shopLang = LangQuery::create()->findOneByByDefault(true); + if ($shopLang !== null) { + $shopLocale = $shopLang->getLocale(); + } else { + $shopLocale = null; + } + + $getCommentRefEvent = new CommentReferenceGetterEvent( + $comment->getRef(), + $comment->getRefId(), + $shopLocale + ); + $event->getDispatcher()->dispatch(CommentEvents::COMMENT_REFERENCE_GETTER, $getCommentRefEvent); + + $this->mailer->sendEmailToShopManagers( + 'new_comment_notification_admin', + [ + 'comment_id' => $comment->getId(), + 'ref_title' => $getCommentRefEvent->getTitle(), + 'ref_type_title' => $getCommentRefEvent->getTypeTitle(), + ] + ); + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return [ + CommentEvents::COMMENT_CREATE => [ + ['create', 128], + ['notifyAdminOfNewComment', 64], + ], + CommentEvents::COMMENT_DELETE => ['delete', 128], + CommentEvents::COMMENT_UPDATE => ['update', 128], + CommentEvents::COMMENT_ABUSE => ['abuse', 128], + CommentEvents::COMMENT_STATUS_UPDATE => ['statusChange', 128], + CommentEvents::COMMENT_RATING_COMPUTE => ['productRatingCompute', 128], + CommentEvents::COMMENT_REFERENCE_GETTER => ['getRefrence', 128], + CommentEvents::COMMENT_CUSTOMER_DEMAND => ['requestCustomerDemand', 128], + CommentEvents::COMMENT_GET_DEFINITION => ['getDefinition', 128], + CommentEvents::COMMENT_GET_DEFINITION_PRODUCT => ['getProductDefinition', 128], + CommentEvents::COMMENT_GET_DEFINITION_CONTENT => ['getContentDefinition', 128], + ]; + } +} diff --git a/local/modules/Comment/Comment.php b/local/modules/Comment/Comment.php new file mode 100644 index 00000000..e3c74c5f --- /dev/null +++ b/local/modules/Comment/Comment.php @@ -0,0 +1,209 @@ + + * @author Julien Chanséaume + */ +class Comment extends BaseModule +{ + const MESSAGE_DOMAIN = "comment"; + const MESSAGE_DOMAIN_EMAIL = "comment.email.default"; + + /** Use comment */ + const CONFIG_ACTIVATED = 1; + + /** Use moderation */ + const CONFIG_MODERATE = 1; + + /** Allowed ref */ + const CONFIG_REF_ALLOWED = 'product,content'; + + /** Only customers are abled to post comment */ + const CONFIG_ONLY_CUSTOMER = 1; + + /** Allow only verified customer (for product, customers that have bought the product) */ + const CONFIG_ONLY_VERIFIED = 1; + + /** request customer comment, x days after an order */ + const CONFIG_REQUEST_CUSTOMMER_TTL = 15; + + /** Send an email notification to the store admins when a new comment is posted */ + const CONFIG_NOTIFY_ADMIN_NEW_COMMENT = true; + + + public function postActivation(ConnectionInterface $con = null) + { + // Config + if (null === ConfigQuery::read('comment_activated')) { + ConfigQuery::write('comment_activated', Comment::CONFIG_ACTIVATED); + } + + if (null === ConfigQuery::read('comment_moderate')) { + ConfigQuery::write('comment_moderate', Comment::CONFIG_MODERATE); + } + + if (null === ConfigQuery::read('comment_ref_allowed')) { + ConfigQuery::write('comment_ref_allowed', Comment::CONFIG_REF_ALLOWED); + } + + if (null === ConfigQuery::read('comment_only_customer')) { + ConfigQuery::write('comment_only_customer', Comment::CONFIG_ONLY_CUSTOMER); + } + + if (null === ConfigQuery::read('comment_only_verified')) { + ConfigQuery::write('comment_only_verified', Comment::CONFIG_ONLY_VERIFIED); + } + + if (null === ConfigQuery::read('comment_request_customer_ttl')) { + ConfigQuery::write('comment_request_customer_ttl', Comment::CONFIG_REQUEST_CUSTOMMER_TTL); + } + + if (null === ConfigQuery::read('comment_notify_admin_new_comment')) { + ConfigQuery::write('comment_notify_admin_new_comment', Comment::CONFIG_NOTIFY_ADMIN_NEW_COMMENT); + } + + // Schema + try { + CommentQuery::create()->findOne(); + } catch (\Exception $ex) { + $database = new Database($con->getWrappedConnection()); + $database->insertSql(null, [__DIR__ . DS . 'Config' . DS . 'thelia.sql']); + } + + // Messages + // load the email localization files (the module was just loaded so they are not loaded yet) + $languages = LangQuery::create()->find(); + /** @var Lang $language */ + foreach ($languages as $language) { + Translator::getInstance()->addResource( + "php", + __DIR__ . "/I18n/email/default/" . $language->getLocale() . ".php", + $language->getLocale(), + self::MESSAGE_DOMAIN_EMAIL + ); + } + + // Request comment from customer + if (null === MessageQuery::create()->findOneByName('comment_request_customer')) { + $message = new Message(); + $message + ->setName('comment_request_customer') + ->setHtmlTemplateFileName('request-customer-comment.html') + ->setHtmlLayoutFileName('') + ->setTextTemplateFileName('request-customer-comment.txt') + ->setTextLayoutFileName('') + ->setSecured(0); + + foreach ($languages as $language) { + $locale = $language->getLocale(); + + $message->setLocale($locale); + + $message->setTitle( + Translator::getInstance()->trans('Request customer comment', [], self::MESSAGE_DOMAIN) + ); + $message->setSubject( + Translator::getInstance()->trans('', [], self::MESSAGE_DOMAIN) + ); + } + + $message->save(); + } + + // Notify admin of new comment + if (null === MessageQuery::create()->findOneByName('new_comment_notification_admin')) { + $message = new Message(); + $message + ->setName('new_comment_notification_admin') + ->setHtmlTemplateFileName('new-comment-notification-admin.html') + ->setHtmlLayoutFileName('') + ->setTextTemplateFileName('new-comment-notification-admin.txt') + ->setTextLayoutFileName('') + ->setSecured(0); + + foreach ($languages as $language) { + $locale = $language->getLocale(); + + $message->setLocale($locale); + + $message->setTitle( + Translator::getInstance()->trans( + 'Notify store admin of new comment', + [], + self::MESSAGE_DOMAIN_EMAIL, + $locale + ) + ); + + $subject = Translator::getInstance()->trans( + 'New comment on %ref_type_title "%ref_title"', + [], + self::MESSAGE_DOMAIN_EMAIL, + $locale + ); + $subject = str_replace('%ref_type_title', '{$ref_type_title|lower}', $subject); + $subject = str_replace('%ref_title', '{$ref_title}', $subject); + $message->setSubject($subject); + } + + $message->save(); + } + } + + public static function getConfig() + { + $config = [ + 'activated' => ( + intval(ConfigQuery::read('comment_activated', self::CONFIG_ACTIVATED)) === 1 + ), + 'moderate' => ( + intval(ConfigQuery::read('comment_moderate', self::CONFIG_MODERATE)) === 1 + ), + 'ref_allowed' => explode( + ',', + ConfigQuery::read('comment_ref_allowed', self::CONFIG_REF_ALLOWED) + ), + 'only_customer' => ( + intval(ConfigQuery::read('comment_only_customer', self::CONFIG_ONLY_CUSTOMER)) === 1 + ), + 'only_verified' => ( + intval(ConfigQuery::read('comment_only_verified', self::CONFIG_ONLY_VERIFIED)) === 1 + ), + 'request_customer_ttl' => ( + intval(ConfigQuery::read('comment_request_customer_ttl', self::CONFIG_REQUEST_CUSTOMMER_TTL)) + ), + 'notify_admin_new_comment' => ( + intval(ConfigQuery::read('comment_notify_admin_new_comment', self::CONFIG_NOTIFY_ADMIN_NEW_COMMENT)) + === 1 + ), + ]; + + return $config; + } +} diff --git a/local/modules/Comment/Config/config.xml b/local/modules/Comment/Config/config.xml new file mode 100644 index 00000000..1e241647 --- /dev/null +++ b/local/modules/Comment/Config/config.xml @@ -0,0 +1,72 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/Comment/Config/module.xml b/local/modules/Comment/Config/module.xml new file mode 100644 index 00000000..b6740228 --- /dev/null +++ b/local/modules/Comment/Config/module.xml @@ -0,0 +1,24 @@ + + + Comment\Comment + + Comment system + + + Système de commentaire + + + en_US + fr_FR + + 0.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.1.0 + alpha + \ No newline at end of file diff --git a/local/modules/Comment/Config/routing.xml b/local/modules/Comment/Config/routing.xml new file mode 100644 index 00000000..3eae0ba5 --- /dev/null +++ b/local/modules/Comment/Config/routing.xml @@ -0,0 +1,69 @@ + + + + + + + + Comment\Controller\Front\CommentController::getAction + + + + Comment\Controller\Front\CommentController::createAction + + + + Comment\Controller\Front\CommentController::deleteAction + \d+ + + + + Comment\Controller\Front\CommentController::abuseAction + + + + + Comment\Controller\Back\CommentController::saveConfiguration + + + + + + Comment\Controller\Back\CommentController::defaultAction + + + + Comment\Controller\Back\CommentController::createAction + + + + Comment\Controller\Back\CommentController::updateAction + \d+ + + + + Comment\Controller\Back\CommentController::processUpdateAction + \d+ + + + + Comment\Controller\Back\CommentController::deleteAction + + + + Comment\Controller\Back\CommentController::changeStatusAction + + + + Comment\Controller\Back\CommentController::activationAction + .* + \d+ + + + + Comment\Controller\Back\CommentController::requestCustomerCommentAction + + + diff --git a/local/modules/Comment/Config/schema.xml b/local/modules/Comment/Config/schema.xml new file mode 100644 index 00000000..e6668bd5 --- /dev/null +++ b/local/modules/Comment/Config/schema.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
diff --git a/local/modules/Comment/Config/thelia.sql b/local/modules/Comment/Config/thelia.sql new file mode 100644 index 00000000..c3e1bd51 --- /dev/null +++ b/local/modules/Comment/Config/thelia.sql @@ -0,0 +1,39 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- comment +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `comment`; + +CREATE TABLE `comment` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `username` VARCHAR(255), + `customer_id` INTEGER, + `ref` VARCHAR(255), + `ref_id` INTEGER, + `email` VARCHAR(255), + `title` VARCHAR(255), + `content` LONGTEXT, + `rating` TINYINT, + `status` TINYINT DEFAULT 0, + `verified` TINYINT, + `abuse` INTEGER, + `locale` VARCHAR(10), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_comment_user_id` (`customer_id`), + CONSTRAINT `fk_comment_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/Comment/Controller/Back/CommentController.php b/local/modules/Comment/Controller/Back/CommentController.php new file mode 100644 index 00000000..6bbe290d --- /dev/null +++ b/local/modules/Comment/Controller/Back/CommentController.php @@ -0,0 +1,439 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Comment\Controller\Back; + +use Comment\Comment; +use Comment\Events\CommentChangeStatusEvent; +use Comment\Events\CommentCheckOrderEvent; +use Comment\Events\CommentCreateEvent; +use Comment\Events\CommentDeleteEvent; +use Comment\Events\CommentEvent; +use Comment\Events\CommentEvents; +use Comment\Events\CommentUpdateEvent; +use Comment\Form\CommentCreationForm; +use Comment\Form\CommentModificationForm; +use Comment\Model\CommentQuery; +use Exception; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Thelia\Controller\Admin\AbstractCrudController; +use Thelia\Core\Security\AccessManager; +use Thelia\Core\Security\Resource\AdminResources; +use Thelia\Model\ConfigQuery; +use Thelia\Model\MetaDataQuery; +use Thelia\Tools\URL; + +/** + * Class CommentController + * @package Comment\Controller\Back + * @author Julien Chanséaume + */ +class CommentController extends AbstractCrudController +{ + + protected $currentRouter = "router.comment"; + + public function __construct() + { + parent::__construct( + 'comment', + 'created_reverse', + 'order', + AdminResources::CONFIG, + CommentEvents::COMMENT_CREATE, + CommentEvents::COMMENT_UPDATE, + CommentEvents::COMMENT_DELETE, + null, // No visibility toggle + null, // no position change + Comment::getModuleCode() + ); + } + + /** + * Return the creation form for this object + */ + protected function getCreationForm() + { + return new CommentCreationForm($this->getRequest()); + } + + /** + * Return the update form for this object + */ + protected function getUpdateForm() + { + return new CommentModificationForm($this->getRequest()); + } + + /** + * Hydrate the update form for this object, before passing it to the update template + * + * @param \Comment\Model\Comment $object + */ + protected function hydrateObjectForm($object) + { + // Prepare the data that will hydrate the form + $data = [ + 'id' => $object->getId(), + 'ref' => $object->getRef(), + 'ref_id' => $object->getRefId(), + 'customer_id' => $object->getCustomerId(), + 'username' => $object->getUsername(), + 'email' => $object->getEmail(), + 'locale' => $object->getLocale(), + 'title' => $object->getTitle(), + 'content' => $object->getContent(), + 'status' => $object->getStatus(), + 'verified' => $object->getVerified(), + 'rating' => $object->getRating() + ]; + + // Setup the object form + return new CommentModificationForm($this->getRequest(), "form", $data); + } + + /** + * Creates the creation event with the provided form data + * + * @param unknown $formData + */ + protected function getCreationEvent($formData) + { + $event = $this->bindFormData( + new CommentCreateEvent(), + $formData + ); + + return $event; + } + + /** + * Creates the update event with the provided form data + * + * @param unknown $formData + */ + protected function getUpdateEvent($formData) + { + $event = $this->bindFormData( + new CommentUpdateEvent(), + $formData + ); + + $event->setId($formData['id']); + + return $event; + } + + protected function bindFormData($event, $formData) + { + $event->setRef($formData['ref']); + $event->setRefId($formData['ref_id']); + $event->setCustomerId($formData['customer_id']); + $event->setUsername($formData['username']); + $event->setEmail($formData['email']); + $event->setLocale($formData['locale']); + $event->setTitle($formData['title']); + $event->setContent($formData['content']); + $event->setStatus($formData['status']); + $event->setVerified($formData['verified']); + $event->setRating($formData['rating']); + + return $event; + } + + /** + * Creates the delete event with the provided form data + */ + protected function getDeleteEvent() + { + $event = new CommentDeleteEvent(); + + $event->setId($this->getRequest()->get('comment_id')); + + return $event; + } + + /** + * Return true if the event contains the object, e.g. the action has updated the object in the event. + * + * @param CommentEvent $event + */ + protected function eventContainsObject($event) + { + return null !== $event->getComment(); + } + + /** + * Get the created object from an event. + * + * @param CommentEvent $event + * + * @return \Comment\Model\Comment + */ + protected function getObjectFromEvent($event) + { + return $event->getComment(); + } + + /** + * Load an existing object from the database + */ + protected function getExistingObject() + { + + $comment_id = $this->getRequest()->get('comment_id'); + if (null === $comment_id) { + $comment_id = $this->getRequest()->attributes('comment_id'); + } + + return CommentQuery::create()->findPk($comment_id); + } + + /** + * Returns the object label form the object event (name, title, etc.) + * + * @param \Comment\Model\Comment $object + */ + protected function getObjectLabel($object) + { + $object->getTitle(); + } + + /** + * Returns the object ID from the object + * + * @param \Comment\Model\Comment $object + */ + protected function getObjectId($object) + { + $object->getId(); + } + + /** + * Render the main list template + * + * @param string $currentOrder , if any, null otherwise. + */ + protected function renderListTemplate($currentOrder) + { + return $this->render('comments', ['order' => $currentOrder]); + } + + /** + * Render the edition template + */ + protected function renderEditionTemplate() + { + return $this->render( + 'comment-edit', + [ + 'comment_id' => $this->getRequest()->get('comment_id') + ] + ); + } + + /** + * Must return a RedirectResponse instance + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + protected function redirectToEditionTemplate() + { + return $this->generateRedirectFromRoute( + "admin.comment.comments.update", + [], + ['comment_id' => $this->getRequest()->get('comment_id')] + ); + } + + /** + * Must return a RedirectResponse instance + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + protected function redirectToListTemplate() + { + return $this->generateRedirectFromRoute('admin.comment.comments.default'); + } + + + public function changeStatusAction() + { + if (null !== $response = $this->checkAuth([], ['comment'], AccessManager::UPDATE) + ) { + return $response; + } + + $message = [ + "success" => false, + ]; + + $id = $this->getRequest()->request->get('id'); + $status = $this->getRequest()->request->get('status'); + + if (null !== $id && null !== $status) { + try { + $event = new CommentChangeStatusEvent(); + $event + ->setId($id) + ->setNewStatus($status); + + $this->dispatch( + CommentEvents::COMMENT_STATUS_UPDATE, + $event + ); + + $message = [ + "success" => true, + "data" => [ + 'id' => $id, + 'status' => $event->getComment()->getStatus() + ] + ]; + } catch (\Exception $ex) { + $message["error"] = $ex->getMessage(); + } + } else { + $message["error"] = $this->getTranslator()->trans('Missing parameters', [], Comment::MESSAGE_DOMAIN); + } + + return $this->jsonResponse(json_encode($message)); + } + + public function activationAction($ref, $refId) + { + if (null !== $response = $this->checkAuth([], ['comment'], AccessManager::UPDATE) + ) { + return $response; + } + + $message = [ + "success" => false, + ]; + + $status = $this->getRequest()->request->get('status'); + + switch ($status) { + case "0": + case "1": + MetaDataQuery::setVal(\Comment\Model\Comment::META_KEY_ACTIVATED, $ref, $refId, $status); + $message['success'] = true; + break; + case "-1": + $deleted = MetaDataQuery::create() + ->filterByMetaKey(\Comment\Model\Comment::META_KEY_ACTIVATED) + ->filterByElementKey($ref) + ->filterByElementId($refId) + ->delete(); + if ($deleted === 1) { + $message['success'] = true; + } + break; + } + + $message['status'] = MetaDataQuery::getVal(\Comment\Model\Comment::META_KEY_ACTIVATED, $ref, $refId, "-1"); + + return $this->jsonResponse(json_encode($message)); + } + + + /** + * Save comment module configuration + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function saveConfiguration() + { + + if (null !== $response = $this->checkAuth([AdminResources::MODULE], ['comment'], AccessManager::UPDATE) + ) { + return $response; + } + + $form = new \Comment\Form\ConfigurationForm($this->getRequest()); + $message = ""; + + $response = null; + + try { + $vform = $this->validateForm($form); + $data = $vform->getData(); + + ConfigQuery::write( + 'comment_activated', + $data['activated'] ? '1' : '0' + ); + ConfigQuery::write( + 'comment_moderate', + $data['moderate'] ? '1' : '0' + ); + ConfigQuery::write('comment_ref_allowed', $data['ref_allowed']); + ConfigQuery::write( + 'comment_only_customer', + $data['only_customer'] ? '1' : '0' + ); + ConfigQuery::write( + 'comment_only_verified', + $data['only_verified'] ? '1' : '0' + ); + ConfigQuery::write( + 'comment_request_customer_ttl', + $data['request_customer_ttl'] + ); + ConfigQuery::write( + 'comment_notify_admin_new_comment', + $data['notify_admin_new_comment'] + ); + } catch (\Exception $e) { + $message = $e->getMessage(); + } + if ($message) { + $form->setErrorMessage($message); + $this->getParserContext()->addForm($form); + $this->getParserContext()->setGeneralError($message); + + return $this->render( + "module-configure", + ["module_code" => Comment::getModuleCode()] + ); + } + + return RedirectResponse::create( + URL::getInstance()->absoluteUrl("/admin/module/" . Comment::getModuleCode()) + ); + } + + public function requestCustomerCommentAction() + { + // We do not check auth, as the related route may be invoked from a cron + try { + $this->dispatch( + CommentEvents::COMMENT_CUSTOMER_DEMAND, + new CommentCheckOrderEvent() + ); + } catch (\Exception $ex) { + // Any error + return $this->errorPage($ex); + } + + return $this->redirectToListTemplate(); + } +} diff --git a/local/modules/Comment/Controller/Front/CommentController.php b/local/modules/Comment/Controller/Front/CommentController.php new file mode 100644 index 00000000..4d48332a --- /dev/null +++ b/local/modules/Comment/Controller/Front/CommentController.php @@ -0,0 +1,293 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Comment\Controller\Front; + +use Comment\Comment; +use Comment\Events\CommentAbuseEvent; +use Comment\Events\CommentCreateEvent; +use Comment\Events\CommentDefinitionEvent; +use Comment\Events\CommentDeleteEvent; +use Comment\Events\CommentEvents; +use Comment\Exception\InvalidDefinitionException; +use Comment\Model\CommentQuery; +use Exception; +use Thelia\Controller\Front\BaseFrontController; + +/** + * Class CommentController + * @package Comment\Controller\Admin + * @author Michaël Espeche + * @author Julien Chanséaume + */ +class CommentController extends BaseFrontController +{ + const DEFAULT_VISIBLE = 0; + + protected $useFallbackTemplate = true; + + public function getAction() + { + // only ajax + $this->checkXmlHttpRequest(); + + $definition = null; + + try { + $definition = $this->getDefinition( + $this->getRequest()->get('ref', null), + $this->getRequest()->get('ref_id', null) + ); + } catch (InvalidDefinitionException $ex) { + if ($ex->isSilent()) { + // Comment not authorized on this resource + $this->accessDenied(); + } + } + + return $this->render( + "ajax-comments", + [ + 'ref' => $this->getRequest()->get('ref'), + 'ref_id' => $this->getRequest()->get('ref_id'), + 'start' => $this->getRequest()->get('start', 0), + 'count' => $this->getRequest()->get('count', 10), + ] + ); + } + + public function abuseAction() + { + // only ajax + $this->checkXmlHttpRequest(); + + $abuseForm = $this->createForm('comment.abuse.form'); + + $messageData = [ + "success" => false + ]; + + try { + $form = $this->validateForm($abuseForm); + + $comment_id = $form->get("id")->getData(); + + $event = new CommentAbuseEvent(); + $event->setId($comment_id); + + $this->dispatch(CommentEvents::COMMENT_ABUSE, $event); + + $messageData["success"] = true; + $messageData["message"] = $this->getTranslator()->trans( + "Your request has been registered. Thank you.", + [], + Comment::MESSAGE_DOMAIN + ); + } catch (\Exception $ex) { + // all errors + $messageData["message"] = $this->getTranslator()->trans( + "Your request could not be validated. Try it later", + [], + Comment::MESSAGE_DOMAIN + ); + } + + return $this->jsonResponse(json_encode($messageData)); + } + + + public function createAction() + { + // only ajax + $this->checkXmlHttpRequest(); + + $responseData = []; + /** @var CommentDefinitionEvent $definition */ + $definition = null; + + try { + $params = $this->getRequest()->get('admin_add_comment'); + $definition = $this->getDefinition( + $params['ref'], + $params['ref_id'] + ); + } catch (InvalidDefinitionException $ex) { + if ($ex->isSilent()) { + // Comment not authorized on this resource + $this->accessDenied(); + } else { + // The customer does not have minimum requirement to post comment + $responseData = [ + "success" => false, + "messages" => [$ex->getMessage()] + ]; + return $this->jsonResponse(json_encode($responseData)); + } + } + + $customer = $definition->getCustomer(); + + $validationGroups = [ + 'Default' + ]; + + if (null === $customer) { + $validationGroups[] = 'anonymous'; + } + if (!$definition->hasRating()) { + $validationGroups[] = 'rating'; + } + + $commentForm = $this->createForm( + 'comment.add.form', + 'form', + [], + ['validation_groups' => $validationGroups] + ); + + try { + $form = $this->validateForm($commentForm); + + $event = new CommentCreateEvent(); + $event->bindForm($form); + + $event->setVerified($definition->isVerified()); + + if (null !== $customer) { + $event->setCustomerId($customer->getId()); + } + + if (!$definition->getConfig()['moderate']) { + $event->setStatus(\Comment\Model\Comment::ACCEPTED); + } else { + $event->setStatus(\Comment\Model\Comment::PENDING); + } + + $event->setLocale($this->getRequest()->getLocale()); + + $this->dispatch(CommentEvents::COMMENT_CREATE, $event); + + if (null !== $event->getComment()) { + $responseData = [ + "success" => true, + "messages" => [ + $this->getTranslator()->trans( + "Thank you for submitting your comment.", + [], + Comment::MESSAGE_DOMAIN + ), + ] + ]; + if ($definition->getConfig()['moderate']) { + $responseData['messages'][] = $this->getTranslator()->trans( + "Your comment will be put online once verified.", + [], + Comment::MESSAGE_DOMAIN + ); + } + } else { + $responseData = [ + "success" => false, + "messages" => [ + $this->getTranslator()->trans( + "Sorry, an unknown error occurred. Please try again.", + [], + Comment::MESSAGE_DOMAIN + ) + ] + ]; + } + } catch (Exception $ex) { + $responseData = [ + "success" => false, + "messages" => [$ex->getMessage()] + ]; + } + + return $this->jsonResponse(json_encode($responseData)); + } + + protected function getDefinition($ref, $refId) + { + $eventDefinition = new CommentDefinitionEvent(); + $eventDefinition + ->setRef($ref) + ->setRefId($refId) + ->setCustomer($this->getSecurityContext()->getCustomerUser()) + ->setConfig(Comment::getConfig()); + + $this->dispatch( + CommentEvents::COMMENT_GET_DEFINITION, + $eventDefinition + ); + + return $eventDefinition; + } + + public function deleteAction($commentId) + { + // only ajax + $this->checkXmlHttpRequest(); + + $messageData = [ + "success" => false + ]; + + try { + $customer = $this->getSecurityContext()->getCustomerUser(); + + // find the comment + $comment = CommentQuery::create()->findPk($commentId); + + if (null !== $comment) { + if ($comment->getCustomerId() === $customer->getId()) { + $event = new CommentDeleteEvent(); + $event->setId($commentId); + + $this->dispatch(CommentEvents::COMMENT_DELETE, $event); + + if (null !== $event->getComment()) { + $messageData["success"] = true; + $messageData["message"] = $this->getTranslator()->trans( + "Your comment has been deleted.", + [], + Comment::MESSAGE_DOMAIN + ); + } + } + } + } catch (\Exception $ex) { + ; + } + + if (false === $messageData["success"]) { + $messageData["message"] = $this->getTranslator()->trans( + "Comment could not be removed. Please try later.", + [], + Comment::MESSAGE_DOMAIN + ); + } + + return $this->jsonResponse(json_encode($messageData)); + } +} diff --git a/local/modules/Comment/Events/CommentAbuseEvent.php b/local/modules/Comment/Events/CommentAbuseEvent.php new file mode 100644 index 00000000..a6daac0b --- /dev/null +++ b/local/modules/Comment/Events/CommentAbuseEvent.php @@ -0,0 +1,23 @@ + + */ +class CommentAbuseEvent extends CommentEvent +{ +} diff --git a/local/modules/Comment/Events/CommentChangeStatusEvent.php b/local/modules/Comment/Events/CommentChangeStatusEvent.php new file mode 100644 index 00000000..39026e0a --- /dev/null +++ b/local/modules/Comment/Events/CommentChangeStatusEvent.php @@ -0,0 +1,43 @@ + + */ +class CommentChangeStatusEvent extends CommentEvent +{ + /** @var int */ + protected $newStatus; + + /** + * @return int + */ + public function getNewStatus() + { + return $this->newStatus; + } + + /** + * @param int $newStatus + */ + public function setNewStatus($newStatus) + { + $this->newStatus = $newStatus; + + return $this; + } +} diff --git a/local/modules/Comment/Events/CommentCheckOrderEvent.php b/local/modules/Comment/Events/CommentCheckOrderEvent.php new file mode 100644 index 00000000..abe17977 --- /dev/null +++ b/local/modules/Comment/Events/CommentCheckOrderEvent.php @@ -0,0 +1,26 @@ + + */ +class CommentCheckOrderEvent extends ActionEvent +{ + +} diff --git a/local/modules/Comment/Events/CommentComputeRatingEvent.php b/local/modules/Comment/Events/CommentComputeRatingEvent.php new file mode 100644 index 00000000..e6b4c936 --- /dev/null +++ b/local/modules/Comment/Events/CommentComputeRatingEvent.php @@ -0,0 +1,85 @@ + + */ +class CommentComputeRatingEvent extends ActionEvent +{ + /** @var string */ + protected $ref; + + /** @var int */ + protected $refId; + + /** @var float */ + protected $rating; + + /** + * @return string + */ + public function getRef() + { + return $this->ref; + } + + /** + * @param string $ref + */ + public function setRef($ref) + { + $this->ref = $ref; + return $this; + } + + /** + * @return int + */ + public function getRefId() + { + return $this->refId; + } + + /** + * @param int $refId + */ + public function setRefId($refId) + { + $this->refId = $refId; + return $this; + } + + /** + * @return float + */ + public function getRating() + { + return $this->rating; + } + + /** + * @param float $rating + */ + public function setRating($rating) + { + $this->rating = $rating; + + return $this; + } +} diff --git a/local/modules/Comment/Events/CommentCreateEvent.php b/local/modules/Comment/Events/CommentCreateEvent.php new file mode 100644 index 00000000..491c8933 --- /dev/null +++ b/local/modules/Comment/Events/CommentCreateEvent.php @@ -0,0 +1,270 @@ + + * + * + */ +class CommentCreateEvent extends CommentEvent +{ + /** @var string */ + protected $ref; + + /** @var int */ + protected $refId; + + /** @var int */ + protected $customerId; + + /** @var string */ + protected $username; + + /** @var string */ + protected $email; + + /** @var string */ + protected $locale; + + /** @var string */ + protected $title; + + /** @var string */ + protected $content; + + /** @var int */ + protected $status; + + /** @var boolean */ + protected $verified; + + /** @var int */ + protected $rating; + + /** @var int */ + protected $abuse; + + /** + * @return int + */ + public function getAbuse() + { + return $this->abuse; + } + + /** + * @param int $abuse + */ + public function setAbuse($abuse) + { + $this->abuse = $abuse; + + return $this; + } + + /** + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * @param string $content + */ + public function setContent($content) + { + $this->content = $content; + } + + /** + * @return int + */ + public function getCustomerId() + { + return $this->customerId; + } + + /** + * @param int $customerId + */ + public function setCustomerId($customerId) + { + $this->customerId = $customerId; + } + + /** + * @return string + */ + public function getEmail() + { + return $this->email; + } + + /** + * @param string $email + */ + public function setEmail($email) + { + $this->email = $email; + } + + /** + * @return string + */ + public function getLocale() + { + return $this->locale; + } + + /** + * @param string $locale + */ + public function setLocale($locale) + { + $this->locale = $locale; + + return $this; + } + + /** + * @return int + */ + public function getRating() + { + return $this->rating; + } + + /** + * @param int $rating + */ + public function setRating($rating) + { + $this->rating = $rating; + + return $this; + } + + /** + * @return string + */ + public function getRef() + { + return $this->ref; + } + + /** + * @param string $ref + */ + public function setRef($ref) + { + $this->ref = $ref; + + return $this; + } + + /** + * @return int + */ + public function getRefId() + { + return $this->refId; + } + + /** + * @param int $refId + */ + public function setRefId($refId) + { + $this->refId = $refId; + + return $this; + } + + /** + * @return int + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param int $status + */ + public function setStatus($status) + { + $this->status = $status; + + return $this; + } + + /** + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $title + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } + + /** + * @return string + */ + public function getUsername() + { + return $this->username; + } + + /** + * @param string $username + */ + public function setUsername($username) + { + $this->username = $username; + + return $this; + } + + /** + * @return boolean + */ + public function isVerified() + { + return $this->verified; + } + + /** + * @param boolean $verified + */ + public function setVerified($verified) + { + $this->verified = $verified; + + return $this; + } +} diff --git a/local/modules/Comment/Events/CommentDefinitionEvent.php b/local/modules/Comment/Events/CommentDefinitionEvent.php new file mode 100644 index 00000000..cb4e5a4c --- /dev/null +++ b/local/modules/Comment/Events/CommentDefinitionEvent.php @@ -0,0 +1,166 @@ + + */ +class CommentDefinitionEvent extends CommentEvent +{ + /** @var string */ + protected $ref; + + /** @var int */ + protected $ref_id; + + /** @var array */ + protected $config = []; + + /** @var \Thelia\Model\Customer */ + protected $customer = null; + + /** @var bool */ + protected $verified = false; + + /** @var bool */ + protected $rating = false; + + /** @var bool */ + protected $valid = false; + + public function __construct() + { + } + + /** + * @return string + */ + public function getRef() + { + return $this->ref; + } + + /** + * @param string $ref + */ + public function setRef($ref) + { + $this->ref = $ref; + return $this; + } + + /** + * @return int + */ + public function getRefId() + { + return $this->ref_id; + } + + /** + * @param int $ref_id + */ + public function setRefId($ref_id) + { + $this->ref_id = $ref_id; + return $this; + } + + /** + * @return array + */ + public function getConfig() + { + return $this->config; + } + + /** + * @param array $config + */ + public function setConfig($config) + { + $this->config = $config; + return $this; + } + + /** + * @return \Thelia\Model\Customer + */ + public function getCustomer() + { + return $this->customer; + } + + /** + * @param \Thelia\Model\Customer $customer + */ + public function setCustomer($customer) + { + $this->customer = $customer; + return $this; + } + + /** + * @return boolean + */ + public function isVerified() + { + return $this->verified; + } + + /** + * @param boolean $verified + */ + public function setVerified($verified) + { + $this->verified = $verified; + return $this; + } + + /** + * @return boolean + */ + public function hasRating() + { + return $this->rating; + } + + /** + * @param boolean $rating + */ + public function setRating($rating) + { + $this->rating = $rating; + return $this; + } + + /** + * @return boolean + */ + public function isValid() + { + return $this->valid; + } + + /** + * @param boolean $valid + */ + public function setValid($valid) + { + $this->valid = $valid; + return $this; + } +} diff --git a/local/modules/Comment/Events/CommentDeleteEvent.php b/local/modules/Comment/Events/CommentDeleteEvent.php new file mode 100644 index 00000000..6ef440ec --- /dev/null +++ b/local/modules/Comment/Events/CommentDeleteEvent.php @@ -0,0 +1,23 @@ + + */ +class CommentDeleteEvent extends CommentEvent +{ +} diff --git a/local/modules/Comment/Events/CommentEvent.php b/local/modules/Comment/Events/CommentEvent.php new file mode 100644 index 00000000..1b448784 --- /dev/null +++ b/local/modules/Comment/Events/CommentEvent.php @@ -0,0 +1,87 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Comment\Events; + +use Comment\Model\Comment; +use Thelia\Core\Event\ActionEvent; + +/** + * + * This class contains all Comment events identifiers used by Comment Core + * + * @author Michaël Espeche + * @author Julien Chanséaume + * + */ +class CommentEvent extends ActionEvent +{ + /** @var int */ + protected $id = null; + + /** @var Comment */ + protected $comment = null; + + /** + * Constructor + */ + public function __construct() + { + } + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @param int $id + */ + public function setId($id) + { + $this->id = $id; + + return $this; + } + + /** + * @return Comment|null + */ + public function getComment() + { + return $this->comment; + } + + /** + * @param Comment $comment + */ + public function setComment(Comment $comment) + { + $this->comment = $comment; + + return $this; + } +} diff --git a/local/modules/Comment/Events/CommentEvents.php b/local/modules/Comment/Events/CommentEvents.php new file mode 100644 index 00000000..d825de8c --- /dev/null +++ b/local/modules/Comment/Events/CommentEvents.php @@ -0,0 +1,36 @@ + + */ +class CommentEvents +{ + const COMMENT_CREATE = "action.comment.create"; + const COMMENT_UPDATE = "action.comment.update"; + const COMMENT_DELETE = "action.comment.delete"; + const COMMENT_STATUS_UPDATE = "action.comment.status.update"; + const COMMENT_ABUSE = "action.comment.abuse"; + const COMMENT_RATING_COMPUTE = "action.comment.rating.compute"; + const COMMENT_REFERENCE_GETTER = "action.comment.reference.getter"; + const COMMENT_CUSTOMER_DEMAND = "action.comment.customer.demand"; + // + const COMMENT_GET_DEFINITION = "action.comment.definition"; + const COMMENT_GET_DEFINITION_PRODUCT = "action.comment.definition.product"; + const COMMENT_GET_DEFINITION_CONTENT = "action.comment.definition.content"; +} diff --git a/local/modules/Comment/Events/CommentReferenceGetterEvent.php b/local/modules/Comment/Events/CommentReferenceGetterEvent.php new file mode 100644 index 00000000..c3168621 --- /dev/null +++ b/local/modules/Comment/Events/CommentReferenceGetterEvent.php @@ -0,0 +1,193 @@ + + */ +class CommentReferenceGetterEvent extends ActionEvent +{ + /** @var string */ + protected $ref; + /** @var int */ + protected $refId; + /** @var string */ + protected $locale; + /** @var mixed */ + protected $object; + /** @var string */ + protected $typeTitle; + /** @var string */ + protected $title; + /** @var string */ + protected $viewUrl; + /** @var string */ + protected $editUrl; + + public function __construct($ref, $refId, $locale) + { + $this->ref = $ref; + $this->refId = $refId; + $this->locale = $locale; + } + + + /** + * @return string + */ + public function getEditUrl() + { + return $this->editUrl; + } + + /** + * @param string $editUrl + */ + public function setEditUrl($editUrl) + { + $this->editUrl = $editUrl; + + return $this; + } + + /** + * @return string + */ + + public function getLocale() + { + return $this->locale; + } + + /** + * @param string $locale + */ + public function setLocale($locale) + { + $this->locale = $locale; + } + + /** + * @return mixed + */ + public function getObject() + { + return $this->object; + } + + /** + * @param mixed $object + */ + public function setObject($object) + { + $this->object = $object; + + return $this; + } + + /** + * @return string + */ + public function getRef() + { + return $this->ref; + } + + /** + * @param string $ref + */ + public function setRef($ref) + { + $this->ref = $ref; + + return $this; + } + + /** + * @return int + */ + public function getRefId() + { + return $this->refId; + } + + /** + * @param int $refId + */ + public function setRefId($refId) + { + $this->refId = $refId; + + return $this; + } + + /** + * @return string + */ + public function getTypeTitle() + { + return $this->typeTitle; + } + + /** + * @param string $typeTitle + * @return CommentReferenceGetterEvent + */ + public function setTypeTitle($typeTitle) + { + $this->typeTitle = $typeTitle; + + return $this; + } + + /** + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $title + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } + + /** + * @return string + */ + public function getViewUrl() + { + return $this->viewUrl; + } + + /** + * @param string $viewUrl + */ + public function setViewUrl($viewUrl) + { + $this->viewUrl = $viewUrl; + + return $this; + } +} diff --git a/local/modules/Comment/Events/CommentUpdateEvent.php b/local/modules/Comment/Events/CommentUpdateEvent.php new file mode 100644 index 00000000..f1161a86 --- /dev/null +++ b/local/modules/Comment/Events/CommentUpdateEvent.php @@ -0,0 +1,23 @@ + + */ +class CommentUpdateEvent extends CommentCreateEvent +{ +} diff --git a/local/modules/Comment/Exception/InvalidDefinitionException.php b/local/modules/Comment/Exception/InvalidDefinitionException.php new file mode 100644 index 00000000..611d79ea --- /dev/null +++ b/local/modules/Comment/Exception/InvalidDefinitionException.php @@ -0,0 +1,49 @@ + + */ +class InvalidDefinitionException extends \RuntimeException +{ + + protected $silent = true; + + public function __construct($message, $silent = true) + { + $this->silent = $silent; + + parent::__construct($message); + } + + /** + * @return boolean + */ + public function isSilent() + { + return $this->silent; + } + + /** + * @param boolean $silent + */ + public function setSilent($silent) + { + $this->silent = $silent; + } +} diff --git a/local/modules/Comment/Form/AddCommentForm.php b/local/modules/Comment/Form/AddCommentForm.php new file mode 100644 index 00000000..20afc1b7 --- /dev/null +++ b/local/modules/Comment/Form/AddCommentForm.php @@ -0,0 +1,119 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Comment\Form; + +use Comment\Comment; +use Symfony\Component\Validator\Constraints\Email; +use Symfony\Component\Validator\Constraints\GreaterThan; +use Symfony\Component\Validator\Constraints\GreaterThanOrEqual; +use Symfony\Component\Validator\Constraints\LessThanOrEqual; +use Symfony\Component\Validator\Constraints\NotBlank; +use Thelia\Form\BaseForm; + +class AddCommentForm extends BaseForm +{ + protected function trans($id, array $parameters = []) + { + return $this->translator->trans($id, $parameters, Comment::MESSAGE_DOMAIN); + } + + protected function buildForm() + { + $this->formBuilder + ->add('username', 'text', [ + 'constraints' => [ + new NotBlank(['groups' => ['anonymous']]) + ], + 'label' => $this->trans('Username'), + 'label_attr' => [ + 'for' => 'comment_username' + ] + ]) + ->add('email', 'email', [ + 'constraints' => [ + new NotBlank(['groups' => ['anonymous']]), + new Email(['groups' => ['anonymous']]) + ], + 'label' => $this->trans('Email'), + 'label_attr' => [ + 'for' => 'comment_mail' + ] + ]) + ->add('title', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Title'), + 'label_attr' => [ + 'for' => 'title' + ] + ]) + ->add('content', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Content'), + 'label_attr' => [ + 'for' => 'content' + ] + ]) + ->add('ref', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Ref'), + 'label_attr' => [ + 'for' => 'ref' + ] + ]) + ->add('ref_id', 'text', [ + 'constraints' => [ + new GreaterThan(['value' => 0]) + ], + 'label' => $this->trans('Ref Id'), + 'label_attr' => [ + 'for' => 'ref_id' + ] + ]) + ->add('rating', 'text', [ + 'constraints' => [ + new GreaterThanOrEqual(['value' => 0, 'groups' => ['rating']]), + new LessThanOrEqual(['value' => 5, 'groups' => ['rating']]) + ], + 'label' => $this->trans('Rating'), + 'label_attr' => [ + 'for' => 'rating' + ] + ]); + } + + /* + protected function getDefinition() { + $this->form->get('success_url'); + } +*/ + public function getName() + { + return 'admin_add_comment'; + } +} diff --git a/local/modules/Comment/Form/CommentAbuseForm.php b/local/modules/Comment/Form/CommentAbuseForm.php new file mode 100644 index 00000000..2c22ea86 --- /dev/null +++ b/local/modules/Comment/Form/CommentAbuseForm.php @@ -0,0 +1,48 @@ + + */ +class CommentAbuseForm extends BaseForm +{ + protected function trans($id, array $parameters = []) + { + return $this->translator->trans($id, $parameters, Comment::MESSAGE_DOMAIN); + } + + protected function buildForm() + { + $this + ->formBuilder + ->add( + 'id', + 'comment_id' + ); + } + + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'comment_abuse'; + } +} diff --git a/local/modules/Comment/Form/CommentCreationForm.php b/local/modules/Comment/Form/CommentCreationForm.php new file mode 100644 index 00000000..653dbeaa --- /dev/null +++ b/local/modules/Comment/Form/CommentCreationForm.php @@ -0,0 +1,168 @@ + + */ +class CommentCreationForm extends BaseForm +{ + + protected function trans($id, array $parameters = []) + { + return $this->translator->trans($id, $parameters, Comment::MESSAGE_DOMAIN); + } + + protected function buildForm() + { + $this + ->formBuilder + ->add( + 'customer_id', + 'integer', + [ + 'required' => false, + 'label' => $this->trans('Customer'), + 'label_attr' => [ + 'for' => 'customer_id' + ] + ] + ) + ->add('username', 'text', [ + 'required' => false, + 'constraints' => [ + new Length(['min' => 2]) + ], + 'label' => $this->trans('Username'), + 'label_attr' => [ + 'for' => 'comment_username' + ] + ]) + ->add('email', 'email', [ + 'required' => false, + 'constraints' => [ + new Email() + ], + 'label' => $this->trans('Email'), + 'label_attr' => [ + 'for' => 'comment_mail' + ] + ]) + ->add( + 'locale', + 'text', + [ + 'label' => $this->trans('Locale'), + 'label_attr' => [ + 'for' => 'locale' + ] + ] + ) + ->add('title', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Title'), + 'label_attr' => [ + 'for' => 'title' + ] + ]) + ->add('content', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Content'), + 'label_attr' => [ + 'for' => 'content' + ] + ]) + ->add('ref', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Ref'), + 'label_attr' => [ + 'for' => 'ref' + ] + ]) + ->add('ref_id', 'integer', [ + 'constraints' => [ + new GreaterThanOrEqual(['value' => 0]) + ], + 'label' => $this->trans('Ref Id'), + 'label_attr' => [ + 'for' => 'ref_id' + ] + ]) + ->add('rating', 'integer', [ + 'required' => false, + 'constraints' => [ + new GreaterThanOrEqual(['value' => 0]), + new LessThanOrEqual(['value' => 5]) + ], + 'label' => $this->trans('Rating'), + 'label_attr' => [ + 'for' => 'rating' + ] + ]) + ->add( + 'status', + 'integer', + [ + 'label' => $this->trans('Status'), + 'label_attr' => [ + 'for' => 'status' + ] + ] + ) + ->add( + 'verified', + 'integer', + [ + 'label' => $this->trans('Verified'), + 'label_attr' => [ + 'for' => 'verified' + ] + ] + ) + ->add( + 'abuse', + 'integer', + [ + 'label' => $this->trans('Abuse'), + 'label_attr' => [ + 'for' => 'abuse' + ] + ] + ); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'admin_comment_creation'; + } +} diff --git a/local/modules/Comment/Form/CommentModificationForm.php b/local/modules/Comment/Form/CommentModificationForm.php new file mode 100644 index 00000000..21f9c413 --- /dev/null +++ b/local/modules/Comment/Form/CommentModificationForm.php @@ -0,0 +1,60 @@ + + */ +class CommentModificationForm extends CommentCreationForm +{ + protected function trans($id, array $parameters = []) + { + return $this->translator->trans($id, $parameters, Comment::MESSAGE_DOMAIN); + } + + protected function buildForm() + { + parent::buildForm(); + + $this + ->formBuilder + ->add( + 'id', + 'integer', + [ + 'constraints' => [ + new NotBlank() + ], + 'label' => $this->trans('Id'), + 'label_attr' => [ + 'for' => 'id' + ] + ] + ); + } + + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'admin_comment_modification'; + } +} diff --git a/local/modules/Comment/Form/ConfigurationForm.php b/local/modules/Comment/Form/ConfigurationForm.php new file mode 100644 index 00000000..17a3015d --- /dev/null +++ b/local/modules/Comment/Form/ConfigurationForm.php @@ -0,0 +1,143 @@ + + */ +class ConfigurationForm extends BaseForm +{ + protected function trans($id, array $parameters = []) + { + return $this->translator->trans($id, $parameters, Comment::MESSAGE_DOMAIN); + } + + protected function buildForm() + { + $form = $this->formBuilder; + + $config = Comment::getConfig(); + + $form + ->add( + "activated", + "checkbox", + [ + 'data' => $config['activated'], + 'label' => $this->trans("Activated"), + 'label_attr' => [ + 'for' => "activated", + 'help' => $this->trans( + "Global activation of comments. You can control activation by product, content." + ) + ], + ] + ) + ->add( + "moderate", + "checkbox", + [ + 'data' => $config['moderate'], + 'label' => $this->trans("Moderate"), + 'label_attr' => [ + 'for' => "moderate", + 'help' => $this->trans("Comments are not validated automatically.") + ], + ] + ) + ->add( + "ref_allowed", + "text", + [ + 'constraints' => [ + new NotBlank() + ], + 'data' => implode(',', $config['ref_allowed']), + 'label' => $this->trans("Allowed references"), + 'label_attr' => [ + 'for' => "back_office_path", + 'help' => $this->trans("which elements could use comments") + ], + ] + ) + ->add( + "only_customer", + "checkbox", + [ + 'data' => $config['only_customer'], + 'label' => $this->trans("Only customer"), + 'label_attr' => [ + 'for' => "only_customer", + 'help' => $this->trans("Only registered customers can post comments.") + ], + ] + ) + ->add( + "only_verified", + "checkbox", + [ + 'data' => $config['only_verified'], + 'label' => $this->trans("Only verified"), + 'label_attr' => [ + 'for' => "only_verified", + 'help' => $this->trans( + "For product comments. Only customers that bought the product can post comments." + ) + ], + ] + ) + ->add( + "request_customer_ttl", + "number", + [ + 'data' => $config['request_customer_ttl'], + 'label' => $this->trans("Request customer"), + 'label_attr' => [ + 'for' => "request_customer_ttl", + 'help' => $this->trans( + "Send an email to request customer comments, x days after a paid order (0 = no request sent)." + ) + ], + ] + ) + ->add( + "notify_admin_new_comment", + "checkbox", + [ + 'data' => $config['notify_admin_new_comment'], + 'label' => $this->trans("Notify store managers on new comment"), + 'label_attr' => [ + 'for' => "notify_admin_new_comment", + 'help' => $this->trans( + "Send an email to the store managers when a new comment is posted." + ) + ], + ] + ); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "comment-configuration-form"; + } +} diff --git a/local/modules/Comment/Form/Field/CommentIdType.php b/local/modules/Comment/Form/Field/CommentIdType.php new file mode 100644 index 00000000..ce6bd007 --- /dev/null +++ b/local/modules/Comment/Form/Field/CommentIdType.php @@ -0,0 +1,45 @@ + + */ +class CommentIdType extends AbstractIdType +{ + /** + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + * + * Get the model query to check + */ + protected function getQuery() + { + return new CommentQuery(); + } + + /** + * Returns the name of this type. + * + * @return string The name of this type + */ + public function getName() + { + return "comment_id"; + } +} diff --git a/local/modules/Comment/Hook/BackHook.php b/local/modules/Comment/Hook/BackHook.php new file mode 100644 index 00000000..83be8be4 --- /dev/null +++ b/local/modules/Comment/Hook/BackHook.php @@ -0,0 +1,93 @@ + + */ +class BackHook extends BaseHook +{ + + public function onModuleConfiguration(HookRenderEvent $event) + { + $event->add($this->render("configuration.html")); + } + + /** + * Add a new entry in the admin tools menu + * + * should add to event a fragment with fields : id,class,url,title + * + * @param HookRenderBlockEvent $event + */ + public function onMainTopMenuTools(HookRenderBlockEvent $event) + { + $event->add( + [ + 'id' => 'tools_menu_comment', + 'class' => '', + 'url' => URL::getInstance()->absoluteUrl('/admin/module/comments'), + 'title' => $this->trans('Comments', [], Comment::MESSAGE_DOMAIN) + ] + ); + } + + /** + * Add module-wide javascript. + * + * @param HookRenderEvent $event + */ + public function onMainFooterJs(HookRenderEvent $event) + { + $event->add($this->addJS('assets/js/comment.js')); + } + + public function onProductTabContent(HookRenderEvent $event) + { + $this->onTabContent($event, 'product'); + } + + public function onContentTabContent(HookRenderEvent $event) + { + $this->onTabContent($event, 'content'); + } + + protected function onTabContent(HookRenderEvent $event, $ref) + { + $event->add( + $this->render( + 'tab-content.html', + [ + 'ref' => $ref, + 'id' => $event->getArgument('id') + ] + ) + ); + } + + public function onJsTabContent(HookRenderEvent $event) + { + $event->add( + $this->addJS('assets/js/comment.js') + ); + } +} diff --git a/local/modules/Comment/Hook/FrontHook.php b/local/modules/Comment/Hook/FrontHook.php new file mode 100644 index 00000000..faf97d48 --- /dev/null +++ b/local/modules/Comment/Hook/FrontHook.php @@ -0,0 +1,161 @@ + + */ +class FrontHook extends BaseHook +{ + protected $parserContext = null; + + public function __construct() + { + } + + public function onShowComment(HookRenderEvent $event) + { + $data = $this->showComment($event); + + if (null !== $data) { + $event->add($data); + } + } + + public function onShowBlockComment(HookRenderBlockEvent $event) + { + $data = $this->showComment($event); + + if (null !== $data) { + $event->add( + [ + 'id' => 'comment', + 'title' => $this->trans("Comments", [], Comment::MESSAGE_DOMAIN), + 'content' => $data + ] + ); + } + } + + protected function showComment(BaseHookRenderEvent $event) + { + list($ref, $refId) = $this->getParams($event); + + $eventDefinition = new CommentDefinitionEvent(); + $eventDefinition + ->setRef($ref) + ->setRefId($refId) + ->setCustomer($this->getCustomer()) + ->setConfig(Comment::getConfig()); + $message = ''; + + try { + $this->dispatcher->dispatch( + CommentEvents::COMMENT_GET_DEFINITION, + $eventDefinition + ); + $eventDefinition->setValid(true); + } catch (InvalidDefinitionException $ex) { + if ($ex->isSilent()) { + return null; + } + $eventDefinition->setValid(false); + $message = $ex->getMessage(); + } catch (\Exception $ex) { + Tlog::getInstance()->debug($ex->getMessage()); + return null; + } + + return $this->render( + "comment.html", + [ + 'definition' => $eventDefinition, + 'message' => $message + ] + ); + } + + /** + * Add the javascript script to manage comments + * + * @param HookRenderEvent $event + */ + public function jsComment(HookRenderEvent $event) + { + $allowedRef = explode( + ',', + ConfigQuery::read('comment_ref_allowed', Comment::CONFIG_REF_ALLOWED) + ); + + if (in_array($this->getView(), $allowedRef)) { + + list($ref, $refId) = $this->getParams($event); + + $event->add( + $this->render( + "js.html", + [ + 'ref' => $ref, + 'ref_id' => $refId + ] + ) + ); + + $event->add( + $this->addJS('assets/js/comment.js') + ); + } + } + + protected function getParams(BaseHookRenderEvent $event) + { + $ref = $event->getArgument('ref') + ? $event->getArgument('ref') + : $this->getView(); + + $refId = 0; + + if ($event->getArgument('ref_id')) { + $refId = $event->getArgument('ref_id'); + } else { + if ($this->getRequest()->attributes->has('id')) { + $refId = intval($this->getRequest()->attributes->get('id')); + } elseif ($this->getRequest()->query->has($ref . '_id')) { + $refId = intval($this->getRequest()->query->get($ref . '_id')); + } + } + + if (null === $ref || 0 === $refId) { + throw new InvalidArgumentException( + $this->trans("Reference not found", [], Comment::MESSAGE_DOMAIN) + ); + } + + return [$ref, $refId]; + } +} diff --git a/local/modules/Comment/I18n/backOffice/default/en_US.php b/local/modules/Comment/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..93903fe1 --- /dev/null +++ b/local/modules/Comment/I18n/backOffice/default/en_US.php @@ -0,0 +1,53 @@ + 'Abused', + 'Accepted' => 'Accepted', + 'Actions' => 'Actions', + 'Activated for this element' => 'Activated for this element', + 'Add a new comment' => 'Add a new comment', + 'All' => 'All', + 'Author' => 'Author', + 'Change this comment' => 'Change this comment', + 'Comment' => 'Comment', + 'Comment configuration.' => 'Comment configuration.', + 'Comment created on %date_create. Last modification: %date_change' => 'Comment created on %date_create. Last modification: %date_change', + 'Comments' => 'Comments', + 'Comments activation.' => 'Comments activation.', + 'Comments management' => 'Comments management', + 'Create a new comment' => 'Create a new comment', + 'Create this comment' => 'Create this comment', + 'Deactivated for this element' => 'Deactivated for this element', + 'Delete comment' => 'Delete comment', + 'Delete this comment' => 'Delete this comment', + 'Do you really want to delete this comment ?' => 'Do you really want to delete this comment ?', + 'Edit comment' => 'Edit comment', + 'Edit comment %name' => 'Edit comment %name', + 'Editing comment "%name"' => 'Editing comment "%name"', + 'Error' => 'Error', + 'Filter' => 'Filter', + 'Home' => 'Home', + 'ID' => 'ID', + 'Impossible to change status.' => 'Impossible to change status.', + 'Impossible to delete comment.' => 'Impossible to delete comment.', + 'Next' => 'Next', + 'Pagination' => 'Pagination', + 'Pending' => 'Pending', + 'Please contact your administrator or try later' => 'Please contact your administrator or try later', + 'Posted: ' => 'Posted: ', + 'Previous' => 'Previous', + 'Reference' => 'Reference', + 'Refused' => 'Refused', + 'Save' => 'Save', + 'Sorry, comment ID=%id was not found.' => 'Sorry, comment ID=%id was not found.', + 'Status' => 'Status', + 'Status :' => 'Status :', + 'Unknow customer %id' => 'Unknow customer %id', + 'Use global configuration' => 'Use global configuration', + 'View' => 'View', + 'no' => 'no', + 'not a customer' => 'not a customer', + 'rating: ' => 'rating: ', + 'verified: ' => 'verified: ', + 'yes' => 'yes', +); diff --git a/local/modules/Comment/I18n/backOffice/default/fr_FR.php b/local/modules/Comment/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..b48f4c6b --- /dev/null +++ b/local/modules/Comment/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,54 @@ + 'Abusif', + 'Accepted' => 'Accepté', + 'Actions' => 'Actions', + 'Activated for this element' => 'Activé pour cet élément', + 'Add a new comment' => 'Ajouter un nouveau commentaires', + 'All' => 'Tous', + 'Author' => 'Auteur', + 'Change this comment' => 'Modifier ce commentaire', + 'Comment' => 'Commentaire', + 'Comment configuration.' => 'Configuration des commentaires.', + 'Comment created on %date_create. Last modification: %date_change' => 'Commentaire créé le %date_create. Dernière modification: %date_change ', + 'Comments' => 'Commentaires', + 'Comments activation.' => 'Activation des commentaires.', + 'Comments management' => 'Gestion des commentaires', + 'Create a new comment' => 'Créer un nouveau commentaire', + 'Create this comment' => 'Créer ce commentaire', + 'Deactivated for this element' => 'Désactivé pour cet élément', + 'Delete comment' => 'Supprimer le commentaire', + 'Delete this comment' => 'Supprimer ce commentaire', + 'Do you really want to delete this comment ?' => 'Voulez-vous vraiment supprimer ce commentaire ?', + 'Edit comment' => 'Modifier le commentaire', + 'Edit comment %name' => 'Modifier le commentaire %name', + 'Editing comment "%name"' => 'Edition du commentaire "%name"', + 'Error' => 'Erreur', + 'Filter' => 'Filtrer', + 'Home' => 'Accueil', + 'ID' => 'ID', + 'Impossible to change status.' => 'Changement de statut impossible.', + 'Impossible to delete comment.' => 'Suppression du commentaire impossible', + 'Next' => 'Suivant', + 'Pagination' => 'Pagination', + 'Pending' => 'En attente', + 'Please contact your administrator or try later' => 'Veuillez contacter l\'administrateur ou ré-essayer plus tard', + 'Posted: ' => 'Posté :', + 'Previous' => 'Précédent', + 'Reference' => 'Référence', + 'Refused' => 'Refusé', + 'Save' => 'Enregistrer', + 'Send email to customer' => 'Envoyer un email au client', + 'Sorry, comment ID=%id was not found.' => 'Désolé, le commentaire ID=%id n\'a pas été trouvé.', + 'Status' => 'Statut', + 'Status :' => 'Statut :', + 'Unknow customer %id' => 'Client inconnu %id', + 'Use global configuration' => 'Utiliser la configuration globale', + 'View' => 'Voir', + 'no' => 'non', + 'not a customer' => 'pas un client', + 'rating: ' => 'note :', + 'verified: ' => 'vérifié :', + 'yes' => 'oui', +); diff --git a/local/modules/Comment/I18n/email/default/en_US.php b/local/modules/Comment/I18n/email/default/en_US.php new file mode 100644 index 00000000..c9609d53 --- /dev/null +++ b/local/modules/Comment/I18n/email/default/en_US.php @@ -0,0 +1,14 @@ + 'Notify store admin of new comment', + 'New comment on %ref_type_title "%ref_title"' => 'New comment on %ref_type_title "%ref_title"', + 'We inform you that a new customer comment has been posted for the %ref_type_title "%ref_title"' + => 'We inform you that a new customer comment has been posted for the %ref_type_title "%ref_title"', + 'Rating: ' => 'Rating: ', + 'Title: ' => 'Title: ', + 'Content: ' => 'Content: ', + 'You can now activate this comment by going to the comment management interface: %comment_management_link' + => 'You can now activate this comment by going to the comment management interface: %comment_management_link', + 'You can now activate this comment by going to the comment management interface.' + => 'You can now activate this comment by going to the comment management interface.', +); diff --git a/local/modules/Comment/I18n/email/default/fr_FR.php b/local/modules/Comment/I18n/email/default/fr_FR.php new file mode 100644 index 00000000..187e057e --- /dev/null +++ b/local/modules/Comment/I18n/email/default/fr_FR.php @@ -0,0 +1,16 @@ + 'Cordialement.', + 'Content: ' => 'Contenu: ', + 'Dear' => 'Bonjour', + 'Feel free to contact us for any further information' => 'N\'hésitez pas à nous contacter pour tout autre question.', + 'It would be great to share your thoughts on products with other customers.' => 'Il serait formidable de partager vos avis sur les produits avec d\'autres clients.', + 'Rating: ' => 'Note: ', + 'Thank you for your order on our online store %store_name' => 'Merci pour votre commande sur notre boutique en ligne %store_name', + 'Title: ' => 'Titre: ', + 'We inform you that a new customer comment has been posted for the %ref_type_title "%ref_title"' => 'Nous vous informons qu\'un nouveau commentaire client a été posté sur %ref_type_title "%ref_title"', + 'You can now activate this comment by going to the comment management interface.' => 'Vous pouvez dores et déjà activer ce commentaire en vous rendant dans l\'interface de gestion des avis.', + 'You can now activate this comment by going to the comment management interface: %comment_management_link' => 'Vous pouvez dores et déjà activer ce commentaire en vous rendant dans l\'interface de gestion des avis: %comment_management_link', + 'You can post comments on this products: ' => 'Vous pouvez laisser un commentaire sur les produits suivants : ', +); diff --git a/local/modules/Comment/I18n/en_US.php b/local/modules/Comment/I18n/en_US.php new file mode 100644 index 00000000..af2c5ae0 --- /dev/null +++ b/local/modules/Comment/I18n/en_US.php @@ -0,0 +1,44 @@ + 'Abuse', + 'Activated' => 'Activated', + 'Allowed references' => 'Allowed references', + 'Comment could not be removed. Please try later.' => 'Comment could not be removed. Please try later.', + 'Comment not activated on this element.' => 'Comment not activated on this element.', + 'Comments' => 'Comments', + 'Comments are not validated automatically.' => 'Comments are not validated automatically.', + 'Content' => 'Content', + 'Customer' => 'Customer', + 'Email' => 'Email', + 'For product comments. Only customers that bought the product can post comments.' => 'For product comments. Only customers that bought the product can post comments.', + 'Global activation of comments. You can control activation by product, content.' => 'Global activation of comments. You can control activation by product, content.', + 'Id' => 'Id', + 'If \'ref\' argument is specified, \'ref_id\' argument should be specified' => 'If \'ref\' argument is specified, \'ref_id\' argument should be specified', + 'Locale' => 'Locale', + 'Missing parameters' => 'Missing parameters', + 'Moderate' => 'Moderate', + 'Notify store managers on new comment' => 'Notify store managers on new comment', + 'Only customer' => 'Only customer', + 'Only customer are allowed to publish comment' => 'Only customer are allowed to publish comment', + 'Only customers who have bought this product can publish comment' => 'Only customers who have bought this product can publish comment', + 'Only registered customers can post comments.' => 'Only registered customers can post comments.', + 'Only verified' => 'Only verified', + 'Product %id does not exist' => 'Product %id does not exist', + 'Rating' => 'Rating', + 'Ref' => 'Ref', + 'Ref Id' => 'Ref Id', + 'Reference %ref is not allowed' => 'Reference %ref is not allowed', + 'Send an email to the store managers when a new comment is posted.' => 'Send an email to the store managers when a new comment is posted.', + 'Sorry, an unknown error occurred. Please try again.' => 'Sorry, an unknown error occurred. Please try again.', + 'Status' => 'Status', + 'Thank you for submitting your comment.' => 'Thank you for submitting your comment.', + 'Title' => 'Title', + 'Username' => 'Username', + 'Verified' => 'Verified', + 'Your comment has been deleted.' => 'Your comment has been deleted.', + 'Your comment will be put online once verified.' => 'Your comment will be put online once verified.', + 'Your request could not be validated. Try it later' => 'Your request could not be validated. Try it later', + 'Your request has been registered. Thank you.' => 'Your request has been registered. Thank you.', + 'which elements could use comments' => 'which elements could use comments', +); diff --git a/local/modules/Comment/I18n/fr_FR.php b/local/modules/Comment/I18n/fr_FR.php new file mode 100644 index 00000000..4add2cac --- /dev/null +++ b/local/modules/Comment/I18n/fr_FR.php @@ -0,0 +1,51 @@ + 'Abus', + 'Activated' => 'Activé', + 'Allowed references' => 'Références autorisées', + 'Comment could not be removed. Please try later.' => 'Le commentaire n\'a pas pu être supprimé. Veuillez ré-essayer plus tard.', + 'Comment not activated on this element.' => 'Les commentaires ne sont pas autorisés sur cet élément. ', + 'Comments' => 'Commentaires', + 'Comments are not validated automatically.' => 'Les commentaires ne sont pas validés automatiquement.', + 'Content' => 'Message', + 'Customer' => 'Client', + 'Email' => 'Email', + 'For product comments. Only customers that bought the product can post comments.' => 'Pour les commentaires produits. Seuls les clients ayant achetés le produit peuvent publier des commentaires.', + 'Global activation of comments. You can control activation by product, content.' => 'Activation globale des commentaires. Vous pouvez contrôler l\'activation par produit, contenu.', + 'Id' => 'Id', + 'If \'ref\' argument is specified, \'ref_id\' argument should be specified' => 'si l\'argument \'ref\' est renseigné, l\'argument \'ref_id\' est nécessaire.', + 'Locale' => 'Langue', + 'Missing parameters' => 'Paramètres manquants', + 'Moderate' => 'Modération', + 'New comment on %ref_type_title "%ref_title"' => 'Nouveau commentaire pour %ref_type_title "%ref_title" ', + 'Notify store admin of new comment' => 'Notifier l\'administrateur de nouveaux commentaires', + 'Notify store managers on new comment' => 'Notifier les administrateurs de la boutique des nouveaux commentaires', + 'Only customer' => 'Seuls les clients', + 'Only customer are allowed to publish comment' => 'Seul les clients sont autorisés à publier des commentaires', + 'Only customers who have bought this product can publish comment' => 'Seuls les clients ayant achetés ce produit peuvent publier des commentaires', + 'Only registered customers can post comments.' => 'Seuls les clients enregistrés peuvent publier des commentaires.', + 'Only verified' => 'Uniquement vérifié', + 'Product' => 'Produit', + 'Product %id does not exist' => 'Le produit %id n\'existe pas', + 'Rating' => 'Note', + 'Ref' => 'Réf', + 'Ref Id' => 'Réf id', + 'Reference %ref is not allowed' => 'La référence %ref n\'est pas autorisée', + 'Reference not found' => 'Référence inconnue', + 'Request customer' => 'Relance client', + 'Request customer comment' => 'Demande commentaire client', + 'Send an email to request customer comments, x days after a paid order (0 = no request sent).' => 'Envoyer un email au client pour demander un avis, x jours après une commande payée (0 = aucune relance)', + 'Send an email to the store managers when a new comment is posted.' => 'Envoyer un email aux administrateurs de la boutique lorsqu\'un nouveau commentaire est posté.', + 'Sorry, an unknown error occurred. Please try again.' => 'Désolé, une erreur non gérée est apparue. Veuillez ré-essayer.', + 'Status' => 'Statut', + 'Thank you for submitting your comment.' => 'Merci pour votre commentaire.', + 'Title' => 'Titre', + 'Username' => 'Nom', + 'Verified' => 'Vérifié', + 'Your comment has been deleted.' => 'Votre commentaire a été supprimé.', + 'Your comment will be put online once verified.' => 'Votre commentaire sera mis en ligne une fois vérifié.', + 'Your request could not be validated. Try it later' => 'Votre demande ne peux pas être validé. Essayer plus tard.', + 'Your request has been registered. Thank you.' => 'Votre demande a été enregistré. Merci.', + 'which elements could use comments' => 'Indique les éléments pouvant utiliser es commentaires', +); diff --git a/local/modules/Comment/I18n/frontOffice/default/en_US.php b/local/modules/Comment/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..0e3cd7d4 --- /dev/null +++ b/local/modules/Comment/I18n/frontOffice/default/en_US.php @@ -0,0 +1,16 @@ + 'Add your comment', + 'Anonymous' => 'Anonymous', + 'Are you sure ?' => 'Are you sure ?', + 'By %username' => 'By %username', + 'Comments' => 'Comments', + 'Delete' => 'Delete', + 'Load more comments...' => 'Load more comments...', + 'Mark as inappropriate' => 'Mark as inappropriate', + 'No more comments' => 'No more comments', + 'Send' => 'Send', + 'There are no comments yet' => 'There are no comments yet', + 'Verified' => 'Verified', +); diff --git a/local/modules/Comment/I18n/frontOffice/default/fr_FR.php b/local/modules/Comment/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..cd50f538 --- /dev/null +++ b/local/modules/Comment/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,17 @@ + 'Ajouter votre commentaire', + 'Anonymous' => 'Anonyme', + 'Are you sure ?' => 'Etes-vous certain ?', + 'By %username' => 'Par %username', + 'Comments' => 'Les commentaires', + 'Delete' => 'Supprimer', + 'Load more comments...' => 'Montrer plus de commentaires...', + 'Mark as inappropriate' => 'Marquer comme inapproprié', + 'No more comments' => 'Plus de commentaire', + 'Send' => 'Envoyer', + 'There are no comments yet' => 'Il n\'y a pas encore de commentaire', + 'Verified' => 'Vérifié', + 'rating:' => 'note :', +); diff --git a/local/modules/Comment/LICENSE b/local/modules/Comment/LICENSE new file mode 100644 index 00000000..fb6d90b9 --- /dev/null +++ b/local/modules/Comment/LICENSE @@ -0,0 +1,166 @@ +GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/local/modules/Comment/Loop/CommentLoop.php b/local/modules/Comment/Loop/CommentLoop.php new file mode 100644 index 00000000..51131fe6 --- /dev/null +++ b/local/modules/Comment/Loop/CommentLoop.php @@ -0,0 +1,271 @@ + + */ +class CommentLoop extends BaseLoop implements PropelSearchLoopInterface +{ + protected $timestampable = true; + + protected $cacheRef = []; + + /** + * Definition of loop arguments + * + * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + Argument::createIntListTypeArgument('customer'), + Argument::createAnyTypeArgument('ref'), + Argument::createIntListTypeArgument('ref_id'), + Argument::createIntListTypeArgument('status'), + Argument::createBooleanOrBothTypeArgument('verified', BooleanOrBothType::ANY), + Argument::createAnyTypeArgument('locale'), + Argument::createAnyTypeArgument('load_ref', 0), + new Argument( + 'order', + new Type\TypeCollection( + new Type\EnumListType( + [ + 'id', + 'id_reverse', + 'status', + 'status_reverse', + 'verified', + 'verified_reverse', + 'abuse', + 'abuse_reverse', + 'created', + 'created_reverse', + 'updated', + 'updated_reverse' + ] + ) + ), + 'manual' + ), + Argument::createAnyTypeArgument('ref_locale') + ); + } + + /** + * this method returns a Propel ModelCriteria + * + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria() + { + $search = CommentQuery::create(); + + $id = $this->getId(); + if (null !== $id) { + $search->filterById($id, Criteria::IN); + } + + $customer = $this->getCustomer(); + if (null !== $customer) { + $search->filterByCustomerId($customer, Criteria::IN); + } + + $ref = $this->getRef(); + $refId = $this->getRefId(); + if (null !== $ref || null !== $refId) { + if (null === $ref || null === $refId) { + throw new \InvalidArgumentException( + $this->translator->trans( + "If 'ref' argument is specified, 'ref_id' argument should be specified", + [], + Comment::MESSAGE_DOMAIN + ) + ); + } + + $search->filterByRef($ref); + $search->filterByRefId($refId, Criteria::IN); + } + + $status = $this->getStatus(); + if ($status !== null) { + $search->filterByStatus($status); + } + + $verified = $this->getVerified(); + if ($verified !== BooleanOrBothType::ANY) { + $search->filterByVerified($verified ? 1 : 0); + } + + $locale = $this->getLocale(); + if (null !== $locale) { + $search->filterByLocale($locale); + } + + $orders = $this->getOrder(); + if (null !== $orders) { + foreach ($orders as $order) { + switch ($order) { + case "id": + $search->orderById(Criteria::ASC); + break; + case "id_reverse": + $search->orderById(Criteria::DESC); + break; + case "visible": + $search->orderByStatus(Criteria::ASC); + break; + case "visible_reverse": + $search->orderByStatus(Criteria::DESC); + break; + case "verified": + $search->orderByVerified(Criteria::ASC); + break; + case "verified_reverse": + $search->orderByVerified(Criteria::DESC); + break; + case "abuse": + $search->orderByAbuse(Criteria::ASC); + break; + case "abuse_reverse": + $search->orderByAbuse(Criteria::DESC); + break; + case "rating": + $search->orderByRating(Criteria::ASC); + break; + case "rating_reverse": + $search->orderByRating(Criteria::DESC); + break; + case "created": + $search->addAscendingOrderByColumn('created_at'); + break; + case "created_reverse": + $search->addDescendingOrderByColumn('created_at'); + break; + case "updated": + $search->addAscendingOrderByColumn('updated_at'); + break; + case "updated_reverse": + $search->addDescendingOrderByColumn('updated_at'); + break; + } + } + } + + return $search; + } + + /** + * @param LoopResult $loopResult + * + * @return LoopResult + */ + public function parseResults(LoopResult $loopResult) + { + /** @var \Comment\Model\Comment $comment */ + foreach ($loopResult->getResultDataCollection() as $comment) { + $loopResultRow = new LoopResultRow($comment); + + $loopResultRow + ->set('ID', $comment->getId()) + ->set('USERNAME', $comment->getUsername()) + ->set('EMAIL', $comment->getEmail()) + ->set('CUSTOMER_ID', $comment->getCustomerId()) + ->set('REF', $comment->getRef()) + ->set('REF_ID', $comment->getRefId()) + ->set('TITLE', $comment->getTitle()) + ->set('CONTENT', $comment->getContent()) + ->set('RATING', $comment->getRating()) + ->set('STATUS', $comment->getStatus()) + ->set('VERIFIED', $comment->getVerified()) + ->set('ABUSE', $comment->getAbuse()); + + if (1 == $this->getLoadRef()) { + // dispatch event to get the reference element + $this->getReference( + $loopResultRow, + $comment->getRef(), + $comment->getRefId() + ); + } + + $this->addOutputFields($loopResultRow, $comment); + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + /** + * @param LoopResultRow $loopResultRow + * @param string $ref + * @param int $refId + */ + protected function getReference(LoopResultRow &$loopResultRow, $ref, $refId) + { + $key = sprintf('%s:%s', $ref, $refId); + $data = [ + 'REF_OBJECT' => null, + 'REF_TITLE' => null, + 'REF_TYPE_TITLE' => null, + 'REF_EDIT_URL' => null, + 'REF_VIEW_URL' => null + ]; + + $refLocale = $this->getRefLocale(); + if ($refLocale === null) { + $refLocale = $this->request->getLocale(); + } + + if (!array_key_exists($key, $this->cacheRef)) { + $event = new CommentReferenceGetterEvent($ref, $refId, $refLocale); + + $this->dispatcher->dispatch( + CommentEvents::COMMENT_REFERENCE_GETTER, + $event + ); + + $data['REF_OBJECT'] = $event->getObject(); + $data['REF_TITLE'] = $event->getTitle(); + $data['REF_TYPE_TITLE'] = $event->getTypeTitle(); + $data['REF_EDIT_URL'] = $event->getEditUrl(); + $data['REF_VIEW_URL'] = $event->getViewUrl(); + } else { + $data = $this->cacheRef[$key]; + } + + foreach ($data as $k => $v) { + $loopResultRow->set($k, $v); + } + } +} diff --git a/local/modules/Comment/Model/Base/Comment.php b/local/modules/Comment/Model/Base/Comment.php new file mode 100644 index 00000000..91c03375 --- /dev/null +++ b/local/modules/Comment/Model/Base/Comment.php @@ -0,0 +1,2020 @@ +status = 0; + } + + /** + * Initializes internal state of Comment\Model\Base\Comment object. + * @see applyDefaults() + */ + public function __construct() + { + $this->applyDefaultValues(); + } + + /** + * Returns whether the object has been modified. + * + * @return boolean True if the object has been modified. + */ + public function isModified() + { + return !!$this->modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another Comment instance. If + * obj is an instance of Comment, delegates to + * equals(Comment). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return Comment The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return Comment The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [username] column value. + * + * @return string + */ + public function getUsername() + { + + return $this->username; + } + + /** + * Get the [customer_id] column value. + * + * @return int + */ + public function getCustomerId() + { + + return $this->customer_id; + } + + /** + * Get the [ref] column value. + * + * @return string + */ + public function getRef() + { + + return $this->ref; + } + + /** + * Get the [ref_id] column value. + * + * @return int + */ + public function getRefId() + { + + return $this->ref_id; + } + + /** + * Get the [email] column value. + * + * @return string + */ + public function getEmail() + { + + return $this->email; + } + + /** + * Get the [title] column value. + * + * @return string + */ + public function getTitle() + { + + return $this->title; + } + + /** + * Get the [content] column value. + * + * @return string + */ + public function getContent() + { + + return $this->content; + } + + /** + * Get the [rating] column value. + * + * @return int + */ + public function getRating() + { + + return $this->rating; + } + + /** + * Get the [status] column value. + * + * @return int + */ + public function getStatus() + { + + return $this->status; + } + + /** + * Get the [verified] column value. + * + * @return int + */ + public function getVerified() + { + + return $this->verified; + } + + /** + * Get the [abuse] column value. + * + * @return int + */ + public function getAbuse() + { + + return $this->abuse; + } + + /** + * Get the [locale] column value. + * + * @return string + */ + public function getLocale() + { + + return $this->locale; + } + + /** + * Get the [optionally formatted] temporal [created_at] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the raw \DateTime object will be returned. + * + * @return mixed Formatted date/time value as string or \DateTime object (if format is NULL), NULL if column is NULL, and 0 if column value is 0000-00-00 00:00:00 + * + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getCreatedAt($format = NULL) + { + if ($format === null) { + return $this->created_at; + } else { + return $this->created_at instanceof \DateTime ? $this->created_at->format($format) : null; + } + } + + /** + * Get the [optionally formatted] temporal [updated_at] column value. + * + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the raw \DateTime object will be returned. + * + * @return mixed Formatted date/time value as string or \DateTime object (if format is NULL), NULL if column is NULL, and 0 if column value is 0000-00-00 00:00:00 + * + * @throws PropelException - if unable to parse/validate the date/time value. + */ + public function getUpdatedAt($format = NULL) + { + if ($format === null) { + return $this->updated_at; + } else { + return $this->updated_at instanceof \DateTime ? $this->updated_at->format($format) : null; + } + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[CommentTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [username] column. + * + * @param string $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setUsername($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->username !== $v) { + $this->username = $v; + $this->modifiedColumns[CommentTableMap::USERNAME] = true; + } + + + return $this; + } // setUsername() + + /** + * Set the value of [customer_id] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setCustomerId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->customer_id !== $v) { + $this->customer_id = $v; + $this->modifiedColumns[CommentTableMap::CUSTOMER_ID] = true; + } + + if ($this->aCustomer !== null && $this->aCustomer->getId() !== $v) { + $this->aCustomer = null; + } + + + return $this; + } // setCustomerId() + + /** + * Set the value of [ref] column. + * + * @param string $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setRef($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->ref !== $v) { + $this->ref = $v; + $this->modifiedColumns[CommentTableMap::REF] = true; + } + + + return $this; + } // setRef() + + /** + * Set the value of [ref_id] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setRefId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->ref_id !== $v) { + $this->ref_id = $v; + $this->modifiedColumns[CommentTableMap::REF_ID] = true; + } + + + return $this; + } // setRefId() + + /** + * Set the value of [email] column. + * + * @param string $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setEmail($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->email !== $v) { + $this->email = $v; + $this->modifiedColumns[CommentTableMap::EMAIL] = true; + } + + + return $this; + } // setEmail() + + /** + * Set the value of [title] column. + * + * @param string $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->title !== $v) { + $this->title = $v; + $this->modifiedColumns[CommentTableMap::TITLE] = true; + } + + + return $this; + } // setTitle() + + /** + * Set the value of [content] column. + * + * @param string $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setContent($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->content !== $v) { + $this->content = $v; + $this->modifiedColumns[CommentTableMap::CONTENT] = true; + } + + + return $this; + } // setContent() + + /** + * Set the value of [rating] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setRating($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->rating !== $v) { + $this->rating = $v; + $this->modifiedColumns[CommentTableMap::RATING] = true; + } + + + return $this; + } // setRating() + + /** + * Set the value of [status] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setStatus($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->status !== $v) { + $this->status = $v; + $this->modifiedColumns[CommentTableMap::STATUS] = true; + } + + + return $this; + } // setStatus() + + /** + * Set the value of [verified] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setVerified($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->verified !== $v) { + $this->verified = $v; + $this->modifiedColumns[CommentTableMap::VERIFIED] = true; + } + + + return $this; + } // setVerified() + + /** + * Set the value of [abuse] column. + * + * @param int $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setAbuse($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->abuse !== $v) { + $this->abuse = $v; + $this->modifiedColumns[CommentTableMap::ABUSE] = true; + } + + + return $this; + } // setAbuse() + + /** + * Set the value of [locale] column. + * + * @param string $v new value + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setLocale($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->locale !== $v) { + $this->locale = $v; + $this->modifiedColumns[CommentTableMap::LOCALE] = true; + } + + + return $this; + } // setLocale() + + /** + * Sets the value of [created_at] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or \DateTime value. + * Empty strings are treated as NULL. + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setCreatedAt($v) + { + $dt = PropelDateTime::newInstance($v, null, '\DateTime'); + if ($this->created_at !== null || $dt !== null) { + if ($dt !== $this->created_at) { + $this->created_at = $dt; + $this->modifiedColumns[CommentTableMap::CREATED_AT] = true; + } + } // if either are not null + + + return $this; + } // setCreatedAt() + + /** + * Sets the value of [updated_at] column to a normalized version of the date/time value specified. + * + * @param mixed $v string, integer (timestamp), or \DateTime value. + * Empty strings are treated as NULL. + * @return \Comment\Model\Comment The current object (for fluent API support) + */ + public function setUpdatedAt($v) + { + $dt = PropelDateTime::newInstance($v, null, '\DateTime'); + if ($this->updated_at !== null || $dt !== null) { + if ($dt !== $this->updated_at) { + $this->updated_at = $dt; + $this->modifiedColumns[CommentTableMap::UPDATED_AT] = true; + } + } // if either are not null + + + return $this; + } // setUpdatedAt() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->status !== 0) { + return false; + } + + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : CommentTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : CommentTableMap::translateFieldName('Username', TableMap::TYPE_PHPNAME, $indexType)]; + $this->username = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : CommentTableMap::translateFieldName('CustomerId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->customer_id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : CommentTableMap::translateFieldName('Ref', TableMap::TYPE_PHPNAME, $indexType)]; + $this->ref = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : CommentTableMap::translateFieldName('RefId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->ref_id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : CommentTableMap::translateFieldName('Email', TableMap::TYPE_PHPNAME, $indexType)]; + $this->email = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : CommentTableMap::translateFieldName('Title', TableMap::TYPE_PHPNAME, $indexType)]; + $this->title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : CommentTableMap::translateFieldName('Content', TableMap::TYPE_PHPNAME, $indexType)]; + $this->content = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : CommentTableMap::translateFieldName('Rating', TableMap::TYPE_PHPNAME, $indexType)]; + $this->rating = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 9 + $startcol : CommentTableMap::translateFieldName('Status', TableMap::TYPE_PHPNAME, $indexType)]; + $this->status = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 10 + $startcol : CommentTableMap::translateFieldName('Verified', TableMap::TYPE_PHPNAME, $indexType)]; + $this->verified = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 11 + $startcol : CommentTableMap::translateFieldName('Abuse', TableMap::TYPE_PHPNAME, $indexType)]; + $this->abuse = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 12 + $startcol : CommentTableMap::translateFieldName('Locale', TableMap::TYPE_PHPNAME, $indexType)]; + $this->locale = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 13 + $startcol : CommentTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)]; + if ($col === '0000-00-00 00:00:00') { + $col = null; + } + $this->created_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 14 + $startcol : CommentTableMap::translateFieldName('UpdatedAt', TableMap::TYPE_PHPNAME, $indexType)]; + if ($col === '0000-00-00 00:00:00') { + $col = null; + } + $this->updated_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 15; // 15 = CommentTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \Comment\Model\Comment object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + if ($this->aCustomer !== null && $this->customer_id !== $this->aCustomer->getId()) { + $this->aCustomer = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(CommentTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildCommentQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aCustomer = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see Comment::setDeleted() + * @see Comment::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(CommentTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildCommentQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(CommentTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + // timestampable behavior + if (!$this->isColumnModified(CommentTableMap::CREATED_AT)) { + $this->setCreatedAt(time()); + } + if (!$this->isColumnModified(CommentTableMap::UPDATED_AT)) { + $this->setUpdatedAt(time()); + } + } else { + $ret = $ret && $this->preUpdate($con); + // timestampable behavior + if ($this->isModified() && !$this->isColumnModified(CommentTableMap::UPDATED_AT)) { + $this->setUpdatedAt(time()); + } + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + CommentTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aCustomer !== null) { + if ($this->aCustomer->isModified() || $this->aCustomer->isNew()) { + $affectedRows += $this->aCustomer->save($con); + } + $this->setCustomer($this->aCustomer); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[CommentTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . CommentTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(CommentTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(CommentTableMap::USERNAME)) { + $modifiedColumns[':p' . $index++] = 'USERNAME'; + } + if ($this->isColumnModified(CommentTableMap::CUSTOMER_ID)) { + $modifiedColumns[':p' . $index++] = 'CUSTOMER_ID'; + } + if ($this->isColumnModified(CommentTableMap::REF)) { + $modifiedColumns[':p' . $index++] = 'REF'; + } + if ($this->isColumnModified(CommentTableMap::REF_ID)) { + $modifiedColumns[':p' . $index++] = 'REF_ID'; + } + if ($this->isColumnModified(CommentTableMap::EMAIL)) { + $modifiedColumns[':p' . $index++] = 'EMAIL'; + } + if ($this->isColumnModified(CommentTableMap::TITLE)) { + $modifiedColumns[':p' . $index++] = 'TITLE'; + } + if ($this->isColumnModified(CommentTableMap::CONTENT)) { + $modifiedColumns[':p' . $index++] = 'CONTENT'; + } + if ($this->isColumnModified(CommentTableMap::RATING)) { + $modifiedColumns[':p' . $index++] = 'RATING'; + } + if ($this->isColumnModified(CommentTableMap::STATUS)) { + $modifiedColumns[':p' . $index++] = 'STATUS'; + } + if ($this->isColumnModified(CommentTableMap::VERIFIED)) { + $modifiedColumns[':p' . $index++] = 'VERIFIED'; + } + if ($this->isColumnModified(CommentTableMap::ABUSE)) { + $modifiedColumns[':p' . $index++] = 'ABUSE'; + } + if ($this->isColumnModified(CommentTableMap::LOCALE)) { + $modifiedColumns[':p' . $index++] = 'LOCALE'; + } + if ($this->isColumnModified(CommentTableMap::CREATED_AT)) { + $modifiedColumns[':p' . $index++] = 'CREATED_AT'; + } + if ($this->isColumnModified(CommentTableMap::UPDATED_AT)) { + $modifiedColumns[':p' . $index++] = 'UPDATED_AT'; + } + + $sql = sprintf( + 'INSERT INTO comment (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'USERNAME': + $stmt->bindValue($identifier, $this->username, PDO::PARAM_STR); + break; + case 'CUSTOMER_ID': + $stmt->bindValue($identifier, $this->customer_id, PDO::PARAM_INT); + break; + case 'REF': + $stmt->bindValue($identifier, $this->ref, PDO::PARAM_STR); + break; + case 'REF_ID': + $stmt->bindValue($identifier, $this->ref_id, PDO::PARAM_INT); + break; + case 'EMAIL': + $stmt->bindValue($identifier, $this->email, PDO::PARAM_STR); + break; + case 'TITLE': + $stmt->bindValue($identifier, $this->title, PDO::PARAM_STR); + break; + case 'CONTENT': + $stmt->bindValue($identifier, $this->content, PDO::PARAM_STR); + break; + case 'RATING': + $stmt->bindValue($identifier, $this->rating, PDO::PARAM_INT); + break; + case 'STATUS': + $stmt->bindValue($identifier, $this->status, PDO::PARAM_INT); + break; + case 'VERIFIED': + $stmt->bindValue($identifier, $this->verified, PDO::PARAM_INT); + break; + case 'ABUSE': + $stmt->bindValue($identifier, $this->abuse, PDO::PARAM_INT); + break; + case 'LOCALE': + $stmt->bindValue($identifier, $this->locale, PDO::PARAM_STR); + break; + case 'CREATED_AT': + $stmt->bindValue($identifier, $this->created_at ? $this->created_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); + break; + case 'UPDATED_AT': + $stmt->bindValue($identifier, $this->updated_at ? $this->updated_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = CommentTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getUsername(); + break; + case 2: + return $this->getCustomerId(); + break; + case 3: + return $this->getRef(); + break; + case 4: + return $this->getRefId(); + break; + case 5: + return $this->getEmail(); + break; + case 6: + return $this->getTitle(); + break; + case 7: + return $this->getContent(); + break; + case 8: + return $this->getRating(); + break; + case 9: + return $this->getStatus(); + break; + case 10: + return $this->getVerified(); + break; + case 11: + return $this->getAbuse(); + break; + case 12: + return $this->getLocale(); + break; + case 13: + return $this->getCreatedAt(); + break; + case 14: + return $this->getUpdatedAt(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['Comment'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['Comment'][$this->getPrimaryKey()] = true; + $keys = CommentTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getUsername(), + $keys[2] => $this->getCustomerId(), + $keys[3] => $this->getRef(), + $keys[4] => $this->getRefId(), + $keys[5] => $this->getEmail(), + $keys[6] => $this->getTitle(), + $keys[7] => $this->getContent(), + $keys[8] => $this->getRating(), + $keys[9] => $this->getStatus(), + $keys[10] => $this->getVerified(), + $keys[11] => $this->getAbuse(), + $keys[12] => $this->getLocale(), + $keys[13] => $this->getCreatedAt(), + $keys[14] => $this->getUpdatedAt(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aCustomer) { + $result['Customer'] = $this->aCustomer->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = CommentTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setUsername($value); + break; + case 2: + $this->setCustomerId($value); + break; + case 3: + $this->setRef($value); + break; + case 4: + $this->setRefId($value); + break; + case 5: + $this->setEmail($value); + break; + case 6: + $this->setTitle($value); + break; + case 7: + $this->setContent($value); + break; + case 8: + $this->setRating($value); + break; + case 9: + $this->setStatus($value); + break; + case 10: + $this->setVerified($value); + break; + case 11: + $this->setAbuse($value); + break; + case 12: + $this->setLocale($value); + break; + case 13: + $this->setCreatedAt($value); + break; + case 14: + $this->setUpdatedAt($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = CommentTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setUsername($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setCustomerId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setRef($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setRefId($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setEmail($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setTitle($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setContent($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setRating($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setStatus($arr[$keys[9]]); + if (array_key_exists($keys[10], $arr)) $this->setVerified($arr[$keys[10]]); + if (array_key_exists($keys[11], $arr)) $this->setAbuse($arr[$keys[11]]); + if (array_key_exists($keys[12], $arr)) $this->setLocale($arr[$keys[12]]); + if (array_key_exists($keys[13], $arr)) $this->setCreatedAt($arr[$keys[13]]); + if (array_key_exists($keys[14], $arr)) $this->setUpdatedAt($arr[$keys[14]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(CommentTableMap::DATABASE_NAME); + + if ($this->isColumnModified(CommentTableMap::ID)) $criteria->add(CommentTableMap::ID, $this->id); + if ($this->isColumnModified(CommentTableMap::USERNAME)) $criteria->add(CommentTableMap::USERNAME, $this->username); + if ($this->isColumnModified(CommentTableMap::CUSTOMER_ID)) $criteria->add(CommentTableMap::CUSTOMER_ID, $this->customer_id); + if ($this->isColumnModified(CommentTableMap::REF)) $criteria->add(CommentTableMap::REF, $this->ref); + if ($this->isColumnModified(CommentTableMap::REF_ID)) $criteria->add(CommentTableMap::REF_ID, $this->ref_id); + if ($this->isColumnModified(CommentTableMap::EMAIL)) $criteria->add(CommentTableMap::EMAIL, $this->email); + if ($this->isColumnModified(CommentTableMap::TITLE)) $criteria->add(CommentTableMap::TITLE, $this->title); + if ($this->isColumnModified(CommentTableMap::CONTENT)) $criteria->add(CommentTableMap::CONTENT, $this->content); + if ($this->isColumnModified(CommentTableMap::RATING)) $criteria->add(CommentTableMap::RATING, $this->rating); + if ($this->isColumnModified(CommentTableMap::STATUS)) $criteria->add(CommentTableMap::STATUS, $this->status); + if ($this->isColumnModified(CommentTableMap::VERIFIED)) $criteria->add(CommentTableMap::VERIFIED, $this->verified); + if ($this->isColumnModified(CommentTableMap::ABUSE)) $criteria->add(CommentTableMap::ABUSE, $this->abuse); + if ($this->isColumnModified(CommentTableMap::LOCALE)) $criteria->add(CommentTableMap::LOCALE, $this->locale); + if ($this->isColumnModified(CommentTableMap::CREATED_AT)) $criteria->add(CommentTableMap::CREATED_AT, $this->created_at); + if ($this->isColumnModified(CommentTableMap::UPDATED_AT)) $criteria->add(CommentTableMap::UPDATED_AT, $this->updated_at); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(CommentTableMap::DATABASE_NAME); + $criteria->add(CommentTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Comment\Model\Comment (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setUsername($this->getUsername()); + $copyObj->setCustomerId($this->getCustomerId()); + $copyObj->setRef($this->getRef()); + $copyObj->setRefId($this->getRefId()); + $copyObj->setEmail($this->getEmail()); + $copyObj->setTitle($this->getTitle()); + $copyObj->setContent($this->getContent()); + $copyObj->setRating($this->getRating()); + $copyObj->setStatus($this->getStatus()); + $copyObj->setVerified($this->getVerified()); + $copyObj->setAbuse($this->getAbuse()); + $copyObj->setLocale($this->getLocale()); + $copyObj->setCreatedAt($this->getCreatedAt()); + $copyObj->setUpdatedAt($this->getUpdatedAt()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Comment\Model\Comment Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Declares an association between this object and a ChildCustomer object. + * + * @param ChildCustomer $v + * @return \Comment\Model\Comment The current object (for fluent API support) + * @throws PropelException + */ + public function setCustomer(ChildCustomer $v = null) + { + if ($v === null) { + $this->setCustomerId(NULL); + } else { + $this->setCustomerId($v->getId()); + } + + $this->aCustomer = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the ChildCustomer object, it will not be re-added. + if ($v !== null) { + $v->addComment($this); + } + + + return $this; + } + + + /** + * Get the associated ChildCustomer object + * + * @param ConnectionInterface $con Optional Connection object. + * @return ChildCustomer The associated ChildCustomer object. + * @throws PropelException + */ + public function getCustomer(ConnectionInterface $con = null) + { + if ($this->aCustomer === null && ($this->customer_id !== null)) { + $this->aCustomer = CustomerQuery::create()->findPk($this->customer_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aCustomer->addComments($this); + */ + } + + return $this->aCustomer; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->username = null; + $this->customer_id = null; + $this->ref = null; + $this->ref_id = null; + $this->email = null; + $this->title = null; + $this->content = null; + $this->rating = null; + $this->status = null; + $this->verified = null; + $this->abuse = null; + $this->locale = null; + $this->created_at = null; + $this->updated_at = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + $this->aCustomer = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(CommentTableMap::DEFAULT_STRING_FORMAT); + } + + // timestampable behavior + + /** + * Mark the current object so that the update date doesn't get updated during next save + * + * @return ChildComment The current object (for fluent API support) + */ + public function keepUpdateDateUnchanged() + { + $this->modifiedColumns[CommentTableMap::UPDATED_AT] = true; + + return $this; + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/Comment/Model/Base/CommentQuery.php b/local/modules/Comment/Model/Base/CommentQuery.php new file mode 100644 index 00000000..8c3a7185 --- /dev/null +++ b/local/modules/Comment/Model/Base/CommentQuery.php @@ -0,0 +1,1057 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildComment|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = CommentTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(CommentTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildComment A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, USERNAME, CUSTOMER_ID, REF, REF_ID, EMAIL, TITLE, CONTENT, RATING, STATUS, VERIFIED, ABUSE, LOCALE, CREATED_AT, UPDATED_AT FROM comment WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildComment(); + $obj->hydrate($row); + CommentTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildComment|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(CommentTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(CommentTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(CommentTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(CommentTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the username column + * + * Example usage: + * + * $query->filterByUsername('fooValue'); // WHERE username = 'fooValue' + * $query->filterByUsername('%fooValue%'); // WHERE username LIKE '%fooValue%' + * + * + * @param string $username The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByUsername($username = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($username)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $username)) { + $username = str_replace('*', '%', $username); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CommentTableMap::USERNAME, $username, $comparison); + } + + /** + * Filter the query on the customer_id column + * + * Example usage: + * + * $query->filterByCustomerId(1234); // WHERE customer_id = 1234 + * $query->filterByCustomerId(array(12, 34)); // WHERE customer_id IN (12, 34) + * $query->filterByCustomerId(array('min' => 12)); // WHERE customer_id > 12 + * + * + * @see filterByCustomer() + * + * @param mixed $customerId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByCustomerId($customerId = null, $comparison = null) + { + if (is_array($customerId)) { + $useMinMax = false; + if (isset($customerId['min'])) { + $this->addUsingAlias(CommentTableMap::CUSTOMER_ID, $customerId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($customerId['max'])) { + $this->addUsingAlias(CommentTableMap::CUSTOMER_ID, $customerId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::CUSTOMER_ID, $customerId, $comparison); + } + + /** + * Filter the query on the ref column + * + * Example usage: + * + * $query->filterByRef('fooValue'); // WHERE ref = 'fooValue' + * $query->filterByRef('%fooValue%'); // WHERE ref LIKE '%fooValue%' + * + * + * @param string $ref The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByRef($ref = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($ref)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $ref)) { + $ref = str_replace('*', '%', $ref); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CommentTableMap::REF, $ref, $comparison); + } + + /** + * Filter the query on the ref_id column + * + * Example usage: + * + * $query->filterByRefId(1234); // WHERE ref_id = 1234 + * $query->filterByRefId(array(12, 34)); // WHERE ref_id IN (12, 34) + * $query->filterByRefId(array('min' => 12)); // WHERE ref_id > 12 + * + * + * @param mixed $refId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByRefId($refId = null, $comparison = null) + { + if (is_array($refId)) { + $useMinMax = false; + if (isset($refId['min'])) { + $this->addUsingAlias(CommentTableMap::REF_ID, $refId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($refId['max'])) { + $this->addUsingAlias(CommentTableMap::REF_ID, $refId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::REF_ID, $refId, $comparison); + } + + /** + * Filter the query on the email column + * + * Example usage: + * + * $query->filterByEmail('fooValue'); // WHERE email = 'fooValue' + * $query->filterByEmail('%fooValue%'); // WHERE email LIKE '%fooValue%' + * + * + * @param string $email The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByEmail($email = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($email)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $email)) { + $email = str_replace('*', '%', $email); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CommentTableMap::EMAIL, $email, $comparison); + } + + /** + * Filter the query on the title column + * + * Example usage: + * + * $query->filterByTitle('fooValue'); // WHERE title = 'fooValue' + * $query->filterByTitle('%fooValue%'); // WHERE title LIKE '%fooValue%' + * + * + * @param string $title The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByTitle($title = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($title)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $title)) { + $title = str_replace('*', '%', $title); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CommentTableMap::TITLE, $title, $comparison); + } + + /** + * Filter the query on the content column + * + * Example usage: + * + * $query->filterByContent('fooValue'); // WHERE content = 'fooValue' + * $query->filterByContent('%fooValue%'); // WHERE content LIKE '%fooValue%' + * + * + * @param string $content The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByContent($content = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($content)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $content)) { + $content = str_replace('*', '%', $content); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CommentTableMap::CONTENT, $content, $comparison); + } + + /** + * Filter the query on the rating column + * + * Example usage: + * + * $query->filterByRating(1234); // WHERE rating = 1234 + * $query->filterByRating(array(12, 34)); // WHERE rating IN (12, 34) + * $query->filterByRating(array('min' => 12)); // WHERE rating > 12 + * + * + * @param mixed $rating The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByRating($rating = null, $comparison = null) + { + if (is_array($rating)) { + $useMinMax = false; + if (isset($rating['min'])) { + $this->addUsingAlias(CommentTableMap::RATING, $rating['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($rating['max'])) { + $this->addUsingAlias(CommentTableMap::RATING, $rating['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::RATING, $rating, $comparison); + } + + /** + * Filter the query on the status column + * + * Example usage: + * + * $query->filterByStatus(1234); // WHERE status = 1234 + * $query->filterByStatus(array(12, 34)); // WHERE status IN (12, 34) + * $query->filterByStatus(array('min' => 12)); // WHERE status > 12 + * + * + * @param mixed $status The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByStatus($status = null, $comparison = null) + { + if (is_array($status)) { + $useMinMax = false; + if (isset($status['min'])) { + $this->addUsingAlias(CommentTableMap::STATUS, $status['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($status['max'])) { + $this->addUsingAlias(CommentTableMap::STATUS, $status['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::STATUS, $status, $comparison); + } + + /** + * Filter the query on the verified column + * + * Example usage: + * + * $query->filterByVerified(1234); // WHERE verified = 1234 + * $query->filterByVerified(array(12, 34)); // WHERE verified IN (12, 34) + * $query->filterByVerified(array('min' => 12)); // WHERE verified > 12 + * + * + * @param mixed $verified The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByVerified($verified = null, $comparison = null) + { + if (is_array($verified)) { + $useMinMax = false; + if (isset($verified['min'])) { + $this->addUsingAlias(CommentTableMap::VERIFIED, $verified['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($verified['max'])) { + $this->addUsingAlias(CommentTableMap::VERIFIED, $verified['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::VERIFIED, $verified, $comparison); + } + + /** + * Filter the query on the abuse column + * + * Example usage: + * + * $query->filterByAbuse(1234); // WHERE abuse = 1234 + * $query->filterByAbuse(array(12, 34)); // WHERE abuse IN (12, 34) + * $query->filterByAbuse(array('min' => 12)); // WHERE abuse > 12 + * + * + * @param mixed $abuse The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByAbuse($abuse = null, $comparison = null) + { + if (is_array($abuse)) { + $useMinMax = false; + if (isset($abuse['min'])) { + $this->addUsingAlias(CommentTableMap::ABUSE, $abuse['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($abuse['max'])) { + $this->addUsingAlias(CommentTableMap::ABUSE, $abuse['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::ABUSE, $abuse, $comparison); + } + + /** + * Filter the query on the locale column + * + * Example usage: + * + * $query->filterByLocale('fooValue'); // WHERE locale = 'fooValue' + * $query->filterByLocale('%fooValue%'); // WHERE locale LIKE '%fooValue%' + * + * + * @param string $locale The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByLocale($locale = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($locale)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $locale)) { + $locale = str_replace('*', '%', $locale); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CommentTableMap::LOCALE, $locale, $comparison); + } + + /** + * Filter the query on the created_at column + * + * Example usage: + * + * $query->filterByCreatedAt('2011-03-14'); // WHERE created_at = '2011-03-14' + * $query->filterByCreatedAt('now'); // WHERE created_at = '2011-03-14' + * $query->filterByCreatedAt(array('max' => 'yesterday')); // WHERE created_at > '2011-03-13' + * + * + * @param mixed $createdAt The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByCreatedAt($createdAt = null, $comparison = null) + { + if (is_array($createdAt)) { + $useMinMax = false; + if (isset($createdAt['min'])) { + $this->addUsingAlias(CommentTableMap::CREATED_AT, $createdAt['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($createdAt['max'])) { + $this->addUsingAlias(CommentTableMap::CREATED_AT, $createdAt['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::CREATED_AT, $createdAt, $comparison); + } + + /** + * Filter the query on the updated_at column + * + * Example usage: + * + * $query->filterByUpdatedAt('2011-03-14'); // WHERE updated_at = '2011-03-14' + * $query->filterByUpdatedAt('now'); // WHERE updated_at = '2011-03-14' + * $query->filterByUpdatedAt(array('max' => 'yesterday')); // WHERE updated_at > '2011-03-13' + * + * + * @param mixed $updatedAt The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByUpdatedAt($updatedAt = null, $comparison = null) + { + if (is_array($updatedAt)) { + $useMinMax = false; + if (isset($updatedAt['min'])) { + $this->addUsingAlias(CommentTableMap::UPDATED_AT, $updatedAt['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($updatedAt['max'])) { + $this->addUsingAlias(CommentTableMap::UPDATED_AT, $updatedAt['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(CommentTableMap::UPDATED_AT, $updatedAt, $comparison); + } + + /** + * Filter the query by a related \Comment\Model\Thelia\Model\Customer object + * + * @param \Comment\Model\Thelia\Model\Customer|ObjectCollection $customer The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function filterByCustomer($customer, $comparison = null) + { + if ($customer instanceof \Comment\Model\Thelia\Model\Customer) { + return $this + ->addUsingAlias(CommentTableMap::CUSTOMER_ID, $customer->getId(), $comparison); + } elseif ($customer instanceof ObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(CommentTableMap::CUSTOMER_ID, $customer->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterByCustomer() only accepts arguments of type \Comment\Model\Thelia\Model\Customer or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the Customer relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function joinCustomer($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('Customer'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'Customer'); + } + + return $this; + } + + /** + * Use the Customer relation Customer object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Comment\Model\Thelia\Model\CustomerQuery A secondary query class using the current class as primary query + */ + public function useCustomerQuery($relationAlias = null, $joinType = Criteria::LEFT_JOIN) + { + return $this + ->joinCustomer($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'Customer', '\Comment\Model\Thelia\Model\CustomerQuery'); + } + + /** + * Exclude object from result + * + * @param ChildComment $comment Object to remove from the list of results + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function prune($comment = null) + { + if ($comment) { + $this->addUsingAlias(CommentTableMap::ID, $comment->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the comment table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CommentTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + CommentTableMap::clearInstancePool(); + CommentTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildComment or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildComment object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CommentTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(CommentTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + CommentTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + CommentTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + + // timestampable behavior + + /** + * Filter by the latest updated + * + * @param int $nbDays Maximum age of the latest update in days + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function recentlyUpdated($nbDays = 7) + { + return $this->addUsingAlias(CommentTableMap::UPDATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); + } + + /** + * Filter by the latest created + * + * @param int $nbDays Maximum age of in days + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function recentlyCreated($nbDays = 7) + { + return $this->addUsingAlias(CommentTableMap::CREATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); + } + + /** + * Order by update date desc + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function lastUpdatedFirst() + { + return $this->addDescendingOrderByColumn(CommentTableMap::UPDATED_AT); + } + + /** + * Order by update date asc + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function firstUpdatedFirst() + { + return $this->addAscendingOrderByColumn(CommentTableMap::UPDATED_AT); + } + + /** + * Order by create date desc + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function lastCreatedFirst() + { + return $this->addDescendingOrderByColumn(CommentTableMap::CREATED_AT); + } + + /** + * Order by create date asc + * + * @return ChildCommentQuery The current query, for fluid interface + */ + public function firstCreatedFirst() + { + return $this->addAscendingOrderByColumn(CommentTableMap::CREATED_AT); + } + +} // CommentQuery diff --git a/local/modules/Comment/Model/Comment.php b/local/modules/Comment/Model/Comment.php new file mode 100644 index 00000000..aa25e787 --- /dev/null +++ b/local/modules/Comment/Model/Comment.php @@ -0,0 +1,16 @@ + array('Id', 'Username', 'CustomerId', 'Ref', 'RefId', 'Email', 'Title', 'Content', 'Rating', 'Status', 'Verified', 'Abuse', 'Locale', 'CreatedAt', 'UpdatedAt', ), + self::TYPE_STUDLYPHPNAME => array('id', 'username', 'customerId', 'ref', 'refId', 'email', 'title', 'content', 'rating', 'status', 'verified', 'abuse', 'locale', 'createdAt', 'updatedAt', ), + self::TYPE_COLNAME => array(CommentTableMap::ID, CommentTableMap::USERNAME, CommentTableMap::CUSTOMER_ID, CommentTableMap::REF, CommentTableMap::REF_ID, CommentTableMap::EMAIL, CommentTableMap::TITLE, CommentTableMap::CONTENT, CommentTableMap::RATING, CommentTableMap::STATUS, CommentTableMap::VERIFIED, CommentTableMap::ABUSE, CommentTableMap::LOCALE, CommentTableMap::CREATED_AT, CommentTableMap::UPDATED_AT, ), + self::TYPE_RAW_COLNAME => array('ID', 'USERNAME', 'CUSTOMER_ID', 'REF', 'REF_ID', 'EMAIL', 'TITLE', 'CONTENT', 'RATING', 'STATUS', 'VERIFIED', 'ABUSE', 'LOCALE', 'CREATED_AT', 'UPDATED_AT', ), + self::TYPE_FIELDNAME => array('id', 'username', 'customer_id', 'ref', 'ref_id', 'email', 'title', 'content', 'rating', 'status', 'verified', 'abuse', 'locale', 'created_at', 'updated_at', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'Username' => 1, 'CustomerId' => 2, 'Ref' => 3, 'RefId' => 4, 'Email' => 5, 'Title' => 6, 'Content' => 7, 'Rating' => 8, 'Status' => 9, 'Verified' => 10, 'Abuse' => 11, 'Locale' => 12, 'CreatedAt' => 13, 'UpdatedAt' => 14, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'username' => 1, 'customerId' => 2, 'ref' => 3, 'refId' => 4, 'email' => 5, 'title' => 6, 'content' => 7, 'rating' => 8, 'status' => 9, 'verified' => 10, 'abuse' => 11, 'locale' => 12, 'createdAt' => 13, 'updatedAt' => 14, ), + self::TYPE_COLNAME => array(CommentTableMap::ID => 0, CommentTableMap::USERNAME => 1, CommentTableMap::CUSTOMER_ID => 2, CommentTableMap::REF => 3, CommentTableMap::REF_ID => 4, CommentTableMap::EMAIL => 5, CommentTableMap::TITLE => 6, CommentTableMap::CONTENT => 7, CommentTableMap::RATING => 8, CommentTableMap::STATUS => 9, CommentTableMap::VERIFIED => 10, CommentTableMap::ABUSE => 11, CommentTableMap::LOCALE => 12, CommentTableMap::CREATED_AT => 13, CommentTableMap::UPDATED_AT => 14, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'USERNAME' => 1, 'CUSTOMER_ID' => 2, 'REF' => 3, 'REF_ID' => 4, 'EMAIL' => 5, 'TITLE' => 6, 'CONTENT' => 7, 'RATING' => 8, 'STATUS' => 9, 'VERIFIED' => 10, 'ABUSE' => 11, 'LOCALE' => 12, 'CREATED_AT' => 13, 'UPDATED_AT' => 14, ), + self::TYPE_FIELDNAME => array('id' => 0, 'username' => 1, 'customer_id' => 2, 'ref' => 3, 'ref_id' => 4, 'email' => 5, 'title' => 6, 'content' => 7, 'rating' => 8, 'status' => 9, 'verified' => 10, 'abuse' => 11, 'locale' => 12, 'created_at' => 13, 'updated_at' => 14, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('comment'); + $this->setPhpName('Comment'); + $this->setClassName('\\Comment\\Model\\Comment'); + $this->setPackage('Comment.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addColumn('USERNAME', 'Username', 'VARCHAR', false, 255, null); + $this->addForeignKey('CUSTOMER_ID', 'CustomerId', 'INTEGER', 'customer', 'ID', false, null, null); + $this->addColumn('REF', 'Ref', 'VARCHAR', false, 255, null); + $this->addColumn('REF_ID', 'RefId', 'INTEGER', false, null, null); + $this->addColumn('EMAIL', 'Email', 'VARCHAR', false, 255, null); + $this->addColumn('TITLE', 'Title', 'VARCHAR', false, 255, null); + $this->addColumn('CONTENT', 'Content', 'CLOB', false, null, null); + $this->addColumn('RATING', 'Rating', 'TINYINT', false, null, null); + $this->addColumn('STATUS', 'Status', 'TINYINT', false, null, 0); + $this->addColumn('VERIFIED', 'Verified', 'TINYINT', false, null, null); + $this->addColumn('ABUSE', 'Abuse', 'INTEGER', false, null, null); + $this->addColumn('LOCALE', 'Locale', 'VARCHAR', false, 10, null); + $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); + $this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('Customer', '\\Comment\\Model\\Thelia\\Model\\Customer', RelationMap::MANY_TO_ONE, array('customer_id' => 'id', ), 'CASCADE', 'RESTRICT'); + } // buildRelations() + + /** + * + * Gets the list of behaviors registered for this table + * + * @return array Associative array (name => parameters) of behaviors + */ + public function getBehaviors() + { + return array( + 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), + ); + } // getBehaviors() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? CommentTableMap::CLASS_DEFAULT : CommentTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (Comment object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = CommentTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = CommentTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + CommentTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = CommentTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + CommentTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = CommentTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = CommentTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + CommentTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(CommentTableMap::ID); + $criteria->addSelectColumn(CommentTableMap::USERNAME); + $criteria->addSelectColumn(CommentTableMap::CUSTOMER_ID); + $criteria->addSelectColumn(CommentTableMap::REF); + $criteria->addSelectColumn(CommentTableMap::REF_ID); + $criteria->addSelectColumn(CommentTableMap::EMAIL); + $criteria->addSelectColumn(CommentTableMap::TITLE); + $criteria->addSelectColumn(CommentTableMap::CONTENT); + $criteria->addSelectColumn(CommentTableMap::RATING); + $criteria->addSelectColumn(CommentTableMap::STATUS); + $criteria->addSelectColumn(CommentTableMap::VERIFIED); + $criteria->addSelectColumn(CommentTableMap::ABUSE); + $criteria->addSelectColumn(CommentTableMap::LOCALE); + $criteria->addSelectColumn(CommentTableMap::CREATED_AT); + $criteria->addSelectColumn(CommentTableMap::UPDATED_AT); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.USERNAME'); + $criteria->addSelectColumn($alias . '.CUSTOMER_ID'); + $criteria->addSelectColumn($alias . '.REF'); + $criteria->addSelectColumn($alias . '.REF_ID'); + $criteria->addSelectColumn($alias . '.EMAIL'); + $criteria->addSelectColumn($alias . '.TITLE'); + $criteria->addSelectColumn($alias . '.CONTENT'); + $criteria->addSelectColumn($alias . '.RATING'); + $criteria->addSelectColumn($alias . '.STATUS'); + $criteria->addSelectColumn($alias . '.VERIFIED'); + $criteria->addSelectColumn($alias . '.ABUSE'); + $criteria->addSelectColumn($alias . '.LOCALE'); + $criteria->addSelectColumn($alias . '.CREATED_AT'); + $criteria->addSelectColumn($alias . '.UPDATED_AT'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(CommentTableMap::DATABASE_NAME)->getTable(CommentTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(CommentTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(CommentTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new CommentTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a Comment or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or Comment object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CommentTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Comment\Model\Comment) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(CommentTableMap::DATABASE_NAME); + $criteria->add(CommentTableMap::ID, (array) $values, Criteria::IN); + } + + $query = CommentQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { CommentTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { CommentTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the comment table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return CommentQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a Comment or Criteria object. + * + * @param mixed $criteria Criteria or Comment object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(CommentTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from Comment object + } + + if ($criteria->containsKey(CommentTableMap::ID) && $criteria->keyContainsValue(CommentTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.CommentTableMap::ID.')'); + } + + + // Set the correct dbName + $query = CommentQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // CommentTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +CommentTableMap::buildTableMap(); diff --git a/local/modules/Comment/README.md b/local/modules/Comment/README.md new file mode 100644 index 00000000..0795fc16 --- /dev/null +++ b/local/modules/Comment/README.md @@ -0,0 +1,94 @@ +# Module Comment + +The module **Comment** allows customer to add comments on different elements of the website : product, content, ... + +A comment is composed of a : + +- title +- message +- rating +- is related to a customer + +The message can be moderated by a administrator before being displayed on the website (recommended). + +Only registered and logged in customer can post comment on the website. You can also only authorized customers to post +comment on products that they have bought. Customers will receive an email after 15 days (by default) to encourage them +to post comment. + +If the comment has been accepted the customer can edit or delete it. + +This module is compatible with Thelia version 2.1 or greater. + +## Installation + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is Comment. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/comment-module:~1.0 +``` + +## Usage + +In back-office, the configuration page allows you to configure the module. + +In the tools menu, a new page displays comments and let you manage them. + +In the front office, an integration is provided for the default template. It uses hooks, so it's activated by default. + +You can override these smarty templates in the current template. You have to put your templates files in this directory + (with default template) : `template/frontOffice/default/modules/Comment/` + +## Loop + +The module provides a new loop : **comment** + +### Input arguments + +|Argument |Description | +|--- |--- | +|**id** | the comment id | +|**customer** | the customer id | +|**ref** | the reference key. eg : product | +|**ref_id** | the reference id. (the product id) | +|**status** | the status of the comment : 0 = pending, 1 = accepted | +|**verified** | the customer has bought the product | +|**locale** | the locale of the comment : fr_FR | +|**load_ref** | load or not the reference object. default = 0 | +|**ref_locale**| locale of the reference object fields. default: the request locale | + +### Output arguments + +|Variable |Description | +|--- |--- | +|$ID | the comment id | +|$USERNAME | the username | +|$EMAIL | the email | +|$CUSTOMER_ID | the customer id | +|$REF | the reference key | +|$REF_ID | the reference id | +|$TITLE | the title | +|$CONTENT | the content | +|$RATING | the rating | +|$STATUS | the status : : 0 = pending, 1 = accepted | +|$VERIFIED | 0 : not verified / not applicable, 1 = the customer has bought the product | +|$ABUSE | an abuse counter. | + +## how to get the rating of a product + +Ratings are stored in the meta_data table. to retrieve the rating, you can use the smarty function `meta` like this : + +```smarty +{$rating={meta meta="COMMENT_RATING" key="product" id="10"}} +{if $rating} + + rating: {$rating} + +{/if} +``` diff --git a/local/modules/Comment/composer.json b/local/modules/Comment/composer.json new file mode 100644 index 00000000..b3f1a8cd --- /dev/null +++ b/local/modules/Comment/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/comment-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "Comment" + } +} \ No newline at end of file diff --git a/local/modules/Comment/templates/backOffice/default/assets/js/comment.js b/local/modules/Comment/templates/backOffice/default/assets/js/comment.js new file mode 100644 index 00000000..8f265097 --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/assets/js/comment.js @@ -0,0 +1,153 @@ +;(function($) { + $(document).ready(function(){ + + $('#comment-save').on('click', function(){ + + var $link, $form, $list; + + $link = $(this); + $form = $link.parents('form').first(); + $list = $form.find('#comment-status').first(); + + $.ajax({ + type: "POST", + dataType: 'json', + data: {status: $list.val()}, + url: $form.attr('action') + }).done(function(data, textStatus, jqXHR){ + if (data.success) { + $list.val(data.status); + } else { + $list.val(data.status); + } + }).fail(function(jqXHR, textStatus, errorThrown){ + + }); + + }); + + var $statusMenu = $('#dropdown-status'); + + $('.dropdown-toggle').on('click.bs.dropdown', function (e) { + + var $btn = $(e.currentTarget), + $parent = $btn.parent(), + $menu = $parent.children('.dropdown-menu'), + $clonedMenu = null; + + console.log($btn.data('id')); + + if ($menu.length == 0) { + // creating the menu + $clonedMenu = $statusMenu.children().first().clone(); + $clonedMenu.appendTo($parent); + } + }); + + $('.dropdown-status').on('click', '.change-status', function (e) { + var $trigger; + + e.preventDefault(); + + $trigger = $(e.currentTarget); + + console.log("trigger status change", e.currentTarget, $trigger); + console.log("trigger status change", $trigger.parents('.actions').first().data('id'), $trigger.data('status')); + + $.ajax({ + type: "POST", + dataType: 'json', + data: {'id': $trigger.parents('.actions').first().data('id'), 'status': $trigger.data('status')}, + url: commentConfig['status'] + }).done(function (data, textStatus, jqXHR) { + var status; + if (data.success) { + status = commentStatus[data.data.status]; + $('#status-' + data.data.id) + .removeClass('btn-default btn-success btn-info btn-warning btn-danger') + .addClass('btn-' + status.css) + .html(status.label + ' ') + ; + } else { + $('#status-failed').modal('show'); + } + }).fail(function (jqXHR, textStatus, errorThrown) { + $('#status-failed').modal('show'); + }); + + }); + + $(".comment-delete").click(function () { + $("#comment_delete_id").val($(this).data("id")); + }); + + var getQueryParams = function getQueryParams() { + var pl = /\+/g, // Regex for replacing addition symbol with a space + search = /([^&=]+)=?([^&]*)/g, + decode = function (s) { + return decodeURIComponent(s.replace(pl, " ")); + }, + query = window.location.search.substring(1), + urlParams = {}, + matches; + + while (matches = search.exec(query)) { + urlParams[decode(matches[1])] = decode(matches[2]); + } + + return urlParams; + }; + + var getFilterLoop = function getFilterLoop() { + var $filterForm = $('.table-filters'); + var filters = {}; + + $filterForm.find('.filter-element').each(function () { + var $this = $(this); + filters[$this.data('name')] = $this.val(); + }); + + return filters; + }; + + var setFilterLoop = function setFilterLoop() { + var $filterForm = $('.table-filters'); + var filters = getQueryParams(); + + $filterForm.find('.filter-element').each(function () { + var $this = $(this); + if ($this.data('name') in filters) { + $this.val(filters[$this.data('name')]); + } + }); + + return filters; + }; + + $(".trigger-filter").on('click', function () { + var queries = [], + param, + params, + newParams; + + params = getQueryParams(); + newParams = getFilterLoop(); + + for (param in newParams) { + if (newParams.hasOwnProperty(param)) { + params[param] = newParams[param]; + } + } + + for (param in params) { + if (params.hasOwnProperty(param)) { + queries.push(encodeURIComponent(param) + '=' + encodeURIComponent(params[param])); + } + } + + window.location.search = '?' + queries.join('&'); + }); + + setFilterLoop(); + }); +})(jQuery); diff --git a/local/modules/Comment/templates/backOffice/default/comment-edit.html b/local/modules/Comment/templates/backOffice/default/comment-edit.html new file mode 100644 index 00000000..b34333fb --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/comment-edit.html @@ -0,0 +1,178 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} +{$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl d='comment.bo.default' l='Edit comment'}{/block} + +{block name="check-module"}comment{/block} +{block name="check-access"}update{/block} + +{block name="main-content"} + +{include file="commons.html" scope="parent"} +
+ +
+ + {loop name="comment_edit" type="comment" hidden="*" id="$comment_id" backend_context="1" limit="1"} + + + +
+
+
+ +
+ {intl d='comment.bo.default' l="Edit comment %name" name={$ID}} +
+ +
+
+ {form name="admin.comment.modification.form" blo=1} + +
+ {* Be sure to get the comment ID, even if the form could not be validated *} + + + {include file="includes/inner-form-toolbar.html" close_url="{url path='/admin/module/comments'}"} + + {form_hidden_fields form=$form} + + {form_field form=$form field='success_url'} + + {/form_field} + + {form_field form=$form field='id'} + + {/form_field} + + {if $form_error}
{$form_error_message}
{/if} + + {form_field form=$form field="ref"} + + {/form_field} + + {form_field form=$form field="ref_id"} + + {/form_field} + + {form_field form=$form field="status"} +
+ + +
+ {/form_field} + + {if $CUSTOMER_ID } + {form_field form=$form field="customer_id"} +
+ + + {loop type="customer" name="customer" id="{$CUSTOMER_ID}" current="no" backend_context="1"} + + {$FIRSTNAME} {$LASTNAME} + + {/loop} + {elseloop rel="customer"} + {intl d='comment.bo.default' l="Unknow customer %id" id="{$CUSTOMER_ID}" } + {/elseloop} +
+ {/form_field} + {else} + {form_field form=$form field="username"} +
+ + +
+ {/form_field} + + {form_field form=$form field="email"} +
+ + +
+ {/form_field} + {/if} + + {form_field form=$form field="locale"} +
+ + +
+ {/form_field} + + {form_field form=$form field="title"} +
+ + +
+ {/form_field} + + {form_field form=$form field="content"} +
+ + +
+ {/form_field} + + {form_field form=$form field='verified'} +
+ +
+ {/form_field} + + {form_field form=$form field="rating"} +
+ + +
+ {/form_field} + +
+
+

{intl d='comment.bo.default' l='Comment created on %date_create. Last modification: %date_change' date_create="{format_date date=$CREATE_DATE}" date_change="{format_date date=$UPDATE_DATE}"}

+
+
+ +
+ + {/form} +
+
+
+
+ +
+ + {/loop} + + {elseloop rel="comment_edit"} +
+
+
+ {intl d='comment.bo.default' l="Sorry, comment ID=%id was not found." id={$comment_id}} +
+
+
+ {/elseloop} + +
+
+{/block} + +{block name="javascript-last-call"} +{hook name="comment.edit-js" location="comment-edit-js" } +{/block} \ No newline at end of file diff --git a/local/modules/Comment/templates/backOffice/default/comments.html b/local/modules/Comment/templates/backOffice/default/comments.html new file mode 100644 index 00000000..281f6368 --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/comments.html @@ -0,0 +1,41 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} + {$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl d='comment.bo.default' l='Comments'}{/block} + +{block name="check-module"}comment{/block} +{block name="check-access"}view{/block} + +{block name="main-content"} + {include file="commons.html" scope="parent"} + +
+
+ + +
+
+
+ {include file="include/comments-list.html"} +
+
+
+
+
+{/block} + +{block name="javascript-initialization"} + {javascripts file='assets/js/main.js'} + + {/javascripts} + + {javascripts file='assets/js/comment.js' source='Comment'} + + {/javascripts} +{/block} diff --git a/local/modules/Comment/templates/backOffice/default/commons.html b/local/modules/Comment/templates/backOffice/default/commons.html new file mode 100644 index 00000000..87fe4b6a --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/commons.html @@ -0,0 +1,9 @@ +{* Status *} + +{$comment_status=[]} +{$comment_status['0']=['label' => {intl d='comment.bo.default' l="Pending"}, 'css' => 'default']} +{$comment_status['1']=['label' => {intl d='comment.bo.default' l="Accepted"}, 'css' => 'success']} +{$comment_status['2']=['label' => {intl d='comment.bo.default' l="Refused"}, 'css' => 'danger']} +{$comment_status['3']=['label' => {intl d='comment.bo.default' l="Abused"}, 'css' => 'warning']} + + \ No newline at end of file diff --git a/local/modules/Comment/templates/backOffice/default/configuration.html b/local/modules/Comment/templates/backOffice/default/configuration.html new file mode 100644 index 00000000..cde64b74 --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/configuration.html @@ -0,0 +1,89 @@ +
+
+ +
+ {intl d='comment.bo.default' l='Comment configuration.'} +
+ +
+
+ + {form name="comment.configuration.form"} +
+ + {if $form_error_message}
{$form_error_message}
{/if} + + {form_hidden_fields form=$form} + + {form_field form=$form field='activated'} +
+ + {$label_attr.help} +
+ {/form_field} + + {form_field form=$form field='moderate'} +
+ + {$label_attr.help} +
+ {/form_field} + + {form_field form=$form field='ref_allowed'} +
+ + + {$label_attr.help} +
+ {/form_field} + + {form_field form=$form field='only_customer'} +
+ + {$label_attr.help} +
+ {/form_field} + + {form_field form=$form field='only_verified'} +
+ + {$label_attr.help} +
+ {/form_field} + + {form_field form=$form field='request_customer_ttl'} +
+ + + {$label_attr.help} +
+ {/form_field} + + {form_field form=$form field='notify_admin_new_comment'} +
+ + {$label_attr.help} +
+ {/form_field} + + + +
+ {/form} + +
+ +
+ +
+
\ No newline at end of file diff --git a/local/modules/Comment/templates/backOffice/default/include/comments-list.html b/local/modules/Comment/templates/backOffice/default/include/comments-list.html new file mode 100644 index 00000000..3eca2ef3 --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/include/comments-list.html @@ -0,0 +1,301 @@ +{hook name="comments.top" location="comments_top" } + +{if $error_message} +
+
+
+ {$error_message} +
+
+
+{/if} + +{* Loop Filter *} +{$loop_limit={$smarty.get.loop_limit|default:20}} +{$loop_page={$smarty.get.page|default:1}} +{$loop_order={$smarty.get.loop_order|default:'created_reverse'}} +{$loop_status={$smarty.get.loop_status|default:''}} + +{assign var="amount" value={count type="comment" status=$loop_status order=$loop_order backend_context="1"}} +{if $amount < $loop_limit * $loop_page} + {$loop_page=1} +{/if} + +
+ + + + + + + + + + + + + {loop type="comment" + name="comment.list" + ref=$loop_ref + ref_id=$loop_ref_id + status=$loop_status + order=$loop_order + page=$loop_page + limit=$loop_limit + load_ref="1" + backend_context="1"} + + + + {* Author *} + + + {* Comment *} + + + {* Reference *} + + + + + {/loop} + + + + + + +
+ {intl d='comment.bo.default' l="Comments management"} + + {* No create action for now + {loop type="auth" name="can_create" role="ADMIN" module="comment" access="CREATE"} + + + + {/loop} + *} + + {intl d='comment.bo.default' l='Send email to customer'} + + +
+ +
+
+ + +
+
+
+ +
+ +
+ +
{intl d='comment.bo.default' l="ID"}{intl d='comment.bo.default' l="Author"}{intl d='comment.bo.default' l="Comment"}{intl d='comment.bo.default' l="Reference"}{intl d='comment.bo.default' l="Actions"}
{$ID} + {if $CUSTOMER_ID} + {loop type="customer" name="customer" id=$CUSTOMER_ID current="no" backend_context="1"} + +
+ {$FIRSTNAME} {$LASTNAME} +
+ {/loop} + {elseloop rel="customer"} + {intl d='comment.bo.default' l="Unknow customer %id" id=$CUSTOMER_ID } + {/elseloop} + {else} + {intl d='comment.bo.default' l="not a customer"} +
+ +
+ {$USERNAME} +
+ {/if} +
+

{$TITLE}

+ +

{$CONTENT}

+
    +
  • {intl d='comment.bo.default' l="Posted: "} + {format_date date={$CREATED} output="datetime"}
  • +
  • {intl d='comment.bo.default' l="rating: "} {$RATING}
  • +
  • {intl d='comment.bo.default' l="verified: "} + {if $VERIFIED}{intl d='comment.bo.default' l='yes'}{else}{intl d='comment.bo.default' l='no'}{/if} +
  • +
+
+ {if $REF_VIEW_URL} + + {/if} + {if $REF_TITLE}{$REF_TITLE} {/if} + ({$REF}: {$REF_ID}) + {if $REF_VIEW_URL} + + {/if} + + + + +
+ {include + file = "includes/pagination.html" + + loop_ref = "comment.list" + max_page_count = $loop_limit + page_url = {url path={navigate to="current"} product_order=$loop_page} + } + +
+ {* + {if $amount > $limit} +
+ {intl d='comment.bo.default' l="Pagination"} +
    + + + {pageloop rel="comment.list" limit=$loop_limit} + {$PAGE} + {if $PAGE eq $LAST} + + {/if} + {/pageloop} +
+
+ {/if} + *} + + +{hook name="comments.bottom" location="comments_bottom" } + + + +{* +{form name="thelia.lang.create"} + + +{* Capture the dialog body, to pass it to the generic dialog *} +{* todo create comment +{capture "creation_dialog"} + +{/capture} + +{include + file = "includes/generic-create-dialog.html" + + dialog_id = "creation_dialog" + dialog_title = {intl d='comment.bo.default' l="Create a new comment"} + dialog_body = {$smarty.capture.creation_dialog nofilter} + + dialog_ok_label = {intl d='comment.bo.default' l="Create this comment"} + + form_action = {url path='/admin/configuration/comments/add'} + form_enctype = {form_enctype form=$form} + form_error_message = $form_error_message +} +{/form} +*} + +{* Delete confirmation dialog *} + +{capture "delete_dialog"} + + {hook name="comments.delete-form" location="comments_delete_form" } +{/capture} + +{include +file = "includes/generic-confirm-dialog.html" + +dialog_id = "delete_dialog" +dialog_title = {intl d='comment.bo.default' l="Delete comment"} +dialog_message = {intl d='comment.bo.default' l="Do you really want to delete this comment ?"} + +form_action = {token_url path='/admin/module/comment/delete'} +form_content = {$smarty.capture.delete_dialog nofilter} +form_error_message = $error_delete_message +} + +
+ + + + + + \ No newline at end of file diff --git a/local/modules/Comment/templates/backOffice/default/tab-content.html b/local/modules/Comment/templates/backOffice/default/tab-content.html new file mode 100644 index 00000000..8b1c0694 --- /dev/null +++ b/local/modules/Comment/templates/backOffice/default/tab-content.html @@ -0,0 +1,45 @@ +{$activated={meta meta="COMMENT_ACTIVATED" key=$ref id=$id}} +{if $activated === null} + {$activated = "-1"} +{/if} + +
+ {intl d='comment.bo.default' l='Comments activation.'} +
+ + +
+
+
+
+
+ + + +
+ + +
+
+
+
+ +
+
+ {include file="commons.html" scope="parent"} + {include file="include/comments-list.html" loop_ref=$ref loop_ref_id=$id} +
+
\ No newline at end of file diff --git a/local/modules/Comment/templates/email/default/new-comment-notification-admin.html b/local/modules/Comment/templates/email/default/new-comment-notification-admin.html new file mode 100644 index 00000000..62a97fea --- /dev/null +++ b/local/modules/Comment/templates/email/default/new-comment-notification-admin.html @@ -0,0 +1,23 @@ +{default_translation_domain domain="comment.email.default"} +{default_locale locale={$locale}} + +{loop type="comment" name="comment" id=$comment_id load_ref="1" ref_locale=$locale backend_context="1"} +

+{intl l='We inform you that a new customer comment has been posted for the %ref_type_title "%ref_title"' + ref_type_title={$REF_TYPE_TITLE|lower} + ref_title=$REF_TITLE +} +

+ +

{intl l="Rating: "}{$RATING}

+ +

{intl l="Title: "}{$TITLE}

+ +

{intl l="Content: "}
{$CONTENT}

+ +

+ + {intl l="You can now activate this comment by going to the comment management interface."} + +

+{/loop} \ No newline at end of file diff --git a/local/modules/Comment/templates/email/default/new-comment-notification-admin.txt b/local/modules/Comment/templates/email/default/new-comment-notification-admin.txt new file mode 100644 index 00000000..eb59bd4c --- /dev/null +++ b/local/modules/Comment/templates/email/default/new-comment-notification-admin.txt @@ -0,0 +1,19 @@ +{default_translation_domain domain="comment.email.default"} +{default_locale locale={$locale}} + +{loop type="comment" name="comment" id=$comment_id load_ref="1" ref_locale=$locale backend_context="1"} +{intl l='We inform you that a new customer comment has been posted for the %ref_type_title "%ref_title"' + ref_type_title={$REF_TYPE_TITLE|lower} + ref_title=$REF_TITLE +} + +{intl l="Rating: "}{$RATING} + +{intl l="Title: "}{$TITLE} + +{intl l="Content: "}{$CONTENT} + +{intl l="You can now activate this comment by going to the comment management interface: %comment_management_link" + comment_management_link={url path="/admin/module/comment/update/$ID"} +} +{/loop} \ No newline at end of file diff --git a/local/modules/Comment/templates/email/default/request-customer-comment.html b/local/modules/Comment/templates/email/default/request-customer-comment.html new file mode 100644 index 00000000..1d4a07b6 --- /dev/null +++ b/local/modules/Comment/templates/email/default/request-customer-comment.html @@ -0,0 +1,17 @@ +{default_translation_domain domain="comment.email.default"} + +{loop type="customer" name="customer.order" current="false" id=$customer_id backend_context="1"} +

{intl l="Dear" } {$LASTNAME} {$FIRSTNAME},

+{/loop} + +

{intl l="Thank you for your order on our online store %store_name" store_name={config key="store_name"}}

+

{intl l="It would be great to share your thoughts on products with other customers."}

+

{intl l="You can post comments on this products: "}

+
    +{loop name="products" type="product" id={','|implode:$product_ids} lang=$lang_id} +
  • {$TITLE}
  • +{/loop} +
+

{intl l="Feel free to contact us for any further information"}

+ +

{intl l="Best Regards."}

\ No newline at end of file diff --git a/local/modules/Comment/templates/email/default/request-customer-comment.txt b/local/modules/Comment/templates/email/default/request-customer-comment.txt new file mode 100644 index 00000000..cd2ef771 --- /dev/null +++ b/local/modules/Comment/templates/email/default/request-customer-comment.txt @@ -0,0 +1,16 @@ +{default_translation_domain domain="comment.email.default"} + +{loop type="customer" name="customer.order" current="false" id=$customer_id backend_context="1"} +{intl l="Dear" } {$LASTNAME} {$FIRSTNAME}, +{/loop} + +{intl l="Thank you for your order on our online store %store_name" store_name={config key="store_name"}} +{intl l="It would be great to share your thoughts on products with other customers."} +{intl l="You can post comments on this products: "} +{loop name="products" type="product" id={','|implode:$product_ids} lang={$lang}} + - {$TITLE} : {$URL} +{/loop} + +{intl l="Feel free to contact us for any further information"} + +{intl l="Best Regards."} \ No newline at end of file diff --git a/local/modules/Comment/templates/frontOffice/default/ajax-comments.html b/local/modules/Comment/templates/frontOffice/default/ajax-comments.html new file mode 100644 index 00000000..38edc18f --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/ajax-comments.html @@ -0,0 +1,90 @@ +{$locale={lang attr="locale"}} +{$customer_id={customer attr="id"}} + +{ifloop rel="comments"} + + {function name=comment_stars empty=1} + {$star=''} + {$star_empty=''} + + {for $foo=0 to 4} + {if $value > $foo} + {$star nofilter} + {elseif $empty == 1} + {$star_empty nofilter} + {/if} + {/for} + {/function} + + + {loop name="comments" type="comment" ref="{$ref}" ref_id="{$ref_id}" status="1" order="created_reverse" + offset="{$start}" limit="{$count}" } + + {if $CUSTOMER_ID} + {loop name="customer" type="customer" id="{$CUSTOMER_ID}" current="false" limit="1"} + {$username="{$FIRSTNAME} {$LASTNAME|truncate:2:"...":false}"} + {$image="http://www.gravatar.com/avatar/{$EMAIL|trim|strtolower|md5}?d=mm&s=64"} + {/loop} + {elseloop rel="customer"} + {$username={intl d="comment.fo.default" l="Anonymous"} } + {$image={image file='assets/img/avatar.png'}} + {/elseloop} + {else} + {$username=$USERNAME} + {$image="http://www.gravatar.com/avatar/{$EMAIL|trim|strtolower|md5}?d=mm&s=64"} + {/if} + +
+ +
+

+ {intl d="comment.fo.default" l="By %username" username={$username}} + {if $RATING}{comment_stars value=$RATING}{/if} +

+

{$TITLE}

+ +

{$CONTENT}

+ +
    +
  • {format_date date="{$CREATED}" output="date"}
  • + {if $VERIFIED} +
  • {intl d="comment.fo.default" l="Verified"}
  • + {else} +
  • {intl d="comment.fo.default" l="Verified"}
  • + {/if} + {if $customer_id && $customer_id == $CUSTOMER_ID} +
  • {intl d="comment.fo.default" l="Delete"}
  • + {else} +
  • + {form name="comment.abuse.form"} +
    + {form_hidden_fields form=$form} + {form_field form=$form field="id"} + + {intl d="comment.fo.default" l="Mark as inappropriate"} + {/form_field} +
    + {/form} +
  • + {/if} +
+
+
+ + {/loop} + + {if {count type="comment" ref="{$ref}" ref_id="{$ref_id}" status="1" } > $start + $count } + + {/if} +{/ifloop} +{elseloop rel="comments"} +
+ {if $start == 0 } + {intl d="comment.fo.default" l="There are no comments yet"} + {else} + {intl d="comment.fo.default" l="No more comments"} + {/if} +
+{/elseloop} \ No newline at end of file diff --git a/local/modules/Comment/templates/frontOffice/default/assets/img/avatar.png b/local/modules/Comment/templates/frontOffice/default/assets/img/avatar.png new file mode 100644 index 00000000..5ce8620a Binary files /dev/null and b/local/modules/Comment/templates/frontOffice/default/assets/img/avatar.png differ diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/comment.js b/local/modules/Comment/templates/frontOffice/default/assets/js/comment.js new file mode 100644 index 00000000..94427aa7 --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/assets/js/comment.js @@ -0,0 +1,159 @@ +;(function($) { + + $(document).ready(function () { + + var $commentTop = $('#comment-top'), + $commentMessage = $('#comment-top-message'), + $commentList = $('#comment-list'), + $commentCustomer = $('#comment-customer'), + $commentForm = $('#form-add-comment'); + + var displayMessage = function displayMessage($element, cssClass, messages, timeout){ + $element.slideUp('fast', function(){ + var i = 0, + domP; + if (messages.length > 0) { + $element.html(""); + $element + .removeClass('alert-success alert-info alert-warning alert-danger hidden') + .addClass('alert-' + cssClass) + ; + for ( ; i < messages.length ; i++ ) { + domP = document.createElement( "p" ); + $element.append( $(domP).html(messages[i]) ); + } + $element.slideDown('slow'); + + if (timeout) { + setTimeout(function(){$element.slideUp();}, timeout); + } + } + }); + }; + + var loadComments = function loadComments(start, count) { + + $.ajax({ + type: "GET", + data: { + 'ref': commentConfig['ref'], + 'ref_id': commentConfig['id'], + 'start': start, + 'count': count + }, + url: commentConfig['get'] + }).done(function(data){ + $commentList.append(data); + }).fail(function(jqXHR, textStatus, errorThrown){ + displayMessage($commentMessage, 'danger', [textStatus]); + }); + + }; + + var abuseComment = function abuseComment(ev) { + + var $link, $form, $alert; + + $link = $(ev.currentTarget); + $form = $link.parents('form').first(); + $alert = $form.parents('.comment-item').first().find('.comment-alert'); + + $.ajax({ + type: "POST", + dataType: 'json', + data: $form.serialize(), + url: $form.attr('action') + }).done(function(data, textStatus, jqXHR){ + if (data.success) { + displayMessage($alert, 'success', [data.message], 5000); + $form.parents('.comment-abuse').first().remove(); + } else { + displayMessage($alert, 'danger', [data.message]); + } + }).fail(function(jqXHR, textStatus, errorThrown){ + displayMessage($alert, 'danger', [textStatus]); + }); + + }; + + var deleteComment = function deleteComment($btn) { + + var $form, $alert; + + $form = $btn.parents('form').first(); + $alert = $form.parents('.comment-item').first().find('.comment-alert'); + + $.ajax({ + type: "GET", + url: $btn.attr('href') + }).done(function(data){ + if (data.success) { + displayMessage($alert, 'success', [data.message], 5000); + $('#comment-customer').remove(); + } else { + displayMessage($alert, 'danger', [data.message]); + } + }).fail(function(jqXHR, textStatus, errorThrown){ + displayMessage($commentMessage, 'danger', [textStatus]); + }); + + }; + + $commentForm.on('submit', function (ev) { + + ev.preventDefault(); + + $.ajax({ + type: "POST", + dataType: 'json', + data: $(this).serialize(), + url: commentConfig['post'] + }).done(function(data, textStatus, jqXHR){ + if (data.success) { + displayMessage($commentMessage, 'success', data.messages); + $commentForm.slideUp(function(){ + $commentForm.remove(); + }); + } else { + displayMessage($commentMessage, 'warning', data.messages); + } + }).fail(function(jqXHR, textStatus, errorThrown){ + displayMessage($commentMessage, 'danger', [textStatus]); + }); + + }); + + loadComments(commentConfig['start'], commentConfig['count']); + + $commentList.on( "click", ".comments-more-link", function(ev) { + ev.preventDefault(); + + commentConfig['start'] += commentConfig['count']; + loadComments(commentConfig['start'], commentConfig['count']); + + $(ev.currentTarget).parents('.comments-more').first().remove(); + }); + + $commentList.on( "click", ".abuse-trigger", function(ev) { + ev.preventDefault(); + + abuseComment(ev); + }); + + $commentList.on( "click", ".delete-trigger", function(ev) { + ev.preventDefault(); + + $trigger = $(ev.currentTarget); + + if ($trigger.data("confirmed") == "1") { + deleteComment($trigger); + } else { + $trigger.data("confirmed", "1"); + $trigger.html($trigger.data("message")); + } + + }); + + }); + +})(jQuery); diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/images/cancel-off.png b/local/modules/Comment/templates/frontOffice/default/assets/js/images/cancel-off.png new file mode 100644 index 00000000..a3031f05 Binary files /dev/null and b/local/modules/Comment/templates/frontOffice/default/assets/js/images/cancel-off.png differ diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/images/cancel-on.png b/local/modules/Comment/templates/frontOffice/default/assets/js/images/cancel-on.png new file mode 100644 index 00000000..08f24936 Binary files /dev/null and b/local/modules/Comment/templates/frontOffice/default/assets/js/images/cancel-on.png differ diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-half.png b/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-half.png new file mode 100644 index 00000000..3c19e90a Binary files /dev/null and b/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-half.png differ diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-off.png b/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-off.png new file mode 100644 index 00000000..956fa7c6 Binary files /dev/null and b/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-off.png differ diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-on.png b/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-on.png new file mode 100644 index 00000000..975fe7f3 Binary files /dev/null and b/local/modules/Comment/templates/frontOffice/default/assets/js/images/star-on.png differ diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/jquery.raty.css b/local/modules/Comment/templates/frontOffice/default/assets/js/jquery.raty.css new file mode 100644 index 00000000..00be54f0 --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/assets/js/jquery.raty.css @@ -0,0 +1,46 @@ +.cancel-on-png, .cancel-off-png, .star-on-png, .star-off-png, .star-half-png { + font-size: 2em; +} + +@font-face { + font-family: "raty"; + font-style: normal; + font-weight: normal; + src: url("fonts/raty.eot"); + src: url("fonts/raty.eot?#iefix") format("embedded-opentype"); + src: url("fonts/raty.svg#raty") format("svg"); + src: url("fonts/raty.ttf") format("truetype"); + src: url("fonts/raty.woff") format("woff"); +} + +.cancel-on-png, .cancel-off-png, .star-on-png, .star-off-png, .star-half-png { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: "raty"; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: 1; + speak: none; + text-transform: none; +} + +.cancel-on-png:before { + content: "\e600"; +} + +.cancel-off-png:before { + content: "\e601"; +} + +.star-on-png:before { + content: "\f005"; +} + +.star-off-png:before { + content: "\f006"; +} + +.star-half-png:before { + content: "\f123"; +} diff --git a/local/modules/Comment/templates/frontOffice/default/assets/js/jquery.raty.js b/local/modules/Comment/templates/frontOffice/default/assets/js/jquery.raty.js new file mode 100644 index 00000000..c5836513 --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/assets/js/jquery.raty.js @@ -0,0 +1,760 @@ +/*! + * jQuery Raty - A Star Rating Plugin + * + * The MIT License + * + * @author : Washington Botelho + * @doc : http://wbotelhos.com/raty + * @version : 2.7.0 + * + */ + +; +(function($) { + 'use strict'; + + var methods = { + init: function(options) { + return this.each(function() { + this.self = $(this); + + methods.destroy.call(this.self); + + this.opt = $.extend(true, {}, $.fn.raty.defaults, options); + + methods._adjustCallback.call(this); + methods._adjustNumber.call(this); + methods._adjustHints.call(this); + + this.opt.score = methods._adjustedScore.call(this, this.opt.score); + + if (this.opt.starType !== 'img') { + methods._adjustStarType.call(this); + } + + methods._adjustPath.call(this); + methods._createStars.call(this); + + if (this.opt.cancel) { + methods._createCancel.call(this); + } + + if (this.opt.precision) { + methods._adjustPrecision.call(this); + } + + methods._createScore.call(this); + methods._apply.call(this, this.opt.score); + methods._setTitle.call(this, this.opt.score); + methods._target.call(this, this.opt.score); + + if (this.opt.readOnly) { + methods._lock.call(this); + } else { + this.style.cursor = 'pointer'; + + methods._binds.call(this); + } + }); + }, + + _adjustCallback: function() { + var options = ['number', 'readOnly', 'score', 'scoreName', 'target']; + + for (var i = 0; i < options.length; i++) { + if (typeof this.opt[options[i]] === 'function') { + this.opt[options[i]] = this.opt[options[i]].call(this); + } + } + }, + + _adjustedScore: function(score) { + if (!score) { + return score; + } + + return methods._between(score, 0, this.opt.number); + }, + + _adjustHints: function() { + if (!this.opt.hints) { + this.opt.hints = []; + } + + if (!this.opt.halfShow && !this.opt.half) { + return; + } + + var steps = this.opt.precision ? 10 : 2; + + for (var i = 0; i < this.opt.number; i++) { + var group = this.opt.hints[i]; + + if (Object.prototype.toString.call(group) !== '[object Array]') { + group = [group]; + } + + this.opt.hints[i] = []; + + for (var j = 0; j < steps; j++) { + var + hint = group[j], + last = group[group.length - 1]; + + if (last === undefined) { + last = null; + } + + this.opt.hints[i][j] = hint === undefined ? last : hint; + } + } + }, + + _adjustNumber: function() { + this.opt.number = methods._between(this.opt.number, 1, this.opt.numberMax); + }, + + _adjustPath: function() { + this.opt.path = this.opt.path || ''; + + if (this.opt.path && this.opt.path.charAt(this.opt.path.length - 1) !== '/') { + this.opt.path += '/'; + } + }, + + _adjustPrecision: function() { + this.opt.half = true; + }, + + _adjustStarType: function() { + var replaces = ['cancelOff', 'cancelOn', 'starHalf', 'starOff', 'starOn']; + + this.opt.path = ''; + + for (var i = 0; i < replaces.length; i++) { + this.opt[replaces[i]] = this.opt[replaces[i]].replace('.', '-'); + } + }, + + _apply: function(score) { + methods._fill.call(this, score); + + if (score) { + if (score > 0) { + this.score.val(score); + } + + methods._roundStars.call(this, score); + } + }, + + _between: function(value, min, max) { + return Math.min(Math.max(parseFloat(value), min), max); + }, + + _binds: function() { + if (this.cancel) { + methods._bindOverCancel.call(this); + methods._bindClickCancel.call(this); + methods._bindOutCancel.call(this); + } + + methods._bindOver.call(this); + methods._bindClick.call(this); + methods._bindOut.call(this); + }, + + _bindClick: function() { + var that = this; + + that.stars.on('click.raty', function(evt) { + var + execute = true, + score = (that.opt.half || that.opt.precision) ? that.self.data('score') : (this.alt || $(this).data('alt')); + + if (that.opt.click) { + execute = that.opt.click.call(that, +score, evt); + } + + if (execute || execute === undefined) { + if (that.opt.half && !that.opt.precision) { + score = methods._roundHalfScore.call(that, score); + } + + methods._apply.call(that, score); + } + }); + }, + + _bindClickCancel: function() { + var that = this; + + that.cancel.on('click.raty', function(evt) { + that.score.removeAttr('value'); + + if (that.opt.click) { + that.opt.click.call(that, null, evt); + } + }); + }, + + _bindOut: function() { + var that = this; + + that.self.on('mouseleave.raty', function(evt) { + var score = +that.score.val() || undefined; + + methods._apply.call(that, score); + methods._target.call(that, score, evt); + methods._resetTitle.call(that); + + if (that.opt.mouseout) { + that.opt.mouseout.call(that, score, evt); + } + }); + }, + + _bindOutCancel: function() { + var that = this; + + that.cancel.on('mouseleave.raty', function(evt) { + var icon = that.opt.cancelOff; + + if (that.opt.starType !== 'img') { + icon = that.opt.cancelClass + ' ' + icon; + } + + methods._setIcon.call(that, this, icon); + + if (that.opt.mouseout) { + var score = +that.score.val() || undefined; + + that.opt.mouseout.call(that, score, evt); + } + }); + }, + + _bindOver: function() { + var that = this, + action = that.opt.half ? 'mousemove.raty' : 'mouseover.raty'; + + that.stars.on(action, function(evt) { + var score = methods._getScoreByPosition.call(that, evt, this); + + methods._fill.call(that, score); + + if (that.opt.half) { + methods._roundStars.call(that, score, evt); + methods._setTitle.call(that, score, evt); + + that.self.data('score', score); + } + + methods._target.call(that, score, evt); + + if (that.opt.mouseover) { + that.opt.mouseover.call(that, score, evt); + } + }); + }, + + _bindOverCancel: function() { + var that = this; + + that.cancel.on('mouseover.raty', function(evt) { + var + starOff = that.opt.path + that.opt.starOff, + icon = that.opt.cancelOn; + + if (that.opt.starType === 'img') { + that.stars.attr('src', starOff); + } else { + icon = that.opt.cancelClass + ' ' + icon; + + that.stars.attr('class', starOff); + } + + methods._setIcon.call(that, this, icon); + methods._target.call(that, null, evt); + + if (that.opt.mouseover) { + that.opt.mouseover.call(that, null); + } + }); + }, + + _buildScoreField: function() { + return $('', { name: this.opt.scoreName, type: 'hidden' }).appendTo(this); + }, + + _createCancel: function() { + var icon = this.opt.path + this.opt.cancelOff, + cancel = $('<' + this.opt.starType + ' />', { title: this.opt.cancelHint, 'class': this.opt.cancelClass }); + + if (this.opt.starType === 'img') { + cancel.attr({ src: icon, alt: 'x' }); + } else { + // TODO: use $.data + cancel.attr('data-alt', 'x').addClass(icon); + } + + if (this.opt.cancelPlace === 'left') { + this.self.prepend(' ').prepend(cancel); + } else { + this.self.append(' ').append(cancel); + } + + this.cancel = cancel; + }, + + _createScore: function() { + var score = $(this.opt.targetScore); + + this.score = score.length ? score : methods._buildScoreField.call(this); + }, + + _createStars: function() { + for (var i = 1; i <= this.opt.number; i++) { + var + name = methods._nameForIndex.call(this, i), + attrs = { alt: i, src: this.opt.path + this.opt[name] }; + + if (this.opt.starType !== 'img') { + attrs = { 'data-alt': i, 'class': attrs.src }; // TODO: use $.data. + } + + attrs.title = methods._getHint.call(this, i); + + $('<' + this.opt.starType + ' />', attrs).appendTo(this); + + if (this.opt.space) { + this.self.append(i < this.opt.number ? ' ' : ''); + } + } + + this.stars = this.self.children(this.opt.starType); + }, + + _error: function(message) { + $(this).text(message); + + $.error(message); + }, + + _fill: function(score) { + var hash = 0; + + for (var i = 1; i <= this.stars.length; i++) { + var + icon, + star = this.stars[i - 1], + turnOn = methods._turnOn.call(this, i, score); + + if (this.opt.iconRange && this.opt.iconRange.length > hash) { + var irange = this.opt.iconRange[hash]; + + icon = methods._getRangeIcon.call(this, irange, turnOn); + + if (i <= irange.range) { + methods._setIcon.call(this, star, icon); + } + + if (i === irange.range) { + hash++; + } + } else { + icon = this.opt[turnOn ? 'starOn' : 'starOff']; + + methods._setIcon.call(this, star, icon); + } + } + }, + + _getFirstDecimal: function(number) { + var + decimal = number.toString().split('.')[1], + result = 0; + + if (decimal) { + result = parseInt(decimal.charAt(0), 10); + + if (decimal.slice(1, 5) === '9999') { + result++; + } + } + + return result; + }, + + _getRangeIcon: function(irange, turnOn) { + return turnOn ? irange.on || this.opt.starOn : irange.off || this.opt.starOff; + }, + + _getScoreByPosition: function(evt, icon) { + var score = parseInt(icon.alt || icon.getAttribute('data-alt'), 10); + + if (this.opt.half) { + var + size = methods._getWidth.call(this), + percent = parseFloat((evt.pageX - $(icon).offset().left) / size); + + score = score - 1 + percent; + } + + return score; + }, + + _getHint: function(score, evt) { + if (score !== 0 && !score) { + return this.opt.noRatedMsg; + } + + var + decimal = methods._getFirstDecimal.call(this, score), + integer = Math.ceil(score), + group = this.opt.hints[(integer || 1) - 1], + hint = group, + set = !evt || this.move; + + if (this.opt.precision) { + if (set) { + decimal = decimal === 0 ? 9 : decimal - 1; + } + + hint = group[decimal]; + } else if (this.opt.halfShow || this.opt.half) { + decimal = set && decimal === 0 ? 1 : decimal > 5 ? 1 : 0; + + hint = group[decimal]; + } + + return hint === '' ? '' : hint || score; + }, + + _getWidth: function() { + var width = this.stars[0].width || parseFloat(this.stars.eq(0).css('font-size')); + + if (!width) { + methods._error.call(this, 'Could not get the icon width!'); + } + + return width; + }, + + _lock: function() { + var hint = methods._getHint.call(this, this.score.val()); + + this.style.cursor = ''; + this.title = hint; + + this.score.prop('readonly', true); + this.stars.prop('title', hint); + + if (this.cancel) { + this.cancel.hide(); + } + + this.self.data('readonly', true); + }, + + _nameForIndex: function(i) { + return this.opt.score && this.opt.score >= i ? 'starOn' : 'starOff'; + }, + + _resetTitle: function(star) { + for (var i = 0; i < this.opt.number; i++) { + this.stars[i].title = methods._getHint.call(this, i + 1); + } + }, + + _roundHalfScore: function(score) { + var integer = parseInt(score, 10), + decimal = methods._getFirstDecimal.call(this, score); + + if (decimal !== 0) { + decimal = decimal > 5 ? 1 : 0.5; + } + + return integer + decimal; + }, + + _roundStars: function(score, evt) { + var + decimal = (score % 1).toFixed(2), + name ; + + if (evt || this.move) { + name = decimal > 0.5 ? 'starOn' : 'starHalf'; + } else if (decimal > this.opt.round.down) { // Up: [x.76 .. x.99] + name = 'starOn'; + + if (this.opt.halfShow && decimal < this.opt.round.up) { // Half: [x.26 .. x.75] + name = 'starHalf'; + } else if (decimal < this.opt.round.full) { // Down: [x.00 .. x.5] + name = 'starOff'; + } + } + + if (name) { + var + icon = this.opt[name], + star = this.stars[Math.ceil(score) - 1]; + + methods._setIcon.call(this, star, icon); + } // Full down: [x.00 .. x.25] + }, + + _setIcon: function(star, icon) { + star[this.opt.starType === 'img' ? 'src' : 'className'] = this.opt.path + icon; + }, + + _setTarget: function(target, score) { + if (score) { + score = this.opt.targetFormat.toString().replace('{score}', score); + } + + if (target.is(':input')) { + target.val(score); + } else { + target.html(score); + } + }, + + _setTitle: function(score, evt) { + if (score) { + var + integer = parseInt(Math.ceil(score), 10), + star = this.stars[integer - 1]; + + star.title = methods._getHint.call(this, score, evt); + } + }, + + _target: function(score, evt) { + if (this.opt.target) { + var target = $(this.opt.target); + + if (!target.length) { + methods._error.call(this, 'Target selector invalid or missing!'); + } + + var mouseover = evt && evt.type === 'mouseover'; + + if (score === undefined) { + score = this.opt.targetText; + } else if (score === null) { + score = mouseover ? this.opt.cancelHint : this.opt.targetText; + } else { + if (this.opt.targetType === 'hint') { + score = methods._getHint.call(this, score, evt); + } else if (this.opt.precision) { + score = parseFloat(score).toFixed(1); + } + + var mousemove = evt && evt.type === 'mousemove'; + + if (!mouseover && !mousemove && !this.opt.targetKeep) { + score = this.opt.targetText; + } + } + + methods._setTarget.call(this, target, score); + } + }, + + _turnOn: function(i, score) { + return this.opt.single ? (i === score) : (i <= score); + }, + + _unlock: function() { + this.style.cursor = 'pointer'; + this.removeAttribute('title'); + + this.score.removeAttr('readonly'); + + this.self.data('readonly', false); + + for (var i = 0; i < this.opt.number; i++) { + this.stars[i].title = methods._getHint.call(this, i + 1); + } + + if (this.cancel) { + this.cancel.css('display', ''); + } + }, + + cancel: function(click) { + return this.each(function() { + var self = $(this); + + if (self.data('readonly') !== true) { + methods[click ? 'click' : 'score'].call(self, null); + + this.score.removeAttr('value'); + } + }); + }, + + click: function(score) { + return this.each(function() { + if ($(this).data('readonly') !== true) { + score = methods._adjustedScore.call(this, score); + + methods._apply.call(this, score); + + if (this.opt.click) { + this.opt.click.call(this, score, $.Event('click')); + } + + methods._target.call(this, score); + } + }); + }, + + destroy: function() { + return this.each(function() { + var self = $(this), + raw = self.data('raw'); + + if (raw) { + self.off('.raty').empty().css({ cursor: raw.style.cursor }).removeData('readonly'); + } else { + self.data('raw', self.clone()[0]); + } + }); + }, + + getScore: function() { + var score = [], + value ; + + this.each(function() { + value = this.score.val(); + + score.push(value ? +value : undefined); + }); + + return (score.length > 1) ? score : score[0]; + }, + + move: function(score) { + return this.each(function() { + var + integer = parseInt(score, 10), + decimal = methods._getFirstDecimal.call(this, score); + + if (integer >= this.opt.number) { + integer = this.opt.number - 1; + decimal = 10; + } + + var + width = methods._getWidth.call(this), + steps = width / 10, + star = $(this.stars[integer]), + percent = star.offset().left + steps * decimal, + evt = $.Event('mousemove', { pageX: percent }); + + this.move = true; + + star.trigger(evt); + + this.move = false; + }); + }, + + readOnly: function(readonly) { + return this.each(function() { + var self = $(this); + + if (self.data('readonly') !== readonly) { + if (readonly) { + self.off('.raty').children('img').off('.raty'); + + methods._lock.call(this); + } else { + methods._binds.call(this); + methods._unlock.call(this); + } + + self.data('readonly', readonly); + } + }); + }, + + reload: function() { + return methods.set.call(this, {}); + }, + + score: function() { + var self = $(this); + + return arguments.length ? methods.setScore.apply(self, arguments) : methods.getScore.call(self); + }, + + set: function(options) { + return this.each(function() { + $(this).raty($.extend({}, this.opt, options)); + }); + }, + + setScore: function(score) { + return this.each(function() { + if ($(this).data('readonly') !== true) { + score = methods._adjustedScore.call(this, score); + + methods._apply.call(this, score); + methods._target.call(this, score); + } + }); + } + }; + + $.fn.raty = function(method) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + ' does not exist!'); + } + }; + + $.fn.raty.defaults = { + cancel : false, + cancelClass : 'raty-cancel', + cancelHint : 'Cancel this rating!', + cancelOff : 'cancel-off.png', + cancelOn : 'cancel-on.png', + cancelPlace : 'left', + click : undefined, + half : false, + halfShow : true, + hints : ['bad', 'poor', 'regular', 'good', 'gorgeous'], + iconRange : undefined, + mouseout : undefined, + mouseover : undefined, + noRatedMsg : 'Not rated yet!', + number : 5, + numberMax : 20, + path : undefined, + precision : false, + readOnly : false, + round : { down: 0.25, full: 0.6, up: 0.76 }, + score : undefined, + scoreName : 'score', + single : false, + space : true, + starHalf : 'star-half.png', + starOff : 'star-off.png', + starOn : 'star-on.png', + starType : 'img', + target : undefined, + targetFormat : '{score}', + targetKeep : false, + targetScore : undefined, + targetText : '', + targetType : 'hint' + }; + +})(jQuery); diff --git a/local/modules/Comment/templates/frontOffice/default/comment.html b/local/modules/Comment/templates/frontOffice/default/comment.html new file mode 100644 index 00000000..8fa2c165 --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/comment.html @@ -0,0 +1,128 @@ +{function name=comment_stars empty=1} + {$star=''} + {$star_empty=''} + + {for $foo=0 to 4} + {if $value > $foo} + {$star nofilter} + {elseif $empty == 1} + {$star_empty nofilter} + {/if} + {/for} +{/function} + +
+ +
+ +
+ {intl d="comment.fo.default" l="Add your comment"} +
+ + + + {if $definition->isValid()} + {form name="comment.add.form"} +
+ + {form_hidden_fields form=$form} + + {form_field form=$form field="ref"} + + {/form_field} + + {form_field form=$form field="ref_id"} + + {/form_field} + + {if ! $definition->getCustomer()} + {form_field form=$form field="username"} +
+ + +
+ {/form_field} + + {form_field form=$form field="email"} +
+ + +
+ {/form_field} + {/if} + + {form_field form=$form field="title"} +
+ + +
+ {/form_field} + + {form_field form=$form field="content"} +
+ + +
+ {/form_field} + + {if $definition->hasRating()} + + {form_field form=$form field="rating"} +
+ {$label} +
+ + + + + + +
+
+ {/form_field} + {/if} + +
+ +
+
+ {/form} + {else} +
{$message}
+ {/if} +
+ +
+
+ {intl d="comment.fo.default" l="Comments"} + {if $definition->hasRating()} + {$rating={meta meta="COMMENT_RATING" key="{$definition->getRef()}" id="{$definition->getRefId()}"}} + {if $rating} + + {intl d="comment.fo.default" l="rating:"} {comment_stars value=$rating} + + {/if} + {/if} +
+ +
+
+
diff --git a/local/modules/Comment/templates/frontOffice/default/includes/stars.html b/local/modules/Comment/templates/frontOffice/default/includes/stars.html new file mode 100644 index 00000000..cb00c64f --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/includes/stars.html @@ -0,0 +1,17 @@ + +{* + A function inside an included file seems not working in smarty +*} + +{function name=comment_stars empty=1} + {$star=''} + {$star_empty=''} + + {for $foo=0 to 4} + {if $value > $foo} + {$star nofilter} + {elseif $empty == 1} + {$star_empty nofilter} + {/if} + {/for} +{/function} diff --git a/local/modules/Comment/templates/frontOffice/default/js.html b/local/modules/Comment/templates/frontOffice/default/js.html new file mode 100644 index 00000000..349724c7 --- /dev/null +++ b/local/modules/Comment/templates/frontOffice/default/js.html @@ -0,0 +1,15 @@ + diff --git a/local/modules/DigressivePrice/Config/config.xml b/local/modules/DigressivePrice/Config/config.xml new file mode 100644 index 00000000..6ba42e95 --- /dev/null +++ b/local/modules/DigressivePrice/Config/config.xml @@ -0,0 +1,33 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/DigressivePrice/Config/create.sql b/local/modules/DigressivePrice/Config/create.sql new file mode 100644 index 00000000..b96d42df --- /dev/null +++ b/local/modules/DigressivePrice/Config/create.sql @@ -0,0 +1,25 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- digressive_price +-- --------------------------------------------------------------------- + +CREATE TABLE IF NOT EXISTS `digressive_price` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `discount` FLOAT NOT NULL, + `quantity_from` INTEGER NOT NULL, + `quantity_to` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `FI_product_digressive` (`product_id`), + CONSTRAINT `fk_product_digressive` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) +) ENGINE=InnoDB; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/DigressivePrice/Config/delete.sql b/local/modules/DigressivePrice/Config/delete.sql new file mode 100644 index 00000000..6b1c55b6 --- /dev/null +++ b/local/modules/DigressivePrice/Config/delete.sql @@ -0,0 +1,13 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- digressive_price +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `digressive_price`; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/DigressivePrice/Config/module.xml b/local/modules/DigressivePrice/Config/module.xml new file mode 100644 index 00000000..a74bde4a --- /dev/null +++ b/local/modules/DigressivePrice/Config/module.xml @@ -0,0 +1,18 @@ + + + DigressivePrice\DigressivePrice + + Digressive price + + + Prix dégressif + + 2.0 + + Etienne PERRIERE - Nexxpix - OpenStudio + eperriere@openstudio.fr + + classic + 2.1.0 + other + diff --git a/local/modules/DigressivePrice/Config/routing.xml b/local/modules/DigressivePrice/Config/routing.xml new file mode 100644 index 00000000..3cab4c31 --- /dev/null +++ b/local/modules/DigressivePrice/Config/routing.xml @@ -0,0 +1,23 @@ + + + + + + DigressivePrice\Controller\DigressivePriceController::createAction + + + + DigressivePrice\Controller\DigressivePriceController::updateAction + + + + DigressivePrice\Controller\DigressivePriceController::deleteAction + + + + DigressivePrice\Controller\DigressivePriceFrontController::updateTableAction + \d+ + + diff --git a/local/modules/DigressivePrice/Config/schema.xml b/local/modules/DigressivePrice/Config/schema.xml new file mode 100644 index 00000000..362932ee --- /dev/null +++ b/local/modules/DigressivePrice/Config/schema.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + +
+ +
diff --git a/local/modules/DigressivePrice/Controller/DigressivePriceController.php b/local/modules/DigressivePrice/Controller/DigressivePriceController.php new file mode 100644 index 00000000..b8fcf749 --- /dev/null +++ b/local/modules/DigressivePrice/Controller/DigressivePriceController.php @@ -0,0 +1,149 @@ + - Nexxpix - OpenStudio + */ +class DigressivePriceController extends BaseAdminController +{ + /** + * @return mixed|\Symfony\Component\HttpFoundation\Response + * @throws \Exception + */ + public function createAction() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'DigressivePrice', AccessManager::CREATE)) { + return $response; + } + + // Initialize vars + $request = $this->getRequest(); + $cdpf = new CreateDigressivePriceForm($request); + + try { + $form = $this->validateForm($cdpf); + + // Dispatch create + $event = new DigressivePriceEvent( + $form->get('productId')->getData(), + $form->get('discount')->getData(), + $form->get('quantityFrom')->getData(), + $form->get('quantityTo')->getData() + ); + $this->dispatch('action.createDigressivePrice', $event); + } catch (\Exception $e) { + $this->setupFormErrorContext( + "Add digressive price", + $e instanceof FormValidationException ? $this->createStandardFormValidationErrorMessage($e) : $e->getMessage(), + $cdpf, + $e + ); + } + + return $this->generateRedirectFromRoute( + 'admin.products.update', + array( + 'product_id' => $this->getRequest()->get('product_id'), + 'current_tab' => 'product_digressive_price' + ) + ); + } + + /** + * @return mixed|\Symfony\Component\HttpFoundation\Response + * @throws \Exception + */ + public function updateAction() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'DigressivePrice', AccessManager::UPDATE)) { + return $response; + } + + // Initialize vars + $request = $this->getRequest(); + $udpf = new UpdateDigressivePriceForm($request); + + try { + $form = $this->validateForm($udpf); + + // Dispatch update + $event = new DigressivePriceFullEvent( + $form->get('id')->getData(), + $form->get('productId')->getData(), + $form->get('discount')->getData(), + $form->get('quantityFrom')->getData(), + $form->get('quantityTo')->getData() + ); + $this->dispatch('action.updateDigressivePrice', $event); + } catch (FormValidationException $e) { + $this->setupFormErrorContext( + "Add digressive price", + $e instanceof FormValidationException ? $this->createStandardFormValidationErrorMessage($e) : $e->getMessage(), + $udpf, + $e + ); + } + + return $this->generateRedirectFromRoute( + 'admin.products.update', + array( + 'product_id' => $this->getRequest()->get('product_id'), + 'current_tab' => 'product_digressive_price' + ) + ); + } + + /** + * @return mixed|\Symfony\Component\HttpFoundation\Response + * @throws \Exception + */ + public function deleteAction() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'DigressivePrice', AccessManager::DELETE)) { + return $response; + } + + // Initialize vars + $request = $this->getRequest(); + $ddpf = new DeleteDigressivePriceForm($request); + + try { + $form = $this->validateForm($ddpf); + + // Dispatch delete + $event = new DigressivePriceIdEvent($form->get('id')->getData()); + $this->dispatch('action.deleteDigressivePrice', $event); + } catch (FormValidationException $e) { + $this->setupFormErrorContext( + "Add digressive price", + $e instanceof FormValidationException ? $this->createStandardFormValidationErrorMessage($e) : $e->getMessage(), + $ddpf, + $e + ); + } + + return $this->generateRedirectFromRoute( + 'admin.products.update', + array( + 'product_id' => $this->getRequest()->get('product_id'), + 'current_tab' => 'product_digressive_price' + ) + ); + } +} diff --git a/local/modules/DigressivePrice/Controller/DigressivePriceFrontController.php b/local/modules/DigressivePrice/Controller/DigressivePriceFrontController.php new file mode 100644 index 00000000..44aed253 --- /dev/null +++ b/local/modules/DigressivePrice/Controller/DigressivePriceFrontController.php @@ -0,0 +1,34 @@ +findPk($pseId)) { + + return $this->render( + 'digressive-price/product-details-bottom', + [ + 'pse_id' => $pse->getId(), + 'product_id' => $pse->getProductId() + ] + ); + } + + return new Response(''); + } +} diff --git a/local/modules/DigressivePrice/DigressivePrice.php b/local/modules/DigressivePrice/DigressivePrice.php new file mode 100644 index 00000000..e2ad9ee3 --- /dev/null +++ b/local/modules/DigressivePrice/DigressivePrice.php @@ -0,0 +1,40 @@ +insertSql(null, array(__DIR__ . '/Config/create.sql')); + } + } + + public function destroy(ConnectionInterface $con = null, $deleteModuleData = false) + { + parent::destroy($con, $deleteModuleData); + if (!is_null($con) && $deleteModuleData === true) { + $database = new Database($con); + $database->insertSql(null, array(__DIR__ . '/Config/delete.sql')); + } + } +} diff --git a/local/modules/DigressivePrice/Event/DigressivePriceEvent.php b/local/modules/DigressivePrice/Event/DigressivePriceEvent.php new file mode 100644 index 00000000..a52a6311 --- /dev/null +++ b/local/modules/DigressivePrice/Event/DigressivePriceEvent.php @@ -0,0 +1,96 @@ + - Nexxpix - OpenStudio + */ +class DigressivePriceEvent extends ActionEvent +{ + protected $productId; + protected $discount; + protected $quantityFrom; + protected $quantityTo; + + public function __construct( + $productId, + $discount, + $quantityFrom, + $quantityTo + ) { + $this->productId = $productId; + $this->discount = $discount; + $this->quantityFrom = $quantityFrom; + $this->quantityTo = $quantityTo; + } + + /** + * @return mixed + */ + public function getProductId() + { + return $this->productId; + } + + /** + * @param mixed $productId + */ + public function setProductId($productId) + { + $this->productId = $productId; + } + + /** + * @return mixed + */ + public function getDiscount() + { + return $this->discount; + } + + /** + * @param mixed $discount + * @return $this + */ + public function setDiscount($discount) + { + $this->discount = $discount; + return $this; + } + + /** + * @return mixed + */ + public function getQuantityFrom() + { + return $this->quantityFrom; + } + + /** + * @param mixed $quantityFrom + */ + public function setQuantityFrom($quantityFrom) + { + $this->quantityFrom = $quantityFrom; + } + + /** + * @return mixed + */ + public function getQuantityTo() + { + return $this->quantityTo; + } + + /** + * @param mixed $quantityTo + */ + public function setQuantityTo($quantityTo) + { + $this->quantityTo = $quantityTo; + } +} diff --git a/local/modules/DigressivePrice/Event/DigressivePriceFullEvent.php b/local/modules/DigressivePrice/Event/DigressivePriceFullEvent.php new file mode 100644 index 00000000..c3bb5262 --- /dev/null +++ b/local/modules/DigressivePrice/Event/DigressivePriceFullEvent.php @@ -0,0 +1,33 @@ + - Nexxpix - OpenStudio + */ +class DigressivePriceFullEvent extends DigressivePriceEvent +{ + protected $id; + + public function __construct( + $id, + $productId, + $discount, + $quantityFrom, + $quantityTo + ) { + parent::__construct($productId, $discount, $quantityFrom, $quantityTo); + + $this->id = $id; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } +} diff --git a/local/modules/DigressivePrice/Event/DigressivePriceIdEvent.php b/local/modules/DigressivePrice/Event/DigressivePriceIdEvent.php new file mode 100644 index 00000000..fb25858d --- /dev/null +++ b/local/modules/DigressivePrice/Event/DigressivePriceIdEvent.php @@ -0,0 +1,28 @@ + - Nexxpix - OpenStudio + */ +class DigressivePriceIdEvent extends ActionEvent +{ + protected $id; + + public function __construct($id) + { + $this->id = $id; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } +} diff --git a/local/modules/DigressivePrice/Form/CreateDigressivePriceForm.php b/local/modules/DigressivePrice/Form/CreateDigressivePriceForm.php new file mode 100644 index 00000000..9c994c18 --- /dev/null +++ b/local/modules/DigressivePrice/Form/CreateDigressivePriceForm.php @@ -0,0 +1,187 @@ + - Nexxpix - OpenStudio + */ +class CreateDigressivePriceForm extends BaseForm +{ + public function getName() + { + return "digressiveprice_create"; + } + + protected function buildForm() + { + $this->formBuilder + ->add( + "productId", + "number", + array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => $this->translator->trans('product ID', [], DigressivePrice::DOMAIN) + ) + ) + ->add( + "quantityFrom", + "number", + array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Callback( + array( + "methods" => array( + array( + $this, + "fromNotInRange" + ) + ) + ) + ) + ), + "label" => $this->translator->trans('FROM {quantity}', [], DigressivePrice::DOMAIN) + ) + ) + ->add( + "quantityTo", + "number", + array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Callback( + array( + "methods" => array( + array($this, + "toIsGreaterThanFrom" + ), + array($this, + "toNotInRange" + ), + array($this, + "notSurround" + ) + ) + ) + ) + ), + "label" => $this->translator->trans('TO {quantity}', [], DigressivePrice::DOMAIN) + ) + ) + ->add( + "discount", + "number", + array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\GreaterThanOrEqual(['value' => 0]), + new Constraints\LessThanOrEqual(['value' => 100]) + ), + "label" => $this->translator->trans('Remise (%)', [], DigressivePrice::DOMAIN) + ) + ); + } + + /** + * @param $value + * @param ExecutionContextInterface $context + */ + public function toIsGreaterThanFrom($value, ExecutionContextInterface $context) + { + $quantityFrom = $this->getForm()->getData()['quantityFrom']; + + if ($quantityFrom >= $value) { + $context->addViolation($this->translator->trans('The end of range must be greater than the beginning', [], DigressivePrice::DOMAIN)); + } + } + + /** + * @param $value + * @param ExecutionContextInterface $context + * @param bool $isUpdating + */ + public function fromNotInRange($value, ExecutionContextInterface $context, $isUpdating = false) + { + $digressivePrices = $this->inRangeQuery($value, $isUpdating); + + if (count($digressivePrices) !== 0) { + $context->addViolation($this->translator->trans('Your new range begins in another one', [], DigressivePrice::DOMAIN)); + } + } + + /** + * @param $value + * @param ExecutionContextInterface $context + * @param bool $isUpdating + */ + public function toNotInRange($value, ExecutionContextInterface $context, $isUpdating = false) + { + $digressivePrices = $this->inRangeQuery($value, $isUpdating); + + if (count($digressivePrices) !== 0) { + $context->addViolation($this->translator->trans('Your new range ends in another one', [], DigressivePrice::DOMAIN)); + } + } + + /** + * @param $value + * @param ExecutionContextInterface $context + * @param bool $isUpdating + */ + public function notSurround($value, ExecutionContextInterface $context, $isUpdating = false) + { + // Check if the values are around FROM and TO quantities of an existing digressive price of the current product + $digressivePricesQuery = DigressivePriceQuery::create() + ->filterByProductId($this->getForm()->getData()['productId']) + ->filterByQuantityFrom($this->getForm()->getData()['quantityFrom'], Criteria::GREATER_EQUAL) + ->filterByQuantityTo($value, Criteria::LESS_EQUAL); + + // If it's an update, don't check itself + if ($isUpdating) { + $digressivePricesQuery->filterById($this->getForm()->getData()['id'], Criteria::NOT_IN); + } else { + // Else it's a new one, so we only check for the current product + $digressivePricesQuery->filterByProductId($this->getForm()->getData()['productId']); + } + + $digressivePrices = $digressivePricesQuery->find(); + + if (count($digressivePrices) !== 0) { + $context->addViolation($this->translator->trans('Your new range surrounds an existing one', [], DigressivePrice::DOMAIN)); + } + } + + /** + * @param $value + * @param $isUpdating + * @return array|mixed|\Propel\Runtime\Collection\ObjectCollection + */ + public function inRangeQuery($value, $isUpdating) + { + // Check if the value is between FROM and TO quantities of an existing digressive price of the current product + $digressivePricesQuery = DigressivePriceQuery::create() + ->filterByProductId($this->getForm()->getData()['productId']) + ->filterByQuantityFrom($value, Criteria::LESS_EQUAL) + ->filterByQuantityTo($value, Criteria::GREATER_EQUAL); + + // If it's an update, don't check itself + if ($isUpdating) { + $digressivePricesQuery->filterById($this->getForm()->getData()['id'], Criteria::NOT_IN); + } + + return $digressivePricesQuery->find(); + } +} diff --git a/local/modules/DigressivePrice/Form/DeleteDigressivePriceForm.php b/local/modules/DigressivePrice/Form/DeleteDigressivePriceForm.php new file mode 100644 index 00000000..72ec42ee --- /dev/null +++ b/local/modules/DigressivePrice/Form/DeleteDigressivePriceForm.php @@ -0,0 +1,48 @@ + - Nexxpix - OpenStudio + */ +class DeleteDigressivePriceForm extends BaseForm +{ + + protected function buildForm() + { + $this->formBuilder + ->add( + "productId", + "number", + array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => $this->translator->trans('product ID', [], DigressivePrice::DOMAIN) + ) + ) + ->add( + "id", + "number", + array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => 'ID' + ) + ); + } + + public function getName() + { + return "digressiveprice_delete"; + } +} diff --git a/local/modules/DigressivePrice/Form/UpdateDigressivePriceForm.php b/local/modules/DigressivePrice/Form/UpdateDigressivePriceForm.php new file mode 100644 index 00000000..9fe09f09 --- /dev/null +++ b/local/modules/DigressivePrice/Form/UpdateDigressivePriceForm.php @@ -0,0 +1,53 @@ + - Nexxpix - OpenStudio + */ +class UpdateDigressivePriceForm extends CreateDigressivePriceForm +{ + public function getName() + { + return "digressiveprice_update"; + } + + protected function buildForm() + { + parent::buildForm(); + + $this->formBuilder + ->add( + "id", + "number", + array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => 'ID' + ) + ); + } + + public function fromNotInRange($value, ExecutionContextInterface $context, $isUpdating = true) + { + parent::fromNotInRange($value, $context, $isUpdating); + } + + public function toNotInRange($value, ExecutionContextInterface $context, $isUpdating = true) + { + parent::toNotInRange($value, $context, $isUpdating); + } + + public function notSurround($value, ExecutionContextInterface $context, $isUpdating = true) + { + parent::notSurround($value, $context, $isUpdating); + } +} diff --git a/local/modules/DigressivePrice/Hook/DigressivePriceHook.php b/local/modules/DigressivePrice/Hook/DigressivePriceHook.php new file mode 100644 index 00000000..826d2e3f --- /dev/null +++ b/local/modules/DigressivePrice/Hook/DigressivePriceHook.php @@ -0,0 +1,48 @@ + - Nexxpix - OpenStudio + * @author Franck Allimant + */ +class DigressivePriceHook extends BaseHook +{ + public function onProductTab(HookRenderBlockEvent $event) + { + $event->add( + [ + 'id' => 'product_digressive_price', + 'title' => $this->trans('Digressive Prices', [], DigressivePrice::DOMAIN), + 'content' => $this->render('product-tab-content-hook.html') + ] + ); + } + + public function onProductDetailsBottom(HookRenderEvent $event) + { + $event->add( + $this->render( + 'digressive-price/product-details-bottom.html', + [ + 'product_id' => $event->getArgument('product') + ] + ) + ); + } + + public function onProductJavascriptInitialization(HookRenderEvent $event) + { + $event->add( + $this->render('digressive-price/digressive-price.js.html') + ); + } + +} diff --git a/local/modules/DigressivePrice/I18n/backOffice/default/en_US.php b/local/modules/DigressivePrice/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..6836263f --- /dev/null +++ b/local/modules/DigressivePrice/I18n/backOffice/default/en_US.php @@ -0,0 +1,12 @@ + 'Add', + 'Add/Update' => 'Add/Update', + 'Digressive price' => 'Digressive price', + 'Discount (%)' => 'Discount (%)', + 'From' => 'From', + 'Remove' => 'Remove', + 'To' => 'To', + 'Update' => 'Update', +); diff --git a/local/modules/DigressivePrice/I18n/backOffice/default/fr_FR.php b/local/modules/DigressivePrice/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..6a8e27a0 --- /dev/null +++ b/local/modules/DigressivePrice/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,12 @@ + 'Ajouter', + 'Add/Update' => 'Ajouter/Modifier', + 'Digressive price' => 'Prix dégressif', + 'Discount (%)' => 'Remise (%)', + 'From' => 'De', + 'Remove' => 'Supprimer', + 'To' => 'A', + 'Update' => 'Modifier', +); diff --git a/local/modules/DigressivePrice/I18n/en_US.php b/local/modules/DigressivePrice/I18n/en_US.php new file mode 100644 index 00000000..8d8aaac1 --- /dev/null +++ b/local/modules/DigressivePrice/I18n/en_US.php @@ -0,0 +1,13 @@ + 'Digressive Prices', + 'FROM {quantity}' => 'FROM {quantity}', + 'Remise (%)' => 'Discount (%)', + 'TO {quantity}' => 'TO {quantity}', + 'The end of range must be greater than the beginning' => 'The end of range must be greater than the beginning', + 'Your new range begins in another one' => 'Your new range begins in another one', + 'Your new range ends in another one' => 'Your new range ends in another one', + 'Your new range surrounds an existing one' => 'Your new range surrounds an existing one', + 'product ID' => 'product ID', +); diff --git a/local/modules/DigressivePrice/I18n/fr_FR.php b/local/modules/DigressivePrice/I18n/fr_FR.php new file mode 100644 index 00000000..c8b05625 --- /dev/null +++ b/local/modules/DigressivePrice/I18n/fr_FR.php @@ -0,0 +1,12 @@ + 'Prix dégressifs', + 'FROM {quantity}' => 'DE (quantité)', + 'Remise (%)' => 'Remise (%)', + 'TO {quantity}' => 'À (quantité)', + 'The end of range must be greater than the beginning' => 'La quantité de fin de l\'intervalle doit être supérieure à la quantité de début', + 'Your new range begins in another one' => 'Cet intervalle de quantité commence dans un intervalle existant', + 'Your new range ends in another one' => 'Cet intervalle de quantité se termine dans un intervalle existant', + 'Your new range surrounds an existing one' => 'Cet intervalle de quantité recouvre un intervalle existant', +); diff --git a/local/modules/DigressivePrice/I18n/frontOffice/default/en_US.php b/local/modules/DigressivePrice/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..fb2eccf1 --- /dev/null +++ b/local/modules/DigressivePrice/I18n/frontOffice/default/en_US.php @@ -0,0 +1,10 @@ + 'Digressive prices', + 'Discount' => 'Discount', + 'None' => 'None', + 'Order more products and get a discount !' => 'Order more products and get a discount !', + 'Quantity' => 'Quantity', + 'Unit price' => 'Unit price', +); diff --git a/local/modules/DigressivePrice/I18n/frontOffice/default/fr_FR.php b/local/modules/DigressivePrice/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..e8465869 --- /dev/null +++ b/local/modules/DigressivePrice/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,12 @@ + 'Prix dégressifs', + 'Discount' => 'Remise', + 'None' => 'Aucune', + 'Order more products and get a discount !' => 'Commandez plus d\'exemplaires de ce produit et bénéficiez d\'une remise sur le prix unitaire de chaque produit !', + 'Quantity' => 'Quantité', + 'Unit price' => 'Prix unitaire', + 'From %qty' => 'De %qty', + 'From %from to %to' => 'De %from à %to' +); diff --git a/local/modules/DigressivePrice/LICENSE.txt b/local/modules/DigressivePrice/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/DigressivePrice/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/DigressivePrice/Listener/DigressivePriceListener.php b/local/modules/DigressivePrice/Listener/DigressivePriceListener.php new file mode 100644 index 00000000..91ba441d --- /dev/null +++ b/local/modules/DigressivePrice/Listener/DigressivePriceListener.php @@ -0,0 +1,185 @@ +requestStack = $requestStack; + } + + public static function getSubscribedEvents() + { + return array( + TheliaEvents::BEFORE_DELETEPRODUCT => array("beforeRemoveDigressivePrices", 128), + TheliaEvents::CART_ADDITEM => array("updateCartItemPrice", 128), + TheliaEvents::CART_UPDATEITEM => array("updateCartItemPrice", 128), + TheliaEvents::CART_ITEM_DUPLICATE => [ 'cartItemDuplication', 100], + + 'action.createDigressivePrice' => array("createDigressivePrice", 128), + 'action.updateDigressivePrice' => array("updateDigressivePrice", 128), + 'action.deleteDigressivePrice' => array("deleteDigressivePrice", 128)); + } + + /** + * @param ProductEvent $event + * @throws \Exception + * @throws \Propel\Runtime\Exception\PropelException + */ + public function beforeRemoveDigressivePrices(ProductEvent $event) + { + $productId = $event->getProduct()->getId(); + + DigressivePriceQuery::create() + ->filterByProductId($productId) + ->delete(); + } + + /** + * Set the good item's price when added to cart + * + * @param CartEvent $event + * @throws \Exception + * @throws \Propel\Runtime\Exception\PropelException + */ + public function updateCartItemPrice(CartEvent $event, $eventName, EventDispatcherInterface $dispatcher) + { + $this->processCartItem($event->getCartItem(), true); + } + + /** + * Update cart prices after duplication. + * + * @param CartItemDuplicationItem $event + * @param $eventName + * @param EventDispatcherInterface $dispatcher + * @throws \Propel\Runtime\Exception\PropelException + */ + public function cartItemDuplication(CartItemDuplicationItem $event, $eventName, EventDispatcherInterface $dispatcher) + { + $this->processCartItem($event->getNewItem(), false); + } + + /** + * Process a cart item to apply our price if required. + * + * @param CartItem $cartItem + * @param bool $setDefaultPrice if true, the regular price is set if the quantity doesn't match any slice. + * @throws \Propel\Runtime\Exception\PropelException + */ + protected function processCartItem(CartItem $cartItem, $setDefaultPrice) + { + // Check if the quantity is into a range + if (null !== $dpq = DigressivePriceQuery::create() + ->filterByProductId($cartItem->getProductId()) + ->filterByQuantityFrom($cartItem->getQuantity(), Criteria::LESS_EQUAL) + ->filterByQuantityTo($cartItem->getQuantity(), Criteria::GREATER_EQUAL) + ->findOne()) { + + $remise = 1 - $dpq->getDiscount() / 100; + + // Get prices + $prices = $cartItem + ->getProductSaleElements() + ->getPricesByCurrency($cartItem->getCart()->getCurrency()); + + $price = $remise * $prices->getPrice(); + $promo = $remise * $prices->getPromoPrice(); + + // Change cart item's prices with those from the corresponding range + $cartItem + ->setPrice($price) + ->setPromoPrice($promo) + ->save(); + } elseif ($setDefaultPrice) { + // Change cart item's prices with the default one + $prices = ProductPriceQuery::create() + ->findOneByProductSaleElementsId($cartItem->getProductSaleElementsId()); + + $cartItem + ->setPrice($prices->getPrice()) + ->setPromoPrice($prices->getPromoPrice()) + ->save(); + } + } + + /** + * @param DigressivePriceEvent $event + * @throws \Exception + * @throws \Propel\Runtime\Exception\PropelException + */ + public function createDigressivePrice(DigressivePriceEvent $event) + { + $digressivePrice = new DigressivePrice(); + + $digressivePrice + ->setProductId($event->getProductId()) + ->setDiscount($event->getDiscount()) + ->setQuantityFrom($event->getQuantityFrom()) + ->setQuantityTo($event->getQuantityTo()) + ->save(); + } + + /** + * @param DigressivePriceFullEvent $event + * @throws \Exception + * @throws \Propel\Runtime\Exception\PropelException + */ + public function updateDigressivePrice(DigressivePriceFullEvent $event) + { + $digressivePrice = DigressivePriceQuery::create()->findOneById($event->getId()); + + $digressivePrice + ->setProductId($event->getProductId()) + ->setDiscount($event->getDiscount()) + ->setQuantityFrom($event->getQuantityFrom()) + ->setQuantityTo($event->getQuantityTo()) + ->save(); + } + + /** + * @param DigressivePriceIdEvent $event + * @throws \Exception + * @throws \Propel\Runtime\Exception\PropelException + */ + public function deleteDigressivePrice(DigressivePriceIdEvent $event) + { + DigressivePriceQuery::create() + ->filterById($event->getId()) + ->delete(); + } +} diff --git a/local/modules/DigressivePrice/Loop/DigressiveLoop.php b/local/modules/DigressivePrice/Loop/DigressiveLoop.php new file mode 100644 index 00000000..f5df104d --- /dev/null +++ b/local/modules/DigressivePrice/Loop/DigressiveLoop.php @@ -0,0 +1,130 @@ + - Nexxpix - OpenStudio + * @method int getProductId() + * @method int getPseId() + * @method int getQuantity() + */ +class DigressiveLoop extends BaseI18nLoop implements PropelSearchLoopInterface +{ + public $countable = true; + + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntTypeArgument('product_id'), + Argument::createIntTypeArgument('pse_id'), + Argument::createIntTypeArgument('quantity') + ); + } + + /** + * @return DigressivePriceQuery|\Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria() + { + $search = DigressivePriceQuery::create(); + + if (null !== $productId = $this->getProductId()) { + $search->filterByProductId($productId); + } elseif (null !== $pseId = $this->getPseId()) { + $pse = ProductSaleElementsQuery::create()->findPk($pseId); + + if (null !== $pse) { + $search->filterByProductId($pse->getProductId()); + } + } + + if (null !== $quantity = $this->getQuantity()) { + $search + ->filterByQuantityFrom($quantity, Criteria::LESS_EQUAL) + ->filterByQuantityTo($quantity, Criteria::GREATER_EQUAL) + ; + + } + + $search->orderByQuantityFrom(); + + return $search; + } + + /** + * @param LoopResult $loopResult + * @return LoopResult + * @throws \Propel\Runtime\Exception\PropelException + */ + public function parseResults(LoopResult $loopResult) + { + $currency = $this->requestStack->getCurrentRequest()->getSession()->getCurrency(); + + /** @var DigressivePrice $digressivePrice */ + foreach ($loopResult->getResultDataCollection() as $digressivePrice) { + $loopResultRow = new LoopResultRow($digressivePrice); + + if (null !== $pseId = $this->getPseId()) { + if (null !== $pse = ProductSaleElementsQuery::create()->findPk($pseId)) { + $product = $pse->getProduct(); + $productId = $product->getId(); + + $prices = $pse->getPricesByCurrency($currency); + } + } else { + $productId = $digressivePrice->getProductId(); + $product = ProductQuery::create()->findOneById($productId); + + $prices = $product + ->getDefaultSaleElements() + ->getPricesByCurrency($currency); + } + + $remise = 1 - $digressivePrice->getDiscount() / 100; + + $price = $remise * $prices->getPrice(); + $promo = $remise * $prices->getPromoPrice(); + + // Get country + $taxCountry = $this->container->get('thelia.taxEngine')->getDeliveryCountry(); + + // Get taxed prices + $taxedPrice = $product->getTaxedPrice($taxCountry, $price); + $taxedPromoPrice = $product->getTaxedPromoPrice($taxCountry, $promo); + + $loopResultRow + ->set("ID", $digressivePrice->getId()) + ->set("PRODUCT_ID", $productId) + ->set("QUANTITY_FROM", $digressivePrice->getQuantityFrom()) + ->set("QUANTITY_TO", $digressivePrice->getQuantityTo()) + + ->set("DISCOUNT", $digressivePrice->getDiscount()) + + ->set("PRICE", $price) + ->set("PROMO_PRICE", $promo) + + ->set("TAXED_PRICE", $taxedPrice) + ->set("TAXED_PROMO_PRICE", $taxedPromoPrice); + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } +} diff --git a/local/modules/DigressivePrice/Model/Base/DigressivePrice.php b/local/modules/DigressivePrice/Model/Base/DigressivePrice.php new file mode 100644 index 00000000..846f474a --- /dev/null +++ b/local/modules/DigressivePrice/Model/Base/DigressivePrice.php @@ -0,0 +1,1369 @@ +modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another DigressivePrice instance. If + * obj is an instance of DigressivePrice, delegates to + * equals(DigressivePrice). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return DigressivePrice The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return DigressivePrice The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [product_id] column value. + * + * @return int + */ + public function getProductId() + { + + return $this->product_id; + } + + /** + * Get the [discount] column value. + * + * @return double + */ + public function getDiscount() + { + + return $this->discount; + } + + /** + * Get the [quantity_from] column value. + * + * @return int + */ + public function getQuantityFrom() + { + + return $this->quantity_from; + } + + /** + * Get the [quantity_to] column value. + * + * @return int + */ + public function getQuantityTo() + { + + return $this->quantity_to; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \DigressivePrice\Model\DigressivePrice The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[DigressivePriceTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [product_id] column. + * + * @param int $v new value + * @return \DigressivePrice\Model\DigressivePrice The current object (for fluent API support) + */ + public function setProductId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->product_id !== $v) { + $this->product_id = $v; + $this->modifiedColumns[DigressivePriceTableMap::PRODUCT_ID] = true; + } + + if ($this->aProduct !== null && $this->aProduct->getId() !== $v) { + $this->aProduct = null; + } + + + return $this; + } // setProductId() + + /** + * Set the value of [discount] column. + * + * @param double $v new value + * @return \DigressivePrice\Model\DigressivePrice The current object (for fluent API support) + */ + public function setDiscount($v) + { + if ($v !== null) { + $v = (double) $v; + } + + if ($this->discount !== $v) { + $this->discount = $v; + $this->modifiedColumns[DigressivePriceTableMap::DISCOUNT] = true; + } + + + return $this; + } // setDiscount() + + /** + * Set the value of [quantity_from] column. + * + * @param int $v new value + * @return \DigressivePrice\Model\DigressivePrice The current object (for fluent API support) + */ + public function setQuantityFrom($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->quantity_from !== $v) { + $this->quantity_from = $v; + $this->modifiedColumns[DigressivePriceTableMap::QUANTITY_FROM] = true; + } + + + return $this; + } // setQuantityFrom() + + /** + * Set the value of [quantity_to] column. + * + * @param int $v new value + * @return \DigressivePrice\Model\DigressivePrice The current object (for fluent API support) + */ + public function setQuantityTo($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->quantity_to !== $v) { + $this->quantity_to = $v; + $this->modifiedColumns[DigressivePriceTableMap::QUANTITY_TO] = true; + } + + + return $this; + } // setQuantityTo() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : DigressivePriceTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : DigressivePriceTableMap::translateFieldName('ProductId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->product_id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : DigressivePriceTableMap::translateFieldName('Discount', TableMap::TYPE_PHPNAME, $indexType)]; + $this->discount = (null !== $col) ? (double) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : DigressivePriceTableMap::translateFieldName('QuantityFrom', TableMap::TYPE_PHPNAME, $indexType)]; + $this->quantity_from = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : DigressivePriceTableMap::translateFieldName('QuantityTo', TableMap::TYPE_PHPNAME, $indexType)]; + $this->quantity_to = (null !== $col) ? (int) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 5; // 5 = DigressivePriceTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \DigressivePrice\Model\DigressivePrice object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + if ($this->aProduct !== null && $this->product_id !== $this->aProduct->getId()) { + $this->aProduct = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(DigressivePriceTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildDigressivePriceQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aProduct = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see DigressivePrice::setDeleted() + * @see DigressivePrice::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(DigressivePriceTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildDigressivePriceQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(DigressivePriceTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + DigressivePriceTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aProduct !== null) { + if ($this->aProduct->isModified() || $this->aProduct->isNew()) { + $affectedRows += $this->aProduct->save($con); + } + $this->setProduct($this->aProduct); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[DigressivePriceTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . DigressivePriceTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(DigressivePriceTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(DigressivePriceTableMap::PRODUCT_ID)) { + $modifiedColumns[':p' . $index++] = 'PRODUCT_ID'; + } + if ($this->isColumnModified(DigressivePriceTableMap::DISCOUNT)) { + $modifiedColumns[':p' . $index++] = 'DISCOUNT'; + } + if ($this->isColumnModified(DigressivePriceTableMap::QUANTITY_FROM)) { + $modifiedColumns[':p' . $index++] = 'QUANTITY_FROM'; + } + if ($this->isColumnModified(DigressivePriceTableMap::QUANTITY_TO)) { + $modifiedColumns[':p' . $index++] = 'QUANTITY_TO'; + } + + $sql = sprintf( + 'INSERT INTO digressive_price (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'PRODUCT_ID': + $stmt->bindValue($identifier, $this->product_id, PDO::PARAM_INT); + break; + case 'DISCOUNT': + $stmt->bindValue($identifier, $this->discount, PDO::PARAM_STR); + break; + case 'QUANTITY_FROM': + $stmt->bindValue($identifier, $this->quantity_from, PDO::PARAM_INT); + break; + case 'QUANTITY_TO': + $stmt->bindValue($identifier, $this->quantity_to, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = DigressivePriceTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getProductId(); + break; + case 2: + return $this->getDiscount(); + break; + case 3: + return $this->getQuantityFrom(); + break; + case 4: + return $this->getQuantityTo(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['DigressivePrice'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['DigressivePrice'][$this->getPrimaryKey()] = true; + $keys = DigressivePriceTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getProductId(), + $keys[2] => $this->getDiscount(), + $keys[3] => $this->getQuantityFrom(), + $keys[4] => $this->getQuantityTo(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aProduct) { + $result['Product'] = $this->aProduct->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = DigressivePriceTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setProductId($value); + break; + case 2: + $this->setDiscount($value); + break; + case 3: + $this->setQuantityFrom($value); + break; + case 4: + $this->setQuantityTo($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = DigressivePriceTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setProductId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setDiscount($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setQuantityFrom($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setQuantityTo($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(DigressivePriceTableMap::DATABASE_NAME); + + if ($this->isColumnModified(DigressivePriceTableMap::ID)) $criteria->add(DigressivePriceTableMap::ID, $this->id); + if ($this->isColumnModified(DigressivePriceTableMap::PRODUCT_ID)) $criteria->add(DigressivePriceTableMap::PRODUCT_ID, $this->product_id); + if ($this->isColumnModified(DigressivePriceTableMap::DISCOUNT)) $criteria->add(DigressivePriceTableMap::DISCOUNT, $this->discount); + if ($this->isColumnModified(DigressivePriceTableMap::QUANTITY_FROM)) $criteria->add(DigressivePriceTableMap::QUANTITY_FROM, $this->quantity_from); + if ($this->isColumnModified(DigressivePriceTableMap::QUANTITY_TO)) $criteria->add(DigressivePriceTableMap::QUANTITY_TO, $this->quantity_to); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(DigressivePriceTableMap::DATABASE_NAME); + $criteria->add(DigressivePriceTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \DigressivePrice\Model\DigressivePrice (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setProductId($this->getProductId()); + $copyObj->setDiscount($this->getDiscount()); + $copyObj->setQuantityFrom($this->getQuantityFrom()); + $copyObj->setQuantityTo($this->getQuantityTo()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \DigressivePrice\Model\DigressivePrice Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Declares an association between this object and a ChildProduct object. + * + * @param ChildProduct $v + * @return \DigressivePrice\Model\DigressivePrice The current object (for fluent API support) + * @throws PropelException + */ + public function setProduct(ChildProduct $v = null) + { + if ($v === null) { + $this->setProductId(NULL); + } else { + $this->setProductId($v->getId()); + } + + $this->aProduct = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the ChildProduct object, it will not be re-added. + if ($v !== null) { + $v->addDigressivePrice($this); + } + + + return $this; + } + + + /** + * Get the associated ChildProduct object + * + * @param ConnectionInterface $con Optional Connection object. + * @return ChildProduct The associated ChildProduct object. + * @throws PropelException + */ + public function getProduct(ConnectionInterface $con = null) + { + if ($this->aProduct === null && ($this->product_id !== null)) { + $this->aProduct = ProductQuery::create()->findPk($this->product_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aProduct->addDigressivePrices($this); + */ + } + + return $this->aProduct; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->product_id = null; + $this->discount = null; + $this->quantity_from = null; + $this->quantity_to = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + $this->aProduct = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(DigressivePriceTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/DigressivePrice/Model/Base/DigressivePriceQuery.php b/local/modules/DigressivePrice/Model/Base/DigressivePriceQuery.php new file mode 100644 index 00000000..baa12d82 --- /dev/null +++ b/local/modules/DigressivePrice/Model/Base/DigressivePriceQuery.php @@ -0,0 +1,609 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildDigressivePrice|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = DigressivePriceTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(DigressivePriceTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildDigressivePrice A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, PRODUCT_ID, DISCOUNT, QUANTITY_FROM, QUANTITY_TO FROM digressive_price WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildDigressivePrice(); + $obj->hydrate($row); + DigressivePriceTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildDigressivePrice|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(DigressivePriceTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(DigressivePriceTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(DigressivePriceTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(DigressivePriceTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(DigressivePriceTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the product_id column + * + * Example usage: + * + * $query->filterByProductId(1234); // WHERE product_id = 1234 + * $query->filterByProductId(array(12, 34)); // WHERE product_id IN (12, 34) + * $query->filterByProductId(array('min' => 12)); // WHERE product_id > 12 + * + * + * @see filterByProduct() + * + * @param mixed $productId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByProductId($productId = null, $comparison = null) + { + if (is_array($productId)) { + $useMinMax = false; + if (isset($productId['min'])) { + $this->addUsingAlias(DigressivePriceTableMap::PRODUCT_ID, $productId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($productId['max'])) { + $this->addUsingAlias(DigressivePriceTableMap::PRODUCT_ID, $productId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(DigressivePriceTableMap::PRODUCT_ID, $productId, $comparison); + } + + /** + * Filter the query on the discount column + * + * Example usage: + * + * $query->filterByDiscount(1234); // WHERE discount = 1234 + * $query->filterByDiscount(array(12, 34)); // WHERE discount IN (12, 34) + * $query->filterByDiscount(array('min' => 12)); // WHERE discount > 12 + * + * + * @param mixed $discount The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByDiscount($discount = null, $comparison = null) + { + if (is_array($discount)) { + $useMinMax = false; + if (isset($discount['min'])) { + $this->addUsingAlias(DigressivePriceTableMap::DISCOUNT, $discount['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($discount['max'])) { + $this->addUsingAlias(DigressivePriceTableMap::DISCOUNT, $discount['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(DigressivePriceTableMap::DISCOUNT, $discount, $comparison); + } + + /** + * Filter the query on the quantity_from column + * + * Example usage: + * + * $query->filterByQuantityFrom(1234); // WHERE quantity_from = 1234 + * $query->filterByQuantityFrom(array(12, 34)); // WHERE quantity_from IN (12, 34) + * $query->filterByQuantityFrom(array('min' => 12)); // WHERE quantity_from > 12 + * + * + * @param mixed $quantityFrom The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByQuantityFrom($quantityFrom = null, $comparison = null) + { + if (is_array($quantityFrom)) { + $useMinMax = false; + if (isset($quantityFrom['min'])) { + $this->addUsingAlias(DigressivePriceTableMap::QUANTITY_FROM, $quantityFrom['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($quantityFrom['max'])) { + $this->addUsingAlias(DigressivePriceTableMap::QUANTITY_FROM, $quantityFrom['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(DigressivePriceTableMap::QUANTITY_FROM, $quantityFrom, $comparison); + } + + /** + * Filter the query on the quantity_to column + * + * Example usage: + * + * $query->filterByQuantityTo(1234); // WHERE quantity_to = 1234 + * $query->filterByQuantityTo(array(12, 34)); // WHERE quantity_to IN (12, 34) + * $query->filterByQuantityTo(array('min' => 12)); // WHERE quantity_to > 12 + * + * + * @param mixed $quantityTo The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByQuantityTo($quantityTo = null, $comparison = null) + { + if (is_array($quantityTo)) { + $useMinMax = false; + if (isset($quantityTo['min'])) { + $this->addUsingAlias(DigressivePriceTableMap::QUANTITY_TO, $quantityTo['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($quantityTo['max'])) { + $this->addUsingAlias(DigressivePriceTableMap::QUANTITY_TO, $quantityTo['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(DigressivePriceTableMap::QUANTITY_TO, $quantityTo, $comparison); + } + + /** + * Filter the query by a related \DigressivePrice\Model\Thelia\Model\Product object + * + * @param \DigressivePrice\Model\Thelia\Model\Product|ObjectCollection $product The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function filterByProduct($product, $comparison = null) + { + if ($product instanceof \DigressivePrice\Model\Thelia\Model\Product) { + return $this + ->addUsingAlias(DigressivePriceTableMap::PRODUCT_ID, $product->getId(), $comparison); + } elseif ($product instanceof ObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(DigressivePriceTableMap::PRODUCT_ID, $product->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterByProduct() only accepts arguments of type \DigressivePrice\Model\Thelia\Model\Product or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the Product relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function joinProduct($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('Product'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'Product'); + } + + return $this; + } + + /** + * Use the Product relation Product object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \DigressivePrice\Model\Thelia\Model\ProductQuery A secondary query class using the current class as primary query + */ + public function useProductQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinProduct($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'Product', '\DigressivePrice\Model\Thelia\Model\ProductQuery'); + } + + /** + * Exclude object from result + * + * @param ChildDigressivePrice $digressivePrice Object to remove from the list of results + * + * @return ChildDigressivePriceQuery The current query, for fluid interface + */ + public function prune($digressivePrice = null) + { + if ($digressivePrice) { + $this->addUsingAlias(DigressivePriceTableMap::ID, $digressivePrice->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the digressive_price table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(DigressivePriceTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + DigressivePriceTableMap::clearInstancePool(); + DigressivePriceTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildDigressivePrice or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildDigressivePrice object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(DigressivePriceTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(DigressivePriceTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + DigressivePriceTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + DigressivePriceTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // DigressivePriceQuery diff --git a/local/modules/DigressivePrice/Model/DigressivePrice.php b/local/modules/DigressivePrice/Model/DigressivePrice.php new file mode 100644 index 00000000..8d6164a2 --- /dev/null +++ b/local/modules/DigressivePrice/Model/DigressivePrice.php @@ -0,0 +1,9 @@ + array('Id', 'ProductId', 'Discount', 'QuantityFrom', 'QuantityTo', ), + self::TYPE_STUDLYPHPNAME => array('id', 'productId', 'discount', 'quantityFrom', 'quantityTo', ), + self::TYPE_COLNAME => array(DigressivePriceTableMap::ID, DigressivePriceTableMap::PRODUCT_ID, DigressivePriceTableMap::DISCOUNT, DigressivePriceTableMap::QUANTITY_FROM, DigressivePriceTableMap::QUANTITY_TO, ), + self::TYPE_RAW_COLNAME => array('ID', 'PRODUCT_ID', 'DISCOUNT', 'QUANTITY_FROM', 'QUANTITY_TO', ), + self::TYPE_FIELDNAME => array('id', 'product_id', 'discount', 'quantity_from', 'quantity_to', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'ProductId' => 1, 'Discount' => 2, 'QuantityFrom' => 3, 'QuantityTo' => 4, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'productId' => 1, 'discount' => 2, 'quantityFrom' => 3, 'quantityTo' => 4, ), + self::TYPE_COLNAME => array(DigressivePriceTableMap::ID => 0, DigressivePriceTableMap::PRODUCT_ID => 1, DigressivePriceTableMap::DISCOUNT => 2, DigressivePriceTableMap::QUANTITY_FROM => 3, DigressivePriceTableMap::QUANTITY_TO => 4, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'PRODUCT_ID' => 1, 'DISCOUNT' => 2, 'QUANTITY_FROM' => 3, 'QUANTITY_TO' => 4, ), + self::TYPE_FIELDNAME => array('id' => 0, 'product_id' => 1, 'discount' => 2, 'quantity_from' => 3, 'quantity_to' => 4, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('digressive_price'); + $this->setPhpName('DigressivePrice'); + $this->setClassName('\\DigressivePrice\\Model\\DigressivePrice'); + $this->setPackage('DigressivePrice.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addForeignKey('PRODUCT_ID', 'ProductId', 'INTEGER', 'product', 'ID', true, null, null); + $this->addColumn('DISCOUNT', 'Discount', 'FLOAT', true, null, null); + $this->addColumn('QUANTITY_FROM', 'QuantityFrom', 'INTEGER', true, null, null); + $this->addColumn('QUANTITY_TO', 'QuantityTo', 'INTEGER', true, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('Product', '\\DigressivePrice\\Model\\Thelia\\Model\\Product', RelationMap::MANY_TO_ONE, array('product_id' => 'id', ), null, null); + } // buildRelations() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? DigressivePriceTableMap::CLASS_DEFAULT : DigressivePriceTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (DigressivePrice object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = DigressivePriceTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = DigressivePriceTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + DigressivePriceTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = DigressivePriceTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + DigressivePriceTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = DigressivePriceTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = DigressivePriceTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + DigressivePriceTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(DigressivePriceTableMap::ID); + $criteria->addSelectColumn(DigressivePriceTableMap::PRODUCT_ID); + $criteria->addSelectColumn(DigressivePriceTableMap::DISCOUNT); + $criteria->addSelectColumn(DigressivePriceTableMap::QUANTITY_FROM); + $criteria->addSelectColumn(DigressivePriceTableMap::QUANTITY_TO); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.PRODUCT_ID'); + $criteria->addSelectColumn($alias . '.DISCOUNT'); + $criteria->addSelectColumn($alias . '.QUANTITY_FROM'); + $criteria->addSelectColumn($alias . '.QUANTITY_TO'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(DigressivePriceTableMap::DATABASE_NAME)->getTable(DigressivePriceTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(DigressivePriceTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(DigressivePriceTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new DigressivePriceTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a DigressivePrice or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or DigressivePrice object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(DigressivePriceTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \DigressivePrice\Model\DigressivePrice) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(DigressivePriceTableMap::DATABASE_NAME); + $criteria->add(DigressivePriceTableMap::ID, (array) $values, Criteria::IN); + } + + $query = DigressivePriceQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { DigressivePriceTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { DigressivePriceTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the digressive_price table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return DigressivePriceQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a DigressivePrice or Criteria object. + * + * @param mixed $criteria Criteria or DigressivePrice object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(DigressivePriceTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from DigressivePrice object + } + + if ($criteria->containsKey(DigressivePriceTableMap::ID) && $criteria->keyContainsValue(DigressivePriceTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.DigressivePriceTableMap::ID.')'); + } + + + // Set the correct dbName + $query = DigressivePriceQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // DigressivePriceTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +DigressivePriceTableMap::buildTableMap(); diff --git a/local/modules/DigressivePrice/composer.json b/local/modules/DigressivePrice/composer.json new file mode 100644 index 00000000..327f07c8 --- /dev/null +++ b/local/modules/DigressivePrice/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/digressiveprice-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "DigressivePrice" + } +} diff --git a/local/modules/DigressivePrice/readme.md b/local/modules/DigressivePrice/readme.md new file mode 100644 index 00000000..aaaca400 --- /dev/null +++ b/local/modules/DigressivePrice/readme.md @@ -0,0 +1,133 @@ +# DigressivePrice + +Easily create and manage range of quantities with associated discounts. + +## Installation + +**Warning** : to get real time changes of digressive prices on the product page, you have to use Thelia 2.4, +or replace in thelia.js : + +`$pse.id.val(pseId);` + +with + +`$pse.id.val(pseId).trigger('change.pse', pseId);` + + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is DigressivePrice. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/digressiveprice-module:~1.0 +``` + +## Usage + +Once activated, go into the Digressive Prices tab of the product you want to add a digressive price to. +You can create a new range, edit or remove an existing one. +Fill the form with following information : + +- Quantity + - from : the quantity which begins your range + - to : the quantity that ends you range. +- Discount in % + +Then click the "Add" or "Update" button. + +Take care of the following : + +- "quantity to" has to be greater than or equal to "quantity from" +- a quantity ('from' and/or 'to') can't be included into another range +- a range can't surround another one +- a quantity can't be negative + +Once created, a table of digressive price is displayed on the product page. This table is updated when the PSE is changed. + +The price will be automatically updated according to the product's quantity in the user's cart. + +## Hook + +This module is only hooked into the Modules tab of the products. +The Hook used is called "product.tab-content". + +On the front-offcie, the module uses the `product.details-bottom` and `product.javascript-initialization` hooks. + +## Loop + +[digressive] + +### Input arguments + +|Argument |Description | +|--- |--- | +|**product_id** | The ID of the product to get digressive prices. Example: "product_id=3" | + +### Output arguments + +|Variable |Description | +|--- |--- | +|$ID | The digressive price range's ID | +|$PRODUCT_ID | The product which th current digressive price is linked to | +|$QUANTITY_FROM | The quantity beginning of the range of the digressive price | +|$QUANTITY_TO | The quantity ending of the range of the digressive price | +|$DISCOUNT | The discount % | +|$PRICE | The tax free price of the product if the quantity is in the range | +|$PROMO_PRICE | The promo tax free price of the product if the quantity is in the range | +|$TAXED_PRICE | The taxed price of the product. Uses the tax rules of the user's country | +|$TAXED_PROMO_PRICE | The taxed promo price of the product. Uses the tax rules of the user's country | + +### Example + +This example displays the product prices according to all the quantity's ranges + +```html + + + + + + + + + + + + {loop type="product" name="theProduct" id={product attr="id"}} + {if $IS_PROMO==1} + {loop type="digressive" name="digressivePrice" product_id=$ID} + + {if $QUANTITY_FROM != 0 && $QUANTITY_TO == 99999} + + {else} + + {/if} + + + {/loop} + {else} + {loop type="digressive" name="digressivePrice" product_id=$ID} + + {if $QUANTITY_FROM != 0 && $QUANTITY_TO == 99999} + + {else} + + {/if} + + + {/loop} + {/if} + {/loop} +
QuantityUnit Price (with taxes)
1 + {if $IS_PROMO==1} + {$BEST_TAXED_PRICE} {currency attr="symbol"} {$TAXED_PRICE} {currency attr="symbol"} + {else} + {$TAXED_PRICE} {currency attr="symbol"} + {/if} +
From {$QUANTITY_FROM}From {$QUANTITY_FROM} to {$QUANTITY_TO}{$TAXED_PROMO_PRICE} {currency attr="symbol"}
From {$QUANTITY_FROM}From {$QUANTITY_FROM} to {$QUANTITY_TO}{$TAXED_PRICE} {currency attr="symbol"}
+``` diff --git a/local/modules/DigressivePrice/templates/backOffice/default/product-tab-content-hook.html b/local/modules/DigressivePrice/templates/backOffice/default/product-tab-content-hook.html new file mode 100644 index 00000000..b8b8e1ba --- /dev/null +++ b/local/modules/DigressivePrice/templates/backOffice/default/product-tab-content-hook.html @@ -0,0 +1,143 @@ +
+
+ {intl d="digressiveprice.bo.default" l="Digressive price"} +
+ + {form name="digressiveprice.create"} + {if $form_error} +
{$form_error_message}
+ {/if} + {/form} + + {form name="digressiveprice.update"} + {if $form_error} +
{$form_error_message}
+ {/if} + {/form} + + {form name="digressiveprice.delete"} + {if $form_error} +
{$form_error_message}
+ {/if} + {/form} + + + + + + + + + + + + + {* List existing digressive prices for this product *} + {loop type="digressive" name="prodDigressivePrices" product_id={product attr="id"}} + + + {form name="digressiveprice.update"} + + + {form_hidden_fields form=$form} + + {form_field form=$form field="id"} + + {/form_field} + + + + {form_field form=$form field="productId"} + + {/form_field} + + + + + + + + + + {/form} + + + + + {/loop} + + + + {form name="digressiveprice.create"} + + + {form_hidden_fields form=$form} + + + + {form_field form=$form field="productId"} + + {/form_field} + + + + + + + + + + + + + {/form} + + +
{intl l="From" d="digressiveprice.bo.default"}{intl l="To" d="digressiveprice.bo.default"}{intl l="Discount (%)" d="digressiveprice.bo.default"}{intl l="Add/Update" d="digressiveprice.bo.default"}{intl l="Remove" d="digressiveprice.bo.default"}
+ {form_field form=$form field="quantityFrom"} + + {/form_field} + + {form_field form=$form field="quantityTo"} + + {/form_field} + + {form_field form=$form field="discount"} + + {/form_field} + + + + {form name="digressiveprice.delete"} +
+ {form_hidden_fields form=$form} + + + + {form_field form=$form field="productId"} + + {/form_field} + + {form_field form=$form field="id"} + + {/form_field} + + +
+ {/form} +
+ {form_field form=$form field="quantityFrom"} + + {/form_field} + + {form_field form=$form field="quantityTo"} + + {/form_field} + + {form_field form=$form field="discount"} + + {/form_field} + + +  
+
diff --git a/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/assets/digressive-price.js b/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/assets/digressive-price.js new file mode 100644 index 00000000..cabf42d1 --- /dev/null +++ b/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/assets/digressive-price.js @@ -0,0 +1,6 @@ +$(function() { + $('#pse-id').change(function() { + + alert("pse = "+$(this).val()); + }); +}); diff --git a/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/digressive-price.js.html b/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/digressive-price.js.html new file mode 100644 index 00000000..4b43eba9 --- /dev/null +++ b/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/digressive-price.js.html @@ -0,0 +1,9 @@ + diff --git a/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/product-details-bottom.html b/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/product-details-bottom.html new file mode 100644 index 00000000..ae250b33 --- /dev/null +++ b/local/modules/DigressivePrice/templates/frontOffice/default/digressive-price/product-details-bottom.html @@ -0,0 +1,53 @@ +{if {count type="digressive" product_id=$product_id pse_id=$pse_id}} +
+

{intl l="Digressive prices" d='digressiveprice.fo.default'}

+

{intl l="Order more products and get a discount !" d='digressiveprice.fo.default'}

+ + {loop type="digressive" name="digressivePrice" product_id=$ID limit=1} + {$firstQuantity = $QUANTITY_FROM} + {/loop} + + {loop type="product" name="theProduct" id=$product_id} + {$isPromo = $IS_PROMO} + + + + + + + + {if firstQuantity > 1} + + + + + + {/if} + + {loop type="digressive" name="digressivePrice" product_id=$ID pse_id=$pse_id} + + {if $QUANTITY_FROM != 0 && $QUANTITY_TO >= 9999} + + {else} + + {/if} + + + + {/loop} +
{intl l="Quantity" d='digressiveprice.fo.default'}{intl l="Discount" d='digressiveprice.fo.default'}{intl l="Unit price" d='digressiveprice.fo.default'}
1{intl l="None" d='digressiveprice.fo.default'} + {if $isPromo} + {format_money number=$BEST_TAXED_PROMO_PRICE} {format_money number=$TAXED_PRICE} + {else} + {format_money number=$TAXED_PRICE} + {/if} +
{intl l='From %qty' qty=$QUANTITY_FROM d='digressiveprice.fo.default'}{intl l='From %from to %to' from=$QUANTITY_FROM to=$QUANTITY_TO d='digressiveprice.fo.default'}{$DISCOUNT}% + {if $isPromo} + {format_money number=$TAXED_PROMO_PRICE} {format_money number=$TAXED_PRICE} + {else} + {format_money number=$TAXED_PRICE} + {/if} +
+ {/loop} +
+{/if} diff --git a/local/modules/FreeOrder/Config/config.xml b/local/modules/FreeOrder/Config/config.xml new file mode 100644 index 00000000..42d3733f --- /dev/null +++ b/local/modules/FreeOrder/Config/config.xml @@ -0,0 +1,6 @@ + + + + diff --git a/local/modules/FreeOrder/Config/module.xml b/local/modules/FreeOrder/Config/module.xml new file mode 100644 index 00000000..f1a445f5 --- /dev/null +++ b/local/modules/FreeOrder/Config/module.xml @@ -0,0 +1,27 @@ + + + FreeOrder\FreeOrder + + There's nothing to pay for this order + This is a pseudo-payment module for free orders. + + + Vous n'avez rien à payer pour cette commande + Un pseudo-module de paiement pour les commandes de montant nul + + + en_US + fr_FR + + 2.3.1 + + Franck Allimant + CQFDev + franck@cqfdev.fr + + payment + 2.2.0 + alpha + diff --git a/local/modules/FreeOrder/FreeOrder.php b/local/modules/FreeOrder/FreeOrder.php new file mode 100644 index 00000000..b5d1df02 --- /dev/null +++ b/local/modules/FreeOrder/FreeOrder.php @@ -0,0 +1,40 @@ +getCurrentOrderTotalAmount() == 0; + } + + public function pay(Order $order) + { + $event = new OrderEvent($order); + $event->setStatus(OrderStatusQuery::getPaidStatus()->getId()); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event); + } + + public function manageStockOnCreation() + { + return false; + } +} diff --git a/local/modules/FreeOrder/LICENSE.txt b/local/modules/FreeOrder/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/FreeOrder/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/FreeOrder/Readme.md b/local/modules/FreeOrder/Readme.md new file mode 100644 index 00000000..63333460 --- /dev/null +++ b/local/modules/FreeOrder/Readme.md @@ -0,0 +1,25 @@ +# Free Order + +This module is used to terminate the order process when the order amount is 0,00. In this case, none of the traditional +payment modules applies. + +## Installation + +This module is bundled with Thelia standard distribution. + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is FreeOrder. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/free-order-module:~1.0 +``` + +## Usage + +The module is displayed as needed in the payment modules list of the order-invoice page. \ No newline at end of file diff --git a/local/modules/FreeOrder/composer.json b/local/modules/FreeOrder/composer.json new file mode 100644 index 00000000..f32437ec --- /dev/null +++ b/local/modules/FreeOrder/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/free-order-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "FreeOrder" + } +} \ No newline at end of file diff --git a/local/modules/FreeShipping/Action/FreeShippingAction.php b/local/modules/FreeShipping/Action/FreeShippingAction.php new file mode 100644 index 00000000..0cd711d9 --- /dev/null +++ b/local/modules/FreeShipping/Action/FreeShippingAction.php @@ -0,0 +1,139 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Action; + +use FreeShipping\Event\FreeShippingDeleteEvent; +use FreeShipping\Event\FreeShippingEvents; +use FreeShipping\Event\FreeShippingUpdateEvent; +use FreeShipping\Model\FreeShipping; +use FreeShipping\Model\FreeShippingQuery; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Thelia\Action\BaseAction; +use Thelia\Model\Base\AreaQuery; + +/** + * + * FreeShippingAction class where all actions are managed + * + * Class FreeShippingAction + * @package FreeShipping\Action + * @author Michaël Espeche + */ +class FreeShippingAction extends BaseAction implements EventSubscriberInterface +{ + + + public function createRule(FreeShippingEvents $event) + { + $rule = new FreeShipping(); + + $freeShippingArea = FreeShippingQuery::create()->findOneByAreaId($event->getArea()); + + if (null === $freeShippingArea) { + $rule + ->setAmount($event->getAmount()) + ->setAreaId($event->getArea()) + ->save(); + } else { + $area = AreaQuery::create()->findOneById($event->getArea()); + + throw new \Exception(sprintf("A free shipping rule already exists for the '%s' area", $area->getName())); + } + + } + + public function updateRule(FreeShippingUpdateEvent $event) + { + + $areaId = $event->getArea(); + $freeShippingArea = FreeShippingQuery::create()->findOneByAreaId($areaId); + + if (null === $freeShippingArea || $freeShippingArea->getAmount() !== $event->getAmount() ) { + + $id = $event->getRuleId(); + + if (null !== $freeShipping = FreeShippingQuery::create()->findPk($id)) { + + $freeShipping->setDispatcher($event->getDispatcher()); + + $freeShipping + ->setAreaId($event->getArea()) + ->setAmount($event->getAmount()) + ->save(); + + $event->setRule($freeShipping); + } + + } else { + $area = AreaQuery::create()->findOneById($areaId); + + throw new \Exception(sprintf("A free shipping rule already exists for the '%s' area", $area->getName())); + } + + + } + + public function deleteRule(FreeShippingDeleteEvent $event) + { + + $id = $event->getFreeShippingId(); + + if (null !== $freeShipping = FreeShippingQuery::create()->findPk($id)) { + + $freeShipping->setDispatcher($event->getDispatcher()) + ->delete(); + + } + } + + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return array( + FreeShippingEvents::FREE_SHIPPING_RULE_CREATE => array('createRule', 128), + FreeShippingUpdateEvent::FREE_SHIPPING_RULE_UPDATE => array('updateRule', 128), + FreeShippingDeleteEvent::FREE_SHIPPING_RULE_DELETE => array('deleteRule', 128) + ); + } +} diff --git a/local/modules/FreeShipping/AdminIncludes/footer_js.html b/local/modules/FreeShipping/AdminIncludes/footer_js.html new file mode 100644 index 00000000..8c5cba06 --- /dev/null +++ b/local/modules/FreeShipping/AdminIncludes/footer_js.html @@ -0,0 +1,16 @@ +{javascripts file='assets/js/main.js'} + +{/javascripts} +{javascripts file='assets/js/bootstrap-select/bootstrap-select.js'} + +{/javascripts} + + \ No newline at end of file diff --git a/local/modules/FreeShipping/AdminIncludes/module_configuration.html b/local/modules/FreeShipping/AdminIncludes/module_configuration.html new file mode 100644 index 00000000..2ac05909 --- /dev/null +++ b/local/modules/FreeShipping/AdminIncludes/module_configuration.html @@ -0,0 +1,112 @@ +
+
+ +
+ + +
+ + + + + + + + + + + {loop name="rules" type="free_shipping"} + + + + + + {/loop} + +
+ {intl l="Free carriage rules"} + {loop type="auth" name="can_create" role="ADMIN" module="freeShipping" access="CREATE"} + + + + {/loop} +
{intl l="Area"}{intl l="Amount up to ... (€)"}{intl l="Actions"}
{$AREA_NAME}{$AMOUNT} +
+ {loop type="auth" name="can_change" role="ADMIN" module="freeShipping" access="UPDATE"} + + + {/loop} +
+
+
+ + +
+ +
+
+ +{* -- Add rule confirmation dialog ----------------------------------- *} +{form name="freeShipping.admin.rule.creation"} + + {capture "rule_creation_dialog"} + + {form_hidden_fields form=$form} + + {form_field form=$form field='success_url'} + + {/form_field} + + {form_field form=$form field='area'} +
+ + +
+ {/form_field} + + {form_field form=$form field='amount'} +
+ + +
{intl l='Enter the amount from which the rule will apply'}
+
+ {/form_field} + + {/capture} + + {include + file = "includes/generic-create-dialog.html" + + dialog_id = "rule_create_dialog" + dialog_title = {intl l="Create a new rule"} + dialog_body = {$smarty.capture.rule_creation_dialog nofilter} + + dialog_ok_label = {intl l="Create"} + dialog_cancel_label = {intl l="Cancel"} + + form_action = {url path='/admin/module/FreeShipping/create'} + form_enctype = {form_enctype form=$form} + form_error_message = $form_error_message + } +{/form} + +{* -- Delete rule confirmation dialog ----------------------------------- *} + +{capture "rule_delete_dialog"} + +{/capture} + +{include +file = "includes/generic-confirm-dialog.html" + +dialog_id = "rule_delete_dialog" +dialog_title = {intl l="Delete this rule"} +dialog_message = {intl l="Do you really want to delete this rule ?"} + +form_action = {token_url path='/admin/module/FreeShipping/delete'} +form_content = {$smarty.capture.rule_delete_dialog nofilter} +} \ No newline at end of file diff --git a/local/modules/FreeShipping/Config/config.xml b/local/modules/FreeShipping/Config/config.xml new file mode 100644 index 00000000..7105e842 --- /dev/null +++ b/local/modules/FreeShipping/Config/config.xml @@ -0,0 +1,35 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + diff --git a/local/modules/FreeShipping/Config/module.xml b/local/modules/FreeShipping/Config/module.xml new file mode 100644 index 00000000..9a7fb261 --- /dev/null +++ b/local/modules/FreeShipping/Config/module.xml @@ -0,0 +1,18 @@ + + + FreeShipping\FreeShipping + + Free Shipping + + + Franco de port + + 1.0.1 + + Michaël Espeche + mespeche@openstudio.fr + + delivery + 2.1.0 + alpha + diff --git a/local/modules/FreeShipping/Config/routing.xml b/local/modules/FreeShipping/Config/routing.xml new file mode 100644 index 00000000..971d9b1d --- /dev/null +++ b/local/modules/FreeShipping/Config/routing.xml @@ -0,0 +1,24 @@ + + + + + + FreeShipping\Controller\Admin\FreeShippingController::createRuleAction + + + + FreeShipping\Controller\Admin\FreeShippingController::deleteAction + + + + FreeShipping\Controller\Admin\FreeShippingController::updateAction + \d+ + + + + FreeShipping\Controller\Admin\FreeShippingController::processUpdateAction + + + \ No newline at end of file diff --git a/local/modules/FreeShipping/Config/schema.xml b/local/modules/FreeShipping/Config/schema.xml new file mode 100644 index 00000000..8e7bcf09 --- /dev/null +++ b/local/modules/FreeShipping/Config/schema.xml @@ -0,0 +1,16 @@ + + + + + + + + + + +
+ + +
diff --git a/local/modules/FreeShipping/Config/sqldb.map b/local/modules/FreeShipping/Config/sqldb.map new file mode 100644 index 00000000..63a93baa --- /dev/null +++ b/local/modules/FreeShipping/Config/sqldb.map @@ -0,0 +1,2 @@ +# Sqlfile -> Database map +thelia.sql=thelia diff --git a/local/modules/FreeShipping/Config/thelia.sql b/local/modules/FreeShipping/Config/thelia.sql new file mode 100644 index 00000000..08c1a586 --- /dev/null +++ b/local/modules/FreeShipping/Config/thelia.sql @@ -0,0 +1,25 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- free_shipping +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `free_shipping`; + +CREATE TABLE `free_shipping` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `area_id` INTEGER NOT NULL, + `amount` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `FI_area_associated_freeShipping_area_id` (`area_id`), + CONSTRAINT `fk_area_associated_freeShipping_area_id` + FOREIGN KEY (`area_id`) + REFERENCES `area` (`id`) +) ENGINE=InnoDB; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/FreeShipping/Controller/Admin/FreeShippingController.php b/local/modules/FreeShipping/Controller/Admin/FreeShippingController.php new file mode 100644 index 00000000..0dbc73e8 --- /dev/null +++ b/local/modules/FreeShipping/Controller/Admin/FreeShippingController.php @@ -0,0 +1,304 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Controller\Admin; + +use FreeShipping\Event\FreeShippingDeleteEvent; +use FreeShipping\Event\FreeShippingEvents; +use FreeShipping\Event\FreeShippingUpdateEvent; +use FreeShipping\Form\FreeShippingRuleCreationForm; +use FreeShipping\Form\FreeShippingRuleModificationForm; +use FreeShipping\Model\FreeShippingQuery; +use Propel\Runtime\Exception\PropelException; +use Thelia\Controller\Admin\AbstractCrudController; +use Thelia\Controller\Admin\unknown; +use Thelia\Core\Security\AccessManager; +use Thelia\Form\Exception\FormValidationException; + +/** + * Class FreeShippingController + * @package FreeShipping\Controller\Admin + * @author Michaël Espeche + */ +class FreeShippingController extends AbstractCrudController +{ + + public $areaId; + + public function __construct() + { + parent::__construct( + 'freeShipping', + 'manual', + 'freeShipping_order', + + 'admin.freeShipping', + + FreeShippingEvents::FREE_SHIPPING_RULE_CREATE, + FreeShippingUpdateEvent::FREE_SHIPPING_RULE_UPDATE, + FreeShippingDeleteEvent::FREE_SHIPPING_RULE_DELETE, + null, + null + ); + } + + public function createRuleAction(){ + + if (null !== $response = $this->checkAuth(array(), array('FreeShipping'), AccessManager::CREATE)) { + return $response; + } + + $ruleCreationForm = new FreeShippingRuleCreationForm($this->getRequest()); + + $message = false; + + try { + + $form = $this->validateForm($ruleCreationForm); + + $event = $this->createEventInstance($form->getData()); + + $this->areaId = $form->get('area')->getData(); + + if(null === $this->getExistingObject()){ + $this->dispatch(FreeShippingEvents::FREE_SHIPPING_RULE_CREATE, $event); + return $this->generateSuccessRedirect($ruleCreationForm); + } + else{ + throw new \Exception("A rule with this area already exist"); + } + + } catch (FormValidationException $e) { + $message = sprintf("Please check your input: %s", $e->getMessage()); + } catch (PropelException $e) { + $message = $e->getMessage(); + } catch (\Exception $e) { + $message = sprintf("Sorry, an error occured: %s", $e->getMessage()." ".$e->getFile()); + } + + if ($message !== false) { + \Thelia\Log\Tlog::getInstance()->error( + sprintf("Error during free shipping rule creation process : %s.", $message) + ); + + $ruleCreationForm->setErrorMessage($message); + + $this->getParserContext() + ->addForm($ruleCreationForm) + ->setGeneralError($message) + ; + } + + // Redirect + return $this->generateRedirectFromRoute( + 'admin.module.configure', array(), array('module_code' => 'FreeShipping') + ); + + } + + /** + * @param $data + * @return \FreeShipping\Event\FreeShippingEvents + */ + private function createEventInstance($data) + { + + $freeShippingEvent = new FreeShippingEvents( + $data['amount'], + $data['area'] + ); + + return $freeShippingEvent; + } + + /** + * Return the creation form for this object + */ + protected function getCreationForm() + { + return new FreeShippingRuleCreationForm($this->getRequest()); + } + + /** + * Return the update form for this object + */ + protected function getUpdateForm() + { + return new FreeShippingRuleModificationForm($this->getRequest()); + } + + /** + * Hydrate the update form for this object, before passing it to the update template + * + * @param unknown $object + */ + protected function hydrateObjectForm($object) + { + // Prepare the data that will hydrate the form + $data = array( + 'id' => $object->getId(), + 'area' => $object->getAreaId(), + 'amount' => $object->getAmount() + ); + + // Setup the object form + return new FreeShippingRuleModificationForm($this->getRequest(), "form", $data); + } + + /** + * Creates the creation event with the provided form data + * + * @param unknown $formData + */ + protected function getCreationEvent($formData) + { + return new FreeShippingEvents($formData['amount'], $formData['area']); + } + + /** + * Creates the update event with the provided form data + * + * @param unknown $formData + */ + protected function getUpdateEvent($formData) + { + $freeShippingUpdateEvent = new FreeShippingUpdateEvent($formData['id']); + + $freeShippingUpdateEvent + ->setArea($formData['area']) + ->setAmount($formData['amount']); + + return $freeShippingUpdateEvent; + } + + /** + * Creates the delete event with the provided form data + */ + protected function getDeleteEvent() + { + return new FreeShippingDeleteEvent($this->getRequest()->get('rule_id')); + } + + /** + * Return true if the event contains the object, e.g. the action has updated the object in the event. + * + * @param unknown $event + */ + protected function eventContainsObject($event) + { + return $event->hasRule(); + } + + /** + * Get the created object from an event. + * + * @param unknown $event + */ + protected function getObjectFromEvent($event) + { + return $event->getRule(); + } + + /** + * Load an existing object from the database + */ + protected function getExistingObject() + { + if(null !== $this->areaId){ + return FreeShippingQuery::create() + ->findOneByAreaId($this->areaId); + } else { + return FreeShippingQuery::create() + ->findOneById($this->getRequest()->get('ruleId', 0)); + } + } + + /** + * Returns the object label form the object event (name, title, etc.) + * + * @param unknown $object + */ + protected function getObjectLabel($object) + { + // TODO: Implement getObjectLabel() method. + } + + /** + * Returns the object ID from the object + * + * @param unknown $object + */ + protected function getObjectId($object) + { + // TODO: Implement getObjectId() method. + } + + /** + * Render the main list template + * + * @param unknown $currentOrder , if any, null otherwise. + */ + protected function renderListTemplate($currentOrder) + { + // TODO: Implement renderListTemplate() method. + } + + protected function getEditionArguments() + { + return array( + 'ruleId' => $this->getRequest()->get('ruleId', 0) + ); + } + + /** + * Render the edition template + */ + protected function renderEditionTemplate() + { + return $this->render('rule-edit', $this->getEditionArguments()); + } + + /** + * Redirect to the edition template + */ + protected function redirectToEditionTemplate() + { + $args = $this->getEditionArguments(); + return $this->generateRedirectFromRoute("admin.freeShipping.rule.edit", [], ["ruleId" => $args['ruleId']]); + } + + /** + * Redirect to the list template + */ + protected function redirectToListTemplate() + { + return $this->generateRedirectFromRoute("admin.module.configure", [], ["module_code" => "FreeShipping"]); + } + + protected function performAdditionalUpdateAction($updateEvent) + { + return $this->redirectToListTemplate(); + } + + +} \ No newline at end of file diff --git a/local/modules/FreeShipping/Event/FreeShippingDeleteEvent.php b/local/modules/FreeShipping/Event/FreeShippingDeleteEvent.php new file mode 100644 index 00000000..98bd24c3 --- /dev/null +++ b/local/modules/FreeShipping/Event/FreeShippingDeleteEvent.php @@ -0,0 +1,68 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Event; + +/** + * Class FreeShippingDeleteEvent + * + * @package FreeShipping\Event + * @author Michaël Espeche + */ +class FreeShippingDeleteEvent extends FreeShippingEvents +{ + + const FREE_SHIPPING_RULE_DELETE = 'freeShipping.action.rule.delete'; + + /** + * @var int free shipping id + */ + protected $freeShippingId; + + /** + * @param int $freeShippingId + */ + public function __construct($freeShippingId) + { + $this->freeShippingId = $freeShippingId; + } + + /** + * @param int $freeShippingId + */ + public function setFreeShippingId($freeShippingId) + { + $this->freeShippingId = $freeShippingId; + + return $this; + } + + /** + * @return int + */ + public function getFreeShippingId() + { + return $this->freeShippingId; + } + +} diff --git a/local/modules/FreeShipping/Event/FreeShippingEvents.php b/local/modules/FreeShipping/Event/FreeShippingEvents.php new file mode 100644 index 00000000..6200d954 --- /dev/null +++ b/local/modules/FreeShipping/Event/FreeShippingEvents.php @@ -0,0 +1,128 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Event; + +use Thelia\Core\Event\ActionEvent; + +/** + * + * This class contains all FreeShipping events identifiers used by FreeShipping Core + * + * @author Michaël Espeche + */ + +class FreeShippingEvents extends ActionEvent +{ + + const FREE_SHIPPING_RULE_CREATE = 'freeShipping.action.rule.create'; + + /** + * @var + */ + protected $area; + /** + * @var + */ + protected $amount; + /** + * @var + */ + protected $rule; + + /** + * @param $amount + * @param $area + */ + public function __construct($amount, $area) + { + $this->amount = $amount; + $this->area = $area; + } + + + /** + * @param mixed $amount + */ + public function setAmount($amount) + { + $this->amount = $amount; + + return $this; + } + + /** + * @return mixed + */ + public function getAmount() + { + return $this->amount; + } + + /** + * @param mixed $area + */ + public function setArea($area) + { + $this->area = $area; + + return $this; + } + + /** + * @return mixed + */ + public function getArea() + { + return $this->area; + } + + /** + * @param mixed $rule + */ + public function setRule($rule) + { + $this->rule = $rule; + + return $this; + } + + /** + * @return mixed + */ + public function getRule() + { + return $this->rule; + } + + /** + * check if rule exists + * + * @return bool + */ + public function hasRule() + { + return null !== $this->rule; + } + +} \ No newline at end of file diff --git a/local/modules/FreeShipping/Event/FreeShippingUpdateEvent.php b/local/modules/FreeShipping/Event/FreeShippingUpdateEvent.php new file mode 100644 index 00000000..3c292118 --- /dev/null +++ b/local/modules/FreeShipping/Event/FreeShippingUpdateEvent.php @@ -0,0 +1,61 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Event; + +/** + * Class FreeShippingUpdateEvent + * @package FreeShipping\Event + * @author Michaël Espeche + */ +class FreeShippingUpdateEvent extends FreeShippingEvents +{ + const FREE_SHIPPING_RULE_UPDATE = 'freeShipping.action.rule.update'; + + protected $ruleId; + + public function __construct($ruleId) + { + $this->ruleId = $ruleId; + } + + /** + * @param mixed $ruleId + */ + public function setRuleId($ruleId) + { + $this->ruleId = $ruleId; + + return $this; + } + + /** + * @return mixed + */ + public function getRuleId() + { + return $this->ruleId; + } + + +} \ No newline at end of file diff --git a/local/modules/FreeShipping/Form/FreeShippingRuleCreationForm.php b/local/modules/FreeShipping/Form/FreeShippingRuleCreationForm.php new file mode 100644 index 00000000..5fa2d125 --- /dev/null +++ b/local/modules/FreeShipping/Form/FreeShippingRuleCreationForm.php @@ -0,0 +1,68 @@ +. */ +/* */ +/*************************************************************************************/ +namespace FreeShipping\Form; + +use Symfony\Component\Validator\Constraints; +use Symfony\Component\Validator\Constraints\NotBlank; +use Thelia\Core\Translation\Translator; +use Thelia\Form\BaseForm; + +/** + * Class FreeShippingRuleCreationForm + * @package FreeShipping\Form + */ +class FreeShippingRuleCreationForm extends BaseForm +{ + + protected function buildForm() + { + $this->formBuilder + ->add('area', 'text', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans('Area'), + 'label_attr' => array( + 'for' => 'free_shipping_area' + ) + )) + ->add('amount', 'text', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans('Amount'), + 'label_attr' => array( + 'for' => 'free_shipping_amount' + ) + )) + ; + } + + /** + * @return string + */ + public function getName() + { + return 'admin_free_shipping_rule_creation'; + } +} diff --git a/local/modules/FreeShipping/Form/FreeShippingRuleModificationForm.php b/local/modules/FreeShipping/Form/FreeShippingRuleModificationForm.php new file mode 100644 index 00000000..1299a2d7 --- /dev/null +++ b/local/modules/FreeShipping/Form/FreeShippingRuleModificationForm.php @@ -0,0 +1,49 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Form; + +use Symfony\Component\Validator\Constraints\GreaterThan; + +/** + * Class FreeShippingRuleModificationForm + * @package Thelia\Form + * @author Michaël Espeche + */ +class FreeShippingRuleModificationForm extends FreeShippingRuleCreationForm +{ + + protected function buildForm() + { + parent::buildForm(); + + $this->formBuilder + ->add("id", "hidden", array("constraints" => array(new GreaterThan(array('value' => 0))))) + ; + } + + public function getName() + { + return "admin_free_shipping_rule_modification"; + } +} diff --git a/local/modules/FreeShipping/FreeShipping.php b/local/modules/FreeShipping/FreeShipping.php new file mode 100644 index 00000000..20d469f5 --- /dev/null +++ b/local/modules/FreeShipping/FreeShipping.php @@ -0,0 +1,96 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping; + +use FreeShipping\Model\Base\FreeShippingQuery; +use Propel\Runtime\Connection\ConnectionInterface; +use Thelia\Install\Database; +use Thelia\Model\AreaQuery; +use Thelia\Model\Country; +use Thelia\Module\AbstractDeliveryModule; + +/** + * Class FreeShipping + * @package FreeShipping + */ +class FreeShipping extends AbstractDeliveryModule +{ + /** + * @param ConnectionInterface $con + */ + public function postActivation(ConnectionInterface $con = null) + { + $database = new Database($con->getWrappedConnection()); + $database->insertSql(null, [ __DIR__.DS.'Config'.DS.'thelia.sql' ]); + } + + + /** + * calculate and return delivery price + * + * @param Country $country + * + * @return mixed + */ + public function getPostage(Country $country) + { + return 0; + } + + /** + * @return string + */ + public function getCode() + { + return 'FreeShipping'; + } + + /** + * This method is called by the Delivery loop, to check if the current module has to be displayed to the customer. + * Override it to implements your delivery rules/ + * + * If you return true, the delivery method will de displayed to the customer + * If you return false, the delivery method will not be displayed + * + * @param Country $country the country to deliver to. + * + * @return boolean + */ + public function isValidDelivery(Country $country) + { + $cart = $this->getRequest()->getSession()->getSessionCart($this->getDispatcher()); + + $amount = $cart->getTaxedAmount($country); + $areaId = $country->getAreaId(); + + $area = FreeShippingQuery::create()->findOneByAreaId($areaId); + $maxAmount = $area->getAmount(); + + if ($amount >= $maxAmount) { + return true; + } else { + return false; + } + } +} diff --git a/local/modules/FreeShipping/LICENSE.txt b/local/modules/FreeShipping/LICENSE.txt new file mode 100644 index 00000000..ef7e7efc --- /dev/null +++ b/local/modules/FreeShipping/LICENSE.txt @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/local/modules/FreeShipping/Loop/FreeShipping.php b/local/modules/FreeShipping/Loop/FreeShipping.php new file mode 100644 index 00000000..fd0bd054 --- /dev/null +++ b/local/modules/FreeShipping/Loop/FreeShipping.php @@ -0,0 +1,104 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FreeShipping\Loop; + +use FreeShipping\Model\Base\FreeShippingQuery; +use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Core\Template\Element\BaseLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\PropelSearchLoopInterface; +use Thelia\Core\Template\Loop\Argument\Argument; +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; +use Thelia\Model\Base\AreaQuery; +use Thelia\Type; +use Thelia\Type\TypeCollection; + +/** + * + * FreeShipping loop + * + * + * Class FreeShipping + * @package FreeShipping\Loop + * @author Michaël Espeche + */ +class FreeShipping extends BaseLoop implements PropelSearchLoopInterface +{ + + /** + * @return ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + new Argument( + 'order', + new TypeCollection( + new Type\EnumListType(array('alpha', 'alpha-reverse', 'manual', 'manual_reverse', 'random', 'given_id')) + ), + 'alpha' + ) + ); + } + + public function buildModelCriteria() + { + + $search = FreeShippingQuery::create(); + + $id = $this->getId(); + + if (!is_null($id)) { + $search->filterById($id, Criteria::IN); + } + + return $search; + + } + + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $rule) { + + $loopResultRow = new LoopResultRow($rule); + + $area = AreaQuery::create()->findOneById($rule->getAreaId()); + + $loopResultRow + ->set("ID", $rule->getId()) + ->set("AMOUNT", $rule->getAmount()) + ->set("AREA_ID", $rule->getAreaId()) + ->set("AREA_NAME", $area->getName()) + ; + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + + } + +} diff --git a/local/modules/FreeShipping/Model/Base/FreeShipping.php b/local/modules/FreeShipping/Model/Base/FreeShipping.php new file mode 100644 index 00000000..28966fbe --- /dev/null +++ b/local/modules/FreeShipping/Model/Base/FreeShipping.php @@ -0,0 +1,1253 @@ +modifiedColumns); + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return in_array($col, $this->modifiedColumns); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return array_unique($this->modifiedColumns); + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + while (false !== ($offset = array_search($col, $this->modifiedColumns))) { + array_splice($this->modifiedColumns, $offset, 1); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another FreeShipping instance. If + * obj is an instance of FreeShipping, delegates to + * equals(FreeShipping). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return FreeShipping The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return FreeShipping The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [area_id] column value. + * + * @return int + */ + public function getAreaId() + { + + return $this->area_id; + } + + /** + * Get the [amount] column value. + * + * @return int + */ + public function getAmount() + { + + return $this->amount; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \FreeShipping\Model\FreeShipping The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[] = FreeShippingTableMap::ID; + } + + + return $this; + } // setId() + + /** + * Set the value of [area_id] column. + * + * @param int $v new value + * @return \FreeShipping\Model\FreeShipping The current object (for fluent API support) + */ + public function setAreaId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->area_id !== $v) { + $this->area_id = $v; + $this->modifiedColumns[] = FreeShippingTableMap::AREA_ID; + } + + if ($this->aArea !== null && $this->aArea->getId() !== $v) { + $this->aArea = null; + } + + + return $this; + } // setAreaId() + + /** + * Set the value of [amount] column. + * + * @param int $v new value + * @return \FreeShipping\Model\FreeShipping The current object (for fluent API support) + */ + public function setAmount($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->amount !== $v) { + $this->amount = $v; + $this->modifiedColumns[] = FreeShippingTableMap::AMOUNT; + } + + + return $this; + } // setAmount() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : FreeShippingTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : FreeShippingTableMap::translateFieldName('AreaId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->area_id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : FreeShippingTableMap::translateFieldName('Amount', TableMap::TYPE_PHPNAME, $indexType)]; + $this->amount = (null !== $col) ? (int) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 3; // 3 = FreeShippingTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \FreeShipping\Model\FreeShipping object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + if ($this->aArea !== null && $this->area_id !== $this->aArea->getId()) { + $this->aArea = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(FreeShippingTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildFreeShippingQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aArea = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see FreeShipping::setDeleted() + * @see FreeShipping::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(FreeShippingTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildFreeShippingQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(FreeShippingTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + FreeShippingTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aArea !== null) { + if ($this->aArea->isModified() || $this->aArea->isNew()) { + $affectedRows += $this->aArea->save($con); + } + $this->setArea($this->aArea); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[] = FreeShippingTableMap::ID; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . FreeShippingTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(FreeShippingTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(FreeShippingTableMap::AREA_ID)) { + $modifiedColumns[':p' . $index++] = 'AREA_ID'; + } + if ($this->isColumnModified(FreeShippingTableMap::AMOUNT)) { + $modifiedColumns[':p' . $index++] = 'AMOUNT'; + } + + $sql = sprintf( + 'INSERT INTO free_shipping (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'AREA_ID': + $stmt->bindValue($identifier, $this->area_id, PDO::PARAM_INT); + break; + case 'AMOUNT': + $stmt->bindValue($identifier, $this->amount, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = FreeShippingTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getAreaId(); + break; + case 2: + return $this->getAmount(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['FreeShipping'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['FreeShipping'][$this->getPrimaryKey()] = true; + $keys = FreeShippingTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getAreaId(), + $keys[2] => $this->getAmount(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aArea) { + $result['Area'] = $this->aArea->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = FreeShippingTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setAreaId($value); + break; + case 2: + $this->setAmount($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = FreeShippingTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setAreaId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setAmount($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(FreeShippingTableMap::DATABASE_NAME); + + if ($this->isColumnModified(FreeShippingTableMap::ID)) $criteria->add(FreeShippingTableMap::ID, $this->id); + if ($this->isColumnModified(FreeShippingTableMap::AREA_ID)) $criteria->add(FreeShippingTableMap::AREA_ID, $this->area_id); + if ($this->isColumnModified(FreeShippingTableMap::AMOUNT)) $criteria->add(FreeShippingTableMap::AMOUNT, $this->amount); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(FreeShippingTableMap::DATABASE_NAME); + $criteria->add(FreeShippingTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \FreeShipping\Model\FreeShipping (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setAreaId($this->getAreaId()); + $copyObj->setAmount($this->getAmount()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \FreeShipping\Model\FreeShipping Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Declares an association between this object and a ChildArea object. + * + * @param ChildArea $v + * @return \FreeShipping\Model\FreeShipping The current object (for fluent API support) + * @throws PropelException + */ + public function setArea(ChildArea $v = null) + { + if ($v === null) { + $this->setAreaId(NULL); + } else { + $this->setAreaId($v->getId()); + } + + $this->aArea = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the ChildArea object, it will not be re-added. + if ($v !== null) { + $v->addFreeShipping($this); + } + + + return $this; + } + + + /** + * Get the associated ChildArea object + * + * @param ConnectionInterface $con Optional Connection object. + * @return ChildArea The associated ChildArea object. + * @throws PropelException + */ + public function getArea(ConnectionInterface $con = null) + { + if ($this->aArea === null && ($this->area_id !== null)) { + $this->aArea = AreaQuery::create()->findPk($this->area_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aArea->addFreeShippings($this); + */ + } + + return $this->aArea; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->area_id = null; + $this->amount = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + $this->aArea = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(FreeShippingTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/FreeShipping/Model/Base/FreeShippingQuery.php b/local/modules/FreeShipping/Model/Base/FreeShippingQuery.php new file mode 100644 index 00000000..c282662a --- /dev/null +++ b/local/modules/FreeShipping/Model/Base/FreeShippingQuery.php @@ -0,0 +1,519 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildFreeShipping|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = FreeShippingTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(FreeShippingTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildFreeShipping A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, AREA_ID, AMOUNT FROM free_shipping WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildFreeShipping(); + $obj->hydrate($row); + FreeShippingTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildFreeShipping|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(FreeShippingTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(FreeShippingTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(FreeShippingTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(FreeShippingTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(FreeShippingTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the area_id column + * + * Example usage: + * + * $query->filterByAreaId(1234); // WHERE area_id = 1234 + * $query->filterByAreaId(array(12, 34)); // WHERE area_id IN (12, 34) + * $query->filterByAreaId(array('min' => 12)); // WHERE area_id > 12 + * + * + * @see filterByArea() + * + * @param mixed $areaId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function filterByAreaId($areaId = null, $comparison = null) + { + if (is_array($areaId)) { + $useMinMax = false; + if (isset($areaId['min'])) { + $this->addUsingAlias(FreeShippingTableMap::AREA_ID, $areaId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($areaId['max'])) { + $this->addUsingAlias(FreeShippingTableMap::AREA_ID, $areaId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(FreeShippingTableMap::AREA_ID, $areaId, $comparison); + } + + /** + * Filter the query on the amount column + * + * Example usage: + * + * $query->filterByAmount(1234); // WHERE amount = 1234 + * $query->filterByAmount(array(12, 34)); // WHERE amount IN (12, 34) + * $query->filterByAmount(array('min' => 12)); // WHERE amount > 12 + * + * + * @param mixed $amount The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function filterByAmount($amount = null, $comparison = null) + { + if (is_array($amount)) { + $useMinMax = false; + if (isset($amount['min'])) { + $this->addUsingAlias(FreeShippingTableMap::AMOUNT, $amount['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($amount['max'])) { + $this->addUsingAlias(FreeShippingTableMap::AMOUNT, $amount['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(FreeShippingTableMap::AMOUNT, $amount, $comparison); + } + + /** + * Filter the query by a related \Thelia\Model\Area object + * + * @param \Thelia\Model\Area|ObjectCollection $area The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function filterByArea($area, $comparison = null) + { + if ($area instanceof \Thelia\Model\Area) { + return $this + ->addUsingAlias(FreeShippingTableMap::AREA_ID, $area->getId(), $comparison); + } elseif ($area instanceof ObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(FreeShippingTableMap::AREA_ID, $area->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterByArea() only accepts arguments of type \Thelia\Model\Area or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the Area relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function joinArea($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('Area'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'Area'); + } + + return $this; + } + + /** + * Use the Area relation Area object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Thelia\Model\AreaQuery A secondary query class using the current class as primary query + */ + public function useAreaQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinArea($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'Area', '\Thelia\Model\AreaQuery'); + } + + /** + * Exclude object from result + * + * @param ChildFreeShipping $freeShipping Object to remove from the list of results + * + * @return ChildFreeShippingQuery The current query, for fluid interface + */ + public function prune($freeShipping = null) + { + if ($freeShipping) { + $this->addUsingAlias(FreeShippingTableMap::ID, $freeShipping->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the free_shipping table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(FreeShippingTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + FreeShippingTableMap::clearInstancePool(); + FreeShippingTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildFreeShipping or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildFreeShipping object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(FreeShippingTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(FreeShippingTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + FreeShippingTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + FreeShippingTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // FreeShippingQuery diff --git a/local/modules/FreeShipping/Model/FreeShipping.php b/local/modules/FreeShipping/Model/FreeShipping.php new file mode 100644 index 00000000..7f771923 --- /dev/null +++ b/local/modules/FreeShipping/Model/FreeShipping.php @@ -0,0 +1,10 @@ + array('Id', 'AreaId', 'Amount', ), + self::TYPE_STUDLYPHPNAME => array('id', 'areaId', 'amount', ), + self::TYPE_COLNAME => array(FreeShippingTableMap::ID, FreeShippingTableMap::AREA_ID, FreeShippingTableMap::AMOUNT, ), + self::TYPE_RAW_COLNAME => array('ID', 'AREA_ID', 'AMOUNT', ), + self::TYPE_FIELDNAME => array('id', 'area_id', 'amount', ), + self::TYPE_NUM => array(0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'AreaId' => 1, 'Amount' => 2, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'areaId' => 1, 'amount' => 2, ), + self::TYPE_COLNAME => array(FreeShippingTableMap::ID => 0, FreeShippingTableMap::AREA_ID => 1, FreeShippingTableMap::AMOUNT => 2, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'AREA_ID' => 1, 'AMOUNT' => 2, ), + self::TYPE_FIELDNAME => array('id' => 0, 'area_id' => 1, 'amount' => 2, ), + self::TYPE_NUM => array(0, 1, 2, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('free_shipping'); + $this->setPhpName('FreeShipping'); + $this->setClassName('\\FreeShipping\\Model\\FreeShipping'); + $this->setPackage('FreeShipping.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addForeignKey('AREA_ID', 'AreaId', 'INTEGER', 'area', 'ID', true, null, null); + $this->addColumn('AMOUNT', 'Amount', 'INTEGER', true, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('Area', '\\Thelia\\Model\\Area', RelationMap::MANY_TO_ONE, array('area_id' => 'id', ), null, null); + } // buildRelations() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? FreeShippingTableMap::CLASS_DEFAULT : FreeShippingTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (FreeShipping object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = FreeShippingTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = FreeShippingTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + FreeShippingTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = FreeShippingTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + FreeShippingTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = FreeShippingTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = FreeShippingTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + FreeShippingTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(FreeShippingTableMap::ID); + $criteria->addSelectColumn(FreeShippingTableMap::AREA_ID); + $criteria->addSelectColumn(FreeShippingTableMap::AMOUNT); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.AREA_ID'); + $criteria->addSelectColumn($alias . '.AMOUNT'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(FreeShippingTableMap::DATABASE_NAME)->getTable(FreeShippingTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(FreeShippingTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(FreeShippingTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new FreeShippingTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a FreeShipping or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or FreeShipping object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(FreeShippingTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \FreeShipping\Model\FreeShipping) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(FreeShippingTableMap::DATABASE_NAME); + $criteria->add(FreeShippingTableMap::ID, (array) $values, Criteria::IN); + } + + $query = FreeShippingQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { FreeShippingTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { FreeShippingTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the free_shipping table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return FreeShippingQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a FreeShipping or Criteria object. + * + * @param mixed $criteria Criteria or FreeShipping object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(FreeShippingTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from FreeShipping object + } + + if ($criteria->containsKey(FreeShippingTableMap::ID) && $criteria->keyContainsValue(FreeShippingTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.FreeShippingTableMap::ID.')'); + } + + + // Set the correct dbName + $query = FreeShippingQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // FreeShippingTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +FreeShippingTableMap::buildTableMap(); diff --git a/local/modules/FreeShipping/README.md b/local/modules/FreeShipping/README.md new file mode 100644 index 00000000..054e74b7 --- /dev/null +++ b/local/modules/FreeShipping/README.md @@ -0,0 +1,22 @@ +# Module Free Shipping Thelia 2 + +This module is used to offer shipping from a minimum amount on a specific shipping zone. + +## How to install + +This module must be into your ```modules/``` directory (thelia/local/modules/). + +You can download the .zip file of this module or create a git submodule into your project like this : + +``` +cd /path-to-thelia +git submodule add https://github.com/thelia-modules/FreeShipping.git local/modules/FreeShipping +``` + +Next, go to your Thelia admin panel for module activation. + +## How to use + +You can manage your free shipping rules on the configuration view of the module with the "configure" button on the modules list. + +After defining a rule, commands that respect it will have their shipping costs equal to 0 (the shipping costs will be calculated automatically). diff --git a/local/modules/FreeShipping/templates/backOffice/default/rule-edit.html b/local/modules/FreeShipping/templates/backOffice/default/rule-edit.html new file mode 100644 index 00000000..cda80fc6 --- /dev/null +++ b/local/modules/FreeShipping/templates/backOffice/default/rule-edit.html @@ -0,0 +1,70 @@ +{extends file="admin-layout.tpl"} + +{block name="check-resource"}admin.freeShipping{/block} +{block name="check-access"}update{/block} + +{block name="page-title"}{intl l='Edit free shipping rule'}{/block} + +{block name="main-content"} +
+
+ + + +
+
+
+
+ {intl l='Edit free shipping rule'} +
+
+ +
+
+ +
+ + {form name="freeShipping.admin.rule.modification"} + + + {* Be sure to get the keyword ID, even if the form could not be validated *} + + + {form_hidden_fields form=$form} + + {form_field form=$form field='area'} +
+ + +
+ {/form_field} + + {form_field form=$form field='amount'} +
+ + +
{intl l='Enter the amount from which the rule will apply'}
+
+ {/form_field} + +
+ +
+ + + {/form} +
+
+
+
+
+
+
+{/block} \ No newline at end of file diff --git a/local/modules/Front/Config/config.xml b/local/modules/Front/Config/config.xml new file mode 100644 index 00000000..dc19adf1 --- /dev/null +++ b/local/modules/Front/Config/config.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + Front/Config/front.xml + + %kernel.cache_dir% + %kernel.debug% + + + + + + diff --git a/local/modules/Front/Config/front.xml b/local/modules/Front/Config/front.xml new file mode 100644 index 00000000..fb2a65f2 --- /dev/null +++ b/local/modules/Front/Config/front.xml @@ -0,0 +1,268 @@ + + + + + + Thelia\Controller\Front\DefaultController::noAction + includes/mini-cart + + + + Thelia\Controller\Front\DefaultController::noAction + includes/addedToCart + + + + + Front\Controller\CustomerController::viewRegisterAction + + + + Front\Controller\CustomerController::createAction + register + + + + + Front\Controller\CustomerController::viewLoginAction + + + + Front\Controller\CustomerController::loginAction + login + + + + + Front\Controller\CustomerController::newPasswordAction + password + + + + Front\Controller\CustomerController::newPasswordSentAction + password + + + + + Front\Controller\CustomerController::logoutAction + + + + + + Thelia\Controller\Front\DefaultController::noAction + account + + + + Front\Controller\CustomerController::viewAction + account-update + + + + Front\Controller\CustomerController::updateAction + account-update + + + + + Front\Controller\CustomerController::updatePasswordAction + account-password + + + + Thelia\Controller\Front\DefaultController::noAction + account-password + + + + Front\Controller\OrderController::viewAction + \d+ + + + + Front\Controller\OrderController::generateDeliveryPdf + \d+ + + + + Front\Controller\OrderController::generateInvoicePdf + \d+ + + + + Front\Controller\OrderController::downloadVirtualProduct + \d+ + + + + + + Thelia\Controller\Front\DefaultController::noAction + address + + + + Front\Controller\AddressController::createAction + address + + + + Front\Controller\AddressController::updateViewAction + address-update + + + + Front\Controller\AddressController::processUpdateAction + address-update + + + + Front\Controller\AddressController::deleteAction + account + + + + Front\Controller\AddressController::generateModalAction + modal-address + \d+ + + + + Front:Address:makeAddressDefault + \d+ + + + + + + + Thelia\Controller\Front\DefaultController::noAction + cart + + + + Front\Controller\CartController::addItem + + + + Front\Controller\CartController::deleteItem + cart + + + + Front\Controller\CartController::changeItem + cart + + + + Front\Controller\CartController::changeCountry + cart + + + + + + Front\Controller\OrderController::deliver + order-delivery + + + + Front\Controller\OrderController::deliverView + order-delivery + + + + Front\Controller\OrderController::getDeliveryModuleListAjaxAction + + + + Front\Controller\OrderController::invoice + order-invoice + + + + Thelia\Controller\Front\DefaultController::noAction + order-invoice + + + + Front\Controller\CouponController::consumeAction + order-invoice + + + + Front\Controller\CouponController::clearAllCouponsAction + order-invoice + + + + Front\Controller\OrderController::pay + + + + Front\Controller\OrderController::orderPlaced + order-placed + + + + Front\Controller\OrderController::orderFailed + order-failed + + + + + + Front\Controller\ContactController::sendAction + contact + + + + Thelia\Controller\Front\DefaultController::noAction + contact-success + + + + + + Front\Controller\NewsletterController::subscribeAction + newsletter + + + + Front\Controller\NewsletterController::unsubscribeAction + newsletter-unsubscribe + + + + + + + Front\Controller\SitemapController::generateAction + + + + + + Front\Controller\FeedController::generateAction + catalog + + + + + + + + Thelia\Controller\Front\DefaultController::emptyRoute + + + + + Thelia\Controller\Front\DefaultController::noAction + index + ^(?!admin|api)[^/]+ + + diff --git a/local/modules/Front/Config/module.xml b/local/modules/Front/Config/module.xml new file mode 100644 index 00000000..6652d387 --- /dev/null +++ b/local/modules/Front/Config/module.xml @@ -0,0 +1,20 @@ + + + Front\Front + + Front integration + + + + Front office module + + + 2.3.1 + + Thelia team + info@thelia.net + + classic + 2.2.0 + alpha + diff --git a/local/modules/Front/Controller/AddressController.php b/local/modules/Front/Controller/AddressController.php new file mode 100644 index 00000000..5ef57311 --- /dev/null +++ b/local/modules/Front/Controller/AddressController.php @@ -0,0 +1,273 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Front\Controller; + +use Front\Front; +use Symfony\Component\Form\Form; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Core\Event\Address\AddressCreateOrUpdateEvent; +use Thelia\Core\Event\Address\AddressEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Form\Definition\FrontForm; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Log\Tlog; +use Thelia\Model\AddressQuery; +use Thelia\Model\Customer; + +/** + * Class AddressController + * @package Thelia\Controller\Front + * @author Manuel Raynaud + */ +class AddressController extends BaseFrontController +{ + + /** + * Controller for generate modal containing update form + * Check if request is a XmlHttpRequest and address owner is the current customer + * + * @param $address_id + */ + public function generateModalAction($address_id) + { + + $this->checkAuth(); + $this->checkXmlHttpRequest(); + + } + + /** + * Create controller. + * Check if customer is logged in + * + * Dispatch TheliaEvents::ADDRESS_CREATE event + */ + public function createAction() + { + $this->checkAuth(); + + $addressCreate = $this->createForm(FrontForm::ADDRESS_CREATE); + + try { + /** @var Customer $customer */ + $customer = $this->getSecurityContext()->getCustomerUser(); + + $form = $this->validateForm($addressCreate, "post"); + $event = $this->createAddressEvent($form); + $event->setCustomer($customer); + + $this->dispatch(TheliaEvents::ADDRESS_CREATE, $event); + + return $this->generateSuccessRedirect($addressCreate); + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans("Please check your input: %s", ['%s' => $e->getMessage()], Front::MESSAGE_DOMAIN); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans("Sorry, an error occured: %s", ['%s' => $e->getMessage()], Front::MESSAGE_DOMAIN); + } + + Tlog::getInstance()->error(sprintf("Error during address creation process : %s", $message)); + + $addressCreate->setErrorMessage($message); + + $this->getParserContext() + ->addForm($addressCreate) + ->setGeneralError($message) + ; + + // Redirect to error URL if defined + if ($addressCreate->hasErrorUrl()) { + return $this->generateErrorRedirect($addressCreate); + } + } + + protected function createAddressEvent(Form $form) + { + return new AddressCreateOrUpdateEvent( + $form->get("label")->getData(), + $form->get("title")->getData(), + $form->get("firstname")->getData(), + $form->get("lastname")->getData(), + $form->get("address1")->getData(), + $form->get("address2")->getData(), + $form->get("address3")->getData(), + $form->get("zipcode")->getData(), + $form->get("city")->getData(), + $form->get("country")->getData(), + $form->get("cellphone")->getData(), + $form->get("phone")->getData(), + $form->get("company")->getData(), + $form->get("is_default")->getData(), + $form->get("state")->getData() + ); + } + + public function updateViewAction($address_id) + { + $this->checkAuth(); + + $customer = $this->getSecurityContext()->getCustomerUser(); + $address = AddressQuery::create()->findPk($address_id); + + if (!$address || $customer->getId() != $address->getCustomerId()) { + return $this->generateRedirectFromRoute('default'); + } + + $this->getParserContext()->set("address_id", $address_id); + } + + public function processUpdateAction($address_id) + { + $this->checkAuth(); + + $addressUpdate = $this->createForm(FrontForm::ADDRESS_UPDATE); + + try { + $customer = $this->getSecurityContext()->getCustomerUser(); + + $form = $this->validateForm($addressUpdate); + + $address = AddressQuery::create()->findPk($address_id); + + if (null === $address) { + return $this->generateRedirectFromRoute('default'); + } + + if ($address->getCustomer()->getId() != $customer->getId()) { + return $this->generateRedirectFromRoute('default'); + } + + $event = $this->createAddressEvent($form); + $event->setAddress($address); + + $this->dispatch(TheliaEvents::ADDRESS_UPDATE, $event); + + return $this->generateSuccessRedirect($addressUpdate); + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans("Please check your input: %s", ['%s' => $e->getMessage()], Front::MESSAGE_DOMAIN); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans("Sorry, an error occured: %s", ['%s' => $e->getMessage()], Front::MESSAGE_DOMAIN); + } + + $this->getParserContext()->set("address_id", $address_id); + + Tlog::getInstance()->error(sprintf("Error during address creation process : %s", $message)); + + $addressUpdate->setErrorMessage($message); + + $this->getParserContext() + ->addForm($addressUpdate) + ->setGeneralError($message) + ; + + if ($addressUpdate->hasErrorUrl()) { + return $this->generateErrorRedirect($addressUpdate); + } + } + + public function deleteAction($address_id) + { + $this->checkAuth(); + $error_message = false; + + $customer = $this->getSecurityContext()->getCustomerUser(); + $address = AddressQuery::create()->findPk($address_id); + + if (!$address || $customer->getId() != $address->getCustomerId()) { + // If Ajax Request + if ($this->getRequest()->isXmlHttpRequest()) { + return $this->jsonResponse( + json_encode( + array( + "success" => false, + "message" => $this->getTranslator()->trans( + "Error during address deletion process", + [], + Front::MESSAGE_DOMAIN + ) + ) + ) + ); + } else { + return $this->generateRedirectFromRoute('default'); + } + } + + try { + $this->dispatch(TheliaEvents::ADDRESS_DELETE, new AddressEvent($address)); + } catch (\Exception $e) { + $error_message = $e->getMessage(); + } + + Tlog::getInstance()->error(sprintf('Error during address deletion : %s', $error_message)); + + // If Ajax Request + if ($this->getRequest()->isXmlHttpRequest()) { + if ($error_message) { + $response = $this->jsonResponse(json_encode(array( + "success" => false, + "message" => $error_message + ))); + } else { + $response = $this->jsonResponse( + json_encode([ + "success" => true, + "message" => "" + ]) + ); + } + + return $response; + + } else { + return $this->generateRedirectFromRoute('default', array('view'=>'account')); + } + } + + public function makeAddressDefaultAction($addressId) + { + $this->checkAuth(); + + $address = AddressQuery::create() + ->filterByCustomerId($this->getSecurityContext()->getCustomerUser()->getId()) + ->findPk($addressId) + ; + + if (null === $address) { + $this->pageNotFound(); + } + + try { + $event = new AddressEvent($address); + $this->dispatch(TheliaEvents::ADDRESS_DEFAULT, $event); + } catch (\Exception $e) { + $this->getParserContext() + ->setGeneralError($e->getMessage()) + ; + + return $this->render("account"); + } + + return $this->generateRedirectFromRoute('default', array('view'=>'account')); + } +} diff --git a/local/modules/Front/Controller/CartController.php b/local/modules/Front/Controller/CartController.php new file mode 100644 index 00000000..b96d64e9 --- /dev/null +++ b/local/modules/Front/Controller/CartController.php @@ -0,0 +1,229 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Front\Controller; + +use Front\Front; +use Propel\Runtime\Exception\PropelException; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\Request; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Core\Event\Cart\CartEvent; +use Thelia\Core\Event\Order\OrderEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Form\CartAdd; +use Thelia\Form\Definition\FrontForm; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Log\Tlog; +use Thelia\Model\AddressQuery; +use Thelia\Model\ConfigQuery; +use Thelia\Model\OrderPostage; +use Thelia\Module\Exception\DeliveryException; +use Thelia\Tools\URL; + +class CartController extends BaseFrontController +{ + public function addItem() + { + $request = $this->getRequest(); + + $cartAdd = $this->getAddCartForm($request); + $message = null; + + try { + $form = $this->validateForm($cartAdd); + + $cartEvent = $this->getCartEvent(); + + $cartEvent->bindForm($form); + + $this->getDispatcher()->dispatch(TheliaEvents::CART_ADDITEM, $cartEvent); + + $this->afterModifyCart(); + + + if ($this->getRequest()->isXmlHttpRequest()) { + $this->changeViewForAjax(); + } elseif (null !== $response = $this->generateSuccessRedirect($cartAdd)) { + return $response; + } + + } catch (PropelException $e) { + Tlog::getInstance()->error(sprintf("Failed to add item to cart with message : %s", $e->getMessage())); + $message = $this->getTranslator()->trans( + "Failed to add this article to your cart, please try again", + [], + Front::MESSAGE_DOMAIN + ); + } catch (FormValidationException $e) { + $message = $e->getMessage(); + } + + if ($message) { + $cartAdd->setErrorMessage($message); + $this->getParserContext()->addForm($cartAdd); + } + } + + public function changeItem() + { + $cartEvent = $this->getCartEvent(); + $cartEvent->setCartItemId($this->getRequest()->get("cart_item")); + $cartEvent->setQuantity($this->getRequest()->get("quantity")); + + try { + $this->getTokenProvider()->checkToken( + $this->getRequest()->query->get('_token') + ); + + $this->dispatch(TheliaEvents::CART_UPDATEITEM, $cartEvent); + + $this->afterModifyCart(); + + if ($this->getRequest()->isXmlHttpRequest()) { + $this->changeViewForAjax(); + } + } catch (\Exception $e) { + Tlog::getInstance()->error(sprintf("Failed to change cart item quantity: %s", $e->getMessage())); + + $this->getParserContext()->setGeneralError($e->getMessage()); + } + } + + public function deleteItem() + { + $cartEvent = $this->getCartEvent(); + $cartEvent->setCartItemId($this->getRequest()->get("cart_item")); + + try { + $this->getTokenProvider()->checkToken( + $this->getRequest()->query->get('_token') + ); + + $this->getDispatcher()->dispatch(TheliaEvents::CART_DELETEITEM, $cartEvent); + + $this->afterModifyCart(); + } catch (\Exception $e) { + Tlog::getInstance()->error(sprintf("error during deleting cartItem with message : %s", $e->getMessage())); + $this->getParserContext()->setGeneralError($e->getMessage()); + } + + $this->changeViewForAjax(); + } + + protected function changeViewForAjax() + { + // If Ajax Request + if ($this->getRequest()->isXmlHttpRequest()) { + $request = $this->getRequest(); + + $view = $request->get('ajax-view', "includes/mini-cart"); + + $request->attributes->set('_view', $view); + } + } + + public function changeCountry() + { + $redirectUrl = URL::getInstance()->absoluteUrl("/cart"); + $deliveryId = $this->getRequest()->get("country"); + $cookieName = ConfigQuery::read('front_cart_country_cookie_name', 'fcccn'); + $cookieExpires = ConfigQuery::read('front_cart_country_cookie_expires', 2592000); + $cookieExpires = intval($cookieExpires) ?: 2592000; + + $cookie = new Cookie($cookieName, $deliveryId, time() + $cookieExpires, '/'); + + $response = $this->generateRedirect($redirectUrl); + $response->headers->setCookie($cookie); + + return $response; + } + + /** + * @return \Thelia\Core\Event\Cart\CartEvent + */ + protected function getCartEvent() + { + $cart = $this->getSession()->getSessionCart($this->getDispatcher()); + + return new CartEvent($cart); + } + + /** + * Find the good way to construct the cart form + * + * @param Request $request + * @return CartAdd + */ + private function getAddCartForm(Request $request) + { + if ($request->isMethod("post")) { + $cartAdd = $this->createForm(FrontForm::CART_ADD); + } else { + $cartAdd = $this->createForm( + FrontForm::CART_ADD, + "form", + array(), + array( + 'csrf_protection' => false, + ), + $this->container + ); + } + + return $cartAdd; + } + + protected function afterModifyCart() + { + /* recalculate postage amount */ + $order = $this->getSession()->getOrder(); + if (null !== $order) { + $deliveryModule = $order->getModuleRelatedByDeliveryModuleId(); + $deliveryAddress = AddressQuery::create()->findPk($order->getChoosenDeliveryAddress()); + + if (null !== $deliveryModule && null !== $deliveryAddress) { + $moduleInstance = $deliveryModule->getDeliveryModuleInstance($this->container); + + $orderEvent = new OrderEvent($order); + + try { + $postage = OrderPostage::loadFromPostage( + $moduleInstance->getPostage($deliveryAddress->getCountry()) + ); + + $orderEvent->setPostage($postage->getAmount()); + $orderEvent->setPostageTax($postage->getAmountTax()); + $orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle()); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent); + } catch (DeliveryException $ex) { + // The postage has been chosen, but changes in the cart causes an exception. + // Reset the postage data in the order + $orderEvent->setDeliveryModule(0); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent); + } + } + } + } +} diff --git a/local/modules/Front/Controller/ContactController.php b/local/modules/Front/Controller/ContactController.php new file mode 100644 index 00000000..47064870 --- /dev/null +++ b/local/modules/Front/Controller/ContactController.php @@ -0,0 +1,83 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Front\Controller; + +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Form\ContactForm; +use Thelia\Form\Definition\FrontForm; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Log\Tlog; +use Thelia\Model\ConfigQuery; + +/** + * Class ContactController + * @package Thelia\Controller\Front + * @author Manuel Raynaud + */ +class ContactController extends BaseFrontController +{ + /** + * send contact message + */ + public function sendAction() + { + $contactForm = $this->createForm(FrontForm::CONTACT); + + try { + $form = $this->validateForm($contactForm); + + $message = \Swift_Message::newInstance($form->get('subject')->getData()) + ->addFrom(ConfigQuery::getStoreEmail(), $form->get('name')->getData()) + ->addReplyTo($form->get('email')->getData(), $form->get('name')->getData()) + ->addTo(ConfigQuery::getStoreEmail(), ConfigQuery::getStoreName()) + ->setBody($form->get('message')->getData()) + ; + + $this->getMailer()->send($message); + + if ($contactForm->hasSuccessUrl()) { + return $this->generateSuccessRedirect($contactForm); + } + + return $this->generateRedirectFromRoute('contact.success'); + + } catch (FormValidationException $e) { + $error_message = $e->getMessage(); + } + + Tlog::getInstance()->error(sprintf('Error during sending contact mail : %s', $error_message)); + + $contactForm->setErrorMessage($error_message); + + $this->getParserContext() + ->addForm($contactForm) + ->setGeneralError($error_message) + ; + + // Redirect to error URL if defined + if ($contactForm->hasErrorUrl()) { + return $this->generateErrorRedirect($contactForm); + } + } +} diff --git a/local/modules/Front/Controller/CouponController.php b/local/modules/Front/Controller/CouponController.php new file mode 100644 index 00000000..c21288f9 --- /dev/null +++ b/local/modules/Front/Controller/CouponController.php @@ -0,0 +1,159 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Front\Controller; + +use Front\Front; +use Propel\Runtime\Exception\PropelException; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Core\Event\Coupon\CouponConsumeEvent; +use Thelia\Core\Event\Order\OrderEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Exception\UnmatchableConditionException; +use Thelia\Form\Definition\FrontForm; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Log\Tlog; +use Thelia\Model\AddressQuery; +use Thelia\Model\OrderPostage; +use Thelia\Module\Exception\DeliveryException; + +/** + * Class CouponController + * @package Thelia\Controller\Front + * @author Guillaume MOREL + */ +class CouponController extends BaseFrontController +{ + /** + * Clear all coupons. + */ + public function clearAllCouponsAction() + { + // Dispatch Event to the Action + $this->getDispatcher()->dispatch(TheliaEvents::COUPON_CLEAR_ALL); + } + + /** + * Coupon consuming + */ + public function consumeAction() + { + $this->checkCartNotEmpty(); + + $message = false; + $couponCodeForm = $this->createForm(FrontForm::COUPON_CONSUME); + + try { + $form = $this->validateForm($couponCodeForm, 'post'); + + $couponCode = $form->get('coupon-code')->getData(); + + if (null === $couponCode || empty($couponCode)) { + $message = true; + throw new \Exception( + $this->getTranslator()->trans( + 'Coupon code can\'t be empty', + [], + Front::MESSAGE_DOMAIN + ) + ); + } + + $couponConsumeEvent = new CouponConsumeEvent($couponCode); + + // Dispatch Event to the Action + $this->getDispatcher()->dispatch(TheliaEvents::COUPON_CONSUME, $couponConsumeEvent); + + /* recalculate postage amount */ + $order = $this->getSession()->getOrder(); + + if (null !== $order) { + $deliveryModule = $order->getModuleRelatedByDeliveryModuleId(); + $deliveryAddress = AddressQuery::create()->findPk($order->getChoosenDeliveryAddress()); + + if (null !== $deliveryModule && null !== $deliveryAddress) { + $moduleInstance = $deliveryModule->getDeliveryModuleInstance($this->container); + + $orderEvent = new OrderEvent($order); + + try { + $postage = OrderPostage::loadFromPostage( + $moduleInstance->getPostage($deliveryAddress->getCountry()) + ); + + $orderEvent->setPostage($postage->getAmount()); + $orderEvent->setPostageTax($postage->getAmountTax()); + $orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle()); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent); + } catch (DeliveryException $ex) { + // The postage has been chosen, but changes dues to coupon causes an exception. + // Reset the postage data in the order + $orderEvent->setDeliveryModule(0); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent); + } + } + } + + return $this->generateSuccessRedirect($couponCodeForm); + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + 'Please check your coupon code: %message', + ["%message" => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } catch (UnmatchableConditionException $e) { + $message = $this->getTranslator()->trans( + 'You should sign in or register to use this coupon', + [ + '%sign' => $this->retrieveUrlFromRouteId('customer.login.view'), + '%register' => $this->retrieveUrlFromRouteId('customer.create.view'), + ], + Front::MESSAGE_DOMAIN + ); + } catch (PropelException $e) { + $this->getParserContext()->setGeneralError($e->getMessage()); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + 'Sorry, an error occurred: %message', + ["%message" => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } + + if ($message !== false) { + Tlog::getInstance()->error( + sprintf("Error during order delivery process : %s. Exception was %s", $message, $e->getMessage()) + ); + + $couponCodeForm->setErrorMessage($message); + + $this->getParserContext() + ->addForm($couponCodeForm) + ->setGeneralError($message); + } + + return $this->generateErrorRedirect($couponCodeForm); + } +} diff --git a/local/modules/Front/Controller/CustomerController.php b/local/modules/Front/Controller/CustomerController.php new file mode 100644 index 00000000..635afd34 --- /dev/null +++ b/local/modules/Front/Controller/CustomerController.php @@ -0,0 +1,567 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Front\Controller; + +use Front\Front; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent; +use Thelia\Core\Event\Customer\CustomerLoginEvent; +use Thelia\Core\Event\LostPasswordEvent; +use Thelia\Core\Event\Newsletter\NewsletterEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Core\Security\Authentication\CustomerUsernamePasswordFormAuthenticator; +use Thelia\Core\Security\Exception\AuthenticationException; +use Thelia\Core\Security\Exception\UsernameNotFoundException; +use Thelia\Core\Security\Exception\WrongPasswordException; +use Thelia\Form\CustomerLogin; +use Thelia\Form\Definition\FrontForm; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Log\Tlog; +use Thelia\Model\ConfigQuery; +use Thelia\Model\Customer; +use Thelia\Model\NewsletterQuery; +use Thelia\Tools\RememberMeTrait; +use Thelia\Tools\URL; + +/** + * Class CustomerController + * @package Thelia\Controller\Front + * @author Manuel Raynaud + */ +class CustomerController extends BaseFrontController +{ + use RememberMeTrait; + + /** + * Display the register template if no customer logged + */ + public function viewLoginAction() + { + if ($this->getSecurityContext()->hasCustomerUser()) { + // Redirect to home page + return $this->generateRedirect(URL::getInstance()->getIndexPage()); + } + + return $this->render("login"); + } + + /** + * Display the register template if no customer logged + */ + public function viewRegisterAction() + { + if ($this->getSecurityContext()->hasCustomerUser()) { + // Redirect to home page + return $this->generateRedirect(URL::getInstance()->getIndexPage()); + } + + return $this->render("register"); + } + + public function newPasswordAction() + { + $passwordLost = $this->createForm(FrontForm::CUSTOMER_LOST_PASSWORD); + + if (! $this->getSecurityContext()->hasCustomerUser()) { + try { + $form = $this->validateForm($passwordLost); + + $event = new LostPasswordEvent($form->get("email")->getData()); + + $this->dispatch(TheliaEvents::LOST_PASSWORD, $event); + + return $this->generateSuccessRedirect($passwordLost); + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occurred: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } + + if ($message !== false) { + Tlog::getInstance()->error( + sprintf( + "Error during customer creation process : %s. Exception was %s", + $message, + $e->getMessage() + ) + ); + } + } else { + $message = $this->getTranslator()->trans( + "You're currently logged in. Please log out before requesting a new password.", + [], + Front::MESSAGE_DOMAIN + ); + } + + $passwordLost->setErrorMessage($message); + + $this->getParserContext() + ->addForm($passwordLost) + ->setGeneralError($message) + ; + + // Redirect to error URL if defined + if ($passwordLost->hasErrorUrl()) { + return $this->generateErrorRedirect($passwordLost); + } + } + + public function newPasswordSentAction() + { + $this->getParser()->assign('password_sent', true); + } + + /** + * Create a new customer. + * On success, redirect to success_url if exists, otherwise, display the same view again. + */ + public function createAction() + { + if (! $this->getSecurityContext()->hasCustomerUser()) { + $customerCreation = $this->createForm(FrontForm::CUSTOMER_CREATE); + + try { + $form = $this->validateForm($customerCreation, "post"); + + $customerCreateEvent = $this->createEventInstance($form->getData()); + + $this->dispatch(TheliaEvents::CUSTOMER_CREATEACCOUNT, $customerCreateEvent); + + $newCustomer = $customerCreateEvent->getCustomer(); + + // Newsletter + if (true === $form->get('newsletter')->getData()) { + $newsletterEmail = $newCustomer->getEmail(); + $nlEvent = new NewsletterEvent( + $newsletterEmail, + $this->getRequest()->getSession()->getLang()->getLocale() + ); + $nlEvent->setFirstname($newCustomer->getFirstname()); + $nlEvent->setLastname($newCustomer->getLastname()); + + // Security : Check if this new Email address already exist + if (null !== $newsletter = NewsletterQuery::create()->findOneByEmail($newsletterEmail)) { + $nlEvent->setId($newsletter->getId()); + $this->dispatch(TheliaEvents::NEWSLETTER_UPDATE, $nlEvent); + } else { + $this->dispatch(TheliaEvents::NEWSLETTER_SUBSCRIBE, $nlEvent); + } + } + + $this->processLogin($customerCreateEvent->getCustomer()); + + $cart = $this->getSession()->getSessionCart($this->getDispatcher()); + if ($cart->getCartItems()->count() > 0) { + $response = $this->generateRedirectFromRoute('cart.view'); + } else { + $response = $this->generateSuccessRedirect($customerCreation); + } + + return $response; + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occured: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } + + Tlog::getInstance()->error( + sprintf( + "Error during customer creation process : %s. Exception was %s", + $message, + $e->getMessage() + ) + ); + + $customerCreation->setErrorMessage($message); + + $this->getParserContext() + ->addForm($customerCreation) + ->setGeneralError($message) + ; + + // Redirect to error URL if defined + if ($customerCreation->hasErrorUrl()) { + return $this->generateErrorRedirect($customerCreation); + } + } + } + + /** + * Prepare customer data update. + */ + public function viewAction() + { + $this->checkAuth(); + + /** @var Customer $customer */ + $customer = $this->getSecurityContext()->getCustomerUser(); + $data = array( + 'id' => $customer->getId(), + 'title' => $customer->getTitleId(), + 'firstname' => $customer->getFirstName(), + 'lastname' => $customer->getLastName(), + 'email' => $customer->getEmail(), + 'email_confirm' => $customer->getEmail(), + 'newsletter' => null !== NewsletterQuery::create()->findOneByEmail($customer->getEmail()), + ); + + $customerProfileUpdateForm = $this->createForm(FrontForm::CUSTOMER_PROFILE_UPDATE, 'form', $data); + + // Pass it to the parser + $this->getParserContext()->addForm($customerProfileUpdateForm); + } + + public function updatePasswordAction() + { + if ($this->getSecurityContext()->hasCustomerUser()) { + $customerPasswordUpdateForm = $this->createForm(FrontForm::CUSTOMER_PASSWORD_UPDATE); + + try { + /** @var Customer $customer */ + $customer = $this->getSecurityContext()->getCustomerUser(); + + $form = $this->validateForm($customerPasswordUpdateForm, "post"); + + $customerChangeEvent = $this->createEventInstance($form->getData()); + $customerChangeEvent->setCustomer($customer); + $this->dispatch(TheliaEvents::CUSTOMER_UPDATEPROFILE, $customerChangeEvent); + + return $this->generateSuccessRedirect($customerPasswordUpdateForm); + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occured: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } + + Tlog::getInstance()->error( + sprintf( + "Error during customer password modification process : %s.", + $message + ) + ); + + $customerPasswordUpdateForm->setErrorMessage($message); + + $this->getParserContext() + ->addForm($customerPasswordUpdateForm) + ->setGeneralError($message) + ; + + // Redirect to error URL if defined + if ($customerPasswordUpdateForm->hasErrorUrl()) { + return $this->generateErrorRedirect($customerPasswordUpdateForm); + } + } + } + + public function updateAction() + { + if ($this->getSecurityContext()->hasCustomerUser()) { + $customerProfileUpdateForm = $this->createForm(FrontForm::CUSTOMER_PROFILE_UPDATE); + + try { + /** @var Customer $customer */ + $customer = $this->getSecurityContext()->getCustomerUser(); + $newsletterOldEmail = $customer->getEmail(); + + $form = $this->validateForm($customerProfileUpdateForm, "post"); + + $customerChangeEvent = $this->createEventInstance($form->getData()); + $customerChangeEvent->setCustomer($customer); + + $customerChangeEvent->setEmailUpdateAllowed( + (intval(ConfigQuery::read('customer_change_email', 0))) ? true : false + ); + + $this->dispatch(TheliaEvents::CUSTOMER_UPDATEPROFILE, $customerChangeEvent); + + $updatedCustomer = $customerChangeEvent->getCustomer(); + + // Newsletter + if (true === $form->get('newsletter')->getData()) { + $nlEvent = new NewsletterEvent( + $updatedCustomer->getEmail(), + $this->getRequest()->getSession()->getLang()->getLocale() + ); + $nlEvent->setFirstname($updatedCustomer->getFirstname()); + $nlEvent->setLastname($updatedCustomer->getLastname()); + + if (null !== $newsletter = NewsletterQuery::create()->findOneByEmail($newsletterOldEmail)) { + $nlEvent->setId($newsletter->getId()); + $this->dispatch(TheliaEvents::NEWSLETTER_UPDATE, $nlEvent); + } else { + $this->dispatch(TheliaEvents::NEWSLETTER_SUBSCRIBE, $nlEvent); + } + } else { + if (null !== $newsletter = NewsletterQuery::create()->findOneByEmail($newsletterOldEmail)) { + $nlEvent = new NewsletterEvent( + $updatedCustomer->getEmail(), + $this->getRequest()->getSession()->getLang()->getLocale() + ); + $nlEvent->setId($newsletter->getId()); + $this->dispatch(TheliaEvents::NEWSLETTER_UNSUBSCRIBE, $nlEvent); + } + } + + $this->processLogin($updatedCustomer); + + return $this->generateSuccessRedirect($customerProfileUpdateForm); + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occured: %s", + [ + '%s' => $e->getMessage() + ], + Front::MESSAGE_DOMAIN + ); + } + + Tlog::getInstance()->error(sprintf("Error during customer modification process : %s.", $message)); + + $customerProfileUpdateForm->setErrorMessage($message); + + $this->getParserContext() + ->addForm($customerProfileUpdateForm) + ->setGeneralError($message) + ; + + // Redirect to error URL if defined + if ($customerProfileUpdateForm->hasErrorUrl()) { + return $this->generateErrorRedirect($customerProfileUpdateForm); + } + } + } + + /** + * Perform user login. On a successful login, the user is redirected to the URL + * found in the success_url form parameter, or / if none was found. + * + * If login is not successfull, the same view is displayed again. + * + */ + public function loginAction() + { + if (!$this->getSecurityContext()->hasCustomerUser()) { + $request = $this->getRequest(); + $customerLoginForm = new CustomerLogin($request); + + try { + $form = $this->validateForm($customerLoginForm, "post"); + + // If User is a new customer + if ($form->get('account')->getData() == 0 && $form->get("email")->getErrors()->count() == 0) { + return $this->generateRedirectFromRoute( + "customer.create.process", + ["email" => $form->get("email")->getData()] + ); + } else { + try { + $authenticator = new CustomerUsernamePasswordFormAuthenticator($request, $customerLoginForm); + + /** @var Customer $customer */ + $customer = $authenticator->getAuthentifiedUser(); + + $this->processLogin($customer); + + if (intval($form->get('remember_me')->getData()) > 0) { + // If a remember me field if present and set in the form, create + // the cookie thant store "remember me" information + $this->createRememberMeCookie( + $customer, + $this->getRememberMeCookieName(), + $this->getRememberMeCookieExpiration() + ); + } + + return $this->generateSuccessRedirect($customerLoginForm); + + } catch (UsernameNotFoundException $e) { + $message = $this->getTranslator()->trans( + "Wrong email or password. Please try again", + [], + Front::MESSAGE_DOMAIN + ); + } catch (WrongPasswordException $e) { + $message = $this->getTranslator()->trans( + "Wrong email or password. Please try again", + [], + Front::MESSAGE_DOMAIN + ); + } catch (AuthenticationException $e) { + $message = $this->getTranslator()->trans( + "Wrong email or password. Please try again", + [], + Front::MESSAGE_DOMAIN + ); + } + + } + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + ['%s' => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occured: %s", + ['%s' => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } + + Tlog::getInstance()->error( + sprintf( + "Error during customer login process : %s. Exception was %s", + $message, + $e->getMessage() + ) + ); + + $customerLoginForm->setErrorMessage($message); + + $this->getParserContext()->addForm($customerLoginForm); + + if ($customerLoginForm->hasErrorUrl()) { + return $this->generateErrorRedirect($customerLoginForm); + } + } + } + + /** + * Perform customer logout. + */ + public function logoutAction() + { + if ($this->getSecurityContext()->hasCustomerUser()) { + $this->dispatch(TheliaEvents::CUSTOMER_LOGOUT); + } + + $this->clearRememberMeCookie($this->getRememberMeCookieName()); + + // Redirect to home page + return $this->generateRedirect(URL::getInstance()->getIndexPage()); + } + + /** + * Dispatch event for customer login action + * + * @param Customer $customer + */ + protected function processLogin(Customer $customer) + { + $this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer)); + } + + /** + * @param $data + * @return \Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent + */ + private function createEventInstance($data) + { + $customerCreateEvent = new CustomerCreateOrUpdateEvent( + isset($data["title"])?$data["title"]:null, + isset($data["firstname"])?$data["firstname"]:null, + isset($data["lastname"])?$data["lastname"]:null, + isset($data["address1"])?$data["address1"]:null, + isset($data["address2"])?$data["address2"]:null, + isset($data["address3"])?$data["address3"]:null, + isset($data["phone"])?$data["phone"]:null, + isset($data["cellphone"])?$data["cellphone"]:null, + isset($data["zipcode"])?$data["zipcode"]:null, + isset($data["city"])?$data["city"]:null, + isset($data["country"])?$data["country"]:null, + isset($data["email"])?$data["email"]:null, + isset($data["password"]) ? $data["password"]:null, + $this->getRequest()->getSession()->getLang()->getId(), + isset($data["reseller"])?$data["reseller"]:null, + isset($data["sponsor"])?$data["sponsor"]:null, + isset($data["discount"])?$data["discount"]:null, + isset($data["company"])?$data["company"]:null, + null, + isset($data["state"])?$data["state"]:null + ); + + return $customerCreateEvent; + } + + + protected function getRememberMeCookieName() + { + return ConfigQuery::read('customer_remember_me_cookie_name', 'crmcn'); + } + + protected function getRememberMeCookieExpiration() + { + return ConfigQuery::read('customer_remember_me_cookie_expiration', 2592000 /* 1 month */); + } +} diff --git a/local/modules/Front/Controller/FeedController.php b/local/modules/Front/Controller/FeedController.php new file mode 100644 index 00000000..5c3f03b6 --- /dev/null +++ b/local/modules/Front/Controller/FeedController.php @@ -0,0 +1,202 @@ + + */ +class FeedController extends BaseFrontController { + + + /** + * Folder name for feeds cache + */ + const FEED_CACHE_DIR = "feeds"; + + /** + * Key prefix for feed cache + */ + const FEED_CACHE_KEY = "feed"; + + + /** + * render the RSS feed + * + * @param $context string The context of the feed : catalog, content. default: catalog + * @param $lang string The lang of the feed : fr_FR, en_US, ... default: default language of the site + * @param $id string The id of the parent element. The id of the main parent category for catalog context. + * The id of the content folder for content context + * @return Response + * @throws \RuntimeException + */ + public function generateAction($context, $lang, $id) + { + + /** @var Request $request */ + $request = $this->getRequest(); + + // context + if ("" === $context){ + $context = "catalog"; + } else if (! in_array($context, array("catalog", "content", "brand")) ){ + $this->pageNotFound(); + } + + // the locale : fr_FR, en_US, + if ("" !== $lang) { + if (! $this->checkLang($lang)){ + $this->pageNotFound(); + } + } else { + try{ + $lang = Lang::getDefaultLanguage(); + $lang = $lang->getLocale(); + } catch (\RuntimeException $ex){ + // @todo generate error page + throw new \RuntimeException("No default language is defined. Please define one."); + } + } + if (null === $lang = LangQuery::create()->findOneByLocale($lang)){ + $this->pageNotFound(); + } + $lang = $lang->getId(); + + // check if element exists and is visible + if ("" !== $id){ + if (false === $this->checkId($context, $id)){ + $this->pageNotFound(); + } + } + + $flush = $request->query->get("flush", ""); + + // check if feed already in cache + $cacheContent = false; + + $cacheDir = $this->getCacheDir(); + $cacheKey = self::FEED_CACHE_KEY . $lang . $context . $id; + $cacheExpire = intval(ConfigQuery::read("feed_ttl", '7200')) ?: 7200; + + $cacheDriver = new FilesystemCache($cacheDir); + if (!($this->checkAdmin() && "" !== $flush)){ + $cacheContent = $cacheDriver->fetch($cacheKey); + } else { + $cacheDriver->delete($cacheKey); + } + + // if not in cache + if (false === $cacheContent){ + // render the view + $cacheContent = $this->renderRaw( + "feed", + array( + "_context_" => $context, + "_lang_" => $lang, + "_id_" => $id + ) + ); + // save cache + $cacheDriver->save($cacheKey, $cacheContent, $cacheExpire); + } + + $response = new Response(); + $response->setContent($cacheContent); + $response->headers->set('Content-Type', 'application/rss+xml'); + + return $response; + } + + + /** + * get the cache directory for feeds + * + * @return mixed|string + */ + protected function getCacheDir() + { + $cacheDir = $this->container->getParameter("kernel.cache_dir"); + $cacheDir = rtrim($cacheDir, '/'); + $cacheDir .= '/' . self::FEED_CACHE_DIR . '/'; + + return $cacheDir; + } + + /** + * Check if current user has ADMIN role + * + * @return bool + */ + protected function checkAdmin(){ + return $this->getSecurityContext()->hasAdminUser(); + } + + + /** + * Check if a lang is used + * + * @param $lang string The lang code. e.g.: fr + * @return bool true if the language is used, otherwise false + */ + private function checkLang($lang) + { + // load locals + $lang = LangQuery::create() + ->findOneByLocale($lang); + + return (null !== $lang); + } + + + /** + * Check if the element exists and is visible + * + * @param $context string catalog or content + * @param $id string id of the element + * @return bool + */ + private function checkId($context, $id) + { + $ret = false; + if (is_numeric($id)){ + if ("catalog" === $context){ + $cat = CategoryQuery::create()->findPk($id); + $ret = (null !== $cat && $cat->getVisible()); + } elseif ("brand" === $context) { + $brand = BrandQuery::create()->findPk($id); + $ret = (null !== $brand && $brand->getVisible()); + } else { + $folder = FolderQuery::create()->findPk($id); + $ret = (null !== $folder && $folder->getVisible()); + } + } + return $ret; + } +} \ No newline at end of file diff --git a/local/modules/Front/Controller/NewsletterController.php b/local/modules/Front/Controller/NewsletterController.php new file mode 100644 index 00000000..9e558141 --- /dev/null +++ b/local/modules/Front/Controller/NewsletterController.php @@ -0,0 +1,164 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Front\Controller; + +use Front\Front; +use Symfony\Component\HttpFoundation\JsonResponse; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Core\Event\Newsletter\NewsletterEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Form\Definition\FrontForm; +use Thelia\Log\Tlog; +use Thelia\Model\Customer; +use Thelia\Model\NewsletterQuery; + +/** + * Class NewsletterController + * @package Thelia\Controller\Front + * @author Manuel Raynaud , Franck Allimant + */ +class NewsletterController extends BaseFrontController +{ + /** + * @since 2.3.0-alpha2 + */ + public function unsubscribeAction() + { + $errorMessage = false; + + $newsletterForm = $this->createForm(FrontForm::NEWSLETTER_UNSUBSCRIBE); + + try { + $form = $this->validateForm($newsletterForm); + + $email = $form->get('email')->getData(); + + if (null !== $newsletter = NewsletterQuery::create()->findOneByEmail($email)) { + $event = new NewsletterEvent( + $email, + $this->getRequest()->getSession()->getLang()->getLocale() + ); + + $event->setId($newsletter->getId()); + + $this->dispatch(TheliaEvents::NEWSLETTER_UNSUBSCRIBE, $event); + + // If a success URL is defined in the form, redirect to it, otherwise use the defaut view + if ($newsletterForm->hasSuccessUrl() && !$this->getRequest()->isXmlHttpRequest()) { + return $this->generateSuccessRedirect($newsletterForm); + } + } + } catch (\Exception $e) { + $errorMessage = $e->getMessage(); + + Tlog::getInstance()->error(sprintf('Error during newsletter unsubscription : %s', $errorMessage)); + + $newsletterForm->setErrorMessage($errorMessage); + } + + // If Ajax Request + if ($this->getRequest()->isXmlHttpRequest()) { + return new JsonResponse([ + "success" => ($errorMessage) ? false : true, + "message" => ($errorMessage) ? $errorMessage : $this->getTranslator()->trans( + "Your subscription to our newsletter has been canceled.", + [], + Front::MESSAGE_DOMAIN + ) + ], ($errorMessage) ? 500 : 200); + } + + $this->getParserContext() + ->setGeneralError($errorMessage) + ->addForm($newsletterForm); + + // If an error URL is defined in the form, redirect to it, otherwise use the defaut view + if ($errorMessage && $newsletterForm->hasErrorUrl()) { + return $this->generateErrorRedirect($newsletterForm); + } + } + + public function subscribeAction() + { + $errorMessage = false; + + $newsletterForm = $this->createForm(FrontForm::NEWSLETTER); + + try { + $form = $this->validateForm($newsletterForm); + + $event = new NewsletterEvent( + $form->get('email')->getData(), + $this->getRequest()->getSession()->getLang()->getLocale() + ); + + /** @var Customer $customer */ + if (null !== $customer = $this->getSecurityContext()->getCustomerUser()) { + $event + ->setFirstname($customer->getFirstname()) + ->setLastname($customer->getLastname()) + ; + } else { + $event + ->setFirstname($form->get('firstname')->getData()) + ->setLastname($form->get('lastname')->getData()) + ; + } + + $this->dispatch(TheliaEvents::NEWSLETTER_SUBSCRIBE, $event); + + // If a success URL is defined in the form, redirect to it, otherwise use the defaut view + if ($newsletterForm->hasSuccessUrl() && ! $this->getRequest()->isXmlHttpRequest()) { + return $this->generateSuccessRedirect($newsletterForm); + } + } catch (\Exception $e) { + $errorMessage = $e->getMessage(); + + Tlog::getInstance()->error(sprintf('Error during newsletter subscription : %s', $errorMessage)); + + $newsletterForm->setErrorMessage($errorMessage); + } + + // If Ajax Request + if ($this->getRequest()->isXmlHttpRequest()) { + return new JsonResponse([ + "success" => ($errorMessage) ? false : true, + "message" => ($errorMessage) ? $errorMessage : $this->getTranslator()->trans( + "Thanks for signing up! We'll keep you posted whenever we have any new updates.", + [], + Front::MESSAGE_DOMAIN + ) + ], ($errorMessage) ? 500 : 200); + } + + $this->getParserContext() + ->setGeneralError($errorMessage) + ->addForm($newsletterForm); + + // If an error URL is defined in the form, redirect to it, otherwise use the defaut view + if ($errorMessage && $newsletterForm->hasErrorUrl()) { + return $this->generateErrorRedirect($newsletterForm); + } + } +} diff --git a/local/modules/Front/Controller/OrderController.php b/local/modules/Front/Controller/OrderController.php new file mode 100644 index 00000000..460109ff --- /dev/null +++ b/local/modules/Front/Controller/OrderController.php @@ -0,0 +1,599 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Front\Controller; + +use Front\Front; +use Propel\Runtime\ActiveQuery\Criteria; +use Propel\Runtime\Exception\PropelException; +use Thelia\Core\Event\Delivery\DeliveryPostageEvent; +use Thelia\Core\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Core\Event\Order\OrderEvent; +use Thelia\Core\Event\Product\VirtualProductOrderDownloadResponseEvent; +use Thelia\Core\Event\TheliaEvents; +use Symfony\Component\HttpFoundation\Response as BaseResponse; +use Thelia\Exception\TheliaProcessException; +use Thelia\Form\Definition\FrontForm; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Log\Tlog; +use Thelia\Model\Address; +use Thelia\Model\AddressQuery; +use Thelia\Model\AreaDeliveryModuleQuery; +use Thelia\Model\ConfigQuery; +use Thelia\Model\ModuleQuery; +use Thelia\Model\Order; +use Thelia\Model\OrderPostage; +use Thelia\Model\OrderProductQuery; +use Thelia\Model\OrderQuery; +use Thelia\Module\AbstractDeliveryModule; +use Thelia\Module\Exception\DeliveryException; + +/** + * Class OrderController + * @package Thelia\Controller\Front + * @author Etienne Roudeix + */ +class OrderController extends BaseFrontController +{ + /** + * Check if the cart contains only virtual products. + */ + public function deliverView() + { + $this->checkAuth(); + $this->checkCartNotEmpty(); + + // check if the cart contains only virtual products + $cart = $this->getSession()->getSessionCart($this->getDispatcher()); + + $deliveryAddress = $this->getCustomerAddress(); + + if ($cart->isVirtual()) { + if (null !== $deliveryAddress) { + $deliveryModule = ModuleQuery::create()->retrieveVirtualProductDelivery($this->container); + + if (false === $deliveryModule) { + Tlog::getInstance()->error( + $this->getTranslator()->trans( + "To enable the virtual product feature, the VirtualProductDelivery module should be activated", + [], + Front::MESSAGE_DOMAIN + ) + ); + } elseif (count($deliveryModule) == 1) { + return $this->registerVirtualProductDelivery($deliveryModule[0], $deliveryAddress); + } + } + } + + return $this->render( + 'order-delivery', + [ + 'delivery_address_id' => (null !== $deliveryAddress) ? $deliveryAddress->getId() : null + ] + ); + } + + /** + * @param AbstractDeliveryModule $moduleInstance + * @param Address $deliveryAddress + * @return \Symfony\Component\HttpFoundation\Response + */ + private function registerVirtualProductDelivery($moduleInstance, $deliveryAddress) + { + /* get postage amount */ + $deliveryModule = $moduleInstance->getModuleModel(); + $cart = $this->getSession()->getSessionCart($this->getDispatcher()); + $deliveryPostageEvent = new DeliveryPostageEvent($moduleInstance, $cart, $deliveryAddress); + + $this->getDispatcher()->dispatch( + TheliaEvents::MODULE_DELIVERY_GET_POSTAGE, + $deliveryPostageEvent + ); + + $postage = $deliveryPostageEvent->getPostage(); + + $orderEvent = $this->getOrderEvent(); + $orderEvent->setDeliveryAddress($deliveryAddress->getId()); + $orderEvent->setDeliveryModule($deliveryModule->getId()); + $orderEvent->setPostage($postage->getAmount()); + $orderEvent->setPostageTax($postage->getAmountTax()); + $orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle()); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_ADDRESS, $orderEvent); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent); + + return $this->generateRedirectFromRoute("order.invoice"); + } + + /** + * set delivery address + * set delivery module + */ + public function deliver() + { + $this->checkAuth(); + $this->checkCartNotEmpty(); + + $message = false; + + $orderDelivery = $this->createForm(FrontForm::ORDER_DELIVER); + + try { + $form = $this->validateForm($orderDelivery, "post"); + + $deliveryAddressId = $form->get("delivery-address")->getData(); + $deliveryModuleId = $form->get("delivery-module")->getData(); + $deliveryAddress = AddressQuery::create()->findPk($deliveryAddressId); + $deliveryModule = ModuleQuery::create()->findPk($deliveryModuleId); + + /* check that the delivery address belongs to the current customer */ + if ($deliveryAddress->getCustomerId() !== $this->getSecurityContext()->getCustomerUser()->getId()) { + throw new \Exception( + $this->getTranslator()->trans( + "Delivery address does not belong to the current customer", + [], + Front::MESSAGE_DOMAIN + ) + ); + } + + /* check that the delivery module fetches the delivery address area */ + if (null === AreaDeliveryModuleQuery::create()->findByCountryAndModule( + $deliveryAddress->getCountry(), + $deliveryModule + )) { + throw new \Exception( + $this->getTranslator()->trans( + "Delivery module cannot be use with selected delivery address", + [], + Front::MESSAGE_DOMAIN + ) + ); + } + + /* get postage amount */ + $moduleInstance = $deliveryModule->getDeliveryModuleInstance($this->container); + + $cart = $this->getSession()->getSessionCart($this->getDispatcher()); + $deliveryPostageEvent = new DeliveryPostageEvent($moduleInstance, $cart, $deliveryAddress); + + $this->getDispatcher()->dispatch( + TheliaEvents::MODULE_DELIVERY_GET_POSTAGE, + $deliveryPostageEvent + ); + + if (!$deliveryPostageEvent->isValidModule() || null === $deliveryPostageEvent->getPostage()) { + throw new DeliveryException( + $this->getTranslator()->trans('The delivery module is not valid.', [], Front::MESSAGE_DOMAIN) + ); + } + + $postage = $deliveryPostageEvent->getPostage(); + + $orderEvent = $this->getOrderEvent(); + $orderEvent->setDeliveryAddress($deliveryAddressId); + $orderEvent->setDeliveryModule($deliveryModuleId); + $orderEvent->setPostage($postage->getAmount()); + $orderEvent->setPostageTax($postage->getAmountTax()); + $orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle()); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_ADDRESS, $orderEvent); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent); + + return $this->generateRedirectFromRoute("order.invoice"); + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + ['%s' => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } catch (PropelException $e) { + $this->getParserContext()->setGeneralError($e->getMessage()); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occured: %s", + ['%s' => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } + + if ($message !== false) { + Tlog::getInstance()->error( + sprintf("Error during order delivery process : %s. Exception was %s", $message, $e->getMessage()) + ); + + $orderDelivery->setErrorMessage($message); + + $this->getParserContext() + ->addForm($orderDelivery) + ->setGeneralError($message) + ; + } + } + + /** + * set invoice address + * set payment module + */ + public function invoice() + { + $this->checkAuth(); + $this->checkCartNotEmpty(); + $this->checkValidDelivery(); + + $message = false; + + $orderPayment = $this->createForm(FrontForm::ORDER_PAYMENT); + + try { + $form = $this->validateForm($orderPayment, "post"); + + $invoiceAddressId = $form->get("invoice-address")->getData(); + $paymentModuleId = $form->get("payment-module")->getData(); + + /* check that the invoice address belongs to the current customer */ + $invoiceAddress = AddressQuery::create()->findPk($invoiceAddressId); + if ($invoiceAddress->getCustomerId() !== $this->getSecurityContext()->getCustomerUser()->getId()) { + throw new \Exception( + $this->getTranslator()->trans( + "Invoice address does not belong to the current customer", + [], + Front::MESSAGE_DOMAIN + ) + ); + } + + $orderEvent = $this->getOrderEvent(); + $orderEvent->setInvoiceAddress($invoiceAddressId); + $orderEvent->setPaymentModule($paymentModuleId); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_INVOICE_ADDRESS, $orderEvent); + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_PAYMENT_MODULE, $orderEvent); + + return $this->generateRedirectFromRoute("order.payment.process"); + + } catch (FormValidationException $e) { + $message = $this->getTranslator()->trans( + "Please check your input: %s", + ['%s' => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } catch (PropelException $e) { + $this->getParserContext()->setGeneralError($e->getMessage()); + } catch (\Exception $e) { + $message = $this->getTranslator()->trans( + "Sorry, an error occured: %s", + ['%s' => $e->getMessage()], + Front::MESSAGE_DOMAIN + ); + } + + if ($message !== false) { + Tlog::getInstance()->error( + sprintf("Error during order payment process : %s. Exception was %s", $message, $e->getMessage()) + ); + + $orderPayment->setErrorMessage($message); + + $this->getParserContext() + ->addForm($orderPayment) + ->setGeneralError($message) + ; + } + + return $this->generateErrorRedirect($orderPayment); + } + + public function pay() + { + /* check customer */ + $this->checkAuth(); + + /* check cart count */ + $this->checkCartNotEmpty(); + + /* check stock not empty */ + if (true === ConfigQuery::checkAvailableStock()) { + if (null !== $response = $this->checkStockNotEmpty()) { + return $response; + } + } + + /* check delivery address and module */ + $this->checkValidDelivery(); + + /* check invoice address and payment module */ + $this->checkValidInvoice(); + + $orderEvent = $this->getOrderEvent(); + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_PAY, $orderEvent); + + $placedOrder = $orderEvent->getPlacedOrder(); + + if (null !== $placedOrder && null !== $placedOrder->getId()) { + /* order has been placed */ + if ($orderEvent->hasResponse()) { + return $orderEvent->getResponse(); + } else { + return $this->generateRedirectFromRoute( + 'order.placed', + [], + ['order_id' => $orderEvent->getPlacedOrder()->getId()] + ); + } + } else { + /* order has not been placed */ + return $this->generateRedirectFromRoute('cart.view'); + } + } + + public function orderPlaced($order_id) + { + /* check if the placed order matched the customer */ + $placedOrder = OrderQuery::create()->findPk( + $this->getRequest()->attributes->get('order_id') + ); + + if (null === $placedOrder) { + throw new TheliaProcessException( + $this->getTranslator()->trans( + "No placed order", + [], + Front::MESSAGE_DOMAIN + ), + TheliaProcessException::NO_PLACED_ORDER, + $placedOrder + ); + } + + $customer = $this->getSecurityContext()->getCustomerUser(); + + if (null === $customer || $placedOrder->getCustomerId() !== $customer->getId()) { + throw new TheliaProcessException( + $this->getTranslator()->trans( + "Received placed order id does not belong to the current customer", + [], + Front::MESSAGE_DOMAIN + ), + TheliaProcessException::PLACED_ORDER_ID_BAD_CURRENT_CUSTOMER, + $placedOrder + ); + } + + $this->getDispatcher()->dispatch(TheliaEvents::ORDER_CART_CLEAR, $this->getOrderEvent()); + + $this->getParserContext()->set("placed_order_id", $placedOrder->getId()); + } + + + public function orderFailed($order_id, $message) + { + if (empty($order_id)) { + // Fallback to request parameter if the method parameter is empty. + $order_id = $this->getRequest()->get('order_id'); + } + + $failedOrder = OrderQuery::create()->findPk($order_id); + + if (null !== $failedOrder) { + $customer = $this->getSecurityContext()->getCustomerUser(); + + if (null === $customer || $failedOrder->getCustomerId() !== $customer->getId()) { + throw new TheliaProcessException( + $this->getTranslator()->trans( + "Received failed order id does not belong to the current customer", + [], + Front::MESSAGE_DOMAIN + ), + TheliaProcessException::PLACED_ORDER_ID_BAD_CURRENT_CUSTOMER, + $failedOrder + ); + } + } else { + Tlog::getInstance()->warning("Failed order ID '$order_id' not found."); + } + + $this->getParserContext() + ->set("failed_order_id", $order_id) + ->set("failed_order_message", $message) + ; + } + + protected function getOrderEvent() + { + $order = $this->getOrder($this->getRequest()); + + return new OrderEvent($order); + } + + public function getOrder(Request $request) + { + $session = $request->getSession(); + + if (null !== $order = $session->getOrder()) { + return $order; + } + + $order = new Order(); + + $session->setOrder($order); + + return $order; + } + + + public function viewAction($order_id) + { + $this->checkOrderCustomer($order_id); + + return $this->render('account-order', ['order_id' => $order_id]); + } + + public function generateInvoicePdf($order_id) + { + $this->checkOrderCustomer($order_id); + + + return $this->generateOrderPdf($order_id, ConfigQuery::read('pdf_invoice_file', 'invoice')); + } + + public function generateDeliveryPdf($order_id) + { + $this->checkOrderCustomer($order_id); + + return $this->generateOrderPdf($order_id, ConfigQuery::read('pdf_delivery_file', 'delivery')); + } + + public function downloadVirtualProduct($order_product_id) + { + if (null !== $orderProduct = OrderProductQuery::create()->findPk($order_product_id)) { + $order = $orderProduct->getOrder(); + + if ($order->isPaid(false)) { + // check customer + $this->checkOrderCustomer($order->getId()); + + $virtualProductEvent = new VirtualProductOrderDownloadResponseEvent($orderProduct); + $this->getDispatcher()->dispatch( + TheliaEvents::VIRTUAL_PRODUCT_ORDER_DOWNLOAD_RESPONSE, + $virtualProductEvent + ); + + $response = $virtualProductEvent->getResponse(); + + if (!$response instanceof BaseResponse) { + throw new \RuntimeException('A Response must be added in the event TheliaEvents::VIRTUAL_PRODUCT_ORDER_DOWNLOAD_RESPONSE'); + } + + return $response; + } + } + + throw new AccessDeniedHttpException(); + + } + + private function checkOrderCustomer($order_id) + { + $this->checkAuth(); + + $order = OrderQuery::create()->findPk($order_id); + $valid = true; + if ($order) { + $customerOrder = $order->getCustomer(); + $customer = $this->getSecurityContext()->getCustomerUser(); + + if ($customerOrder->getId() != $customer->getId()) { + $valid = false; + } + } else { + $valid = false; + } + + if (false === $valid) { + throw new AccessDeniedHttpException(); + } + } + + public function getDeliveryModuleListAjaxAction() + { + $this->checkXmlHttpRequest(); + + // Change the delivery address if customer has changed it + $address = null; + $session = $this->getSession(); + $addressId = $this->getRequest()->get('address_id', null); + if (null !== $addressId && $addressId !== $session->getOrder()->getChoosenDeliveryAddress()) { + $address = AddressQuery::create()->findPk($addressId); + if (null !== $address && $address->getCustomerId() === $session->getCustomerUser()->getId()) { + $session->getOrder()->setChoosenDeliveryAddress($addressId); + } + } + + $address = AddressQuery::create()->findPk($session->getOrder()->getChoosenDeliveryAddress()); + + $countryId = $address->getCountryId(); + $stateId = $address->getStateId(); + + $args = array( + 'country' => $countryId, + 'state' => $stateId, + 'address' => $session->getOrder()->getChoosenDeliveryAddress() + ); + + return $this->render('ajax/order-delivery-module-list', $args); + } + + private function checkStockNotEmpty() + { + $cart = $this->getSession()->getSessionCart($this->getDispatcher()); + $cartItems = $cart->getCartItems(); + $flagQuantity = 0; + foreach ($cartItems as $cartItem) { + $pse = $cartItem->getProductSaleElements(); + if ($pse->getQuantity() <= 0) { + $flagQuantity = 1; + } + } + if ($flagQuantity == 1) { + return $this->generateRedirectFromRoute('cart.view'); + } else { + return null; + } + } + + /** + * Retrieve the chosen delivery address for a cart or the default customer address if not exists + * + * @return null|Address + */ + protected function getCustomerAddress() + { + $deliveryAddress = null; + $addressId = $this->getSession()->getOrder()->getChoosenDeliveryAddress(); + if (null === $addressId) { + $customer = $this->getSecurityContext()->getCustomerUser(); + + $deliveryAddress = AddressQuery::create() + ->filterByCustomerId($customer->getId()) + ->orderByIsDefault(Criteria::DESC) + ->findOne(); + + if (null !== $deliveryAddress) { + $this->getSession()->getOrder()->setChoosenDeliveryAddress( + $deliveryAddress->getId() + ); + } + } else { + $deliveryAddress = AddressQuery::create()->findPk($addressId); + } + + return $deliveryAddress; + } +} diff --git a/local/modules/Front/Controller/SitemapController.php b/local/modules/Front/Controller/SitemapController.php new file mode 100644 index 00000000..c9c10986 --- /dev/null +++ b/local/modules/Front/Controller/SitemapController.php @@ -0,0 +1,150 @@ + + */ +class SitemapController extends BaseFrontController { + + + /** + * Folder name for sitemap cache + */ + const SITEMAP_CACHE_DIR = "sitemap"; + + /** + * Key prefix for sitemap cache + */ + const SITEMAP_CACHE_KEY = "sitemap"; + + /** + * @return Response + */ + public function generateAction() + { + /** @var Request $request */ + $request = $this->getRequest(); + + // the locale : fr, en, + $lang = $request->query->get("lang", ""); + if ("" !== $lang) { + if (! $this->checkLang($lang)){ + $this->pageNotFound(); + } + } + // specific content : product, category, cms + $context = $request->query->get("context", ""); + if (! in_array($context, array("", "catalog", "content")) ){ + $this->pageNotFound(); + } + + $flush = $request->query->get("flush", ""); + + // check if sitemap already in cache + $cacheContent = false; + + $cacheDir = $this->getCacheDir(); + $cacheKey = self::SITEMAP_CACHE_KEY . $lang . $context; + $cacheExpire = intval(ConfigQuery::read("sitemap_ttl", '7200')) ?: 7200; + + $cacheDriver = new FilesystemCache($cacheDir); + if (!($this->checkAdmin() && "" !== $flush)){ + $cacheContent = $cacheDriver->fetch($cacheKey); + } else { + $cacheDriver->delete($cacheKey); + } + + // if not in cache + if (false === $cacheContent){ + // render the view + $cacheContent = $this->renderRaw( + "sitemap", + array( + "_lang_" => $lang, + "_context_" => $context + ) + ); + // save cache + $cacheDriver->save($cacheKey, $cacheContent, $cacheExpire); + } + + $response = new Response(); + $response->setContent($cacheContent); + $response->headers->set('Content-Type', 'application/xml'); + + return $response; + } + + + /** + * get the cache directory for sitemap + * + * @return mixed|string + */ + protected function getCacheDir() + { + $cacheDir = $this->container->getParameter("kernel.cache_dir"); + $cacheDir = rtrim($cacheDir, '/'); + $cacheDir .= '/' . self::SITEMAP_CACHE_DIR . '/'; + + return $cacheDir; + } + + /** + * Check if current user has ADMIN role + * + * @return bool + */ + protected function checkAdmin(){ + return $this->getSecurityContext()->hasAdminUser(); + } + + + /** + * Check if a lang is used + * + * @param $lang The lang code. e.g.: fr + * @return bool true if the language is used, otherwise false + */ + private function checkLang($lang) + { + // load locals + $lang = LangQuery::create() + ->findOneByCode($lang); + + return (null !== $lang); + } + +} \ No newline at end of file diff --git a/local/modules/Front/Front.php b/local/modules/Front/Front.php new file mode 100644 index 00000000..c085f27f --- /dev/null +++ b/local/modules/Front/Front.php @@ -0,0 +1,31 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Front; + +use Thelia\Module\BaseModule; + +class Front extends BaseModule +{ + const MESSAGE_DOMAIN = 'front'; +} diff --git a/local/modules/Front/I18n/de_DE.php b/local/modules/Front/I18n/de_DE.php new file mode 100644 index 00000000..bf641783 --- /dev/null +++ b/local/modules/Front/I18n/de_DE.php @@ -0,0 +1,22 @@ + 'Gutschein-Code darf nicht leer sein', + 'Delivery address does not belong to the current customer' => 'Lieferadresse gehört nicht zum aktuellen Kunden', + 'Delivery module cannot be use with selected delivery address' => 'Lieferung-Modul kann nicht mit ausgewählten Lieferadresse verwendet werden', + 'Error during address deletion process' => 'Fehler beim Löschen der Adresse', + 'Failed to add this article to your cart, please try again' => 'Der Artikel konnte nicht zum Warenkorb hinzugefügt werden, bitte versuchen Sie es erneut', + 'Invoice address does not belong to the current customer' => 'Rechnungsadresse gehört nicht zum aktuellen Kunden', + 'No placed order' => 'Keine Bestellungen', + 'Please check your coupon code: %message' => 'Bitte überprüfen Sie Ihren Gutschein-Code: %message', + 'Please check your input: %s' => 'Bitte überprüfen Sie Ihre Eingabe: %s', + 'Received failed order id does not belong to the current customer' => 'Empfangene Id einer fehlgeschlagenen Bestellung gehört nicht zum aktuellen Kunden', + 'Received placed order id does not belong to the current customer' => 'Empfangene Bestellungs-Id gehört nicht zum aktuellen Kunden', + 'Sorry, an error occured: %s' => 'Leider ist ein Fehler aufgetreten: %s', + 'Sorry, an error occurred: %message' => 'Leider ist ein Fehler aufgetreten: %message', + 'Sorry, an error occurred: %s' => 'Es tut uns Leid, aber ein Fehler ist aufgetreten: %s', + 'Thanks for signing up! We\'ll keep you posted whenever we have any new updates.' => 'Vielen Dank für Ihre Anmeldung! Wir halten Ihnen auf dem Laufenden über neuen Updates.', + 'To enable the virtual product feature, the VirtualProductDelivery module should be activated' => 'Um das virtuelle Produkt-Feature zu aktivieren, sollte das VirtualProductDelivery-Modul aktiviert werden', + 'Wrong email or password. Please try again' => 'E-Mail oder Passwort falsch. Bitte erneut versuchen', + 'You\'re currently logged in. Please log out before requesting a new password.' => 'Sie sind derzeit angemeldet. Bitte melden Sie sich ab, bevor Sie ein neues Passwort anfordern.', +]; diff --git a/local/modules/Front/I18n/en_US.php b/local/modules/Front/I18n/en_US.php new file mode 100644 index 00000000..ae70e91e --- /dev/null +++ b/local/modules/Front/I18n/en_US.php @@ -0,0 +1,23 @@ + 'Coupon code can\'t be empty', + 'Delivery address does not belong to the current customer' => 'Delivery address does not belong to the current customer', + 'Delivery module cannot be use with selected delivery address' => 'Delivery module cannot be use with selected delivery address', + 'Error during address deletion process' => 'Error during address deletion process', + 'Failed to add this article to your cart, please try again' => 'Failed to add this article to your cart, please try again', + 'Invoice address does not belong to the current customer' => 'Invoice address does not belong to the current customer', + 'No placed order' => 'No placed order', + 'Please check your coupon code: %message' => 'Please check your coupon code: %message', + 'Please check your input: %s' => 'Please check your input: %s', + 'Received failed order id does not belong to the current customer' => 'Received failed order id does not belong to the current customer', + 'Received placed order id does not belong to the current customer' => 'Received placed order id does not belong to the current customer', + 'Sorry, an error occured: %s' => 'Sorry, an error occured: %s', + 'Sorry, an error occurred: %message' => 'Sorry, an error occurred: %message', + 'Sorry, an error occurred: %s' => 'Sorry, an error occurred: %s', + 'Thanks for signing up! We\'ll keep you posted whenever we have any new updates.' => 'Thanks for signing up! We\'ll keep you posted whenever we have any new updates.', + 'To enable the virtual product feature, the VirtualProductDelivery module should be activated' => 'To enable the virtual product feature, the VirtualProductDelivery module should be activated', + 'Wrong email or password. Please try again' => 'Wrong email or password. Please try again', + 'You should sign in or register to use this coupon' => 'You should sign in or register to use this coupon', + 'You\'re currently logged in. Please log out before requesting a new password.' => 'You\'re currently logged in. Please log out before requesting a new password.', +); diff --git a/local/modules/Front/I18n/fr_FR.php b/local/modules/Front/I18n/fr_FR.php new file mode 100644 index 00000000..35405e3e --- /dev/null +++ b/local/modules/Front/I18n/fr_FR.php @@ -0,0 +1,23 @@ + 'Le code promo ne peut être vide', + 'Delivery address does not belong to the current customer' => 'L\'adresse de livraison n\'appartient pas au client en cours', + 'Delivery module cannot be use with selected delivery address' => 'Le module de livraison ne peut pas être utilisé avec cette adresse de livraison', + 'Error during address deletion process' => 'Désolé. Une erreur s\'est produite lors de la suppression de l\'adresse', + 'Failed to add this article to your cart, please try again' => 'Impossible d\'ajouter cet article à votre panier. Merci de ré-essayer.', + 'Invoice address does not belong to the current customer' => 'L\'adresse de facturation n\'appartient pas au client en cours', + 'No placed order' => 'Aucune commande passée', + 'Please check your coupon code: %message' => 'Merci de vérifier votre code promo : %message', + 'Please check your input: %s' => 'Merci de vérifier les informations indiquées : %s', + 'Received failed order id does not belong to the current customer' => 'L\'id de commande refusée n\'appartient pas au client en cours', + 'Received placed order id does not belong to the current customer' => 'L\'id de commande passée n\'appartient pas au client en cours', + 'Sorry, an error occured: %s' => 'Désolé. Une erreur s\'est produite : %s', + 'Sorry, an error occurred: %message' => 'Désolé. Une erreur s\'est produite : %message', + 'Sorry, an error occurred: %s' => 'Désolé, une erreur est survenue : %s', + 'Thanks for signing up! We\'ll keep you posted whenever we have any new updates.' => 'Merci de votre inscription ! Nous vous tiendrons informé dès qu\'il y aura des nouveautés.', + 'To enable the virtual product feature, the VirtualProductDelivery module should be activated' => 'Pour activer les produits virtuels, le module VirtualProductDelivery doit être activé', + 'Wrong email or password. Please try again' => 'Adresse email ou mot de passe incorrect. Merci de ré-essayer.', + 'You should sign in or register to use this coupon' => 'Vous devez vous connecter ou vous inscrire pour utiliser ce coupon', + 'You\'re currently logged in. Please log out before requesting a new password.' => 'Vous être actuellement connecté au site. Vous devez vous déconnecter pour demander un nouveau mot de passe.', +]; diff --git a/local/modules/Front/I18n/it_IT.php b/local/modules/Front/I18n/it_IT.php new file mode 100644 index 00000000..041021bb --- /dev/null +++ b/local/modules/Front/I18n/it_IT.php @@ -0,0 +1,7 @@ + 'Il codice di sconto non può essere vuoto', + 'Thanks for signing up! We\'ll keep you posted whenever we have any new updates.' => 'Grazie per l\'inscrizione! Ti terremo aggiornato ogni volta che abbiamo eventuali nuovi aggiornamenti.', + 'You should sign in or register to use this coupon' => 'Dovresti accedere o registrarti per utilizzare questo coupon', +]; diff --git a/local/modules/Front/I18n/tr_TR.php b/local/modules/Front/I18n/tr_TR.php new file mode 100644 index 00000000..47004a8b --- /dev/null +++ b/local/modules/Front/I18n/tr_TR.php @@ -0,0 +1,22 @@ + 'Kupon şifre boş olamaz', + 'Delivery address does not belong to the current customer' => 'Teslimat adresi geçerli müşteriye ait değil', + 'Delivery module cannot be use with selected delivery address' => 'Teslim modülü seçili teslimat adresi kullanılamaz', + 'Error during address deletion process' => 'Adres silme işlemi sırasında bir hata oluştu', + 'Failed to add this article to your cart, please try again' => 'Sepetinize Bu ürün eklenemedi, lütfen tekrar deneyin', + 'Invoice address does not belong to the current customer' => 'Fatura adresi geçerli müşteriye ait değil', + 'No placed order' => 'Yerleştirilen hiçbir sipariş', + 'Please check your coupon code: %message' => 'Kupon kodunuzu gözden geçirin: %message', + 'Please check your input: %s' => 'Lütfen girişinizi denetleyin: %s', + 'Received failed order id does not belong to the current customer' => 'Alınan başarısız sipariş kimliği geçerli müşteriye ait değil', + 'Received placed order id does not belong to the current customer' => 'Alınmış yerleştirilmiş sipariş kimliği geçerli müşteriye ait değil', + 'Sorry, an error occured: %s' => 'Üzgünüz, bir hata oluştu: %s', + 'Sorry, an error occurred: %message' => 'Üzgünüz, bir hata oluştu: %message', + 'Sorry, an error occurred: %s' => 'Üzgünüz, bir hata oluştu: %s', + 'Thanks for signing up! We\'ll keep you posted whenever we have any new updates.' => 'Teşekkürler. Yeni güncelleştirmeler olduğunda sizi haberdar edeceğiz.', + 'To enable the virtual product feature, the VirtualProductDelivery module should be activated' => 'Sanal ürün özelliği etkinleştirmek için VirtualProductDelivery modülü etkinleştirilmesi', + 'Wrong email or password. Please try again' => 'Email adresi veya şifre hatalı. Lütfen tekrar deneyiniz', + 'You\'re currently logged in. Please log out before requesting a new password.' => 'Şu anda logged içinde. Lütfen yeni bir parola istemeden önce çıkış.', +]; diff --git a/local/modules/Front/LICENSE.txt b/local/modules/Front/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/Front/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/Front/composer.json b/local/modules/Front/composer.json new file mode 100644 index 00000000..b916b7bb --- /dev/null +++ b/local/modules/Front/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/front-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "Front" + } +} diff --git a/local/modules/HookAdminHome/Config/config.xml b/local/modules/HookAdminHome/Config/config.xml new file mode 100644 index 00000000..ad256c63 --- /dev/null +++ b/local/modules/HookAdminHome/Config/config.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/HookAdminHome/Config/module.xml b/local/modules/HookAdminHome/Config/module.xml new file mode 100644 index 00000000..33d483d8 --- /dev/null +++ b/local/modules/HookAdminHome/Config/module.xml @@ -0,0 +1,26 @@ + + + HookAdminHome\HookAdminHome + + Displays the default blocks on the homepage of the administration + + + Affiche les blocs par défaut sur la page d'accueil de l'administration + + + en_US + fr_FR + + 2.3.1 + + + Gilles Bourgeat + gilles@thelia.net + + + classic + 2.2.0 + prod + diff --git a/local/modules/HookAdminHome/Config/routing.xml b/local/modules/HookAdminHome/Config/routing.xml new file mode 100644 index 00000000..68cdbec5 --- /dev/null +++ b/local/modules/HookAdminHome/Config/routing.xml @@ -0,0 +1,17 @@ + + + + + + HookAdminHome\Controller\HomeController::loadStatsAjaxAction + + + + HookAdminHome\Controller\HomeController::processTemplateAction + ajax/thelia_news_feed + 1 + + + diff --git a/local/modules/HookAdminHome/Controller/HomeController.php b/local/modules/HookAdminHome/Controller/HomeController.php new file mode 100644 index 00000000..19b4717f --- /dev/null +++ b/local/modules/HookAdminHome/Controller/HomeController.php @@ -0,0 +1,146 @@ + + */ +class HomeController extends BaseAdminController +{ + /** + * Folder name for stats cache + */ + const STATS_CACHE_DIR = "stats"; + + /** + * Key prefix for stats cache + */ + const STATS_CACHE_KEY = "stats"; + + const RESOURCE_CODE = "admin.home"; + + public function loadStatsAjaxAction() + { + if (null !== $response = $this->checkAuth(self::RESOURCE_CODE, array(), AccessManager::VIEW)) { + return $response; + } + + $cacheExpire = ConfigQuery::getAdminCacheHomeStatsTTL(); + + $cacheContent = false; + + $month = (int) $this->getRequest()->query->get('month', date('m')); + $year = (int) $this->getRequest()->query->get('year', date('Y')); + + if ($cacheExpire) { + $context = "_" . $month . "_" . $year; + + $cacheKey = self::STATS_CACHE_KEY . $context; + + $cacheDriver = new FilesystemCache($this->getCacheDir()); + + if (!$this->getRequest()->query->get('flush', "0")) { + $cacheContent = $cacheDriver->fetch($cacheKey); + } else { + $cacheDriver->delete($cacheKey); + } + } + + if ($cacheContent === false) { + $data = new \stdClass(); + + $data->title = $this->getTranslator()->trans( + "Stats on %month/%year", + ['%month' => $month, '%year' => $year], + HookAdminHome::DOMAIN_NAME + ); + + /* sales */ + $saleSeries = new \stdClass(); + $saleSeries->color = self::testHexColor('sales_color', '#adadad'); + $saleSeries->data = OrderQuery::getMonthlySaleStats($month, $year); + + /* new customers */ + $newCustomerSeries = new \stdClass(); + $newCustomerSeries->color = self::testHexColor('customers_color', '#f39922'); + $newCustomerSeries->data = CustomerQuery::getMonthlyNewCustomersStats($month, $year); + + /* orders */ + $orderSeries = new \stdClass(); + $orderSeries->color = self::testHexColor('orders_color', '#5cb85c'); + $orderSeries->data = OrderQuery::getMonthlyOrdersStats($month, $year); + + /* first order */ + $firstOrderSeries = new \stdClass(); + $firstOrderSeries->color = self::testHexColor('first_orders_color', '#5bc0de'); + $firstOrderSeries->data = OrderQuery::getFirstOrdersStats($month, $year); + + /* cancelled orders */ + $cancelledOrderSeries = new \stdClass(); + $cancelledOrderSeries->color = self::testHexColor('cancelled_orders_color', '#d9534f'); + $cancelledOrderSeries->data = OrderQuery::getMonthlyOrdersStats($month, $year, array(5)); + + $data->series = array( + $saleSeries, + $newCustomerSeries, + $orderSeries, + $firstOrderSeries, + $cancelledOrderSeries, + ); + + $cacheContent = json_encode($data); + + if ($cacheExpire) { + $cacheDriver->save($cacheKey, $cacheContent, $cacheExpire); + } + } + + return $this->jsonResponse($cacheContent); + } + + /** + * get the cache directory for sitemap + * + * @return mixed|string + */ + protected function getCacheDir() + { + $cacheDir = $this->container->getParameter("kernel.cache_dir"); + $cacheDir = rtrim($cacheDir, '/'); + $cacheDir .= DIRECTORY_SEPARATOR . self::STATS_CACHE_DIR . DIRECTORY_SEPARATOR; + + return $cacheDir; + } + + /** + * @param string $key + * @param string $default + * @return string hexadecimal color or default argument + */ + protected function testHexColor($key, $default) + { + $hexColor = $this->getRequest()->query->get($key, $default); + + return preg_match('/^#[a-f0-9]{6}$/i', $hexColor) ? $hexColor : $default; + } +} diff --git a/local/modules/HookAdminHome/Hook/AdminHook.php b/local/modules/HookAdminHome/Hook/AdminHook.php new file mode 100644 index 00000000..309b6297 --- /dev/null +++ b/local/modules/HookAdminHome/Hook/AdminHook.php @@ -0,0 +1,71 @@ + + */ +class AdminHook extends BaseHook +{ + public function blockStatistics(HookRenderEvent $event) + { + $event->add($this->render('block-statistics.html')); + } + + public function blockStatisticsJs(HookRenderEvent $event) + { + $event->add($this->render('block-statistics-js.html')); + } + + public function blockSalesStatistics(HookRenderBlockEvent $event) + { + $content = trim($this->render("block-sales-statistics.html")); + if (!empty($content)) { + $event->add([ + "id" => "block-sales-statistics", + "title" => $this->trans("Sales statistics", [], HookAdminHome::DOMAIN_NAME), + "content" => $content + ]); + } + } + + public function blockNews(HookRenderBlockEvent $event) + { + $content = trim($this->render("block-news.html")); + if (!empty($content)) { + $event->add([ + "id" => "block-news", + "content" => $content + ]); + } + } + + public function blockTheliaInformation(HookRenderBlockEvent $event) + { + $content = trim($this->render("block-thelia-information.html")); + if (!empty($content)) { + $event->add([ + "id" => "block-thelia-information", + "title" => $this->trans("Thelia informations", [], HookAdminHome::DOMAIN_NAME), + "content" => $content + ]); + } + } +} diff --git a/local/modules/HookAdminHome/HookAdminHome.php b/local/modules/HookAdminHome/HookAdminHome.php new file mode 100644 index 00000000..1a403c0a --- /dev/null +++ b/local/modules/HookAdminHome/HookAdminHome.php @@ -0,0 +1,21 @@ + 'إحصائيات عن الشهر و السنة %month/%year', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/ar_SA.php b/local/modules/HookAdminHome/I18n/backOffice/default/ar_SA.php new file mode 100644 index 00000000..dafa0a35 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/ar_SA.php @@ -0,0 +1,11 @@ + 'تم إحباط الطلبات', + 'Average cart' => 'متوسط العربة', + 'Categories' => 'الفئات', + 'Click here' => 'انقر هنا', + 'Current version' => 'النسخة الحالية', + 'Customers' => 'العملاء', + 'Dashboard' => 'لوحة المعلومات', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/cs_CZ.php b/local/modules/HookAdminHome/I18n/backOffice/default/cs_CZ.php new file mode 100644 index 00000000..b1fe273d --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/cs_CZ.php @@ -0,0 +1,31 @@ + 'Aborted orders', + 'Average cart' => 'Average cart', + 'Categories' => 'Categories', + 'Click here' => 'Click here', + 'Current version' => 'Current version', + 'Customers' => 'Customers', + 'Dashboard' => 'Dashboard', + 'First orders' => 'First orders', + 'Latest version available' => 'Latest version available', + 'Lire la suite' => 'Lire la suite', + 'Loading Thelia lastest news...' => 'Loading Thelia lastest news...', + 'Loading...' => 'Loading...', + 'New customers' => 'New customers', + 'News' => 'News', + 'Offline products' => 'Offline products', + 'Online products' => 'Online products', + 'Orders' => 'Orders', + 'Overall sales' => 'Overall sales', + 'Previous month sales' => 'Previous month sales', + 'Previous year sales' => 'Previous year sales', + 'Products' => 'Products', + 'Sales' => 'Sales', + 'Sales excluding shipping' => 'Sales excluding shipping', + 'This month' => 'This month', + 'This year' => 'This year', + 'Today' => 'Today', + 'Yesterday sales' => 'Yesterday sales', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/de_DE.php b/local/modules/HookAdminHome/I18n/backOffice/default/de_DE.php new file mode 100644 index 00000000..07620ee9 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/de_DE.php @@ -0,0 +1,30 @@ + 'Abgebrochene Bestellungen', + 'Average cart' => 'Durchschnittlichen Warenkorb', + 'Categories' => 'Kategorien', + 'Click here' => 'Hier Klicken', + 'Current version' => 'Aktuelle Version', + 'Customers' => 'Kunden', + 'Dashboard' => 'Dashboard', + 'First orders' => 'Erste Bestellungen', + 'Latest version available' => 'Neueste Version verfügbar', + 'Lire la suite' => 'Weiterlesen', + 'Loading Thelia lastest news...' => 'THELIAs neuesten Nachrichten Laden ...', + 'Loading...' => 'Laden...', + 'New customers' => 'Neue Kunde', + 'Offline products' => 'Offline Produkte', + 'Online products' => 'Online Produkte', + 'Orders' => 'Bestellungen', + 'Overall sales' => 'Gesamtverkäufe', + 'Previous month sales' => 'Vorheriger Monat Verkäufe', + 'Previous year sales' => 'Vorheriges Jahr Verkäufe', + 'Products' => 'Produkte', + 'Sales' => 'Verkäufe', + 'Sales excluding shipping' => 'Verkäufe ohne Lieferung', + 'This month' => 'Diesen Monat', + 'This year' => 'Dieses Jahr', + 'Today' => 'Heute', + 'Yesterday sales' => 'Verkäufe von Gestern', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/en_US.php b/local/modules/HookAdminHome/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..0c70e849 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/en_US.php @@ -0,0 +1,32 @@ + 'Aborted orders', + 'Average cart' => 'Average cart', + 'Categories' => 'Categories', + 'Click here' => 'Click here', + 'Current version' => 'Current version', + 'Customers' => 'Customers', + 'Dashboard' => 'Dashboard', + 'First orders' => 'First orders', + 'Latest version available' => 'Latest version available', + 'Lire la suite' => 'Read more', + 'Loading Thelia lastest news...' => 'Loading Thelia lastest news...', + 'Loading...' => 'Loading...', + 'New customers' => 'New customers', + 'News' => 'News', + 'Offline products' => 'Offline products', + 'Online products' => 'Online products', + 'Orders' => 'Orders', + 'Overall sales' => 'Overall sales', + 'Previous month sales' => 'Previous month sales', + 'Previous year sales' => 'Previous year sales', + 'Products' => 'Products', + 'Sales' => 'Sales', + 'Sales excluding shipping' => 'Sales excluding shipping', + 'This month' => 'This month', + 'This year' => 'This year', + 'Today' => 'Today', + 'Yesterday sales' => 'Yesterday sales', + 'Read more' => 'Read more', +); diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/es_ES.php b/local/modules/HookAdminHome/I18n/backOffice/default/es_ES.php new file mode 100644 index 00000000..6537481f --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/es_ES.php @@ -0,0 +1,31 @@ + 'Pedidos abandonados', + 'Average cart' => 'Carrito medio', + 'Categories' => 'Categorías', + 'Click here' => 'Haz clic aquí', + 'Current version' => 'Versión actual', + 'Customers' => 'Clientes', + 'Dashboard' => 'Panel de Control', + 'First orders' => 'Primeros pedidos', + 'Latest version available' => 'Última versión disponible', + 'Lire la suite' => 'Leer más', + 'Loading Thelia lastest news...' => 'Carregant Thelia últimes notícies ...', + 'Loading...' => 'Carregant ...', + 'New customers' => 'Nuevos clientes', + 'News' => 'Noticias', + 'Offline products' => 'Productos fuera de línea', + 'Online products' => 'Productos en línea', + 'Orders' => 'Pedidos', + 'Overall sales' => 'Ventas totales', + 'Previous month sales' => 'Ventas del mes anterior', + 'Previous year sales' => 'Ventas del año anterior', + 'Products' => 'Productos', + 'Sales' => 'Ventas', + 'Sales excluding shipping' => 'Ventas sin el envio', + 'This month' => 'Este mes', + 'This year' => 'Este año', + 'Today' => 'Hoy', + 'Yesterday sales' => 'Ventas de ayer', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/fr_FR.php b/local/modules/HookAdminHome/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..187a5a2f --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,31 @@ + 'Paniers abandonnés', + 'Average cart' => 'Panier moyen', + 'Categories' => 'Rubriques', + 'Click here' => 'Cliquez ici', + 'Current version' => 'Version en cours', + 'Customers' => 'Clients', + 'Dashboard' => 'Tableau de bord', + 'First orders' => 'Premières commandes', + 'Latest version available' => 'Dernière version disponible', + 'Loading Thelia lastest news...' => 'Chargement des dernières information Thelia...', + 'Loading...' => 'Chargement...', + 'New customers' => 'Nouveaux clients', + 'News' => 'Actualités', + 'Offline products' => 'Produits hors ligne', + 'Online products' => 'Produits en ligne', + 'Orders' => 'Commandes', + 'Overall sales' => 'Total des ventes', + 'Previous month sales' => 'Ventes du mois précédent', + 'Previous year sales' => 'Ventes de l\'année précédente', + 'Products' => 'Produits', + 'Read more' => 'Lire la suite', + 'Sales' => 'Ventes', + 'Sales excluding shipping' => 'Ventes hors frais de port', + 'This month' => 'Ce mois', + 'This year' => 'Cette année', + 'Today' => 'Aujourd\'hui', + 'Yesterday sales' => 'Ventes de la veille', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/it_IT.php b/local/modules/HookAdminHome/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..de57bcf8 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/it_IT.php @@ -0,0 +1,32 @@ + 'Ordini annullati', + 'Average cart' => 'Carrello medio', + 'Categories' => 'Categorie', + 'Click here' => 'Clicca qui', + 'Current version' => 'Versione attuale', + 'Customers' => 'Clienti', + 'Dashboard' => 'Dashboard', + 'First orders' => 'Primi ordini', + 'Latest version available' => 'Ultima versione disponibile', + 'Lire la suite' => 'Per saperne di più', + 'Loading Thelia lastest news...' => 'Caricamento delle ultime notizie su Thelia...', + 'Loading...' => 'Caricamento...', + 'New customers' => 'Nuovi clienti', + 'News' => 'Notizie', + 'Offline products' => 'Prodotti non in linea', + 'Online products' => 'Prodotti online', + 'Orders' => 'Ordini', + 'Overall sales' => 'Vendite complessive', + 'Previous month sales' => 'Vendite del mese precedente', + 'Previous year sales' => 'Vendite dell\'anno precedente', + 'Products' => 'Prodotti', + 'Read more' => 'Per saperne di più', + 'Sales' => 'Vendite', + 'Sales excluding shipping' => 'Vendite escluse spese di spedizione', + 'This month' => 'Questo mese', + 'This year' => 'Quest\'anno', + 'Today' => 'Oggi', + 'Yesterday sales' => 'Vendite di ieri', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/pt_BR.php b/local/modules/HookAdminHome/I18n/backOffice/default/pt_BR.php new file mode 100644 index 00000000..7daaaee4 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/pt_BR.php @@ -0,0 +1,6 @@ + 'Ordens abortadas', + 'Click here' => 'Clique aqui', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/ru_RU.php b/local/modules/HookAdminHome/I18n/backOffice/default/ru_RU.php new file mode 100644 index 00000000..b1fe273d --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/ru_RU.php @@ -0,0 +1,31 @@ + 'Aborted orders', + 'Average cart' => 'Average cart', + 'Categories' => 'Categories', + 'Click here' => 'Click here', + 'Current version' => 'Current version', + 'Customers' => 'Customers', + 'Dashboard' => 'Dashboard', + 'First orders' => 'First orders', + 'Latest version available' => 'Latest version available', + 'Lire la suite' => 'Lire la suite', + 'Loading Thelia lastest news...' => 'Loading Thelia lastest news...', + 'Loading...' => 'Loading...', + 'New customers' => 'New customers', + 'News' => 'News', + 'Offline products' => 'Offline products', + 'Online products' => 'Online products', + 'Orders' => 'Orders', + 'Overall sales' => 'Overall sales', + 'Previous month sales' => 'Previous month sales', + 'Previous year sales' => 'Previous year sales', + 'Products' => 'Products', + 'Sales' => 'Sales', + 'Sales excluding shipping' => 'Sales excluding shipping', + 'This month' => 'This month', + 'This year' => 'This year', + 'Today' => 'Today', + 'Yesterday sales' => 'Yesterday sales', +]; diff --git a/local/modules/HookAdminHome/I18n/backOffice/default/tr_TR.php b/local/modules/HookAdminHome/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..6fcb84a3 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,31 @@ + 'İptal edilen siparişler', + 'Average cart' => 'Sepet Ortalaması', + 'Categories' => 'Katogoriler', + 'Click here' => 'Buraya tıklayın', + 'Current version' => 'Güncel Sürüm', + 'Customers' => 'müşteriler', + 'Dashboard' => 'Kontrol paneli', + 'First orders' => 'İlk emir', + 'Latest version available' => 'En son yorum elde edilebilir', + 'Lire la suite' => 'Devamını okuyun', + 'Loading Thelia lastest news...' => 'Thelia yükleme son haberler...', + 'Loading...' => 'Yükleneniyor…...', + 'New customers' => 'Yeni Müşteriler', + 'News' => 'Yeni Haberler', + 'Offline products' => 'Çevrimdışı ürünler', + 'Online products' => 'Online Ürünler', + 'Orders' => 'siparişler', + 'Overall sales' => 'Genel satış', + 'Previous month sales' => 'Önceki ay satış', + 'Previous year sales' => 'Önceki yılın satış', + 'Products' => 'ürün', + 'Sales' => 'Satış', + 'Sales excluding shipping' => 'Nakliye hariç satış', + 'This month' => 'Bu Ay', + 'This year' => 'Bu yıl', + 'Today' => 'bugün', + 'Yesterday sales' => 'Dün satış', +]; diff --git a/local/modules/HookAdminHome/I18n/cs_CZ.php b/local/modules/HookAdminHome/I18n/cs_CZ.php new file mode 100644 index 00000000..2ff4e47b --- /dev/null +++ b/local/modules/HookAdminHome/I18n/cs_CZ.php @@ -0,0 +1,7 @@ + 'Sales statistics', + 'Stats on %month/%year' => 'Stats on %month/%year', + 'Thelia informations' => 'Thelia information', +]; diff --git a/local/modules/HookAdminHome/I18n/de_DE.php b/local/modules/HookAdminHome/I18n/de_DE.php new file mode 100644 index 00000000..4405c981 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/de_DE.php @@ -0,0 +1,7 @@ + 'Verkaufsstatistiken', + 'Stats on %month/%year' => 'Statistiken für %month/%year', + 'Thelia informations' => 'Thelias Informationen', +]; diff --git a/local/modules/HookAdminHome/I18n/en_US.php b/local/modules/HookAdminHome/I18n/en_US.php new file mode 100644 index 00000000..a4d812ee --- /dev/null +++ b/local/modules/HookAdminHome/I18n/en_US.php @@ -0,0 +1,7 @@ + 'Stats on %month/%year', + 'Thelia informations' => 'Thelia information', + 'Sales statistics' => 'Sales statistics', +); diff --git a/local/modules/HookAdminHome/I18n/es_ES.php b/local/modules/HookAdminHome/I18n/es_ES.php new file mode 100644 index 00000000..fabace8e --- /dev/null +++ b/local/modules/HookAdminHome/I18n/es_ES.php @@ -0,0 +1,6 @@ + 'Estadísticas de ventas', + 'Thelia informations' => 'información sobre Thelia', +]; diff --git a/local/modules/HookAdminHome/I18n/fr_FR.php b/local/modules/HookAdminHome/I18n/fr_FR.php new file mode 100644 index 00000000..1fe9d72d --- /dev/null +++ b/local/modules/HookAdminHome/I18n/fr_FR.php @@ -0,0 +1,7 @@ + 'Statistiques de vente', + 'Stats on %month/%year' => 'Statistiques pour %month/%year', + 'Thelia informations' => 'Informations Thelia', +]; diff --git a/local/modules/HookAdminHome/I18n/id_ID.php b/local/modules/HookAdminHome/I18n/id_ID.php new file mode 100644 index 00000000..8cbc43ab --- /dev/null +++ b/local/modules/HookAdminHome/I18n/id_ID.php @@ -0,0 +1,5 @@ + 'Stats on %month/%year', +]; diff --git a/local/modules/HookAdminHome/I18n/it_IT.php b/local/modules/HookAdminHome/I18n/it_IT.php new file mode 100644 index 00000000..dcab80d9 --- /dev/null +++ b/local/modules/HookAdminHome/I18n/it_IT.php @@ -0,0 +1,6 @@ + 'Statistiche di vendita', + 'Thelia informations' => 'Thelia informazioni', +]; diff --git a/local/modules/HookAdminHome/I18n/ru_RU.php b/local/modules/HookAdminHome/I18n/ru_RU.php new file mode 100644 index 00000000..2ff4e47b --- /dev/null +++ b/local/modules/HookAdminHome/I18n/ru_RU.php @@ -0,0 +1,7 @@ + 'Sales statistics', + 'Stats on %month/%year' => 'Stats on %month/%year', + 'Thelia informations' => 'Thelia information', +]; diff --git a/local/modules/HookAdminHome/I18n/tr_TR.php b/local/modules/HookAdminHome/I18n/tr_TR.php new file mode 100644 index 00000000..b8d17e2e --- /dev/null +++ b/local/modules/HookAdminHome/I18n/tr_TR.php @@ -0,0 +1,7 @@ + 'Satış istatistikleri', + 'Stats on %month/%year' => '%month/%year istatistikleri', + 'Thelia informations' => 'Thelia bilgi', +]; diff --git a/local/modules/HookAdminHome/LICENSE.txt b/local/modules/HookAdminHome/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookAdminHome/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookAdminHome/composer.json b/local/modules/HookAdminHome/composer.json new file mode 100644 index 00000000..d5921a2c --- /dev/null +++ b/local/modules/HookAdminHome/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-admin-home-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookAdminHome" + } +} \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/ajax/thelia_news_feed.html b/local/modules/HookAdminHome/templates/backOffice/default/ajax/thelia_news_feed.html new file mode 100644 index 00000000..59aa6ee5 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/ajax/thelia_news_feed.html @@ -0,0 +1,29 @@ +{* this template is loaded via Ajax in the login page, to prevent login page slowdown *} + +{* Set the default translation domain, that will be used by intl when the 'd' parameter is not set *} +{default_translation_domain domain='hookadminhome.bo.default'} + +
+ {loop type="feed" name="thelia_feeds" url="http://thelia.net/feeds/?lang={$lang_code}" limit="3"} + +
+ +
+
+ {* we use unescape:"htmlall" to unescape var before truncate, to prevent a cut in the middel of an HTML entity, eg &ea... *} +

{$DESCRIPTION|strip_tags|unescape:"htmlall"|truncate:250:"...":true nofilter}

+
+ +
+
+ + {/loop} +
\ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/assets/css/home.css b/local/modules/HookAdminHome/templates/backOffice/default/assets/css/home.css new file mode 100644 index 00000000..1e9e24f0 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/assets/css/home.css @@ -0,0 +1 @@ +#block-information a{color:#8A8A8A}.stats{border-right:1px solid #f0f0f0;text-align:center}.stats:last-child{border-right:none}.stats h2{margin-top:0;margin-bottom:5px;font-size:30px}.stats p{margin-top:0;text-transform:uppercase;font-size:12px}@media (max-width:991px){.stats{margin-bottom:10px}.stats:nth-child(3){border-right:none}} \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/assets/less/home.less b/local/modules/HookAdminHome/templates/backOffice/default/assets/less/home.less new file mode 100644 index 00000000..14bfe85d --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/assets/less/home.less @@ -0,0 +1,39 @@ +@import "../../../../../../../../templates/backOffice/default/assets/less/bootstrap/variables.less"; +@import "../../../../../../../../templates/backOffice/default/assets/less/thelia/variables.less"; + +#block-information { + a { + color: #8A8A8A; + } +} + +.stats { + border-right: 1px solid @table-border-color; + text-align: center; + + &:last-child { + border-right: none; + } + + h2 { + margin-top: 0; + margin-bottom: 5px; + font-size: 30px; + } + + p { + margin-top: 0; + text-transform: uppercase; + font-size: @font-size-base - 1; // 12px + } +} + +@media (max-width: @screen-sm-max) { + .stats { + margin-bottom: 10px; + + &:nth-child(3) { + border-right: none; + } + } +} \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-information.html b/local/modules/HookAdminHome/templates/backOffice/default/block-information.html new file mode 100644 index 00000000..0557a24b --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-information.html @@ -0,0 +1,59 @@ +{* Do not display shop information block if user none of the required authorizations *} + +{capture name="shop_information_block_content"} + {loop type="auth" name="can_view" role="ADMIN" resource="admin.customer" access="VIEW"} + + {/loop} + + {loop type="auth" name="can_view" role="ADMIN" resource="admin.category" access="VIEW"} + + {/loop} + + {loop type="auth" name="can_view" role="ADMIN" resource="admin.product" access="VIEW"} + + + + {/loop} + + {loop type="auth" name="can_view" role="ADMIN" resource="admin.order" access="VIEW"} + + {/loop} +{/capture} + +{if trim($smarty.capture.shop_information_block_content) ne ""} +
+
+ {$smarty.capture.shop_information_block_content nofilter} +
+
+{/if} \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-news-js.html b/local/modules/HookAdminHome/templates/backOffice/default/block-news-js.html new file mode 100644 index 00000000..07fdec71 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-news-js.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-news.html b/local/modules/HookAdminHome/templates/backOffice/default/block-news.html new file mode 100644 index 00000000..2f64fbdb --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-news.html @@ -0,0 +1,3 @@ +
+
{intl l="Loading Thelia lastest news..." d='hookadminhome.bo.default'}
+
\ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-sales-statistics.html b/local/modules/HookAdminHome/templates/backOffice/default/block-sales-statistics.html new file mode 100644 index 00000000..ff196671 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-sales-statistics.html @@ -0,0 +1,136 @@ +{loop type="auth" name="can_view" role="ADMIN" resource="admin.order" access="VIEW"} + + + {capture assign=defaultCurrency} + {loop type="currency" name="default-currency" default_only="1"} + {$SYMBOL} + {/loop} + {/capture} + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{intl l="Overall sales" d='hookadminhome.bo.default'}{stats key="sales" startDate="today" endDate="today"} {$defaultCurrency}
{intl l="Sales excluding shipping" d='hookadminhome.bo.default'} + {$salesNoShipping = {stats key="sales" startDate="today" endDate="today" includeShipping="false"}} + {$salesNoShipping} {$defaultCurrency} +
{intl l="Yesterday sales" d='hookadminhome.bo.default'}{stats key="sales" startDate="yesterday" endDate="yesterday"} {$defaultCurrency}
{intl l="Orders" d='hookadminhome.bo.default'} + {$orderCount = {stats key="orders" startDate="today" endDate="today"}} + {$orderCount} +
{intl l="Average cart" d='hookadminhome.bo.default'} + {if $orderCount == 0} + 0 {$defaultCurrency} + {else} + {($salesNoShipping/$orderCount)|round:"2"} {$defaultCurrency} + {/if} +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{intl l="Overall sales" d='hookadminhome.bo.default'}{stats key="sales" startDate="this_month" endDate="this_month"} {$defaultCurrency}
{intl l="Sales excluding shipping" d='hookadminhome.bo.default'} + {$salesNoShipping = {stats key="sales" startDate="this_month" endDate="this_month" includeShipping="false"}} + {$salesNoShipping} {$defaultCurrency} +
{intl l="Previous month sales" d='hookadminhome.bo.default'}{stats key="sales" startDate="last_month" endDate="last_month"} {$defaultCurrency}
{intl l="Orders" d='hookadminhome.bo.default'} + {$orderCount = {stats key="orders" startDate="this_month" endDate="this_month"}} + {$orderCount} +
{intl l="Average cart" d='hookadminhome.bo.default'} + {if $orderCount == 0} + 0 {$defaultCurrency} + {else} + {($salesNoShipping/$orderCount)|round:"2"} {$defaultCurrency} + {/if} +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{intl l="Overall sales" d='hookadminhome.bo.default'}{stats key="sales" startDate="this_year" endDate="this_year"} {$defaultCurrency}
{intl l="Sales excluding shipping" d='hookadminhome.bo.default'} + {$salesNoShipping = {stats key="sales" startDate="this_year" endDate="this_year" includeShipping="false"}} + {$salesNoShipping} {$defaultCurrency} +
{intl l="Previous year sales" d='hookadminhome.bo.default'}{stats key="sales" startDate="last_year" endDate="last_year"} {$defaultCurrency}
{intl l="Orders" d='hookadminhome.bo.default'} + {$orderCount = {stats key="orders" startDate="this_year" endDate="this_year"}} + {$orderCount} +
{intl l="Average cart" d='hookadminhome.bo.default'} + {if $orderCount == 0} + 0 {$defaultCurrency} + {else} + {($salesNoShipping/$orderCount)|round:"2"} {$defaultCurrency} + {/if} +
+
+
+
+{/loop} \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-statistics-js.html b/local/modules/HookAdminHome/templates/backOffice/default/block-statistics-js.html new file mode 100644 index 00000000..b8593ce5 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-statistics-js.html @@ -0,0 +1,195 @@ +{javascripts file='assets/js/jqplot/jquery.jqplot.min.js'} + +{/javascripts} +{javascripts file='assets/js/jqplot/plugins/jqplot.highlighter.min.js'} + +{/javascripts} +{javascripts file='assets/js/jqplot/plugins/jqplot.barRenderer.min.js'} + +{/javascripts} +{javascripts file='assets/js/jqplot/plugins/jqplot.pieRenderer.min.js'} + +{/javascripts} +{javascripts file='assets/js/moment-with-locales.min.js'} + +{/javascripts} +{javascripts file='assets/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js'} + +{/javascripts} + + \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-statistics.html b/local/modules/HookAdminHome/templates/backOffice/default/block-statistics.html new file mode 100644 index 00000000..e29e7135 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-statistics.html @@ -0,0 +1,34 @@ +{loop type="auth" name="can_view" role="ADMIN" resource="admin.order" access="VIEW"} +
+ +
+ {intl l='Dashboard' d='hookadminhome.bo.default'} +
+ + + + + + + +
+
+ +
+
+ + + + + +
+
+ +
+ +
+
+
+ +
+{/loop} \ No newline at end of file diff --git a/local/modules/HookAdminHome/templates/backOffice/default/block-thelia-information.html b/local/modules/HookAdminHome/templates/backOffice/default/block-thelia-information.html new file mode 100644 index 00000000..fa799906 --- /dev/null +++ b/local/modules/HookAdminHome/templates/backOffice/default/block-thelia-information.html @@ -0,0 +1,18 @@ +
+ + + + + + + + + + + + + + + +
{intl l="Current version" d='hookadminhome.bo.default'}{$THELIA_VERSION}
{intl l="Latest version available"}{intl l="Loading..." d='hookadminhome.bo.default'}
{intl l="News"}{intl l="Click here" d='hookadminhome.bo.default'}
+
\ No newline at end of file diff --git a/local/modules/HookAnalytics/Config/config.xml b/local/modules/HookAnalytics/Config/config.xml new file mode 100644 index 00000000..57a6cb0f --- /dev/null +++ b/local/modules/HookAnalytics/Config/config.xml @@ -0,0 +1,21 @@ + + + + + +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/local/modules/HookAnalytics/Config/module.xml b/local/modules/HookAnalytics/Config/module.xml new file mode 100644 index 00000000..948220ce --- /dev/null +++ b/local/modules/HookAnalytics/Config/module.xml @@ -0,0 +1,24 @@ + + + HookAnalytics\HookAnalytics + + Analytics (Google) + + + Statistiques (Google) + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookAnalytics/Config/routing.xml b/local/modules/HookAnalytics/Config/routing.xml new file mode 100644 index 00000000..269697d7 --- /dev/null +++ b/local/modules/HookAnalytics/Config/routing.xml @@ -0,0 +1,10 @@ + + + + + HookAnalytics\Controller\Configuration::saveAction + + + diff --git a/local/modules/HookAnalytics/Controller/Configuration.php b/local/modules/HookAnalytics/Controller/Configuration.php new file mode 100644 index 00000000..dc083f55 --- /dev/null +++ b/local/modules/HookAnalytics/Controller/Configuration.php @@ -0,0 +1,57 @@ + + */ +class Configuration extends BaseAdminController { + + public function saveAction() + { + + if (null !== $response = $this->checkAuth(array(AdminResources::MODULE), array('hookanalytics'), AccessManager::UPDATE)) { + return $response; + } + + $form = new \HookAnalytics\Form\Configuration($this->getRequest()); + $resp = array( + "error" => 0, + "message" => "" + ); + $response=null; + + try { + $vform = $this->validateForm($form); + $data = $vform->getData(); + + ConfigQuery::write("hookanalytics_trackingcode", $data["trackingcode"], false, true); + + } catch (\Exception $e) { + $resp["error"] = 1; + $resp["message"] = $e->getMessage(); + } + + return JsonResponse::create($resp); + } + +} \ No newline at end of file diff --git a/local/modules/HookAnalytics/Form/Configuration.php b/local/modules/HookAnalytics/Form/Configuration.php new file mode 100644 index 00000000..01db6191 --- /dev/null +++ b/local/modules/HookAnalytics/Form/Configuration.php @@ -0,0 +1,54 @@ + + */ +class Configuration extends BaseForm { + + protected function buildForm() + { + $form = $this->formBuilder; + + $value = ConfigQuery::read("hookanalytics_trackingcode", ""); + $form->add( + "trackingcode", + "text", + array( + 'data' => $value, + 'label' => Translator::getInstance()->trans("Tracking Code"), + 'label_attr' => array( + 'for' => "trackingcode" + ), + ) + ); + + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "hookanalytics"; + } + + +} \ No newline at end of file diff --git a/local/modules/HookAnalytics/Hook/FrontHook.php b/local/modules/HookAnalytics/Hook/FrontHook.php new file mode 100644 index 00000000..11bd3c6c --- /dev/null +++ b/local/modules/HookAnalytics/Hook/FrontHook.php @@ -0,0 +1,33 @@ + + */ +class FrontHook extends BaseHook { + + public function onMainHeadBottom(HookRenderEvent $event) + { + $value = trim(ConfigQuery::read("hookanalytics_trackingcode", "")); + if ("" != $value){ + $event->add($value); + } + } +} \ No newline at end of file diff --git a/local/modules/HookAnalytics/HookAnalytics.php b/local/modules/HookAnalytics/HookAnalytics.php new file mode 100644 index 00000000..2636e381 --- /dev/null +++ b/local/modules/HookAnalytics/HookAnalytics.php @@ -0,0 +1,20 @@ + 'Ein Fehler ist aufgetreten', + 'Edit your analytics configuration.' => 'Analytics-Konfiguration bearbeiten.', + 'Save' => 'Speichern', +]; diff --git a/local/modules/HookAnalytics/I18n/backOffice/default/en_US.php b/local/modules/HookAnalytics/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..ef8b1f98 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/backOffice/default/en_US.php @@ -0,0 +1,7 @@ + 'An error occured', + 'Edit your analytics configuration.' => 'Edit your analytics configuration.', + 'Save' => 'Save', +); diff --git a/local/modules/HookAnalytics/I18n/backOffice/default/fr_FR.php b/local/modules/HookAnalytics/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..56712bd3 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,7 @@ + 'Une erreur est survenue', + 'Edit your analytics configuration.' => 'Modifier la configuration des statistiques', + 'Save' => ' Enregistrer', +]; diff --git a/local/modules/HookAnalytics/I18n/backOffice/default/it_IT.php b/local/modules/HookAnalytics/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..0c59bda5 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/backOffice/default/it_IT.php @@ -0,0 +1,5 @@ + 'Salvare', +]; diff --git a/local/modules/HookAnalytics/I18n/backOffice/default/tr_TR.php b/local/modules/HookAnalytics/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..8e913080 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,7 @@ + 'Bir hata meydana geldi', + 'Edit your analytics configuration.' => 'Analytics yapılandırmanızı düzenleyin.', + 'Save' => 'kaydet', +]; diff --git a/local/modules/HookAnalytics/I18n/de_DE.php b/local/modules/HookAnalytics/I18n/de_DE.php new file mode 100644 index 00000000..e1b30511 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/de_DE.php @@ -0,0 +1,5 @@ + 'Tracking-Code', +]; diff --git a/local/modules/HookAnalytics/I18n/en_US.php b/local/modules/HookAnalytics/I18n/en_US.php new file mode 100644 index 00000000..ba8939d7 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/en_US.php @@ -0,0 +1,5 @@ + 'Tracking Code', +); diff --git a/local/modules/HookAnalytics/I18n/fr_FR.php b/local/modules/HookAnalytics/I18n/fr_FR.php new file mode 100644 index 00000000..ab7c10b8 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Code de suivi', +]; diff --git a/local/modules/HookAnalytics/I18n/frontOffice/default/de_DE.php b/local/modules/HookAnalytics/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..938a9f4a --- /dev/null +++ b/local/modules/HookAnalytics/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google+', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS-Feed', + 'Twitter' => 'Twitter', + 'Youtube' => 'YouTube', +]; diff --git a/local/modules/HookAnalytics/I18n/frontOffice/default/en_US.php b/local/modules/HookAnalytics/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..534a4d03 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/frontOffice/default/en_US.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google+', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS Feed', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +); diff --git a/local/modules/HookAnalytics/I18n/frontOffice/default/fr_FR.php b/local/modules/HookAnalytics/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..7b64f075 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google+', + 'Instagram' => 'Instagram', + 'RSS' => 'Flux RSS', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +]; diff --git a/local/modules/HookAnalytics/I18n/frontOffice/default/it_IT.php b/local/modules/HookAnalytics/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..15298b70 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google +', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS Feed', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +]; diff --git a/local/modules/HookAnalytics/I18n/frontOffice/default/tr_TR.php b/local/modules/HookAnalytics/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..b951272b --- /dev/null +++ b/local/modules/HookAnalytics/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google +', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS Beslemesi', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +]; diff --git a/local/modules/HookAnalytics/I18n/it_IT.php b/local/modules/HookAnalytics/I18n/it_IT.php new file mode 100644 index 00000000..bcce8768 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/it_IT.php @@ -0,0 +1,5 @@ + 'Codice di monitoraggio', +]; diff --git a/local/modules/HookAnalytics/I18n/tr_TR.php b/local/modules/HookAnalytics/I18n/tr_TR.php new file mode 100644 index 00000000..3e16a023 --- /dev/null +++ b/local/modules/HookAnalytics/I18n/tr_TR.php @@ -0,0 +1,5 @@ + 'İzleme Kodu', +]; diff --git a/local/modules/HookAnalytics/LICENSE.txt b/local/modules/HookAnalytics/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookAnalytics/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookAnalytics/composer.json b/local/modules/HookAnalytics/composer.json new file mode 100644 index 00000000..efe5231d --- /dev/null +++ b/local/modules/HookAnalytics/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-analytics-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookAnalytics" + } +} diff --git a/local/modules/HookAnalytics/templates/backOffice/default/assets/js/module-configuration.js b/local/modules/HookAnalytics/templates/backOffice/default/assets/js/module-configuration.js new file mode 100644 index 00000000..fe180bb7 --- /dev/null +++ b/local/modules/HookAnalytics/templates/backOffice/default/assets/js/module-configuration.js @@ -0,0 +1,29 @@ +$(document).ready(function() { + $("#hookanalytics-form").on("submit", function(e, data){ + e.preventDefault(); + var form = $(this); + + $('body').append(''); + + $.ajax({ + url: form.attr('action'), + type: form.attr('method'), + data: form.serialize() + }).done(function(){ + $("#loading-event").remove(); + }) + .success(function(data) { + if (data.error != 0) { + $("#loading-event").remove(); + $('#hookanalytics-failed-body').html(data.message); + $("#hookanalytics-failed").modal("show"); + } + }) + .fail(function(jqXHR, textStatus, errorThrown){ + $("#loading-event").remove(); + $('#hookanalytics-failed-body').html(jqXHR.responseJSON.message); + $("#hookanalytics-failed").modal("show"); + }); + + }); +}); \ No newline at end of file diff --git a/local/modules/HookAnalytics/templates/backOffice/default/module_configuration.html b/local/modules/HookAnalytics/templates/backOffice/default/module_configuration.html new file mode 100644 index 00000000..c80b88ab --- /dev/null +++ b/local/modules/HookAnalytics/templates/backOffice/default/module_configuration.html @@ -0,0 +1,52 @@ + + + +
+
+ +
+ {intl l='Edit your analytics configuration.'} +
+ +
+
+ + {form name="hookanalytics.configuration.form"} + + + {form_hidden_fields} + + {form_field field='trackingcode'} +
+ + +
+ {/form_field} + + + + {/form} + +
+ +
+ +
+
+ + + + diff --git a/local/modules/HookCart/Config/config.xml b/local/modules/HookCart/Config/config.xml new file mode 100644 index 00000000..f8c3dce8 --- /dev/null +++ b/local/modules/HookCart/Config/config.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/local/modules/HookCart/Config/module.xml b/local/modules/HookCart/Config/module.xml new file mode 100644 index 00000000..a5a0ecfa --- /dev/null +++ b/local/modules/HookCart/Config/module.xml @@ -0,0 +1,24 @@ + + + HookCart\HookCart + + Block Cart + + + Bloc Panier + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookCart/HookCart.php b/local/modules/HookCart/HookCart.php new file mode 100644 index 00000000..da8d0e9a --- /dev/null +++ b/local/modules/HookCart/HookCart.php @@ -0,0 +1,20 @@ + 'Warenkorb', + 'Checkout' => 'Zur Kasse', + 'Remove' => 'Entfernen', + 'View Cart' => 'Warenkorb anzeigen', + 'You have no items in your shopping cart.' => 'Sie haben keine Produkte im Warenkorb', +]; diff --git a/local/modules/HookCart/I18n/frontOffice/default/en_US.php b/local/modules/HookCart/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..3f99d2c5 --- /dev/null +++ b/local/modules/HookCart/I18n/frontOffice/default/en_US.php @@ -0,0 +1,9 @@ + 'Cart', + 'Checkout' => 'Checkout', + 'Remove' => 'Remove', + 'View Cart' => 'View Cart', + 'You have no items in your shopping cart.' => 'You have no items in your shopping cart.', +); diff --git a/local/modules/HookCart/I18n/frontOffice/default/fr_FR.php b/local/modules/HookCart/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..088f21ef --- /dev/null +++ b/local/modules/HookCart/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,9 @@ + 'Panier', + 'Checkout' => 'Commande', + 'Remove' => 'Supprimer', + 'View Cart' => 'Voir le panier', + 'You have no items in your shopping cart.' => 'Vous n\'avez pas de produit dans votre panier.', +]; diff --git a/local/modules/HookCart/I18n/frontOffice/default/it_IT.php b/local/modules/HookCart/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..dac05d5d --- /dev/null +++ b/local/modules/HookCart/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,9 @@ + 'Carrello', + 'Checkout' => 'Procedi all\'acquisto', + 'Remove' => 'Rimuovi', + 'View Cart' => 'Visualizza il carrello', + 'You have no items in your shopping cart.' => 'Non hai nessun prodotto nel tuo carrello.', +]; diff --git a/local/modules/HookCart/I18n/frontOffice/default/tr_TR.php b/local/modules/HookCart/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..04f4cc85 --- /dev/null +++ b/local/modules/HookCart/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,9 @@ + 'Sepet', + 'Checkout' => 'Ödeme yap', + 'Remove' => 'Kaldır', + 'View Cart' => 'Sepeti Görüntüle', + 'You have no items in your shopping cart.' => 'Sepetinizde hiç ürün yok.', +]; diff --git a/local/modules/HookCart/LICENSE.txt b/local/modules/HookCart/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookCart/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookCart/composer.json b/local/modules/HookCart/composer.json new file mode 100644 index 00000000..f56a5cb6 --- /dev/null +++ b/local/modules/HookCart/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-cart-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookCart" + } +} diff --git a/local/modules/HookCart/templates/frontOffice/default/assets/css/styles.css b/local/modules/HookCart/templates/frontOffice/default/assets/css/styles.css new file mode 100644 index 00000000..e69de29b diff --git a/local/modules/HookCart/templates/frontOffice/default/main-navbar-secondary.html b/local/modules/HookCart/templates/frontOffice/default/main-navbar-secondary.html new file mode 100644 index 00000000..a5df3814 --- /dev/null +++ b/local/modules/HookCart/templates/frontOffice/default/main-navbar-secondary.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/local/modules/HookCart/templates/frontOffice/default/mini-cart.html b/local/modules/HookCart/templates/frontOffice/default/mini-cart.html new file mode 100644 index 00000000..edfd8bfd --- /dev/null +++ b/local/modules/HookCart/templates/frontOffice/default/mini-cart.html @@ -0,0 +1,81 @@ +{ifloop rel="cartloop"} + +{/ifloop} +{elseloop rel="cartloop"} + +{/elseloop} diff --git a/local/modules/HookContact/Config/config.xml b/local/modules/HookContact/Config/config.xml new file mode 100644 index 00000000..5c54bc9c --- /dev/null +++ b/local/modules/HookContact/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/local/modules/HookContact/Config/module.xml b/local/modules/HookContact/Config/module.xml new file mode 100644 index 00000000..388a1b27 --- /dev/null +++ b/local/modules/HookContact/Config/module.xml @@ -0,0 +1,24 @@ + + + HookContact\HookContact + + Block Contact + + + Bloc Contact + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookContact/Hook/FrontHook.php b/local/modules/HookContact/Hook/FrontHook.php new file mode 100644 index 00000000..8ed956f5 --- /dev/null +++ b/local/modules/HookContact/Hook/FrontHook.php @@ -0,0 +1,39 @@ + + */ +class FrontHook extends BaseHook +{ + public function onMainFooterBody(HookRenderBlockEvent $event) + { + $content = trim($this->render("main-footer-body.html")); + if ("" != $content) { + $event->add( + array( + "id" => "contact-footer-body", + "class" => "contact", + "title" => $this->trans("Contact", array(), "hookcontact"), + "content" => $content + ) + ); + } + } +} diff --git a/local/modules/HookContact/HookContact.php b/local/modules/HookContact/HookContact.php new file mode 100644 index 00000000..2b8df283 --- /dev/null +++ b/local/modules/HookContact/HookContact.php @@ -0,0 +1,20 @@ + 'Kontakt', +]; diff --git a/local/modules/HookContact/I18n/en_US.php b/local/modules/HookContact/I18n/en_US.php new file mode 100644 index 00000000..55aea96d --- /dev/null +++ b/local/modules/HookContact/I18n/en_US.php @@ -0,0 +1,5 @@ + 'Contact', +); diff --git a/local/modules/HookContact/I18n/fr_FR.php b/local/modules/HookContact/I18n/fr_FR.php new file mode 100644 index 00000000..896efb7c --- /dev/null +++ b/local/modules/HookContact/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Contact', +]; diff --git a/local/modules/HookContact/I18n/frontOffice/default/fr_FR.php b/local/modules/HookContact/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..d8eb50ed --- /dev/null +++ b/local/modules/HookContact/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,5 @@ + 'Nous trouver, Nous contacter', +]; diff --git a/local/modules/HookContact/I18n/it_IT.php b/local/modules/HookContact/I18n/it_IT.php new file mode 100644 index 00000000..11ee0ec2 --- /dev/null +++ b/local/modules/HookContact/I18n/it_IT.php @@ -0,0 +1,5 @@ + 'Contatta', +]; diff --git a/local/modules/HookContact/I18n/tr_TR.php b/local/modules/HookContact/I18n/tr_TR.php new file mode 100644 index 00000000..31680df5 --- /dev/null +++ b/local/modules/HookContact/I18n/tr_TR.php @@ -0,0 +1,5 @@ + 'İletişim', +]; diff --git a/local/modules/HookContact/LICENSE.txt b/local/modules/HookContact/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookContact/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookContact/composer.json b/local/modules/HookContact/composer.json new file mode 100644 index 00000000..2ecdb22a --- /dev/null +++ b/local/modules/HookContact/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-contact-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookContact" + } +} diff --git a/local/modules/HookContact/templates/frontOffice/default/main-footer-body.html b/local/modules/HookContact/templates/frontOffice/default/main-footer-body.html new file mode 100644 index 00000000..9eea38b6 --- /dev/null +++ b/local/modules/HookContact/templates/frontOffice/default/main-footer-body.html @@ -0,0 +1,25 @@ +
+ +
    +
  • +
    + {config key="store_address1"} {config key="store_address2"} {config key="store_address3"}
    + {config key="store_zipcode"} + + {config key="store_city"} + {if {config key="store_country"} } + {loop type="country" name="address.country.title" id={config key="store_country"}}, {$TITLE}{/loop} + {/if} + +
    +
  • + {if {config key="store_phone"} } +
  • + {config key="store_phone"} +
  • + {/if} +
  • + {intl l="Find us, Contact us" d="hookcontact.fo.default"} +
  • +
+
diff --git a/local/modules/HookCurrency/Config/config.xml b/local/modules/HookCurrency/Config/config.xml new file mode 100644 index 00000000..1b5deb78 --- /dev/null +++ b/local/modules/HookCurrency/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/local/modules/HookCurrency/Config/module.xml b/local/modules/HookCurrency/Config/module.xml new file mode 100644 index 00000000..567c89ab --- /dev/null +++ b/local/modules/HookCurrency/Config/module.xml @@ -0,0 +1,24 @@ + + + HookCurrency\HookCurrency + + Block Currency + + + Bloc Devise + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookCurrency/HookCurrency.php b/local/modules/HookCurrency/HookCurrency.php new file mode 100644 index 00000000..63d66296 --- /dev/null +++ b/local/modules/HookCurrency/HookCurrency.php @@ -0,0 +1,20 @@ + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookCurrency/composer.json b/local/modules/HookCurrency/composer.json new file mode 100644 index 00000000..58767943 --- /dev/null +++ b/local/modules/HookCurrency/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-currency-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookCurrency" + } +} diff --git a/local/modules/HookCurrency/templates/frontOffice/default/main-navbar-secondary.html b/local/modules/HookCurrency/templates/frontOffice/default/main-navbar-secondary.html new file mode 100644 index 00000000..0a8faad9 --- /dev/null +++ b/local/modules/HookCurrency/templates/frontOffice/default/main-navbar-secondary.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/local/modules/HookCustomer/Config/config.xml b/local/modules/HookCustomer/Config/config.xml new file mode 100644 index 00000000..63a29ce5 --- /dev/null +++ b/local/modules/HookCustomer/Config/config.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/local/modules/HookCustomer/Config/module.xml b/local/modules/HookCustomer/Config/module.xml new file mode 100644 index 00000000..d4af10b3 --- /dev/null +++ b/local/modules/HookCustomer/Config/module.xml @@ -0,0 +1,24 @@ + + + HookCustomer\HookCustomer + + Block Customer + + + Bloc Client + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookCustomer/HookCustomer.php b/local/modules/HookCustomer/HookCustomer.php new file mode 100644 index 00000000..eab3f96a --- /dev/null +++ b/local/modules/HookCustomer/HookCustomer.php @@ -0,0 +1,20 @@ + 'E-mail Adresse', + 'Forgot your Password?' => 'Haben sir Ihr Passwort vergessen ?', + 'Log In!' => 'Log In!', + 'Log out!' => 'Log out!', + 'My Account' => 'Mein Kundenkonto', + 'Password' => 'Passwort', + 'Register' => 'Registrieren', + 'Register!' => 'Registrieren!', + 'Sign In' => 'Registrieren', +]; diff --git a/local/modules/HookCustomer/I18n/frontOffice/default/en_US.php b/local/modules/HookCustomer/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..102c3129 --- /dev/null +++ b/local/modules/HookCustomer/I18n/frontOffice/default/en_US.php @@ -0,0 +1,13 @@ + 'Email address', + 'Forgot your Password?' => 'Forgot your Password?', + 'Log In!' => 'Log In!', + 'Log out!' => 'Log out!', + 'My Account' => 'My Account', + 'Password' => 'Password', + 'Register' => 'Register', + 'Register!' => 'Register!', + 'Sign In' => 'Sign In', +); diff --git a/local/modules/HookCustomer/I18n/frontOffice/default/fr_FR.php b/local/modules/HookCustomer/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..8a899390 --- /dev/null +++ b/local/modules/HookCustomer/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,13 @@ + 'Adresse e-mail', + 'Forgot your Password?' => 'Mot de passe oublié ?', + 'Log In!' => 'Se connecter', + 'Log out!' => 'Se déconnecter', + 'My Account' => 'Mon compte', + 'Password' => 'Mot de passe', + 'Register' => 'S\'inscrire', + 'Register!' => 'Enregistrez-vous !', + 'Sign In' => 'Se connecter', +]; diff --git a/local/modules/HookCustomer/I18n/frontOffice/default/it_IT.php b/local/modules/HookCustomer/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..aba7ec5d --- /dev/null +++ b/local/modules/HookCustomer/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,13 @@ + 'Indirizzo email', + 'Forgot your Password?' => 'Hai dimenticato la password?', + 'Log In!' => 'Accedi!', + 'Log out!' => 'Esci!', + 'My Account' => 'Mio account', + 'Password' => 'Password', + 'Register' => 'Registrati', + 'Register!' => 'Registrati!', + 'Sign In' => 'Accedi', +]; diff --git a/local/modules/HookCustomer/I18n/frontOffice/default/tr_TR.php b/local/modules/HookCustomer/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..83c6b6fd --- /dev/null +++ b/local/modules/HookCustomer/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,13 @@ + 'Eposta adresi', + 'Forgot your Password?' => 'Parolanızı mı unuttunuz?', + 'Log In!' => 'Oturum aç!', + 'Log out!' => 'Çıkış Yap!', + 'My Account' => 'Hesabım', + 'Password' => 'Parola', + 'Register' => 'Kaydol', + 'Register!' => 'Kayıt ol!', + 'Sign In' => 'Oturum Aç', +]; diff --git a/local/modules/HookCustomer/LICENSE.txt b/local/modules/HookCustomer/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookCustomer/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookCustomer/composer.json b/local/modules/HookCustomer/composer.json new file mode 100644 index 00000000..d081b403 --- /dev/null +++ b/local/modules/HookCustomer/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-customer-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookCustomer" + } +} diff --git a/local/modules/HookCustomer/templates/frontOffice/default/assets/css/styles.css b/local/modules/HookCustomer/templates/frontOffice/default/assets/css/styles.css new file mode 100644 index 00000000..e69de29b diff --git a/local/modules/HookCustomer/templates/frontOffice/default/main-navbar-secondary.html b/local/modules/HookCustomer/templates/frontOffice/default/main-navbar-secondary.html new file mode 100644 index 00000000..13d84fd5 --- /dev/null +++ b/local/modules/HookCustomer/templates/frontOffice/default/main-navbar-secondary.html @@ -0,0 +1,43 @@ + \ No newline at end of file diff --git a/local/modules/HookLang/Config/config.xml b/local/modules/HookLang/Config/config.xml new file mode 100644 index 00000000..d30cb542 --- /dev/null +++ b/local/modules/HookLang/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/local/modules/HookLang/Config/module.xml b/local/modules/HookLang/Config/module.xml new file mode 100644 index 00000000..786823b7 --- /dev/null +++ b/local/modules/HookLang/Config/module.xml @@ -0,0 +1,24 @@ + + + HookLang\HookLang + + Block Languages + + + Bloc langages + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookLang/HookLang.php b/local/modules/HookLang/HookLang.php new file mode 100644 index 00000000..2ab93ac2 --- /dev/null +++ b/local/modules/HookLang/HookLang.php @@ -0,0 +1,20 @@ + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookLang/composer.json b/local/modules/HookLang/composer.json new file mode 100644 index 00000000..c5338646 --- /dev/null +++ b/local/modules/HookLang/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-lang-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookLang" + } +} diff --git a/local/modules/HookLang/templates/frontOffice/default/main-navbar-secondary.html b/local/modules/HookLang/templates/frontOffice/default/main-navbar-secondary.html new file mode 100644 index 00000000..a61a7a1e --- /dev/null +++ b/local/modules/HookLang/templates/frontOffice/default/main-navbar-secondary.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/local/modules/HookLinks/Config/config.xml b/local/modules/HookLinks/Config/config.xml new file mode 100644 index 00000000..6036b5d0 --- /dev/null +++ b/local/modules/HookLinks/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/local/modules/HookLinks/Config/module.xml b/local/modules/HookLinks/Config/module.xml new file mode 100644 index 00000000..cb4c9022 --- /dev/null +++ b/local/modules/HookLinks/Config/module.xml @@ -0,0 +1,24 @@ + + + HookLinks\HookLinks + + Block Useful links + + + Bloc Liens utiles + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookLinks/Hook/FrontHook.php b/local/modules/HookLinks/Hook/FrontHook.php new file mode 100644 index 00000000..3f0a4829 --- /dev/null +++ b/local/modules/HookLinks/Hook/FrontHook.php @@ -0,0 +1,38 @@ + + */ +class FrontHook extends BaseHook { + + public function onMainFooterBody(HookRenderBlockEvent $event) + { + $content = trim($this->render("main-footer-body.html")); + if ("" != $content){ + $event->add(array( + "id" => "links-footer-body", + "class" => "default", + "title" => $this->trans("Useful links", array(), "hooklinks"), + "content" => $content + )); + } + } + +} \ No newline at end of file diff --git a/local/modules/HookLinks/HookLinks.php b/local/modules/HookLinks/HookLinks.php new file mode 100644 index 00000000..28e00f98 --- /dev/null +++ b/local/modules/HookLinks/HookLinks.php @@ -0,0 +1,20 @@ + 'Nützliche Links', +]; diff --git a/local/modules/HookLinks/I18n/en_US.php b/local/modules/HookLinks/I18n/en_US.php new file mode 100644 index 00000000..531cd8a6 --- /dev/null +++ b/local/modules/HookLinks/I18n/en_US.php @@ -0,0 +1,5 @@ + 'Useful links', +); diff --git a/local/modules/HookLinks/I18n/fr_FR.php b/local/modules/HookLinks/I18n/fr_FR.php new file mode 100644 index 00000000..95d22cf1 --- /dev/null +++ b/local/modules/HookLinks/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Liens utiles', +]; diff --git a/local/modules/HookLinks/I18n/frontOffice/default/de_DE.php b/local/modules/HookLinks/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..1dc47f8d --- /dev/null +++ b/local/modules/HookLinks/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,10 @@ + 'Warenkorb', + 'Checkout' => 'Zur Kasse', + 'Log out!' => 'Log out!', + 'Login' => 'Anmeldung', + 'My Account' => 'Mein Kundenkonto', + 'Register' => 'Registrieren', +]; diff --git a/local/modules/HookLinks/I18n/frontOffice/default/en_US.php b/local/modules/HookLinks/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..33a0bb71 --- /dev/null +++ b/local/modules/HookLinks/I18n/frontOffice/default/en_US.php @@ -0,0 +1,10 @@ + 'Cart', + 'Checkout' => 'Checkout', + 'Log out!' => 'Log out!', + 'Login' => 'Login', + 'My Account' => 'My Account', + 'Register' => 'Register', +); diff --git a/local/modules/HookLinks/I18n/frontOffice/default/fr_FR.php b/local/modules/HookLinks/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..8b8c6bf4 --- /dev/null +++ b/local/modules/HookLinks/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,10 @@ + 'Panier', + 'Checkout' => 'Commander', + 'Log out!' => 'Se déconnecter', + 'Login' => 'Connexion', + 'My Account' => 'Mon compte', + 'Register' => 'S\'inscrire', +]; diff --git a/local/modules/HookLinks/I18n/frontOffice/default/it_IT.php b/local/modules/HookLinks/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..fca67d76 --- /dev/null +++ b/local/modules/HookLinks/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,10 @@ + 'Carrello', + 'Checkout' => 'Procedi all\'acquisto', + 'Log out!' => 'Esci!', + 'Login' => 'Login', + 'My Account' => 'Mio account', + 'Register' => 'Registrati', +]; diff --git a/local/modules/HookLinks/I18n/frontOffice/default/tr_TR.php b/local/modules/HookLinks/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..88c01521 --- /dev/null +++ b/local/modules/HookLinks/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,10 @@ + 'Sepet', + 'Checkout' => 'Ödeme yap', + 'Log out!' => 'Çıkış Yap!', + 'Login' => 'Giriş yap', + 'My Account' => 'Hesabım', + 'Register' => 'Kaydol', +]; diff --git a/local/modules/HookLinks/I18n/it_IT.php b/local/modules/HookLinks/I18n/it_IT.php new file mode 100644 index 00000000..6120aafa --- /dev/null +++ b/local/modules/HookLinks/I18n/it_IT.php @@ -0,0 +1,5 @@ + 'Link utili', +]; diff --git a/local/modules/HookLinks/I18n/tr_TR.php b/local/modules/HookLinks/I18n/tr_TR.php new file mode 100644 index 00000000..3f99d1ee --- /dev/null +++ b/local/modules/HookLinks/I18n/tr_TR.php @@ -0,0 +1,5 @@ + 'Faydalı Linkler', +]; diff --git a/local/modules/HookLinks/LICENSE.txt b/local/modules/HookLinks/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookLinks/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookLinks/composer.json b/local/modules/HookLinks/composer.json new file mode 100644 index 00000000..23abd78e --- /dev/null +++ b/local/modules/HookLinks/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-links-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookLinks" + } +} diff --git a/local/modules/HookLinks/templates/frontOffice/default/main-footer-body.html b/local/modules/HookLinks/templates/frontOffice/default/main-footer-body.html new file mode 100644 index 00000000..08607f06 --- /dev/null +++ b/local/modules/HookLinks/templates/frontOffice/default/main-footer-body.html @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/local/modules/HookNavigation/Config/config.xml b/local/modules/HookNavigation/Config/config.xml new file mode 100644 index 00000000..1da4b2b4 --- /dev/null +++ b/local/modules/HookNavigation/Config/config.xml @@ -0,0 +1,17 @@ + + + + + +
+ + + + + + + + + + + diff --git a/local/modules/HookNavigation/Config/module.xml b/local/modules/HookNavigation/Config/module.xml new file mode 100644 index 00000000..06043053 --- /dev/null +++ b/local/modules/HookNavigation/Config/module.xml @@ -0,0 +1,24 @@ + + + HookNavigation\HookNavigation + + Block Navigation + + + Bloc Menu + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookNavigation/Config/routing.xml b/local/modules/HookNavigation/Config/routing.xml new file mode 100644 index 00000000..2182aa3c --- /dev/null +++ b/local/modules/HookNavigation/Config/routing.xml @@ -0,0 +1,9 @@ + + + + HookNavigation:HookNavigationConfig:default + + + HookNavigation:HookNavigationConfig:save + + diff --git a/local/modules/HookNavigation/Controller/HookNavigationConfigController.php b/local/modules/HookNavigation/Controller/HookNavigationConfigController.php new file mode 100644 index 00000000..04b7ca5f --- /dev/null +++ b/local/modules/HookNavigation/Controller/HookNavigationConfigController.php @@ -0,0 +1,75 @@ + - OpenStudio + */ +class HookNavigationConfigController extends BaseAdminController +{ + public function defaultAction() + { + $bodyConfig = HookNavigation::getConfigValue(HookNavigationConfigValue::FOOTER_BODY_FOLDER_ID); + $bottomConfig = HookNavigation::getConfigValue(HookNavigationConfigValue::FOOTER_BOTTOM_FOLDER_ID); + + $this->getSession()->getFlashBag()->set('bodyConfig', $bodyConfig); + $this->getSession()->getFlashBag()->set('bottomConfig', $bottomConfig); + + return $this->render('hooknavigation-configuration'); + } + + public function saveAction() + { + $baseForm = $this->createForm('hooknavigation.configuration'); + + $errorMessage = null; + + try { + $form = $this->validateForm($baseForm); + $data = $form->getData(); + + HookNavigation::setConfigValue(HookNavigationConfigValue::FOOTER_BODY_FOLDER_ID, is_bool($data['footer_body_folder_id']) ? (int) ($data['footer_body_folder_id']) : $data['footer_body_folder_id']); + HookNavigation::setConfigValue(HookNavigationConfigValue::FOOTER_BOTTOM_FOLDER_ID, is_bool($data['footer_bottom_folder_id']) ? (int) ($data['footer_bottom_folder_id']) : $data['footer_bottom_folder_id']); + } catch (FormValidationException $ex) { + // Invalid data entered + $errorMessage = $this->createStandardFormValidationErrorMessage($ex); + } catch (\Exception $ex) { + // Any other error + $errorMessage = $this->getTranslator()->trans('Sorry, an error occurred: %err', ['%err' => $ex->getMessage()], [], HookNavigation::MESSAGE_DOMAIN); + } + + if (null !== $errorMessage) { + // Mark the form as with error + $baseForm->setErrorMessage($errorMessage); + + // Send the form and the error to the parser + $this->getParserContext() + ->addForm($baseForm) + ->setGeneralError($errorMessage) + ; + } else { + $this->getParserContext() + ->set('success', true) + ; + } + + return $this->defaultAction(); + } +} diff --git a/local/modules/HookNavigation/Form/HookNavigationConfigForm.php b/local/modules/HookNavigation/Form/HookNavigationConfigForm.php new file mode 100644 index 00000000..84221749 --- /dev/null +++ b/local/modules/HookNavigation/Form/HookNavigationConfigForm.php @@ -0,0 +1,55 @@ + - OpenStudio + */ +class HookNavigationConfigForm extends BaseForm +{ + public function getName() + { + return 'hooknavigation_configuration'; + } + + protected function buildForm() + { + $this->formBuilder + ->add( + 'footer_body_folder_id', + 'number', + [ + 'constraints' => [ + new NotBlank(), + ], + 'label' => $this->translator->trans('Folder in footer body', [], HookNavigation::MESSAGE_DOMAIN), + ] + ) + ->add( + 'footer_bottom_folder_id', + 'number', + [ + 'constraints' => [ + new NotBlank(), + ], + 'label' => $this->translator->trans('Folder in footer bottom', [], HookNavigation::MESSAGE_DOMAIN), + ] + ); + } +} diff --git a/local/modules/HookNavigation/Hook/FrontHook.php b/local/modules/HookNavigation/Hook/FrontHook.php new file mode 100644 index 00000000..a108f3a0 --- /dev/null +++ b/local/modules/HookNavigation/Hook/FrontHook.php @@ -0,0 +1,51 @@ +, Etienne PERRIERE - OpenStudio + */ +class FrontHook extends BaseHook +{ + public function onMainFooterBody(HookRenderBlockEvent $event) + { + $bodyConfig = HookNavigation::getConfigValue(HookNavigationConfigValue::FOOTER_BODY_FOLDER_ID); + + $content = trim($this->render('main-footer-body.html', ['bodyFolderId' => $bodyConfig])); + if ('' != $content) { + $event->add(array( + 'id' => 'navigation-footer-body', + 'class' => 'links', + 'title' => $this->trans('Latest articles', array(), HookNavigation::MESSAGE_DOMAIN), + 'content' => $content, + )); + } + } + + public function onMainFooterBottom(HookRenderEvent $event) + { + $bottomConfig = HookNavigation::getConfigValue(HookNavigationConfigValue::FOOTER_BOTTOM_FOLDER_ID); + + $content = $this->render('main-footer-bottom.html', ['bottomFolderId' => $bottomConfig]); + $event->add($content); + } +} diff --git a/local/modules/HookNavigation/HookNavigation.php b/local/modules/HookNavigation/HookNavigation.php new file mode 100644 index 00000000..a878b090 --- /dev/null +++ b/local/modules/HookNavigation/HookNavigation.php @@ -0,0 +1,24 @@ + 'Kategorien', + 'Folder in footer body' => 'Ordner in Fußzeile', + 'Folder in footer bottom' => 'Ordner in Fußzeile', + 'Home' => 'Startseite', + 'HookNavigation configuration' => 'HookNavigation Konfiguration', + 'No articles currently' => 'Zur Zeit keine Artikel', + 'Toggle navigation' => 'Navigation umschalten', +]; diff --git a/local/modules/HookNavigation/I18n/backOffice/default/en_US.php b/local/modules/HookNavigation/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..88e66b06 --- /dev/null +++ b/local/modules/HookNavigation/I18n/backOffice/default/en_US.php @@ -0,0 +1,10 @@ + 'Configuration correctly saved', + 'Configure hooknavigation' => 'Configure hooknavigation', + 'Home' => 'Home', + 'HookNavigation configuration' => 'HookNavigation configuration', + 'Modules' => 'Modules', + 'Select a folder' => 'Select a folder', +); diff --git a/local/modules/HookNavigation/I18n/backOffice/default/fr_FR.php b/local/modules/HookNavigation/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..04211f37 --- /dev/null +++ b/local/modules/HookNavigation/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,10 @@ + 'Configuration sauvegardée correctement', + 'Configure hooknavigation' => 'Configurer Bloc Menu', + 'Home' => 'Accueil', + 'HookNavigation configuration' => 'Configuration de Block Menu', + 'Modules' => 'Modules', + 'Select a folder' => 'Sélectionner un dossier', +]; diff --git a/local/modules/HookNavigation/I18n/backOffice/default/it_IT.php b/local/modules/HookNavigation/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..7b04d958 --- /dev/null +++ b/local/modules/HookNavigation/I18n/backOffice/default/it_IT.php @@ -0,0 +1,7 @@ + 'Home', + 'Modules' => 'Moduli', + 'Select a folder' => 'Seleziona una cartella', +]; diff --git a/local/modules/HookNavigation/I18n/backOffice/default/tr_TR.php b/local/modules/HookNavigation/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..6816d794 --- /dev/null +++ b/local/modules/HookNavigation/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,11 @@ + 'Katogoriler', + 'Folder in footer body' => 'Altbilgi vücut klasöründe', + 'Folder in footer bottom' => 'Altbilgi alt klasöründe', + 'Home' => 'Ana sayfa', + 'HookNavigation configuration' => 'HookNavigation yapılandırma', + 'No articles currently' => 'Hiç makale yok', + 'Toggle navigation' => 'Navigasyonu değiştir', +]; diff --git a/local/modules/HookNavigation/I18n/en_US.php b/local/modules/HookNavigation/I18n/en_US.php new file mode 100644 index 00000000..cfcc1fe2 --- /dev/null +++ b/local/modules/HookNavigation/I18n/en_US.php @@ -0,0 +1,8 @@ + 'Folder in footer body', + 'Folder in footer bottom' => 'Folder in footer bottom', + 'Latest articles' => 'Latest articles', + 'Sorry, an error occurred: %err' => 'Sorry, an error occurred: %err', +); diff --git a/local/modules/HookNavigation/I18n/fr_FR.php b/local/modules/HookNavigation/I18n/fr_FR.php new file mode 100644 index 00000000..b976c5fd --- /dev/null +++ b/local/modules/HookNavigation/I18n/fr_FR.php @@ -0,0 +1,8 @@ + 'Dossier du pied de page', + 'Folder in footer bottom' => 'Dossier sous le pied de page', + 'Latest articles' => 'Nos dossiers', + 'Sorry, an error occurred: %err' => 'Désolé, une erreur est survenue: %err', +]; diff --git a/local/modules/HookNavigation/I18n/frontOffice/default/de_DE.php b/local/modules/HookNavigation/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..c32bbb2a --- /dev/null +++ b/local/modules/HookNavigation/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,6 @@ + 'Neueste Artikel', + 'No articles currently' => 'Zur Zeit keine Artikel', +]; diff --git a/local/modules/HookNavigation/I18n/frontOffice/default/en_US.php b/local/modules/HookNavigation/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..d63a3877 --- /dev/null +++ b/local/modules/HookNavigation/I18n/frontOffice/default/en_US.php @@ -0,0 +1,8 @@ + 'Categories', + 'Home' => 'Home', + 'No articles currently' => 'No articles currently', + 'Toggle navigation' => 'Toggle navigation', +); diff --git a/local/modules/HookNavigation/I18n/frontOffice/default/fr_FR.php b/local/modules/HookNavigation/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..6d26f6f9 --- /dev/null +++ b/local/modules/HookNavigation/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,8 @@ + 'Rubriques', + 'Home' => 'Accueil', + 'No articles currently' => 'Aucun article pour le moment', + 'Toggle navigation' => 'Basculer la navigation', +]; diff --git a/local/modules/HookNavigation/I18n/frontOffice/default/it_IT.php b/local/modules/HookNavigation/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..c7165516 --- /dev/null +++ b/local/modules/HookNavigation/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,8 @@ + 'Categorie', + 'Home' => 'Home', + 'No articles currently' => 'Attualmente non sono presenti articoli', + 'Toggle navigation' => 'Toggle navigation', +]; diff --git a/local/modules/HookNavigation/I18n/frontOffice/default/tr_TR.php b/local/modules/HookNavigation/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..a76a2b01 --- /dev/null +++ b/local/modules/HookNavigation/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,6 @@ + 'Son Makaleler', + 'No articles currently' => 'Hiç makale yok', +]; diff --git a/local/modules/HookNavigation/I18n/it_IT.php b/local/modules/HookNavigation/I18n/it_IT.php new file mode 100644 index 00000000..8ae2a7f1 --- /dev/null +++ b/local/modules/HookNavigation/I18n/it_IT.php @@ -0,0 +1,5 @@ + 'Ultimi articoli', +]; diff --git a/local/modules/HookNavigation/LICENSE.txt b/local/modules/HookNavigation/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookNavigation/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookNavigation/Model/Config/Base/HookNavigationConfigValue.php b/local/modules/HookNavigation/Model/Config/Base/HookNavigationConfigValue.php new file mode 100644 index 00000000..925f6c5e --- /dev/null +++ b/local/modules/HookNavigation/Model/Config/Base/HookNavigationConfigValue.php @@ -0,0 +1,23 @@ + + + +
+
+ {intl l="Configure hooknavigation" d="hooknavigation.bo.default"} +
+ +
+
+ {if $success} +
+ {intl l="Configuration correctly saved" d="hooknavigation.bo.default"} +
+ {/if} + + {form name="hooknavigation.configuration"} + + {include "includes/inner-form-toolbar.html" hide_flags = 1 close_url={url path='/admin/modules'}} +
+ + {form_field form=$form field="success_url"} + + {/form_field} + + {form_hidden_fields form=$form} + + {flash type="bodyConfig"} + {assign var='bodyConfig' value=$MESSAGE} + {/flash} + {flash type="bottomConfig"} + {assign var='bottomConfig' value=$MESSAGE} + {/flash} + + {form_field form=$form field="footer_body_folder_id"} +
+ + + + + {if ! empty($label_attr.help)} + {$label_attr.help} + {/if} +
+ {/form_field} + + {form_field form=$form field="footer_bottom_folder_id"} +
+ + + + + {if ! empty($label_attr.help)} + {$label_attr.help} + {/if} +
+ {/form_field} + + {include "includes/inner-form-toolbar.html" hide_flags = 1 close_url={url path='/admin/modules'} page_bottom = 1} + + {/form} +
+
+
+ +{/block} + +{block name="javascript-initialization"} +{/block} \ No newline at end of file diff --git a/local/modules/HookNavigation/templates/frontOffice/default/main-footer-body.html b/local/modules/HookNavigation/templates/frontOffice/default/main-footer-body.html new file mode 100644 index 00000000..254de001 --- /dev/null +++ b/local/modules/HookNavigation/templates/frontOffice/default/main-footer-body.html @@ -0,0 +1,17 @@ +{ifloop rel="blog.articles"} + +{/ifloop} +{elseloop rel="blog.articles"} +
    +
  • {intl l="No articles currently" d="hooknavigation.fo.default"}
  • +
+{/elseloop} diff --git a/local/modules/HookNavigation/templates/frontOffice/default/main-footer-bottom.html b/local/modules/HookNavigation/templates/frontOffice/default/main-footer-bottom.html new file mode 100644 index 00000000..88762536 --- /dev/null +++ b/local/modules/HookNavigation/templates/frontOffice/default/main-footer-bottom.html @@ -0,0 +1,7 @@ + diff --git a/local/modules/HookNavigation/templates/frontOffice/default/main-navbar-primary.html b/local/modules/HookNavigation/templates/frontOffice/default/main-navbar-primary.html new file mode 100644 index 00000000..62514618 --- /dev/null +++ b/local/modules/HookNavigation/templates/frontOffice/default/main-navbar-primary.html @@ -0,0 +1,56 @@ + + +{* classic navbar without dropdown + +*} \ No newline at end of file diff --git a/local/modules/HookNewsletter/Config/config.xml b/local/modules/HookNewsletter/Config/config.xml new file mode 100644 index 00000000..9d66a2fe --- /dev/null +++ b/local/modules/HookNewsletter/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/local/modules/HookNewsletter/Config/module.xml b/local/modules/HookNewsletter/Config/module.xml new file mode 100644 index 00000000..3c7944e1 --- /dev/null +++ b/local/modules/HookNewsletter/Config/module.xml @@ -0,0 +1,24 @@ + + + HookNewsletter\HookNewsletter + + Block Newsletter + + + Bloc Newsletter + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookNewsletter/Hook/FrontHook.php b/local/modules/HookNewsletter/Hook/FrontHook.php new file mode 100644 index 00000000..0d1b9688 --- /dev/null +++ b/local/modules/HookNewsletter/Hook/FrontHook.php @@ -0,0 +1,37 @@ + + */ +class FrontHook extends BaseHook { + + public function onMainFooterBody(HookRenderBlockEvent $event) + { + $content = trim($this->render("main-footer-body.html")); + if ("" != $content){ + $event->add(array( + "id" => "newsletter-footer-body", + "class" => "newsletter", + "title" => $this->trans("Newsletter", array(), "hooknewsletter"), + "content" => $content + )); + } + } +} \ No newline at end of file diff --git a/local/modules/HookNewsletter/HookNewsletter.php b/local/modules/HookNewsletter/HookNewsletter.php new file mode 100644 index 00000000..887b4a07 --- /dev/null +++ b/local/modules/HookNewsletter/HookNewsletter.php @@ -0,0 +1,20 @@ + 'Newsletter', +]; diff --git a/local/modules/HookNewsletter/I18n/en_US.php b/local/modules/HookNewsletter/I18n/en_US.php new file mode 100644 index 00000000..eeea5e3d --- /dev/null +++ b/local/modules/HookNewsletter/I18n/en_US.php @@ -0,0 +1,5 @@ + 'Newsletter', +); diff --git a/local/modules/HookNewsletter/I18n/fr_FR.php b/local/modules/HookNewsletter/I18n/fr_FR.php new file mode 100644 index 00000000..67c6b531 --- /dev/null +++ b/local/modules/HookNewsletter/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Lettre d\'information', +]; diff --git a/local/modules/HookNewsletter/I18n/frontOffice/default/de_DE.php b/local/modules/HookNewsletter/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..9de40b6a --- /dev/null +++ b/local/modules/HookNewsletter/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,8 @@ + 'E-mail Adresse', + 'Sign up to receive our latest news.' => 'Abonnieren Sie unseren Newsletter.', + 'Subscribe' => 'Abonnieren', + 'Your email address' => 'Ihre E-Mail-Adresse', +]; diff --git a/local/modules/HookNewsletter/I18n/frontOffice/default/en_US.php b/local/modules/HookNewsletter/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..68f5056a --- /dev/null +++ b/local/modules/HookNewsletter/I18n/frontOffice/default/en_US.php @@ -0,0 +1,8 @@ + 'Email address', + 'Sign up to receive our latest news.' => 'Sign up to receive our latest news.', + 'Subscribe' => 'Subscribe', + 'Your email address' => 'Your email address', +); diff --git a/local/modules/HookNewsletter/I18n/frontOffice/default/fr_FR.php b/local/modules/HookNewsletter/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..17819d1f --- /dev/null +++ b/local/modules/HookNewsletter/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,8 @@ + 'Adresse e-mail', + 'Sign up to receive our latest news.' => 'Enregistrez vous pour recevoir nos dernières nouvelles.', + 'Subscribe' => 'Inscription', + 'Your email address' => 'Votre adresse email', +]; diff --git a/local/modules/HookNewsletter/I18n/frontOffice/default/it_IT.php b/local/modules/HookNewsletter/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..563e28bd --- /dev/null +++ b/local/modules/HookNewsletter/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,6 @@ + 'Indirizzo email', + 'Subscribe' => 'Abbonati', +]; diff --git a/local/modules/HookNewsletter/I18n/frontOffice/default/tr_TR.php b/local/modules/HookNewsletter/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..dcc2918f --- /dev/null +++ b/local/modules/HookNewsletter/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,8 @@ + 'Eposta adresi', + 'Sign up to receive our latest news.' => 'En yeni haberleri almak için kaydolun.', + 'Subscribe' => 'Abone Ol', + 'Your email address' => 'E-posta adresiniz', +]; diff --git a/local/modules/HookNewsletter/I18n/it_IT.php b/local/modules/HookNewsletter/I18n/it_IT.php new file mode 100644 index 00000000..8e9757db --- /dev/null +++ b/local/modules/HookNewsletter/I18n/it_IT.php @@ -0,0 +1,5 @@ + 'Newsletter', +]; diff --git a/local/modules/HookNewsletter/I18n/tr_TR.php b/local/modules/HookNewsletter/I18n/tr_TR.php new file mode 100644 index 00000000..6d9159e5 --- /dev/null +++ b/local/modules/HookNewsletter/I18n/tr_TR.php @@ -0,0 +1,5 @@ + 'E-Bülten', +]; diff --git a/local/modules/HookNewsletter/LICENSE.txt b/local/modules/HookNewsletter/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookNewsletter/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookNewsletter/composer.json b/local/modules/HookNewsletter/composer.json new file mode 100644 index 00000000..230b69d6 --- /dev/null +++ b/local/modules/HookNewsletter/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-newsletter-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookNewsletter" + } +} diff --git a/local/modules/HookNewsletter/templates/frontOffice/default/main-footer-body.html b/local/modules/HookNewsletter/templates/frontOffice/default/main-footer-body.html new file mode 100644 index 00000000..f60e082e --- /dev/null +++ b/local/modules/HookNewsletter/templates/frontOffice/default/main-footer-body.html @@ -0,0 +1,13 @@ +

{intl l="Sign up to receive our latest news." d="hooknewsletter.fo.default"}

+{form name="thelia.front.newsletter"} +
+{form_hidden_fields} +{form_field field="email"} +
+ + +
+{/form_field} + +
+{/form} \ No newline at end of file diff --git a/local/modules/HookProductsNew/Config/config.xml b/local/modules/HookProductsNew/Config/config.xml new file mode 100644 index 00000000..6b795cd1 --- /dev/null +++ b/local/modules/HookProductsNew/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/local/modules/HookProductsNew/Config/module.xml b/local/modules/HookProductsNew/Config/module.xml new file mode 100644 index 00000000..32d7604f --- /dev/null +++ b/local/modules/HookProductsNew/Config/module.xml @@ -0,0 +1,24 @@ + + + HookProductsNew\HookProductsNew + + Block New Products + + + Bloc Nouveaux Produits + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookProductsNew/HookProductsNew.php b/local/modules/HookProductsNew/HookProductsNew.php new file mode 100644 index 00000000..16a92d08 --- /dev/null +++ b/local/modules/HookProductsNew/HookProductsNew.php @@ -0,0 +1,20 @@ + '+ Alle anzeigen', + 'Latest' => 'Neuigkeiten', +]; diff --git a/local/modules/HookProductsNew/I18n/frontOffice/default/en_US.php b/local/modules/HookProductsNew/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..bd7cd7c7 --- /dev/null +++ b/local/modules/HookProductsNew/I18n/frontOffice/default/en_US.php @@ -0,0 +1,6 @@ + '+ View All', + 'Latest' => 'Latest', +); diff --git a/local/modules/HookProductsNew/I18n/frontOffice/default/fr_FR.php b/local/modules/HookProductsNew/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..4c0449ee --- /dev/null +++ b/local/modules/HookProductsNew/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,6 @@ + '+ Tout voir', + 'Latest' => 'Top des ventes', +]; diff --git a/local/modules/HookProductsNew/I18n/frontOffice/default/it_IT.php b/local/modules/HookProductsNew/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..f8284b5d --- /dev/null +++ b/local/modules/HookProductsNew/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,6 @@ + '+ Mostra tutto', + 'Latest' => 'Ultimi', +]; diff --git a/local/modules/HookProductsNew/I18n/frontOffice/default/tr_TR.php b/local/modules/HookProductsNew/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..035d01d9 --- /dev/null +++ b/local/modules/HookProductsNew/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,6 @@ + '+ Hepsini gör', + 'Latest' => 'En son', +]; diff --git a/local/modules/HookProductsNew/LICENSE.txt b/local/modules/HookProductsNew/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookProductsNew/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookProductsNew/composer.json b/local/modules/HookProductsNew/composer.json new file mode 100644 index 00000000..37573922 --- /dev/null +++ b/local/modules/HookProductsNew/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-products-new-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookProductsNew" + } +} diff --git a/local/modules/HookProductsNew/templates/frontOffice/default/home-body.html b/local/modules/HookProductsNew/templates/frontOffice/default/home-body.html new file mode 100644 index 00000000..2004b136 --- /dev/null +++ b/local/modules/HookProductsNew/templates/frontOffice/default/home-body.html @@ -0,0 +1,59 @@ +{ifloop rel="product_new"} +
+
+

{intl l="Latest" d="hookproductsnew.fo.default"} {intl l="+ View All" d="hookproductsnew.fo.default"}

+
+
+ +
+
+{/ifloop} diff --git a/local/modules/HookProductsOffer/Config/config.xml b/local/modules/HookProductsOffer/Config/config.xml new file mode 100644 index 00000000..00e4ebb5 --- /dev/null +++ b/local/modules/HookProductsOffer/Config/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/local/modules/HookProductsOffer/Config/module.xml b/local/modules/HookProductsOffer/Config/module.xml new file mode 100644 index 00000000..1441e552 --- /dev/null +++ b/local/modules/HookProductsOffer/Config/module.xml @@ -0,0 +1,24 @@ + + + HookProductsOffer\HookProductsOffer + + Block Promo Products + + + Bloc Produits en promo + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookProductsOffer/HookProductsOffer.php b/local/modules/HookProductsOffer/HookProductsOffer.php new file mode 100644 index 00000000..2b04e7f8 --- /dev/null +++ b/local/modules/HookProductsOffer/HookProductsOffer.php @@ -0,0 +1,20 @@ + '+ Alle sehen', + 'Offers' => 'Angebote', +]; diff --git a/local/modules/HookProductsOffer/I18n/frontOffice/default/en_US.php b/local/modules/HookProductsOffer/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..9b4a1c61 --- /dev/null +++ b/local/modules/HookProductsOffer/I18n/frontOffice/default/en_US.php @@ -0,0 +1,6 @@ + '+ View All', + 'Offers' => 'Offers', +); diff --git a/local/modules/HookProductsOffer/I18n/frontOffice/default/fr_FR.php b/local/modules/HookProductsOffer/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..3dbf4a11 --- /dev/null +++ b/local/modules/HookProductsOffer/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,6 @@ + '+ Tout voir', + 'Offers' => 'Promotions', +]; diff --git a/local/modules/HookProductsOffer/I18n/frontOffice/default/it_IT.php b/local/modules/HookProductsOffer/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..ba350c21 --- /dev/null +++ b/local/modules/HookProductsOffer/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,6 @@ + '+ Mostra tutto', + 'Offers' => 'Offerte', +]; diff --git a/local/modules/HookProductsOffer/I18n/frontOffice/default/tr_TR.php b/local/modules/HookProductsOffer/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..bc9c3e6b --- /dev/null +++ b/local/modules/HookProductsOffer/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,6 @@ + '+ Hepsini gör', + 'Offers' => 'Teklifler', +]; diff --git a/local/modules/HookProductsOffer/LICENSE.txt b/local/modules/HookProductsOffer/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookProductsOffer/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookProductsOffer/composer.json b/local/modules/HookProductsOffer/composer.json new file mode 100644 index 00000000..8329abdb --- /dev/null +++ b/local/modules/HookProductsOffer/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-products-offer-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookProductsOffer" + } +} diff --git a/local/modules/HookProductsOffer/templates/frontOffice/default/home-body.html b/local/modules/HookProductsOffer/templates/frontOffice/default/home-body.html new file mode 100644 index 00000000..462e775a --- /dev/null +++ b/local/modules/HookProductsOffer/templates/frontOffice/default/home-body.html @@ -0,0 +1,39 @@ +{ifloop rel="current-sales"} +
+ {loop name="current-sales" type="sale" limit="2"} +
+ + +
+
    + {loop name="products_in_sale" type="product" limit="4" sale=$ID} + {include file="includes/single-product.html" colClass="col-md-3 col-sm-4" product_id=$ID hasBtn=false hasDescription=false width="218" height="146"} + {/loop} +
+
+
+ {/loop} +
+{/ifloop} +{* Display "regular" promos, if any, only if we don't have active sales *} + +{elseloop rel="current-sales"} +{ifloop rel="product_promo"} +
+
+

{intl l="Offers" d="hookproductsoffer.fo.default"} {intl l="+ View All" d="hookproductsoffer.fo.default"}

+
+ +
+
    + {loop name="product_promo" type="product" limit="4" promo="yes"} + {include file="includes/single-product.html" colClass="col-md-3 col-sm-4" product_id=$ID hasBtn=false hasDescription=false width="218" height="146"} + {/loop} +
+
+
+{/ifloop} +{/elseloop} diff --git a/local/modules/HookSearch/Config/config.xml b/local/modules/HookSearch/Config/config.xml new file mode 100644 index 00000000..b5d60c60 --- /dev/null +++ b/local/modules/HookSearch/Config/config.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/local/modules/HookSearch/Config/module.xml b/local/modules/HookSearch/Config/module.xml new file mode 100644 index 00000000..d13b8846 --- /dev/null +++ b/local/modules/HookSearch/Config/module.xml @@ -0,0 +1,24 @@ + + + HookSearch\HookSearch + + Block Search + + + Bloc Recherche + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookSearch/HookSearch.php b/local/modules/HookSearch/HookSearch.php new file mode 100644 index 00000000..bbe6d752 --- /dev/null +++ b/local/modules/HookSearch/HookSearch.php @@ -0,0 +1,20 @@ + 'Mindestens 2 Zeichen.', + 'Search' => 'Suchen', + 'Search a product' => 'Ein Produkt suchen', + 'Search...' => 'Suchen ...', +]; diff --git a/local/modules/HookSearch/I18n/frontOffice/default/en_US.php b/local/modules/HookSearch/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..5d94b36c --- /dev/null +++ b/local/modules/HookSearch/I18n/frontOffice/default/en_US.php @@ -0,0 +1,8 @@ + 'Minimum 2 characters.', + 'Search' => 'Search', + 'Search a product' => 'Search a product', + 'Search...' => 'Search...', +); diff --git a/local/modules/HookSearch/I18n/frontOffice/default/fr_FR.php b/local/modules/HookSearch/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..c115fb42 --- /dev/null +++ b/local/modules/HookSearch/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,8 @@ + '2 caractères minimum.', + 'Search' => 'Recherche', + 'Search a product' => 'Rechercher un produit', + 'Search...' => 'Rechercher...', +]; diff --git a/local/modules/HookSearch/I18n/frontOffice/default/it_IT.php b/local/modules/HookSearch/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..65ad8706 --- /dev/null +++ b/local/modules/HookSearch/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,8 @@ + 'Minimo 2 caratteri.', + 'Search' => 'Ricerca', + 'Search a product' => 'Ricerca un prodotto', + 'Search...' => 'Ricerca...', +]; diff --git a/local/modules/HookSearch/I18n/frontOffice/default/tr_TR.php b/local/modules/HookSearch/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..e9d75686 --- /dev/null +++ b/local/modules/HookSearch/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,8 @@ + 'En az 2 karakter.', + 'Search' => 'Arama', + 'Search a product' => 'Ürün ara', + 'Search...' => 'Arama...', +]; diff --git a/local/modules/HookSearch/LICENSE.txt b/local/modules/HookSearch/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookSearch/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookSearch/composer.json b/local/modules/HookSearch/composer.json new file mode 100644 index 00000000..9dfdcaf1 --- /dev/null +++ b/local/modules/HookSearch/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-search-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookSearch" + } +} diff --git a/local/modules/HookSearch/templates/frontOffice/default/assets/css/styles.css b/local/modules/HookSearch/templates/frontOffice/default/assets/css/styles.css new file mode 100644 index 00000000..74b18399 --- /dev/null +++ b/local/modules/HookSearch/templates/frontOffice/default/assets/css/styles.css @@ -0,0 +1,11 @@ +.header-container .search-container label, +.header-container .search-container .btn-search>span { + position:absolute; + width:1px; + height:1px; + margin:-1px; + padding:0; + overflow:hidden; + clip:rect(0 0 0 0); + border:0 +} \ No newline at end of file diff --git a/local/modules/HookSearch/templates/frontOffice/default/main-navbar-primary.html b/local/modules/HookSearch/templates/frontOffice/default/main-navbar-primary.html new file mode 100644 index 00000000..31c6afd2 --- /dev/null +++ b/local/modules/HookSearch/templates/frontOffice/default/main-navbar-primary.html @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/local/modules/HookSearch/templates/frontOffice/default/main-navbar-secondary.html b/local/modules/HookSearch/templates/frontOffice/default/main-navbar-secondary.html new file mode 100644 index 00000000..40ba03a6 --- /dev/null +++ b/local/modules/HookSearch/templates/frontOffice/default/main-navbar-secondary.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/local/modules/HookSocial/Config/config.xml b/local/modules/HookSocial/Config/config.xml new file mode 100644 index 00000000..f151f07c --- /dev/null +++ b/local/modules/HookSocial/Config/config.xml @@ -0,0 +1,21 @@ + + + + + +
+ + + + + + + + + + + + + diff --git a/local/modules/HookSocial/Config/module.xml b/local/modules/HookSocial/Config/module.xml new file mode 100644 index 00000000..bf58e279 --- /dev/null +++ b/local/modules/HookSocial/Config/module.xml @@ -0,0 +1,24 @@ + + + HookSocial\HookSocial + + Block Social + + + Bloc Social + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.2.0 + alpha + diff --git a/local/modules/HookSocial/Config/routing.xml b/local/modules/HookSocial/Config/routing.xml new file mode 100644 index 00000000..769a2c4a --- /dev/null +++ b/local/modules/HookSocial/Config/routing.xml @@ -0,0 +1,10 @@ + + + + + HookSocial\Controller\Configuration::saveAction + + + diff --git a/local/modules/HookSocial/Controller/Configuration.php b/local/modules/HookSocial/Controller/Configuration.php new file mode 100644 index 00000000..9fef4bfa --- /dev/null +++ b/local/modules/HookSocial/Controller/Configuration.php @@ -0,0 +1,61 @@ + + */ +class Configuration extends BaseAdminController +{ + public function saveAction() + { + + if (null !== $response = $this->checkAuth(array(AdminResources::MODULE), array('hooksocial'), AccessManager::UPDATE)) { + return $response; + } + + $form = new \HookSocial\Form\Configuration($this->getRequest()); + $resp = array( + "error" => 0, + "message" => "" + ); + $response=null; + + try { + $vform = $this->validateForm($form); + $data = $vform->getData(); + + foreach ($data as $name => $value) { + if (! $form->isTemplateDefinedHiddenFieldName($name)) { + ConfigQuery::write("hooksocial_" . $name, $value, false, true); + } + + Tlog::getInstance()->debug(sprintf("%s => %s", $name, $value)); + } + } catch (\Exception $e) { + $resp["error"] = 1; + $resp["message"] = $e->getMessage(); + } + + return JsonResponse::create($resp); + } +} \ No newline at end of file diff --git a/local/modules/HookSocial/Form/Configuration.php b/local/modules/HookSocial/Form/Configuration.php new file mode 100644 index 00000000..82d7418b --- /dev/null +++ b/local/modules/HookSocial/Form/Configuration.php @@ -0,0 +1,86 @@ + + */ +class Configuration extends BaseForm { + + protected function buildForm() + { + $form = $this->formBuilder; + + $definitions = array( + array( + "id" => "twitter", + "label" => Translator::getInstance()->trans("Twitter username", array(), 'hooksocial') + ), + array( + "id" => "facebook", + "label" => Translator::getInstance()->trans("Facebook username", array(), 'hooksocial') + ), + array( + "id" => "google", + "label" => Translator::getInstance()->trans("Google + username", array(), 'hooksocial') + ), + array( + "id" => "instagram", + "label" => Translator::getInstance()->trans("Instagram username", array(), 'hooksocial') + ), + array( + "id" => "pinterest", + "label" => Translator::getInstance()->trans("Pinterest username", array(), 'hooksocial') + ), + array( + "id" => "youtube", + "label" => Translator::getInstance()->trans("Youtube URL", array(), 'hooksocial') + ), + array( + "id" => "rss", + "label" => Translator::getInstance()->trans("RSS URL", array(), 'hooksocial') + ) + ); + + foreach ($definitions as $field){ + $value = ConfigQuery::read("hooksocial_" . $field["id"], ""); + $form->add( + $field["id"], + "text", + array( + 'data' => $value, + 'label' => $field["label"], + 'label_attr' => array( + 'for' => $field["id"] + ), + ) + ); + } + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "hooksocial"; + } + + +} \ No newline at end of file diff --git a/local/modules/HookSocial/Hook/FrontHook.php b/local/modules/HookSocial/Hook/FrontHook.php new file mode 100644 index 00000000..770c2178 --- /dev/null +++ b/local/modules/HookSocial/Hook/FrontHook.php @@ -0,0 +1,37 @@ + + */ +class FrontHook extends BaseHook { + + public function onMainFooterBody(HookRenderBlockEvent $event) + { + $content = trim($this->render("main-footer-body.html")); + if ("" != $content){ + $event->add(array( + "id" => "social-footer-body", + "class" => "social", + "title" => $this->trans("Follow us", array(), "hooksocial"), + "content" => $content + )); + } + } +} \ No newline at end of file diff --git a/local/modules/HookSocial/HookSocial.php b/local/modules/HookSocial/HookSocial.php new file mode 100644 index 00000000..030e814d --- /dev/null +++ b/local/modules/HookSocial/HookSocial.php @@ -0,0 +1,20 @@ + 'Ein Fehler ist aufgetreten', + 'Save' => 'Speichern', +]; diff --git a/local/modules/HookSocial/I18n/backOffice/default/en_US.php b/local/modules/HookSocial/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..4ce9a282 --- /dev/null +++ b/local/modules/HookSocial/I18n/backOffice/default/en_US.php @@ -0,0 +1,7 @@ + 'An error occured', + 'Edit your social accounts.' => 'Edit your social accounts.', + 'Save' => 'Save', +); diff --git a/local/modules/HookSocial/I18n/backOffice/default/fr_FR.php b/local/modules/HookSocial/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..e08beb6c --- /dev/null +++ b/local/modules/HookSocial/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,7 @@ + 'Une erreur est survenue', + 'Edit your social accounts.' => 'Modifier vos paramètres de réseaux sociaux.', + 'Save' => ' Enregistrer', +]; diff --git a/local/modules/HookSocial/I18n/backOffice/default/it_IT.php b/local/modules/HookSocial/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..3099d7ba --- /dev/null +++ b/local/modules/HookSocial/I18n/backOffice/default/it_IT.php @@ -0,0 +1,6 @@ + 'Modifica i tuoi account social.', + 'Save' => 'Salvare', +]; diff --git a/local/modules/HookSocial/I18n/backOffice/default/tr_TR.php b/local/modules/HookSocial/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..f4d5e02c --- /dev/null +++ b/local/modules/HookSocial/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,7 @@ + 'Bir hata meydana geldi', + 'Edit your social accounts.' => 'Sosyal hesaplarınızı düzenleyin.', + 'Save' => 'kaydet', +]; diff --git a/local/modules/HookSocial/I18n/de_DE.php b/local/modules/HookSocial/I18n/de_DE.php new file mode 100644 index 00000000..e6c7fb51 --- /dev/null +++ b/local/modules/HookSocial/I18n/de_DE.php @@ -0,0 +1,12 @@ + 'Facebook Benutzername', + 'Follow us' => 'Folgen Sie uns', + 'Google + username' => 'Google+ Benutzername', + 'Instagram username' => 'Instagram Benutzername', + 'Pinterest username' => 'Pinterest Benutzername', + 'RSS URL' => 'RSS-URL', + 'Twitter username' => 'Twitter Benutzername', + 'Youtube URL' => 'YouTube-URL', +]; diff --git a/local/modules/HookSocial/I18n/en_US.php b/local/modules/HookSocial/I18n/en_US.php new file mode 100644 index 00000000..dfb8eff8 --- /dev/null +++ b/local/modules/HookSocial/I18n/en_US.php @@ -0,0 +1,12 @@ + 'Facebook username', + 'Follow us' => 'Follow us', + 'Google + username' => 'Google + username', + 'Instagram username' => 'Instagram username', + 'Pinterest username' => 'Pinterest username', + 'RSS URL' => 'RSS URL', + 'Twitter username' => 'Twitter username', + 'Youtube URL' => 'Youtube URL', +); diff --git a/local/modules/HookSocial/I18n/fr_FR.php b/local/modules/HookSocial/I18n/fr_FR.php new file mode 100644 index 00000000..6f08ba6f --- /dev/null +++ b/local/modules/HookSocial/I18n/fr_FR.php @@ -0,0 +1,12 @@ + 'Nom d\'utilisateur Facebook', + 'Follow us' => 'Suivez-nous', + 'Google + username' => 'Nom d\'utilisateur Google +', + 'Instagram username' => 'Nom d\'utilisateur Instagram', + 'Pinterest username' => 'Nom d\'utilisateur Pinterest', + 'RSS URL' => 'URL du flux RSS', + 'Twitter username' => 'Nom d\'utilisateur Twitter', + 'Youtube URL' => 'URL Youtube', +]; diff --git a/local/modules/HookSocial/I18n/frontOffice/default/de_DE.php b/local/modules/HookSocial/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..938a9f4a --- /dev/null +++ b/local/modules/HookSocial/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google+', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS-Feed', + 'Twitter' => 'Twitter', + 'Youtube' => 'YouTube', +]; diff --git a/local/modules/HookSocial/I18n/frontOffice/default/en_US.php b/local/modules/HookSocial/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..534a4d03 --- /dev/null +++ b/local/modules/HookSocial/I18n/frontOffice/default/en_US.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google+', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS Feed', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +); diff --git a/local/modules/HookSocial/I18n/frontOffice/default/fr_FR.php b/local/modules/HookSocial/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..7b64f075 --- /dev/null +++ b/local/modules/HookSocial/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google+', + 'Instagram' => 'Instagram', + 'RSS' => 'Flux RSS', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +]; diff --git a/local/modules/HookSocial/I18n/frontOffice/default/it_IT.php b/local/modules/HookSocial/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..15298b70 --- /dev/null +++ b/local/modules/HookSocial/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google +', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS Feed', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +]; diff --git a/local/modules/HookSocial/I18n/frontOffice/default/tr_TR.php b/local/modules/HookSocial/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..b951272b --- /dev/null +++ b/local/modules/HookSocial/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,10 @@ + 'Facebook', + 'Google+' => 'Google +', + 'Instagram' => 'Instagram', + 'RSS' => 'RSS Beslemesi', + 'Twitter' => 'Twitter', + 'Youtube' => 'Youtube', +]; diff --git a/local/modules/HookSocial/I18n/it_IT.php b/local/modules/HookSocial/I18n/it_IT.php new file mode 100644 index 00000000..e1fd072a --- /dev/null +++ b/local/modules/HookSocial/I18n/it_IT.php @@ -0,0 +1,12 @@ + 'Nome utente Facebook', + 'Follow us' => 'Seguici', + 'Google + username' => 'Nome utente Google +', + 'Instagram username' => 'Nome utente Instagram', + 'Pinterest username' => 'Nome utente Pinterest', + 'RSS URL' => 'RSS URL', + 'Twitter username' => 'Nome utente Twitter', + 'Youtube URL' => 'Youtube URL', +]; diff --git a/local/modules/HookSocial/I18n/tr_TR.php b/local/modules/HookSocial/I18n/tr_TR.php new file mode 100644 index 00000000..c5ea54f4 --- /dev/null +++ b/local/modules/HookSocial/I18n/tr_TR.php @@ -0,0 +1,12 @@ + 'Facebook kullanıcı adı', + 'Follow us' => 'Bizi takip edin', + 'Google + username' => 'Google + kullanıcı adı', + 'Instagram username' => 'Google + kullanıcı adı', + 'Pinterest username' => 'Pinterest kullanıcı adı', + 'RSS URL' => 'RSS URL', + 'Twitter username' => 'Twitter kullanıcı adı', + 'Youtube URL' => 'YouTube URL', +]; diff --git a/local/modules/HookSocial/LICENSE.txt b/local/modules/HookSocial/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/HookSocial/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/HookSocial/composer.json b/local/modules/HookSocial/composer.json new file mode 100644 index 00000000..4a18288a --- /dev/null +++ b/local/modules/HookSocial/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/hook-social-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "HookSocial" + } +} diff --git a/local/modules/HookSocial/templates/backOffice/default/assets/js/module-configuration.js b/local/modules/HookSocial/templates/backOffice/default/assets/js/module-configuration.js new file mode 100644 index 00000000..5bf3dfcc --- /dev/null +++ b/local/modules/HookSocial/templates/backOffice/default/assets/js/module-configuration.js @@ -0,0 +1,28 @@ +$(document).ready(function() { + $("#hooksocial-form").on("submit", function(e, data){ + e.preventDefault(); + var form = $(this); + + $('body').append(''); + + $.ajax({ + url: form.attr('action'), + type: form.attr('method'), + data: form.serialize() + }).done(function(){ + $("#loading-event").remove(); + }) + .success(function(data) { + if (data.error != 0) { + $("#loading-event").remove(); + $('#hooksocial-failed-body').html(data.message); + $("#hooksocial-failed").modal("show"); + } + }) + .fail(function(jqXHR, textStatus, errorThrown){ + $("#loading-event").remove(); + $('#hooksocial-failed-body').html(jqXHR.responseJSON.message); + $("#hooksocial-failed").modal("show"); + }); + }); +}); \ No newline at end of file diff --git a/local/modules/HookSocial/templates/backOffice/default/module_configuration.html b/local/modules/HookSocial/templates/backOffice/default/module_configuration.html new file mode 100644 index 00000000..61a48c13 --- /dev/null +++ b/local/modules/HookSocial/templates/backOffice/default/module_configuration.html @@ -0,0 +1,94 @@ + + + +
+
+ +
+ {intl d='hooksocial.bo.default' l='Edit your social accounts.'} +
+ +
+
+ + {form name="hooksocial.configuration.form"} + + + {form_hidden_fields} + + {form_field field='twitter'} +
+ + +
+ {/form_field} + + {form_field field='facebook'} +
+ + +
+ {/form_field} + + {form_field field='google'} +
+ + +
+ {/form_field} + + {form_field field='instagram'} +
+ + +
+ {/form_field} + + {form_field field='pinterest'} +
+ + +
+ {/form_field} + + {form_field field='youtube'} +
+ + +
+ {/form_field} + + {form_field field='rss'} +
+ + +
+ {/form_field} + + + + {/form} + +
+ +
+ +
+
+ + + + diff --git a/local/modules/HookSocial/templates/frontOffice/default/assets/css/styles.css b/local/modules/HookSocial/templates/frontOffice/default/assets/css/styles.css new file mode 100644 index 00000000..e69de29b diff --git a/local/modules/HookSocial/templates/frontOffice/default/main-footer-body.html b/local/modules/HookSocial/templates/frontOffice/default/main-footer-body.html new file mode 100644 index 00000000..095d7832 --- /dev/null +++ b/local/modules/HookSocial/templates/frontOffice/default/main-footer-body.html @@ -0,0 +1,86 @@ + \ No newline at end of file diff --git a/local/modules/HookTest/Config/config.xml b/local/modules/HookTest/Config/config.xml new file mode 100644 index 00000000..6b26bd61 --- /dev/null +++ b/local/modules/HookTest/Config/config.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/HookTest/Config/module.xml b/local/modules/HookTest/Config/module.xml new file mode 100644 index 00000000..9cd16c76 --- /dev/null +++ b/local/modules/HookTest/Config/module.xml @@ -0,0 +1,18 @@ + + + HookTest\HookTest + + Hook module tester + + + Hook module tester + + 0.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + classic + 2.0.0 + other + diff --git a/local/modules/HookTest/Hook/FrontHook.php b/local/modules/HookTest/Hook/FrontHook.php new file mode 100644 index 00000000..ea805a63 --- /dev/null +++ b/local/modules/HookTest/Hook/FrontHook.php @@ -0,0 +1,170 @@ + + */ +class FrontHook extends BaseHook { + + protected $ldelim = "::"; + protected $rdelim = "::"; + + + public function onMainHeadTop(HookRenderEvent $event) + { + $event->add($this->mark("main.head-top test0")); + } + + public function onMainHeadTopTest1(HookRenderEvent $event) + { + $event->add($this->mark("main.head-top test1")); + } + + public function onMainHeadTopTest2(HookRenderEvent $event) + { + $event->add($this->mark("main.head-top test2")); + } + + public function onMainHeadTopTest3(HookRenderEvent $event) + { + $event->add($this->mark("main.head-top test3")); + } + + + // == Hook Function ===================================================== + + public function onMainBodyTop(HookRenderEvent $event){ + $event->add($this->mark("main.body-top 1-1")); + $event->add($this->mark("main.body-top 1-2")); + } + + public function onMainBodyTop2(HookRenderEvent $event) + { + $event->add($this->mark("main.body-top 2")); + } + + + // == ifhook / elsehook ================================================ + + public function onMainNavbarSecondary(HookRenderEvent $event){ + $event->add($this->mark("main.navbar-secondary 1")); + } + + /** + * empty string should be considered as empty :) and should activate the elsehook + * + * @param HookRenderEvent $event + */ + public function onMainNavbarPrimary(HookRenderEvent $event) + { + $event->add(""); + $event->add(" "); + } + + public function onProductAdditional(HookRenderEvent $event) + { + // nothing added + } + + + // == hookblock / forhook ============================================== + + public function onMainFooterBody(HookRenderBlockEvent $event) + { + $event->addFragment(new Fragment(array( + "id" => "id1", + "class" => "class1", + "content" => "content1" + ))); + $event->add(array( + "id" => "id2", + "class" => "class2", + "content" => "content2" + )); + } + + // == global objects =================================================== + + public function onMainContentTop(HookRenderEvent $event) + { + $event->add($this->mark("main.content-top")); + $event->add($this->mark("view : " . $this->getView())); + $event->add($this->mark("request : " . $this->getRequest())); + $event->add($this->mark("session : " . $this->getSession()->getId())); + $event->add($this->mark("cart : " . ($this->getCart() === null ? "null" : "not null"))); + $event->add($this->mark("order : " . ($this->getOrder() === null ? "null" : "not null"))); + $event->add($this->mark("currency : " . $this->getCurrency()->getId())); + $event->add($this->mark("customer : " . $this->getCustomer())); + $event->add($this->mark("lang : " . $this->getLang()->getId())); + } + + public function onMainContentTopRender(HookRenderEvent $event) + { + $event->add($this->render("render.html")); + } + + public function onMainContentTopDump(HookRenderEvent $event) + { + $event->add($this->dump("dump.txt")); + } + + public function onMainContentTopAddCSS(HookRenderEvent $event) + { + $event->add($this->mark($this->addCSS("assets/css/styles.css"))); + $event->add($this->mark($this->addCSS("assets/css/print.css", array("media" => "print")))); + } + + public function onMainContentTopAddJS(HookRenderEvent $event) + { + $event->add($this->mark($this->addJS("assets/js/script.js"))); + } + + public function onMainContentTopTrans(HookRenderEvent $event) + { + $event->add($this->mark($this->trans("Hodor Hodor", array(), "hooktest"))); + $event->add($this->mark($this->trans("Hello World", array(), "hooktest"))); + $event->add($this->mark($this->trans("Hello %name%", array("%name%" => "Hodor")))); + $event->add($this->mark($this->trans("Hi %name%", array("%name%" => "Hodor"), "hooktest", 'fr_FR'))); + } + + // == template overriding ==================================================== + + public function onMainContentTopOverriding(HookRenderEvent $event) + { + $event->add($this->render("override1.html")); + // redefined in template hooktest in the module + $event->add($this->render("override2.html")); + // redefined in template hooktest + $event->add($this->render("override3.html")); + + $event->add($this->render("override-assets.html")); + + } + + + + protected function mark($message, $endofline="\n") + { + return sprintf("%s %s %s%s", $this->ldelim, $message, $this->rdelim, $endofline); + } + +} \ No newline at end of file diff --git a/local/modules/HookTest/HookTest.php b/local/modules/HookTest/HookTest.php new file mode 100644 index 00000000..1a95a557 --- /dev/null +++ b/local/modules/HookTest/HookTest.php @@ -0,0 +1,21 @@ + 'Hodor en_US Hodor', + 'Hello World' => 'Hello en_US World', + 'Hello %name%' => 'Hello en_US %name%', + 'Hi %name%' => 'Hi en_US %name%', +); diff --git a/local/modules/HookTest/I18n/fr_FR.php b/local/modules/HookTest/I18n/fr_FR.php new file mode 100644 index 00000000..78016ce0 --- /dev/null +++ b/local/modules/HookTest/I18n/fr_FR.php @@ -0,0 +1,7 @@ + 'Hodor fr_FR Hodor', + 'Hello World' => 'Bonjour fr_FR monde', + 'Hello %name%' => 'Bonjour fr_FR %name%', + 'Hi %name%' => 'Salut fr_FR %name%', +); diff --git a/local/modules/HookTest/I18n/frontOffice/default/en_US.php b/local/modules/HookTest/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..afca37ed --- /dev/null +++ b/local/modules/HookTest/I18n/frontOffice/default/en_US.php @@ -0,0 +1,5 @@ + + {ifloop rel="cartloop"} + + {/ifloop} + {elseloop rel="cartloop"} + + {/elseloop} + \ No newline at end of file diff --git a/local/modules/HookTest/templates/frontOffice/default/override-assets.html b/local/modules/HookTest/templates/frontOffice/default/override-assets.html new file mode 100644 index 00000000..3702db3c --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/default/override-assets.html @@ -0,0 +1,13 @@ + + +{stylesheets file="assets/css/style1.css" source="HookTest"} +asset file 1 : {$asset_url} +{/stylesheets} +{stylesheets file="assets/css/style2.css" source="HookTest"} +asset file 2 : {$asset_url} +{/stylesheets} +{stylesheets file="assets/css/style3.css" source="HookTest"} +asset file 3 : {$asset_url} +{/stylesheets} + + \ No newline at end of file diff --git a/local/modules/HookTest/templates/frontOffice/default/override1.html b/local/modules/HookTest/templates/frontOffice/default/override1.html new file mode 100644 index 00000000..31b1e3e4 --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/default/override1.html @@ -0,0 +1 @@ +:: file override1 from module/default :: diff --git a/local/modules/HookTest/templates/frontOffice/default/override2.html b/local/modules/HookTest/templates/frontOffice/default/override2.html new file mode 100644 index 00000000..d3744dba --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/default/override2.html @@ -0,0 +1 @@ +:: file override2 from module/default :: diff --git a/local/modules/HookTest/templates/frontOffice/default/override3.html b/local/modules/HookTest/templates/frontOffice/default/override3.html new file mode 100644 index 00000000..e178cc79 --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/default/override3.html @@ -0,0 +1 @@ +:: file override3 from module/default :: diff --git a/local/modules/HookTest/templates/frontOffice/default/render.html b/local/modules/HookTest/templates/frontOffice/default/render.html new file mode 100644 index 00000000..217a5f63 --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/default/render.html @@ -0,0 +1,2 @@ + +:: function render :: diff --git a/local/modules/HookTest/templates/frontOffice/hooktest/assets/css/style2.css b/local/modules/HookTest/templates/frontOffice/hooktest/assets/css/style2.css new file mode 100644 index 00000000..348fd427 --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/hooktest/assets/css/style2.css @@ -0,0 +1 @@ +/* style2 in module/hooktest */ \ No newline at end of file diff --git a/local/modules/HookTest/templates/frontOffice/hooktest/override2.html b/local/modules/HookTest/templates/frontOffice/hooktest/override2.html new file mode 100644 index 00000000..108fb477 --- /dev/null +++ b/local/modules/HookTest/templates/frontOffice/hooktest/override2.html @@ -0,0 +1 @@ +:: file override2 from module/hooktest :: diff --git a/local/modules/InvoiceRef/AdminIncludes/module_configuration.html b/local/modules/InvoiceRef/AdminIncludes/module_configuration.html new file mode 100644 index 00000000..792faa19 --- /dev/null +++ b/local/modules/InvoiceRef/AdminIncludes/module_configuration.html @@ -0,0 +1,52 @@ +
+
+
+
+ {intl d='invoiceref.ai' l="Invoice ref Configuration"} +
+
+ +
+
+
+ {form name="invoiceref_configuration"} + +
+ {form_hidden_fields form=$form} + + {include file = "includes/inner-form-toolbar.html" + hide_flags = true + page_url = "{url path='/admin/module/InvoiceRef'}" + close_url = "{url path='/admin/modules'}" + } + + {if $form_error} +
+
+
{$form_error_message}
+
+
+ {/if} + +
+
+ {form_field form=$form field="invoice"} +
+ + {/form_field} +
+
+ + {/form} +
+
+
+
\ No newline at end of file diff --git a/local/modules/InvoiceRef/Config/config.xml b/local/modules/InvoiceRef/Config/config.xml new file mode 100644 index 00000000..f87c0262 --- /dev/null +++ b/local/modules/InvoiceRef/Config/config.xml @@ -0,0 +1,31 @@ + + + + + + + + + +
+ + + + + + + + + + + + + diff --git a/local/modules/InvoiceRef/Config/module.xml b/local/modules/InvoiceRef/Config/module.xml new file mode 100644 index 00000000..d810f60c --- /dev/null +++ b/local/modules/InvoiceRef/Config/module.xml @@ -0,0 +1,18 @@ + + + InvoiceRef\InvoiceRef + + Manage invoive ref + + + Gestion des numéros de facture + + 0.1 + + Manuel Raynaud + manu@thelia.net + + classic + 2.0.0 + alpha + diff --git a/local/modules/InvoiceRef/Config/routing.xml b/local/modules/InvoiceRef/Config/routing.xml new file mode 100644 index 00000000..014ba703 --- /dev/null +++ b/local/modules/InvoiceRef/Config/routing.xml @@ -0,0 +1,35 @@ + + + + + + + + InvoiceRef\Controller\ConfigurationController::configureAction + + + diff --git a/local/modules/InvoiceRef/Config/schema.xml b/local/modules/InvoiceRef/Config/schema.xml new file mode 100644 index 00000000..6acc7afb --- /dev/null +++ b/local/modules/InvoiceRef/Config/schema.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/local/modules/InvoiceRef/Controller/ConfigurationController.php b/local/modules/InvoiceRef/Controller/ConfigurationController.php new file mode 100644 index 00000000..6bdbc018 --- /dev/null +++ b/local/modules/InvoiceRef/Controller/ConfigurationController.php @@ -0,0 +1,74 @@ + + */ +class ConfigurationController extends BaseAdminController +{ + + public function configureAction() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'invoiceref', AccessManager::UPDATE)) { + return $response; + } + + $form = new ConfigurationForm($this->getRequest()); + $response = null; + $error_msg = null; + try { + $configForm = $this->validateForm($form); + + ConfigQuery::write('invoiceRef', $configForm->get('invoice')->getData(), true, true); + + // Redirect to the success URL, + if ($this->getRequest()->get('save_mode') == 'stay') { + // If we have to stay on the same page, redisplay the configuration page/ + $route = '/admin/module/InvoiceRef'; + } else { + // If we have to close the page, go back to the module back-office page. + $route = '/admin/modules'; + } + $response = RedirectResponse::create(URL::getInstance()->absoluteUrl($route)); + } catch (FormValidationException $e) { + $error_msg = $this->createStandardFormValidationErrorMessage($e); + } catch (\Exception $e) { + $error_msg = $e->getMessage(); + } + if (null !== $error_msg) { + $this->setupFormErrorContext( + 'InvoiceRef Configuration', + $error_msg, + $form, + $e + ); + $response = $this->render( + 'module-configure', + ['module_code' => 'InvoiceRef'] + ); + } + return $response; + } +} \ No newline at end of file diff --git a/local/modules/InvoiceRef/EventListeners/OrderListener.php b/local/modules/InvoiceRef/EventListeners/OrderListener.php new file mode 100644 index 00000000..f5cb5b49 --- /dev/null +++ b/local/modules/InvoiceRef/EventListeners/OrderListener.php @@ -0,0 +1,75 @@ + + */ +class OrderListener implements EventSubscriberInterface +{ + + public function implementInvoice(OrderEvent $event) + { + $order = $event->getOrder(); + + if ($order->isPaid() && null === $order->getInvoiceRef()) { + $invoiceRef = ConfigQuery::create() + ->findOneByName('invoiceRef'); + + if (null === $invoiceRef) { + throw new \RuntimeException("you must set an invoice ref in your admin panel"); + } + $value = $invoiceRef->getValue(); + $order->setInvoiceRef($value) + ->save() + ; + + $invoiceRef->setValue(++$value) + ->save(); + } + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return [ + TheliaEvents::ORDER_UPDATE_STATUS => ['implementInvoice', 100] + ]; + } +} \ No newline at end of file diff --git a/local/modules/InvoiceRef/Form/ConfigurationForm.php b/local/modules/InvoiceRef/Form/ConfigurationForm.php new file mode 100644 index 00000000..a00aefbe --- /dev/null +++ b/local/modules/InvoiceRef/Form/ConfigurationForm.php @@ -0,0 +1,71 @@ + + */ +class ConfigurationForm extends BaseForm +{ + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + $this->formBuilder + ->add('invoice', 'text', [ + 'constraints' => [ + new NotBlank() + ], + 'label' => Translator::getInstance()->trans('invoice ref', [], InvoiceRef::DOMAIN_NAME), + 'label_attr' => [ + 'for' => 'invoice-ref' + ], + 'data' => ConfigQuery::read('invoiceRef', 0) + ]); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'invoiceref_config'; + } +} \ No newline at end of file diff --git a/local/modules/InvoiceRef/I18n/AdminIncludes/en_US.php b/local/modules/InvoiceRef/I18n/AdminIncludes/en_US.php new file mode 100644 index 00000000..2c5aa60f --- /dev/null +++ b/local/modules/InvoiceRef/I18n/AdminIncludes/en_US.php @@ -0,0 +1,5 @@ + 'Invoice ref Configuration', +); diff --git a/local/modules/InvoiceRef/I18n/AdminIncludes/fr_FR.php b/local/modules/InvoiceRef/I18n/AdminIncludes/fr_FR.php new file mode 100644 index 00000000..298ff8bf --- /dev/null +++ b/local/modules/InvoiceRef/I18n/AdminIncludes/fr_FR.php @@ -0,0 +1,5 @@ + 'Configuration du numéro de facture', +); diff --git a/local/modules/InvoiceRef/I18n/en_US.php b/local/modules/InvoiceRef/I18n/en_US.php new file mode 100644 index 00000000..00767223 --- /dev/null +++ b/local/modules/InvoiceRef/I18n/en_US.php @@ -0,0 +1,5 @@ + 'invoice ref', +); diff --git a/local/modules/InvoiceRef/I18n/fr_FR.php b/local/modules/InvoiceRef/I18n/fr_FR.php new file mode 100644 index 00000000..1446cf32 --- /dev/null +++ b/local/modules/InvoiceRef/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Numéro de facture', +); diff --git a/local/modules/InvoiceRef/InvoiceRef.php b/local/modules/InvoiceRef/InvoiceRef.php new file mode 100644 index 00000000..c48e6594 --- /dev/null +++ b/local/modules/InvoiceRef/InvoiceRef.php @@ -0,0 +1,33 @@ +/local/modules/``` directory and be sure that the name of the module is InvoiceRef. +* Activate it in your thelia administration panel + +## Usage + +Once installed, you have to set the invoice number used by Thelia. After that, this number will be increased after each payment. For example if you start with number 1000, this number will be increased by 1 after each payment so you will have 1000, after 1001, after 1002, etc. + +If you don't set this number, it will start with number 1 diff --git a/local/modules/OrderCreation/AdminIncludes/customer-edit-js.html b/local/modules/OrderCreation/AdminIncludes/customer-edit-js.html new file mode 100644 index 00000000..3b1f1632 --- /dev/null +++ b/local/modules/OrderCreation/AdminIncludes/customer-edit-js.html @@ -0,0 +1,168 @@ + diff --git a/local/modules/OrderCreation/AdminIncludes/customer-edit.html b/local/modules/OrderCreation/AdminIncludes/customer-edit.html new file mode 100644 index 00000000..9b72ce4f --- /dev/null +++ b/local/modules/OrderCreation/AdminIncludes/customer-edit.html @@ -0,0 +1,29 @@ +
+
+
+ {if $order_creation_error} +
+
{$order_creation_error}
+
+ {/if} + {if $order_creation_success} +
+
{$order_creation_success}
+
+ {/if} +
+ {intl l="Create an order for this customer" d='ordercreation'} +
+
+ {loop type="auth" name="can_create" role="ADMIN" resource="admin.ordercreation" access="CREATE"} + + {intl l="Generate a new order" d="ordercreation"} + + {/loop} +
+
+
+
+ +{* -- Create a new order -------------------- *} +{include file="forms/create-order-form.html"} \ No newline at end of file diff --git a/local/modules/OrderCreation/AdminIncludes/head_css.html b/local/modules/OrderCreation/AdminIncludes/head_css.html new file mode 100644 index 00000000..a81fc780 --- /dev/null +++ b/local/modules/OrderCreation/AdminIncludes/head_css.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/local/modules/OrderCreation/AdminIncludes/orders_table_header.html b/local/modules/OrderCreation/AdminIncludes/orders_table_header.html new file mode 100644 index 00000000..19e33491 --- /dev/null +++ b/local/modules/OrderCreation/AdminIncludes/orders_table_header.html @@ -0,0 +1,6 @@ + + {intl l="Invoice" d="ordercreation"} + + + {intl l="Invoice date" d="ordercreation"} + \ No newline at end of file diff --git a/local/modules/OrderCreation/AdminIncludes/orders_table_row.html b/local/modules/OrderCreation/AdminIncludes/orders_table_row.html new file mode 100644 index 00000000..f03413bb --- /dev/null +++ b/local/modules/OrderCreation/AdminIncludes/orders_table_row.html @@ -0,0 +1,6 @@ + + {$INVOICE_REF} + + + {format_date date=$INVOICE_DATE output="date"} + \ No newline at end of file diff --git a/local/modules/OrderCreation/Config/config.xml b/local/modules/OrderCreation/Config/config.xml new file mode 100644 index 00000000..910910e1 --- /dev/null +++ b/local/modules/OrderCreation/Config/config.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/OrderCreation/Config/module.xml b/local/modules/OrderCreation/Config/module.xml new file mode 100644 index 00000000..e262b351 --- /dev/null +++ b/local/modules/OrderCreation/Config/module.xml @@ -0,0 +1,18 @@ + + + OrderCreation\OrderCreation + + Order creation in BackOffice + + + Creation de commande dans le BackOffice + + 1.4 + + gbarral + gbarral@openstudio.fr + + classic + 2.1.1 + other + diff --git a/local/modules/OrderCreation/Config/routing.xml b/local/modules/OrderCreation/Config/routing.xml new file mode 100644 index 00000000..b97bc2b6 --- /dev/null +++ b/local/modules/OrderCreation/Config/routing.xml @@ -0,0 +1,25 @@ + + + + + + OrderCreation\Controller\Admin\OrderCreationAdminController::createOrderAction + + + + OrderCreation\Controller\Admin\OrderCreationAdminController::addItemAction + \d+ + + + + OrderCreation\Controller\Admin\OrderCreationAdminController::getAvailableProductAction + xml|json + + + + OrderCreation\Controller\Admin\OrderCreationAdminController::updateCountryInRequest + + + diff --git a/local/modules/OrderCreation/Config/schema.xml b/local/modules/OrderCreation/Config/schema.xml new file mode 100644 index 00000000..75486271 --- /dev/null +++ b/local/modules/OrderCreation/Config/schema.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/local/modules/OrderCreation/Controller/Admin/OrderCreationAdminController.php b/local/modules/OrderCreation/Controller/Admin/OrderCreationAdminController.php new file mode 100644 index 00000000..78c92fcd --- /dev/null +++ b/local/modules/OrderCreation/Controller/Admin/OrderCreationAdminController.php @@ -0,0 +1,239 @@ +render( + "ajax/add-cart-item", + array("position" => $position) + ); + } + + public function createOrderAction() + { + $response = $this->checkAuth(array(AdminResources::MODULE), array('OrderCreation'), AccessManager::CREATE); + if (null !== $response) { + return $response; + } + + $con = Propel::getConnection(OrderTableMap::DATABASE_NAME); + $con->beginTransaction(); + + $form = new OrderCreationCreateForm($this->getRequest()); + + try { + + $formValidate = $this->validateForm($form); + + $event = new OrderCreationEvent(); + + $event + ->setContainer($this->getContainer()) + ->setCustomerId($formValidate->get('customer_id')->getData()) + ->setDeliveryAddressId($formValidate->get('delivery_address_id')->getData()) + ->setDeliveryModuleId($formValidate->get('delivery_module_id')->getData()) + ->setInvoiceAddressId($formValidate->get('invoice_address_id')->getData()) + ->setPaymentModuleId($formValidate->get('payment_module_id')->getData()) + ->setProductSaleElementIds($formValidate->get('product_sale_element_id')->getData()) + ->setQuantities($formValidate->get('quantity')->getData()) + ; + + $this->dispatch(OrderCreationListener::ADMIN_ORDER_CREATE, $event); + + if (null != $event->getResponse()) { + $con->commit(); + return $event->getResponse(); + } + + //Don't forget to fill the Customer form + if (null != $customer = CustomerQuery::create()->findPk($formValidate->get('customer_id')->getData())) { + $customerForm = $this->hydrateCustomerForm($customer); + $this->getParserContext()->addForm($customerForm); + } + + $con->commit(); + return RedirectResponse::create( + URL::getInstance()->absoluteUrl( + '/admin/customer/update?customer_id='.$formValidate->get('customer_id')->getData() + ) + ); + + } catch (\Exception $e) { + $con->rollBack(); + $form->setErrorMessage($e->getMessage()); + + $this->getParserContext() + ->addForm($form) + ->setGeneralError($e->getMessage()) + ; + + //Don't forget to fill the Customer form + if (null != $customer = CustomerQuery::create() + ->findPk($this->getRequest()->request->get('admin_order_create')['customer_id'])) { + + $customerForm = $this->hydrateCustomerForm($customer); + $this->getParserContext()->addForm($customerForm); + + } + + return $this->render('customer-edit', array( + 'customer_id' => $this->getRequest()->request->get('admin_order_create')['customer_id'], + "order_creation_error" => $e->getMessage() + )); + } + } + + protected function hydrateCustomerForm(Customer $customer) + { + // Get default adress of the customer + $address = $customer->getDefaultAddress(); + + // Prepare the data that will hydrate the form + $data = array( + 'id' => $customer->getId(), + 'firstname' => $customer->getFirstname(), + 'lastname' => $customer->getLastname(), + 'email' => $customer->getEmail(), + 'title' => $customer->getTitleId(), + 'discount' => $customer->getDiscount(), + 'reseller' => $customer->getReseller(), + ); + + if ($address !== null) { + $data['company'] = $address->getCompany(); + $data['address1'] = $address->getAddress1(); + $data['address2'] = $address->getAddress2(); + $data['address3'] = $address->getAddress3(); + $data['phone'] = $address->getPhone(); + $data['cellphone'] = $address->getCellphone(); + $data['zipcode'] = $address->getZipcode(); + $data['city'] = $address->getCity(); + $data['country'] = $address->getCountryId(); + } + + // A loop is used in the template + return new CustomerUpdateForm($this->getRequest(), 'form', $data); + } + + public function getAvailableProductAction($categoryId = null) + { + $result = array(); + + if ($categoryId !== null) { + + $pseQuery = ProductSaleElementsQuery::create(); + + $productJoin = new Join(ProductSaleElementsTableMap::PRODUCT_ID, ProductTableMap::ID, Criteria::INNER_JOIN); + $pseQuery->addJoinObject($productJoin); + + $productI18nJoin = new Join(ProductTableMap::ID, ProductI18nTableMap::ID, Criteria::INNER_JOIN); + $pseQuery->addJoinObject($productI18nJoin, 'productI18n_JOIN'); + $pseQuery->addJoinCondition( + "productI18n_JOIN", + "product_i18n.locale = '".$this->getCurrentEditionLocale()."'", + null, + null, + \PDO::PARAM_STR + ); + + $productCategoryJoin = new Join( + ProductTableMap::ID, + ProductCategoryTableMap::PRODUCT_ID, + Criteria::INNER_JOIN + ); + $pseQuery->addJoinObject($productCategoryJoin, "productCategory_JOIN"); + $pseQuery->addJoinCondition( + "productCategory_JOIN", + "product_category.default_category = ?", + 1, + null, + \PDO::PARAM_INT + ); + + $pseQuery->addJoinCondition( + "productCategory_JOIN", + "product_category.category_id = ?", + $categoryId, + null, + \PDO::PARAM_INT + ); + + $pseQuery->addAscendingOrderByColumn('product_i18n.TITLE'); + + $pseQuery->withColumn("product_i18n.title", "PRODUCT_TITLE"); + $pseQuery->withColumn("product.id", "PRODUCT_ID"); + + $pses = $pseQuery->find(); + + /** @var \Thelia\Model\ProductSaleElements $pse */ + foreach ($pses as $pse) { + $result[] = array( + 'id' => $pse->getId(), + 'product_id' => $pse->getVirtualColumns()["PRODUCT_ID"], + 'ref' => $pse->getRef(), + 'title' => $pse->getVirtualColumns()["PRODUCT_TITLE"], + 'quantity' => $pse->getQuantity() + ); + } + } + + return $this->jsonResponse(json_encode($result)); + } + + public function updateCountryInRequest() + { + if (null != $addressId = $this->getRequest()->request->get('address_id')) { + + if (null != $address = AddressQuery::create()->findPk($addressId)) { + $order = new Order(); + $order + ->setCustomer() + ->setChoosenDeliveryAddress($addressId); + + $this->getRequest()->getSession()->set( + "thelia.order", + $order + ); + + $this->getRequest()->getSession()->set( + "thelia.customer_user", + $address->getCustomer() + ); + } + + } + + return null; + } +} diff --git a/local/modules/OrderCreation/Event/OrderCreationEvent.php b/local/modules/OrderCreation/Event/OrderCreationEvent.php new file mode 100644 index 00000000..a7363fbe --- /dev/null +++ b/local/modules/OrderCreation/Event/OrderCreationEvent.php @@ -0,0 +1,273 @@ +container = $container; + + return $this; + } + + /** + * @return \Symfony\Component\DependencyInjection\ContainerInterface + */ + public function getContainer() + { + return $this->container; + } + + /** + * @param \Thelia\Model\CartItem $cartItem + * + * @return OrderCreationEvent + */ + public function setCartItem($cartItem) + { + $this->cartItem = $cartItem; + + return $this; + } + + /** + * @return \Thelia\Model\CartItem + */ + public function getCartItem() + { + return $this->cartItem; + } + + /** + * @param int $customerId + * + * @return OrderCreationEvent + */ + public function setCustomerId($customerId) + { + $this->customerId = $customerId; + + return $this; + } + + /** + * @return int + */ + public function getCustomerId() + { + return $this->customerId; + } + + /** + * @param int $deliveryAddressId + * + * @return OrderCreationEvent + */ + public function setDeliveryAddressId($deliveryAddressId) + { + $this->deliveryAddressId = $deliveryAddressId; + + return $this; + } + + /** + * @return int + */ + public function getDeliveryAddressId() + { + return $this->deliveryAddressId; + } + + /** + * @param int $deliveryModuleId + * + * @return OrderCreationEvent + */ + public function setDeliveryModuleId($deliveryModuleId) + { + $this->deliveryModuleId = $deliveryModuleId; + + return $this; + } + + /** + * @return int + */ + public function getDeliveryModuleId() + { + return $this->deliveryModuleId; + } + + /** + * @param int $invoiceAddressId + * + * @return OrderCreationEvent + */ + public function setInvoiceAddressId($invoiceAddressId) + { + $this->invoiceAddressId = $invoiceAddressId; + + return $this; + } + + /** + * @return int + */ + public function getInvoiceAddressId() + { + return $this->invoiceAddressId; + } + + /** + * @param int $paymentModuleId + * + * @return OrderCreationEvent + */ + public function setPaymentModuleId($paymentModuleId) + { + $this->paymentModuleId = $paymentModuleId; + + return $this; + } + + /** + * @return int + */ + public function getPaymentModuleId() + { + return $this->paymentModuleId; + } + + /** + * @param \Thelia\Model\Order $placedOrder + * + * @return OrderCreationEvent + */ + public function setPlacedOrder($placedOrder) + { + $this->placedOrder = $placedOrder; + + return $this; + } + + /** + * @return \Thelia\Model\Order + */ + public function getPlacedOrder() + { + return $this->placedOrder; + } + + /** + * @param array $productSaleElementIds + * + * @return OrderCreationEvent + */ + public function setProductSaleElementIds($productSaleElementIds) + { + $this->productSaleElementIds = $productSaleElementIds; + + return $this; + } + + /** + * @return array + */ + public function getProductSaleElementIds() + { + return $this->productSaleElementIds; + } + + /** + * @param array $quantities + * + * @return OrderCreationEvent + */ + public function setQuantities($quantities) + { + $this->quantities = $quantities; + + return $this; + } + + /** + * @return array + */ + public function getQuantities() + { + return $this->quantities; + } + + /** + * @param mixed $response + * + * @return OrderCreationEvent + */ + public function setResponse($response) + { + $this->response = $response; + + return $this; + } + + /** + * @return mixed + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/local/modules/OrderCreation/EventListeners/OrderCreationListener.php b/local/modules/OrderCreation/EventListeners/OrderCreationListener.php new file mode 100644 index 00000000..a3059613 --- /dev/null +++ b/local/modules/OrderCreation/EventListeners/OrderCreationListener.php @@ -0,0 +1,229 @@ +request = $request; + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return array( + self::ADMIN_ORDER_CREATE => array('adminOrderCreate', 128) + ); + } + + public function adminOrderCreate(OrderCreationEvent $event) + { + $pseIds = $event->getProductSaleElementIds(); + $quantities = $event->getQuantities(); + + /** @var \Thelia\Model\Address $deliveryAddress */ + $deliveryAddress = AddressQuery::create()->findPk($event->getDeliveryAddressId()); + /** @var \Thelia\Model\Address $invoiceAddress */ + $invoiceAddress = AddressQuery::create()->findPk($event->getInvoiceAddressId()); + /** @var \Thelia\Model\Module $deliveryModule */ + $deliveryModule = ModuleQuery::create()->findPk($event->getDeliveryModuleId()); + /** @var \Thelia\Model\Module $paymentModule */ + $paymentModule = ModuleQuery::create()->findPk($event->getPaymentModuleId()); + + /** @var \Thelia\Model\Currency $currency */ + $currency = Currency::getDefaultCurrency(); + $lang = new Lang(); + + /** @var \Thelia\Model\Customer $customer */ + $customer = CustomerQuery::create()->findPk($event->getCustomerId()); + + $order = new Order(); + $order + ->setCustomerId($customer->getId()) + ->setCurrencyId($currency->getId()) + ->setCurrencyRate($currency->getRate()) + ->setStatusId(OrderStatusQuery::getNotPaidStatus()->getId()) + ->setLangId($lang->getDefaultLanguage()->getId()) + ->setChoosenDeliveryAddress($deliveryAddress) + ->setChoosenInvoiceAddress($invoiceAddress) + ; + + $cart = new Cart(); + $cart->setToken(uniqid("createorder", true)) + ->setCustomer($customer) + ->setCurrency($currency->getDefaultCurrency()) + ->save() + ; + + foreach ($pseIds as $key => $pseId) { + + /** @var \Thelia\Model\ProductSaleElements $productSaleElements */ + if (null != $productSaleElements = ProductSaleElementsQuery::create()->findOneById($pseId)) { + + /** @var \Thelia\Model\ProductPrice $productPrice */ + if (null != $productPrice = ProductPriceQuery::create() + ->filterByProductSaleElementsId($productSaleElements->getId()) + ->filterByCurrencyId($currency->getDefaultCurrency()->getId()) + ->findOne()) { + + $cartItem = new CartItem(); + $cartItem + ->setCart($cart) + ->setProduct($productSaleElements->getProduct()) + ->setProductSaleElements($productSaleElements) + ->setQuantity($quantities[$key]) + ->setPrice($productPrice->getPrice()) + ->setPromoPrice($productPrice->getPromoPrice()) + ->setPromo($productSaleElements->getPromo()) + ->setPriceEndOfLife(time() + 60*60*24*30); + + $event->setCartItem($cartItem); + + $event->getDispatcher()->dispatch(self::ADMIN_ORDER_BEFORE_ADD_CART, $event); + + $cartItem->save(); + + } + } + } + + //If someone is connected in FRONT, stock it + $oldCustomer = $this->request->getSession()->getCustomerUser(); + + //Do the same for his cart + $oldCart = $this->request->getSession()->getSessionCart($event->getDispatcher()); + + $this->request->getSession()->setCustomerUser($customer); + + $this->request->getSession()->set("thelia.cart_id", $cart->getId()); + + $orderEvent = new OrderEvent($order); + $orderEvent->setDeliveryAddress($deliveryAddress->getId()); + $orderEvent->setInvoiceAddress($invoiceAddress->getId()); + + $moduleInstance = $deliveryModule->getModuleInstance($event->getContainer()); + $postage = OrderPostage::loadFromPostage( + $moduleInstance->getPostage($deliveryAddress->getCountry()) + ); + $orderEvent->setPostage($postage->getAmount()); + $orderEvent->setPostageTax($postage->getAmountTax()); + $orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle()); + $orderEvent->setDeliveryModule($deliveryModule->getId()); + $orderEvent->setPaymentModule($paymentModule->getId()); + + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_ADDRESS, $orderEvent); + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_INVOICE_ADDRESS, $orderEvent); + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent); + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent); + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_PAYMENT_MODULE, $orderEvent); + + //DO NOT FORGET THAT THE DISCOUNT ORDER HAS TO BE PLACED IN CART + if ($this->request->getSession()->getSessionCart($event->getDispatcher()) != null) { + $cart->setCartItems($this->request->getSession()->getSessionCart($event->getDispatcher())->getCartItems()); + $cart->setDiscount($this->request->getSession()->getSessionCart($event->getDispatcher())->getDiscount()); + } + + $cart->save(); + + $orderManualEvent = new OrderManualEvent( + $orderEvent->getOrder(), + $orderEvent->getOrder()->getCurrency(), + $orderEvent->getOrder()->getLang(), + $cart, + $customer + ); + + $this->request->getSession()->set("thelia.cart_id", $cart->getId()); + + + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_CREATE_MANUAL, $orderManualEvent); + + $event->getDispatcher()->dispatch( + TheliaEvents::ORDER_BEFORE_PAYMENT, + new OrderEvent($orderManualEvent->getPlacedOrder()) + ); + + /* but memorize placed order */ + $orderEvent->setOrder(new Order()); + $orderEvent->setPlacedOrder($orderManualEvent->getPlacedOrder()); + + /* call pay method */ + $payEvent = new OrderPaymentEvent($orderManualEvent->getPlacedOrder()); + + $event->getDispatcher()->dispatch(TheliaEvents::MODULE_PAY, $payEvent); + + if ($payEvent->hasResponse()) { + $event->setResponse($payEvent->getResponse()); + } + + $event->setPlacedOrder($orderManualEvent->getPlacedOrder()); + $event->getDispatcher()->dispatch(self::ADMIN_ORDER_AFTER_CREATE_MANUAL, $event); + + //Reconnect the front user + if ($oldCustomer != null) { + $this->request->getSession()->setCustomerUser($oldCustomer); + + //And fill his cart + if ($oldCart != null) { + $this->request->getSession()->set("thelia.cart_id", $oldCart->getId()); + } + } else { + $this->request->getSession()->clearCustomerUser(); + } + } +} diff --git a/local/modules/OrderCreation/Form/OrderCreationCreateForm.php b/local/modules/OrderCreation/Form/OrderCreationCreateForm.php new file mode 100644 index 00000000..51b3eb19 --- /dev/null +++ b/local/modules/OrderCreation/Form/OrderCreationCreateForm.php @@ -0,0 +1,122 @@ +formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + $this->formBuilder + + ->add('customer_id', 'integer', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => 'customer_id', + 'label_attr' => array( + 'for' => 'customer_id_form' + ) + )) + ->add('delivery_address_id', 'integer', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans("Delivery address", array(), OrderCreation::MESSAGE_DOMAIN), + 'label_attr' => array( + 'for' => 'delivery_address_id_form' + ) + )) + ->add('invoice_address_id', 'integer', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans("Invoice address", array(), OrderCreation::MESSAGE_DOMAIN), + 'label_attr' => array( + 'for' => 'invoice_address_id_form' + ) + )) + ->add('delivery_module_id', 'integer', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans("Transport solution", array(), OrderCreation::MESSAGE_DOMAIN), + 'label_attr' => array( + 'for' => 'delivery_module_id_form' + ) + )) + ->add('payment_module_id', 'integer', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans("Payment solution", array(), OrderCreation::MESSAGE_DOMAIN), + 'label_attr' => array( + 'for' => 'payment_module_id_form' + ) + )) + ->add('product_sale_element_id', 'collection', array( + 'type' => 'number', + 'label' => Translator::getInstance()->trans('Product', array(), OrderCreation::MESSAGE_DOMAIN), + 'label_attr' => array('for' => 'product_sale_element_id_form'), + 'allow_add' => true, + 'allow_delete' => true, + )) + ->add('quantity', 'collection', array( + 'type' => 'number', + 'label' => Translator::getInstance()->trans('Quantity', array(), OrderCreation::MESSAGE_DOMAIN), + 'label_attr' => array('for' => 'quantity_form'), + 'allow_add' => true, + 'allow_delete' => true, + 'options' => array( + 'constraints' => array( + new NotBlank(), + new GreaterThan( + array('value' => 0) + ) + ) + ) + )) + ; + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "admin_order_create"; + } +} diff --git a/local/modules/OrderCreation/I18n/en_US.php b/local/modules/OrderCreation/I18n/en_US.php new file mode 100644 index 00000000..36cb4267 --- /dev/null +++ b/local/modules/OrderCreation/I18n/en_US.php @@ -0,0 +1,37 @@ + "Add product", + + //B + "Be Carefull! This action will increase your product's stock" => "Be Carefull! This action will increase your product's stock", + + //C + "Choose" => "Choose", + "Create an order for this customer" => "Create an order for this customer", + + //D + "Delivery address" => "Delivery address", + + //I + "Invoice" => "Invoice", + "Invoice date" => "Invoice date", + "Invoice address" => "Invoice address", + + //P + "Payment" => "Payment", + "Payment solution" => "Payment solution", + + //R + "Reimbursement" => "Reimbursement", + + //G + "Generate a new order" => "Generate a new order", + + //T + "Transport solution" => "Transport solution", + "Type of order" => "Type of order", + + //Y + "You can't choose negative quantity for CREDIT order" => "You can't choose negative quantity for CREDIT order", +); diff --git a/local/modules/OrderCreation/I18n/fr_FR.php b/local/modules/OrderCreation/I18n/fr_FR.php new file mode 100644 index 00000000..649c18b2 --- /dev/null +++ b/local/modules/OrderCreation/I18n/fr_FR.php @@ -0,0 +1,38 @@ + "Ajouter produit", + + //B + "Be Carefull! This action will increase your product's stock" => "Attention! Cette action va augmenter vos stocks !", + + //C + "Choose" => "Choisir", + "Choose a delivery address first" => "Veuillez choisir une adresse de livraison", + "Create an order for this customer" => "Créer une commande pour ce client", + + //D + "Delivery address" => "Adresse de livraison", + + //I + "Invoice" => "Facture", + "Invoice date" => "Date facture", + "Invoice address" => "Adresse de facturation", + + //P + "Payment" => "Paiement", + "Payment solution" => "Moyen de paiement", + + //R + "Reimbursement" => "Remboursement", + + //G + "Generate a new order" => "Générer une nouvelle commande", + + //T + "Transport solution" => "Moyen de transport", + "Type of order" => "Type de commande", + + //Y + "You can't choose negative quantity for CREDIT order" => "Vous ne pouvez pas choisir de quantités négatives pour un AVOIR.", +); diff --git a/local/modules/OrderCreation/OrderCreation.php b/local/modules/OrderCreation/OrderCreation.php new file mode 100644 index 00000000..0279f34f --- /dev/null +++ b/local/modules/OrderCreation/OrderCreation.php @@ -0,0 +1,20 @@ +/local/modules/``` directory and be sure that the name of the module is OrderCreation. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/order-creation-module:~1.0 +``` + +## Usage + +Be sure that you have : + - an active payment module + - an active delivery module + +Then, go to the customer edit page and click on the button "Create an order for this customer" \ No newline at end of file diff --git a/local/modules/OrderCreation/composer.json b/local/modules/OrderCreation/composer.json new file mode 100644 index 00000000..43667a25 --- /dev/null +++ b/local/modules/OrderCreation/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/order-creation-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "OrderCreation" + } +} \ No newline at end of file diff --git a/local/modules/OrderCreation/templates/backOffice/default/ajax/add-cart-item.html b/local/modules/OrderCreation/templates/backOffice/default/ajax/add-cart-item.html new file mode 100644 index 00000000..44569dfe --- /dev/null +++ b/local/modules/OrderCreation/templates/backOffice/default/ajax/add-cart-item.html @@ -0,0 +1,45 @@ +{form name="admin.order.creation.create.form"} + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+ {form_field form=$form field='product_sale_element_id' value_key=$position} + + + {/form_field} + + {form_field form=$form field='quantity' value_key=$position} + + + {/form_field} +
+ + + +{/form} \ No newline at end of file diff --git a/local/modules/OrderCreation/templates/backOffice/default/forms/create-order-form.html b/local/modules/OrderCreation/templates/backOffice/default/forms/create-order-form.html new file mode 100644 index 00000000..e0fbd678 --- /dev/null +++ b/local/modules/OrderCreation/templates/backOffice/default/forms/create-order-form.html @@ -0,0 +1,107 @@ +{form name="admin.order.creation.create.form"} + {* Capture the dialog body, to pass it to the generic dialog *} + {capture "order_create_dialog"} + + {form_hidden_fields form=$form} + + {form_field form=$form field='customer_id'} + + {/form_field} + + + + + + + + + + + + + + + + + + + + +
+ {form_field form=$form field='delivery_address_id'} +
+ + + +
+ {/form_field} +
+ {form_field form=$form field='invoice_address_id'} +
+ + + +
+ {/form_field} +
+ + {intl l="Add product" d="ordercreation"} + +
+ {form_field form=$form field='delivery_module_id'} +
+
+ +
+
+ {intl l="Choose a delivery address first" d="ordercreation"} +
+
+ +
+ {/form_field} +
+ {form_field form=$form field='payment_module_id'} +
+ + + +
+ {/form_field} +
+ + {/capture} + {include + file = "includes/generic-create-dialog.html" + + dialog_id = "order_create_dialog" + dialog_title = {intl l="Generate a new order" d="ordercreation"} + dialog_body = {$smarty.capture.order_create_dialog nofilter} + + dialog_ok_label = {intl l="Save"} + + form_action = {url path='/admin/module/OrderCreation/order/create'} + form_enctype = {form_enctype form=$form} + form_error_message = $form_error_message + } +{/form} \ No newline at end of file diff --git a/local/modules/Paypal/Classes/API/PaypalApiCredentials.php b/local/modules/Paypal/Classes/API/PaypalApiCredentials.php new file mode 100644 index 00000000..4f724df2 --- /dev/null +++ b/local/modules/Paypal/Classes/API/PaypalApiCredentials.php @@ -0,0 +1,130 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\API; + +use Paypal\Paypal; +use Thelia\Core\Translation\Translator; + +class PaypalApiCredentials +{ + + /** @var string PayPal API username */ + protected $apiUsername = null; + + /** @var string PayPal API password */ + protected $apiPassword = null; + + /** @var string PayPal API signature (Three Token Authentication) */ + protected $apiSignature = null; + + /** + * Create a NVP Credentials + * + * @param string $user PayPal API username + * @param string $password PayPal API password + * @param string $signature PayPal API signature (3T) + * + * @throws \InvalidArgumentException + */ + public function __construct($user = null, $password = null, $signature = null) + { + if ($user === null && $password === null && $signature === null) { + $this->setDefaultCredentials(); + } else { + if (empty($user) || empty($password) || empty($signature)) { + throw new \InvalidArgumentException( + 'PaypalApiCredentials : Missing Argument' + ); + } + $this->apiPassword = $password; + $this->apiSignature = $signature; + $this->apiUsername = $user; + + } + } + + /** + * Set credentials from database according to SandBox Mode + * + * @throws \InvalidArgumentException + */ + protected function setDefaultCredentials() + { + $paypalApiManager = new PaypalApiManager(); + + if ($paypalApiManager->isModeSandbox()) { + $username = Paypal::getConfigValue('sandbox_login', ''); + $password = Paypal::getConfigValue('sandbox_password', ''); + $signature = Paypal::getConfigValue('sandbox_signature', ''); + } else { + $username = Paypal::getConfigValue('login', ''); + $password = Paypal::getConfigValue('password', ''); + $signature = Paypal::getConfigValue('signature', ''); + } + + if (empty($username)) { + throw new \InvalidArgumentException(Translator::getInstance()->trans('The username option must be set.')); + } + if (empty($password)) { + throw new \InvalidArgumentException(Translator::getInstance()->trans('The password option must be set.')); + } + if (empty($signature)) { + throw new \InvalidArgumentException(Translator::getInstance()->trans('The signature option must be set.')); + } + + $this->apiUsername = $username; + $this->apiPassword = $password; + $this->apiSignature = $signature; + } + + /** + * Return API password + * + * @return string + */ + public function getApiPassword() + { + return $this->apiPassword; + } + + /** + * Return API signature + * + * @return string + */ + public function getApiSignature() + { + return $this->apiSignature; + } + + /** + * Return API username + * + * @return string + */ + public function getApiUsername() + { + return $this->apiUsername; + } +} diff --git a/local/modules/Paypal/Classes/API/PaypalApiLogManager.php b/local/modules/Paypal/Classes/API/PaypalApiLogManager.php new file mode 100644 index 00000000..dad63230 --- /dev/null +++ b/local/modules/Paypal/Classes/API/PaypalApiLogManager.php @@ -0,0 +1,92 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\API; + +use Thelia\Log\Tlog; + +/** + * Class PaypalApiLogManager + * This class is the Paypal logger + * Logged actions: transaction + */ +class PaypalApiLogManager +{ + /** @var Tlog $log */ + protected static $logger; + + /** + * Parse and log the return of the Paypal NVP API + * + * @param string $transaction A special string returned by the NVP API + */ + public function logTransaction($parsedTransaction) + { + if ($parsedTransaction) { + /* + * Then write + */ + $logLine = ''; + $date = new \DateTime($parsedTransaction['TIMESTAMP']); + + $logLine .= $date->format('Y-m-d H:i:s') . ' '; + $logLine .= 'Transaction ' . $parsedTransaction['ACK'] . ' '; + $logLine .= 'correlationId: ' . $parsedTransaction['CORRELATIONID'] . ' '; + + if ($parsedTransaction !== null && array_key_exists('L_ERRORCODE0', $parsedTransaction)) { + $logLine .= 'error: '; + $logLine .= '[' . $parsedTransaction['L_ERRORCODE0'] . '] '; + $logLine .= '<' . $parsedTransaction['L_SHORTMESSAGE0'] . '> '; + $logLine .= $parsedTransaction['L_LONGMESSAGE0'] . ' '; + } + + $this->getLogger()->info($logLine); + } else { + $this->getLogger()->info('No transaction was created.'); + } + } + + public static function getLogFilePath() + { + return THELIA_LOG_DIR . DS . "log-paypal.txt"; + } + + /** + * @return Tlog + */ + public function getLogger() + { + if (self::$logger == null) { + self::$logger = Tlog::getNewInstance(); + + $logFilePath = self::getLogFilePath(); + + self::$logger->setPrefix("#LEVEL: #DATE #HOUR: "); + self::$logger->setDestinations("\\Thelia\\Log\\Destination\\TlogDestinationRotatingFile"); + self::$logger->setConfig("\\Thelia\\Log\\Destination\\TlogDestinationRotatingFile", 0, $logFilePath); + self::$logger->setLevel(Tlog::INFO); + } + + return self::$logger; + } +} diff --git a/local/modules/Paypal/Classes/API/PaypalApiManager.php b/local/modules/Paypal/Classes/API/PaypalApiManager.php new file mode 100644 index 00000000..28b53920 --- /dev/null +++ b/local/modules/Paypal/Classes/API/PaypalApiManager.php @@ -0,0 +1,199 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\API; + +use Paypal\Classes\PaypalResources; +use Paypal\Classes\vendor\MobileDetect\MobileDetect; +use Paypal\Paypal; + +/** + * Class PaypalApiManager + * Assist in helping managing API + */ +class PaypalApiManager +{ + /** Live API */ + const DEFAULT_NVP_3T_API_URL_LIVE = 'https://api-3t.paypal.com/nvp'; + + /** SandBox API */ + const DEFAULT_NVP_3T_API_URL_SANDBOX = 'https://api-3t.sandbox.paypal.com/nvp'; + + /** Button Source - Identification code for third-party applications */ + const BUTTON_SOURCE = 'Thelia_Cart'; + + /** API Version */ + const API_VERSION = '108.0'; + + const PAYMENT_TYPE_ORDER = 'Order'; + const PAYMENT_TYPE_SALE = 'Sale'; + const PAYMENT_TYPE_AUTHORIZATION = 'Authorization'; + + /** @var bool if SandBox mode is enabled or not */ + protected $isModeSandbox = true; + + protected $config=null; + + public function __construct() + { + $this->isModeSandbox = Paypal::isSandboxMode(); + } + + /** + * Get if SandBox is enabled or not + * + * @return bool + */ + public function isModeSandbox() + { + return $this->isModeSandbox; + } + + /** + * Convert NVP string to array + * + * @param string $nvpstr NVP string + * + * @return array parameters + */ + public static function nvpToArray($nvpstr) + { + $paypalResponse = array(); + parse_str($nvpstr, $paypalResponse); + + $cleanedArray = array(); + $previousKey = reset($paypalResponse); + foreach ($paypalResponse as $key => $value) { + if (1 === preg_match('#^([A-Z0-9_]+)$#', $key)) { + $cleanedArray[$key] = $value; + $previousKey = $key; + } else { + $cleanedArray[$previousKey] .= '&' . $key . '=' . $value; + } + } + + return $cleanedArray; + } + + /** + * Convert array to NVP string + * + * @param $data + * @param \stdClass|null $ret + * @param null $construct_scheme + * + * @return string + */ + public static function arrayToNvp($data, \stdClass $ret = null, $construct_scheme = null) + { + if ($ret===null) { + $ret = new \stdClass(); + $ret->value=""; + } + if (is_array($data)) { + foreach ($data as $key => $value) { + self::arrayToNvp($value, $ret, $construct_scheme===null?$key:$construct_scheme."_".$key); + } + } else { + $ret->value .= $construct_scheme."=".$data."&"; + } + + return substr($ret->value, 0, strlen($ret->value)-1); + } + + /** + * Detect if user is using a mobile + * Used in Express Checkout Mobile + * + * @return bool + */ + public function isMobile() + { + $detect = new MobileDetect(); + + return $detect->isMobile(); + } + + /** + * Return Express checkout URL + * Check itself if mobile or not + * + * @param string $token Paypal API token + * + * @return string + */ + public function getExpressCheckoutUrl($token) + { + if ($this->isMobile()) { + $cmd = PaypalResources::CMD_EXPRESS_CHECKOUT_MOBILE_KEY; + } else { + $cmd = PaypalResources::CMD_EXPRESS_CHECKOUT_KEY; + } + + return $this->getPaypalUrl() .'?cmd=' . $cmd . '&token=' . $token; + } + + /** + * Return relevant PayPal redirect URL + * According to SandBox Mode on or not + * + * @return string URL + */ + public function getPaypalUrl() + { + $url = PaypalResources::PAYPAL_REDIRECT_SANDBOX_URL; + + if (!$this->isModeSandbox()) { + $url = PaypalResources::PAYPAL_REDIRECT_NORMAL_URL; + } + + return $url; + } + + /** + * Convert float into NVP number + * + * @param string $number number + * + * @return string + */ + public static function convertFloatToNvpFormat($number) + { + return number_format($number, 2, '.', ''); + } + + /** + * Return API Url (sandbox or live) + * + * @return string + */ + public function getApiUrl() + { + $url = self::DEFAULT_NVP_3T_API_URL_SANDBOX; + if (!$this->isModeSandbox) { + $url = self::DEFAULT_NVP_3T_API_URL_LIVE; + } + + return $url; + } +} diff --git a/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationInterface.php b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationInterface.php new file mode 100644 index 00000000..343f84f3 --- /dev/null +++ b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationInterface.php @@ -0,0 +1,44 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\NVP\Operations; + +/** + * Class NvpOperationInterface + */ +interface PaypalNvpOperationInterface +{ + /** + * Generate NVP request message + * + * @return string + */ + public function getRequest(); + + /** + * Get Operation Name + * + * @return string Operation name + */ + public function getOperationName(); +} diff --git a/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsBase.php b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsBase.php new file mode 100644 index 00000000..8d005077 --- /dev/null +++ b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsBase.php @@ -0,0 +1,49 @@ + + */ +namespace Paypal\Classes\NVP\Operations; + +use Paypal\Classes\API\PaypalApiManager; + +abstract class PaypalNvpOperationsBase implements PaypalNvpOperationInterface +{ + /** @var \Paypal\Classes\API\PaypalApiCredentials API Credentials (3T) */ + protected $credentials = null; + + /** @var string operation name */ + protected $operationName = null; + + /** @var array Payload with optional parameters */ + protected $payload = null; + + /** + * Generate NVP request message + * + * @return string NVP string + */ + public function getRequest() + { + $request = 'METHOD=' . $this->operationName; + $request .= '&VERSION=' . PaypalApiManager::API_VERSION; + $request .= '&USER=' . urlencode($this->credentials->getApiUsername()); + $request .= '&PWD=' . urlencode($this->credentials->getApiPassword()); + $request .= '&SIGNATURE=' . urlencode($this->credentials->getApiSignature()); + + return $request; + } + + /** + * Get Operation Name + * + * @return string Operation name + */ + public function getOperationName() + { + return $this->operationName; + } +} diff --git a/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsDoExpressCheckoutPayment.php b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsDoExpressCheckoutPayment.php new file mode 100644 index 00000000..3b9338a4 --- /dev/null +++ b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsDoExpressCheckoutPayment.php @@ -0,0 +1,108 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\NVP\Operations; + +use Paypal\Classes\API\PaypalApiCredentials; + +/** + * Class PaypalNvpOperationsDoExpressCheckoutPayment + * Manage NVP DoExpressCheckoutPayment Operation + */ +class PaypalNvpOperationsDoExpressCheckoutPayment extends PaypalNvpOperationsBase +{ + /** @var string Payer ID returned by PayPal when it redirects the buyer's browser to your site */ + protected $payerId = null; + + /** @var string SetExpressCheckout API Token */ + protected $token = null; + + /** @var string Transaction amount + * Must be specified as 2000.00 or 2,000.00. + * The specified amount cannot exceed USD $10,000.00, regardless of the currency used. + */ + protected $amount = null; + + /** @var string Currency id ex: EUR */ + protected $currencyId = null; + + /** @var string Payment action ex: sale/order */ + protected $paymentAction = null; + + /** @var string URL IPN listener */ + protected $ipnListenerUrl = null; + + /** @var string Button Source for Thelia_Cart */ + protected $buttonSource; + + /** + * Constructor + * + * @param PaypalApiCredentials $credentials API Credentials (3T) + * @param string $amount Transaction amount. Must be specified as 2000.00 or 2,000.00. The specified amount cannot exceed USD $10,000.00, regardless of the currency used. + * @param string $currencyId Currency id ex: EUR + * @param string $payerId Payer ID returned by PayPal when it redirects the buyer's browser to your site + * @param string $paymentAction Payment action ex: sale/order + * @param string $token Token returned by PayPal SetExpressCheckout API when it redirects the buyer's browser to your site. + * @param string $ipnListenerUrl Url Paypal will call in order to confirm payment + * @param $buttonSource + */ + public function __construct( + PaypalApiCredentials $credentials, + $amount, + $currencyId, + $payerId, + $paymentAction, + $token, + $ipnListenerUrl, + $buttonSource = null + ) { + $this->operationName = 'DoExpressCheckoutPayment'; + $this->token = $token; + $this->amount = $amount; + $this->payerId = $payerId; + $this->credentials = $credentials; + $this->currencyId = $currencyId; + $this->paymentAction = $paymentAction; + $this->ipnListenerUrl = $ipnListenerUrl; + $this->buttonSource = $buttonSource; + } + + /** + * {@inheritdoc} + */ + public function getRequest() + { + $request = parent::getRequest(); + $request .= '&TOKEN=' . $this->token; + $request .= '&PAYERID=' . $this->payerId; + $request .= '&PAYMENTREQUEST_0_AMT=' . $this->amount; + $request .= '&PAYMENTREQUEST_0_CURRENCYCODE=' . $this->currencyId; + $request .= '&PAYMENTREQUEST_0_PAYMENTACTION=' . $this->paymentAction; + if (null !== $this->buttonSource) { + $request .='&BUTTONSOURCE=' . $this->buttonSource; + } + + return $request; + } +} diff --git a/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsGetExpressCheckoutDetails.php b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsGetExpressCheckoutDetails.php new file mode 100644 index 00000000..9e045821 --- /dev/null +++ b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsGetExpressCheckoutDetails.php @@ -0,0 +1,60 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\NVP\Operations; + +use Paypal\Classes\API\PaypalApiCredentials; + +/** + * Class GetExpressCheckoutDetails + * Manage NVP GetExpressCheckoutDetails Operation + */ +class PaypalNvpOperationsGetExpressCheckoutDetails extends PaypalNvpOperationsBase +{ + /** @var string SetExpressCheckout API Token */ + protected $token = null; + + /** + * Constructor + * + * @param PaypalApiCredentials $credentials API Credentials (3T) + * @param string $token Token from SetExpressCheckout API + */ + public function __construct(PaypalApiCredentials $credentials, $token) + { + $this->operationName = 'GetExpressCheckoutDetails'; + $this->credentials = $credentials; + $this->token = $token; + } + + /** + * {@inheritdoc } + */ + public function getRequest() + { + $request = parent::getRequest(); + $request .= '&TOKEN=' . $this->token; + + return $request; + } +} diff --git a/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsSetExpressCheckout.php b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsSetExpressCheckout.php new file mode 100644 index 00000000..c218db71 --- /dev/null +++ b/local/modules/Paypal/Classes/NVP/Operations/PaypalNvpOperationsSetExpressCheckout.php @@ -0,0 +1,163 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\NVP\Operations; + +use Paypal\Classes\API\PaypalApiCredentials; +use Paypal\Classes\API\PaypalApiManager; + +/** + * Class PaypalNvpOperationsSetExpressCheckout + * Manage NVP SetExpressCheckout Operation + */ +class PaypalNvpOperationsSetExpressCheckout extends PaypalNvpOperationsBase +{ + /** @var string Transaction amount + * Must be specified as 2000.00 or 2,000.00. + * The specified amount cannot exceed USD $10,000.00, regardless of the currency used. + */ + protected $amount = null; + + /** @var string Currency id ex: EUR */ + protected $currencyId = null; + + /** @var string URL when operation is successful */ + protected $returnUrl = null; + + /** @var string URL when operation is cancelled */ + protected $cancelUrl = null; + + /** @var string allowing the shortcut transaction */ + protected $billingAgreement = null; + + /** @var bool If Paypal has to use Thelia Customer Address */ + protected $isPaypalAddressOverrided = false; + + /** @var string Delivery Address */ + protected $name = null; + /** @var string Delivery Address */ + protected $street = null; + /** @var string Delivery Address */ + protected $street2 = null; + /** @var string Delivery Address */ + protected $city = null; + /** @var string Delivery Address */ + protected $state = null; + /** @var string Delivery Address */ + protected $zip = null; + /** @var string Delivery Address */ + protected $countryCode = null; + + /** + * Constructor + * + * @param PaypalApiCredentials $credentials API Credentials (3T) + * @param string $amount Transaction amount (operationName = 'SetExpressCheckout'; + $this->credentials = $credentials; + + $this->amount = $amount; + $this->cancelUrl = $cancelUrl; + $this->currencyId = $currencyId; + $this->returnUrl = $returnUrl; + + $this->billingAgreement = $billingAgreement; + + $this->payload = $payload; + } + + /** + * Set customer delivery address + * + * @param string $name Name + * @param string $street Street + * @param string $street2 Street 2 + * @param string $city City + * @param string $state State + * @param string $zip Zip + * @param string $countryCode CountryCode FR|US|UK + * + * @return $this + */ + public function setCustomerDeliveryAddress($name, $street, $street2, $city, $state, $zip, $countryCode) + { + $this->isPaypalAddressOverrided = true; + $this->name = $name; + $this->street = $street; + $this->street2 = $street2; + $this->city = $city; + $this->state = $state; + $this->zip = $zip; + $this->countryCode = $countryCode; + + return $this; + } + + /** + * {@inheritdoc } + */ + public function getRequest() + { + $request = parent::getRequest(); + $request .= '&PAYMENTREQUEST_0_AMT=' . urlencode(PaypalApiManager::convertFloatToNvpFormat($this->amount)); + $request .= '&PAYMENTREQUEST_0_CURRENCYCODE=' . urlencode($this->currencyId); + $request .= '&RETURNURL=' . urlencode($this->returnUrl); + $request .= '&CANCELURL=' . urlencode($this->cancelUrl); + + if ($this->isPaypalAddressOverrided) { + $request .= '&ADDROVERRIDE=1'; + $request .= '&PAYMENTREQUEST_0_SHIPTONAME=' . urlencode($this->name); + $request .= '&PAYMENTREQUEST_0_SHIPTOSTREET=' . urlencode($this->street); + $request .= '&PAYMENTREQUEST_0_SHIPTOSTREET2=' . urlencode($this->street2); + $request .= '&PAYMENTREQUEST_0_SHIPTOCITY=' . urlencode($this->city); + $request .= '&PAYMENTREQUEST_0_SHIPTOSTATE=' . urlencode($this->state); + $request .= '&PAYMENTREQUEST_0_SHIPTOZIP=' . urlencode($this->zip); + $request .= '&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=' . urlencode($this->countryCode); + } + + if ($this->billingAgreement != 0) { + $request .= '&L_BILLINGTYPE0=MerchantInitiatedBillingSingleAgreement'; + } + + if (!empty($this->payload)) { + $request .= '&' . PaypalApiManager::arrayToNvp($this->payload); + } + + return $request; + } +} diff --git a/local/modules/Paypal/Classes/NVP/PaypalNvpMessageSender.php b/local/modules/Paypal/Classes/NVP/PaypalNvpMessageSender.php new file mode 100644 index 00000000..db338232 --- /dev/null +++ b/local/modules/Paypal/Classes/NVP/PaypalNvpMessageSender.php @@ -0,0 +1,92 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes\NVP; + +use Paypal\Classes\API\PaypalApiManager; +use Paypal\Classes\NVP\Operations\PaypalNvpOperationInterface; + +/** + * Class PaypalNvpMessageSender + * + * Send NVP requests via Curl + * + * Example for the API SetExpressCheckout call on the SandBox: + * $paypal = new Paypal(); + * $nvpSetExpressCheckout = new PaypalNvpOperationsSetExpressCheckout( + * new PaypalApiCredentials(new PayPalVariableRepository($paypal->link)), + * $amount, + * $currencyID, + * $return_url, + * $cancel_url, + * ); + * $nvpMessageSender = new PaypalNvpMessageSender($nvpSetExpressCheckout, true); + * $response = $nvpMessageSender->send(); + */ +class PaypalNvpMessageSender +{ + /** @var string message to send */ + protected $message = null; + + /** @var bool if sandbox mode is enabled */ + protected $isSandbox = true; + + /** + * Constructor + * + * @param PaypalNvpOperationInterface $nvpMessage NVP message to send + * @param bool $isSandbox if sandbox mode enabled + */ + public function __construct(PaypalNvpOperationInterface $nvpMessage, $isSandbox = true) + { + $this->isSandbox = $isSandbox; + $this->message = $nvpMessage->getRequest(); + } + + /** + * Send request via Curl + * + * @return string APÏ response + */ + public function send() + { + $paypalApiManager = new PaypalApiManager(); + + $url = $paypalApiManager->getApiUrl(); + + $ch = curl_init($url); + + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $this->message); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + $response = curl_exec($ch); + + return $response; + } +} diff --git a/local/modules/Paypal/Classes/PaypalResources.php b/local/modules/Paypal/Classes/PaypalResources.php new file mode 100644 index 00000000..f70854e6 --- /dev/null +++ b/local/modules/Paypal/Classes/PaypalResources.php @@ -0,0 +1,36 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Classes; + +class PaypalResources +{ + const LOGO_NORMAL_URL = 'https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_37x23.jpg'; + const LOGO_PAIEMENT_CARDS_URL = 'https://www.paypalobjects.com/webstatic/mktg/logo-center/logo_paypal_moyens_paiement_fr.jpg'; + + const PAYPAL_REDIRECT_NORMAL_URL = 'https://www.paypal.com/cgi-bin/webscr'; + const PAYPAL_REDIRECT_SANDBOX_URL = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; + + const CMD_EXPRESS_CHECKOUT_KEY = '_express-checkout'; + const CMD_EXPRESS_CHECKOUT_MOBILE_KEY = '_express-checkout-mobile'; +} diff --git a/local/modules/Paypal/Classes/vendor/MobileDetect/MobileDetect.php b/local/modules/Paypal/Classes/vendor/MobileDetect/MobileDetect.php new file mode 100644 index 00000000..a14e3d22 --- /dev/null +++ b/local/modules/Paypal/Classes/vendor/MobileDetect/MobileDetect.php @@ -0,0 +1,1024 @@ + + * Victor Stanciu (until v. 1.0) + * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt + * @link Official page: http://mobiledetect.net + * GitHub Repository: https://github.com/serbanghita/Mobile-Detect + * Google Code Old Page: http://code.google.com/p/php-mobile-detect/ + * @version 2.6.6 + */ + +namespace Paypal\Classes\vendor\MobileDetect; + +class MobileDetect +{ + /** + * Mobile detection type. + */ + const DETECTION_TYPE_MOBILE = 'mobile'; + + /** + * Extended detection type. + */ + const DETECTION_TYPE_EXTENDED = 'extended'; + + /** + * A frequently used regular expression to extract version #s. + */ + const VER = '([\w._\+]+)'; + + /** + * Top-level device. + */ + const MOBILE_GRADE_A = 'A'; + + /** + * Mid-level device. + */ + const MOBILE_GRADE_B = 'B'; + + /** + * Low-level device. + */ + const MOBILE_GRADE_C = 'C'; + + /** + * Stores the version number of the current release. + * @var array + */ + protected $scriptVersion = '2.6.6'; + + /** + * The User-Agent HTTP header is stored in here. + * @var string + */ + protected $userAgent = null; + + /** + * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. + * @var array + */ + protected $httpHeaders = array(); + + /** + * All the rules combined. + * @var array + */ + protected $mobileDetectionRules = null; + + /** + * The rules, but extended. + * @var array + */ + protected $mobileDetectionRulesExtended = null; + + /** + * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. + * + * @var string + */ + protected $detectionType = self::DETECTION_TYPE_MOBILE; + + /** + * List of mobile devices (phones). + * + * @var array + */ + protected $phoneDevices = array( + 'iPhone' => '\biPhone.*Mobile|\biPod', // |\biTunes + 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', + 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b', + 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile', + // @todo: Is 'Dell Streak' a tablet or a phone? ;) + 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', + 'Motorola' => 'Motorola|\bDroid\b.*Build|DROIDX|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT909|XT910|XT912|XT928', + 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535', + 'LG' => '\bLG\b;|(LG|LG-)?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999)', + 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h', + 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', + // @ref: http://www.micromaxinfo.com/mobiles/smartphones + // Added because the codes might conflict with Acer Tablets. + 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', + 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex. + 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) + // @ref: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) + // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. + 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', + // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. + 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', + // Added simvalley mobile just for fun. They have some interesting devices. + // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html + 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', + // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 + 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|mmp|pocket|psp|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|wap|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser|LG-P500' + ); + + /** + * List of tablet devices. + * + * @var array + */ + protected $tabletDevices = array( + 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. + 'NexusTablet' => '^.*Android.*Nexus(((?:(?!Mobile))|(?:(\s(7|10).+))).)*$', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|SM-T311|SM-T310|SM-T210|SM-T211|SM-P900', + // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/ + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFTT|KFOTE)\b', + // Only the Surface tablets with Windows RT are considered mobile. + // @ref: http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx + 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;', + // @note: watch out for PadFone, see #132 + 'AsusTablet' => 'Transformer|TF101|^.*PadFone((?!Mobile).)*$|ME301T|ME371MG', + 'BlackBerryTablet' => 'PlayBook|RIM Tablet', + 'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200', + 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', + 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|LogicPD Zoom2', + // @ref: http://www.acer.ro/ac/ro/RO/content/drivers + // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) + // @note: Can conflict with Micromax phones codes. + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71)\b', + // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ + // @ref: http://us.toshiba.com/tablets/tablet-finder + // @ref: http://www.toshiba.co.jp/regza/tablet/ + 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', + // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html + 'LGTablet' => '\bL-06C|LG-V900|LG-V909\b', + 'FujitsuTablet' => 'Android.*\b(F-01D|F-05E|F-10D|M532|Q572)\b', + // Prestigio Tablets http://www.prestigio.com/support + 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D', + // @ref: http://support.lenovo.com/en_GB/downloads/default.page?# + 'LenovoTablet' => 'IdeaTab|S2110|S6000|K3011|A3000|A1000|A2107|A2109|A1107', + 'YarvikTablet' => 'Android.*(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468)', + 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', + 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT', + // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ + 'IRUTablet' => 'M702pro', + 'MegafonTablet' => 'MegaFon V9|ZTE V9', + // @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/ + 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', + // @reference: http://wiki.archosfans.com/index.php?title=Main_Page + 'ArchosTablet' => 'Android.*ARCHOS|\b101G9\b|\b80G9\b', + // @reference: http://en.wikipedia.org/wiki/NOVO7 + 'AinolTablet' => 'NOVO7|Novo7Aurora|Novo7Basic|NOVO7PALADIN', + // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER + // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser + // @ref: http://www.sony.jp/support/tablet/ + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT211|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201', + // @ref: db + http://www.cube-tablet.com/buy-products.html + 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', + // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 + 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', + // @ref: http://www.match.net.cn/products.asp + 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', + // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) + // @ref: http://www.imp3.net/14/show.php?itemid=20454 + 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', + // @ref: http://www.rock-chips.com/index.php?do=prod&pid=2 + 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', + // @ref: http://www.telstra.com.au/home-phone/thub-2/ + 'TelstraTablet' => 'T-Hub2', + // @ref: http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ + 'FlyTablet' => 'IQ310|Fly Vision', + // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)', + // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 + // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) + 'HuaweiTablet' => 'MediaPad|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', + // Nec or Medias Tab + 'NecTablet' => '\bN-06D|\bN-08D', + // Pantech Tablets: http://www.pantechusa.com/phones/ + 'PantechTablet' => 'Pantech.*P4100', + // Broncho Tablets: http://www.broncho.cn/ (hard to find) + 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', + // @ref: http://versusuk.com/support.html + 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', + // @ref: http://www.zync.in/index.php/our-products/tablet-phablets + 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', + // @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ + 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', + // @ref: https://www.nabitablet.com/ + 'NabiTablet' => 'Android.*\bNabi', + 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', + // French Danew Tablets http://www.danew.com/produits-tablette.php + 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', + // Texet Tablets and Readers http://www.texet.ru/tablet/ + 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', + // @note: Avoid detecting 'PLAYSTATION 3' as mobile. + 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', + // @ref: http://www.galapad.net/product.html + 'GalapadTablet' => 'Android.*\bG1\b', + // @ref: http://www.micromaxinfo.com/tablet/funbook + 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', + // http://www.karbonnmobiles.com/products_tablet.php + 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', + // @ref: http://www.gloryunion.cn/products.asp + // @ref: http://www.allwinnertech.com/en/apply/mobile.html + // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. + 'GUTablet' => 'TX-A1301|TX-M9002|Q702', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|ViewPad7|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|hp-tablet|rk30sdk', + ); + + /** + * List of mobile Operating Systems. + * + * @var array + */ + protected $operatingSystems = array( + 'AndroidOS' => 'Android', + 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', + 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', + 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', + // @reference: http://en.wikipedia.org/wiki/Windows_Mobile + 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', + // @reference: http://en.wikipedia.org/wiki/Windows_Phone + // http://wifeng.cn/?r=blog&a=view&id=106 + // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx + 'WindowsPhoneOS' => 'Windows Phone OS|XBLWP7|ZuneWP7', + 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', + // http://en.wikipedia.org/wiki/MeeGo + // @todo: research MeeGo in UAs + 'MeeGoOS' => 'MeeGo', + // http://en.wikipedia.org/wiki/Maemo + // @todo: research Maemo in UAs + 'MaemoOS' => 'Maemo', + 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 + 'webOS' => 'webOS|hpwOS', + 'badaOS' => '\bBada\b', + 'BREWOS' => 'BREW', + ); + + /** + * List of mobile User Agents. + * + * @var array + */ + protected $userAgents = array( + // @reference: https://developers.google.com/chrome/mobile/docs/user-agent + 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', + 'Dolfin' => '\bDolfin\b', + 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+', + 'Skyfire' => 'Skyfire', + 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ + 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', + 'Bolt' => 'bolt', + 'TeaShark' => 'teashark', + 'Blazer' => 'Blazer', + // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 + 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile', + // @ref: http://en.wikipedia.org/wiki/Midori_(web_browser) + //'Midori' => 'midori', + 'Tizen' => 'Tizen', + 'UCBrowser' => 'UC.*Browser|UCWEB', + // @ref: https://github.com/serbanghita/Mobile-Detect/issues/7 + 'DiigoBrowser' => 'DiigoBrowser', + // http://www.puffinbrowser.com/index.php + 'Puffin' => 'Puffin', + // @ref: http://mercury-browser.com/index.html + 'Mercury' => '\bMercury\b', + // @reference: http://en.wikipedia.org/wiki/Minimo + // http://en.wikipedia.org/wiki/Vision_Mobile_Browser + 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision' + ); + + /** + * Utilities. + * + * @var array + */ + protected $utilities = array( + // Experimental. When a mobile device wants to switch to 'Desktop Mode'. + // @ref: http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ + // @ref: https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + 'DesktopMode' => 'WPDesktop', + 'TV' => 'SonyDTV|HbbTV', // experimental + 'WebKit' => '(webkit)[ /]([\w.]+)', + 'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', + 'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2', + 'Watch' => 'SM-V700', + ); + + /** + * The individual segments that could exist in a User-Agent string. VER refers to the regular + * expression defined in the constant self::VER. + * + * @var array + */ + protected $properties = array( + + // Build + 'Mobile' => 'Mobile/[VER]', + 'Build' => 'Build/[VER]', + 'Version' => 'Version/[VER]', + 'VendorID' => 'VendorID/[VER]', + + // Devices + 'iPad' => 'iPad.*CPU[a-z ]+[VER]', + 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', + 'iPod' => 'iPod.*CPU[a-z ]+[VER]', + //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), + 'Kindle' => 'Kindle/[VER]', + + // Browser + 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), + 'Dolfin' => 'Dolfin/[VER]', + // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference + 'Firefox' => 'Firefox/[VER]', + 'Fennec' => 'Fennec/[VER]', + // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx + 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NetFront/[VER]', + 'NokiaBrowser' => 'NokiaBrowser/[VER]', + 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), + 'Opera Mini' => 'Opera Mini/[VER]', + 'Opera Mobi' => 'Version/[VER]', + 'UC Browser' => 'UC Browser[VER]', + // @note: Safari 7534.48.3 is actually Version 5.1. + // @note: On BlackBerry the Version is overwriten by the OS. + 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), + 'Skyfire' => 'Skyfire/[VER]', + 'Tizen' => 'Tizen/[VER]', + 'Webkit' => 'webkit[ /][VER]', + + // Engine + 'Gecko' => 'Gecko/[VER]', + 'Trident' => 'Trident/[VER]', + 'Presto' => 'Presto/[VER]', + + // OS + 'iOS' => ' \bOS\b [VER] ', + 'Android' => 'Android [VER]', + 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), + 'BREW' => 'BREW [VER]', + 'Java' => 'Java/[VER]', + // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx + // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases + 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), + 'Windows Phone' => 'Windows Phone [VER]', + 'Windows CE' => 'Windows CE/[VER]', + // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd + 'Windows NT' => 'Windows NT [VER]', + 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), + 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), + ); + + /** + * Construct an instance of this class. + * + * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. + * If left empty, will use the global _SERVER['HTTP_*'] vars instead. + * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT + * from the $headers array instead. + */ + public function __construct( + array $headers = null, + $userAgent = null + ){ + $this->setHttpHeaders($headers); + $this->setUserAgent($userAgent); + + $this->setMobileDetectionRules(); + $this->setMobileDetectionRulesExtended(); + } + + /** + * Get the current script version. + * This is useful for the demo.php file, + * so people can check on what version they are testing + * for mobile devices. + * + * @return string The version number in "X.Y.Z" format. + */ + public function getScriptVersion() + { + return $this->scriptVersion; + } + + /** + * Set the HTTP Headers. Must be PHP-flavored. + * + * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract + * the headers. The default null is left for backwards compatibilty. + */ + public function setHttpHeaders($httpHeaders = null) + { + //use global _SERVER if $httpHeaders aren't defined + if (!is_array($httpHeaders) || !count($httpHeaders)) { + $httpHeaders = $_SERVER; + } + + //Only save HTTP headers. In PHP land, that means only _SERVER vars that + //start with HTTP_. + foreach ($httpHeaders as $key => $value) { + if (substr($key,0,5) == 'HTTP_') { + $this->httpHeaders[$key] = $value; + } + } + } + + /** + * Retrieves the HTTP headers. + * + * @return array + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Retrieves a particular header. If it doesn't exist, no exception/error is caused. + * Simply null is returned. + * + * @param string $header The name of the header to retrieve. Can be HTTP compliant such as + * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the + * all-caps, HTTP_ prefixed, underscore seperated awesomeness. + * + * @return string|null The value of the header. + */ + public function getHttpHeader($header) + { + //are we using PHP-flavored headers? + if (strpos($header, '_') === false) { + $header = str_replace('-', '_', $header); + $header = strtoupper($header); + } + + //test the alternate, too + $altHeader = 'HTTP_' . $header; + + //Test both the regular and the HTTP_ prefix + if (isset($this->httpHeaders[$header])) { + return $this->httpHeaders[$header]; + } elseif (isset($this->httpHeaders[$altHeader])) { + return $this->httpHeaders[$altHeader]; + } + } + + /** + * Set the User-Agent to be used. + * + * @param string $userAgent The user agent string to set. + */ + public function setUserAgent($userAgent = null) + { + if (!empty($userAgent)) { + $this->userAgent = $userAgent; + } else { + $this->userAgent = $this->getHttpHeader('User-Agent'); + + if (empty($this->userAgent)) { + $this->userAgent = $this->getHttpHeader('X-Device-User-Agent'); + } + + //Header can occur on devices using Opera Mini (can expose the real device type). + //Let's concatenate it (we need this extra info in the regexes). + if ($operaMiniUa = $this->getHttpHeader('X-OperaMini-Phone-UA')) { + $this->userAgent .= ' ' . $operaMiniUa; + } + } + } + + /** + * Retrieve the User-Agent. + * + * @return string|null The user agent if it's set. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or + * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. + * + * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default + * parameter is null which will default to self::DETECTION_TYPE_MOBILE. + */ + public function setDetectionType($type = null) + { + if ($type === null) { + $type = self::DETECTION_TYPE_MOBILE; + } + + if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { + return; + } + + $this->detectionType = $type; + } + + /** + * Retrieve the list of known phone devices. + * + * @return array List of phone devices. + */ + public function getPhoneDevices() + { + return $this->phoneDevices; + } + + /** + * Retrieve the list of known tablet devices. + * + * @return array List of tablet devices. + */ + public function getTabletDevices() + { + return $this->tabletDevices; + } + + /** + * Method sets the mobile detection rules. This method is used for the magic methods $detect->is*(). + */ + public function setMobileDetectionRules() + { + // Merge all rules together. + $this->mobileDetectionRules = array_merge( + $this->phoneDevices, + $this->tabletDevices, + $this->operatingSystems, + $this->userAgents + ); + + } + + /** + * Method sets the mobile detection rules + utilities. + * The reason this is separate is because utilities rules + * don't necessary imply mobile. This method is used inside + * the new $detect->is('stuff') method. + */ + public function setMobileDetectionRulesExtended() + { + // Merge all rules together. + $this->mobileDetectionRulesExtended = array_merge( + $this->phoneDevices, + $this->tabletDevices, + $this->operatingSystems, + $this->userAgents, + $this->utilities + ); + + } + + /** + * Retrieve the current set of rules. + * + * @return array + */ + public function getRules() + { + if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { + return $this->mobileDetectionRulesExtended; + } else { + return $this->mobileDetectionRules; + } + } + + /** + * Check the HTTP headers for signs of mobile. + * This is the fastest mobile check possible; it's used + * inside isMobile() method. + * + * @return bool + */ + public function checkHttpHeadersForMobile() + { + return( + isset($this->httpHeaders['HTTP_ACCEPT']) && + (strpos($this->httpHeaders['HTTP_ACCEPT'], 'application/x-obml2d') !== false || // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ + strpos($this->httpHeaders['HTTP_ACCEPT'], 'application/vnd.rim.html') !== false || // BlackBerry devices. + strpos($this->httpHeaders['HTTP_ACCEPT'], 'text/vnd.wap.wml') !== false || + strpos($this->httpHeaders['HTTP_ACCEPT'], 'application/vnd.wap.xhtml+xml') !== false) || + isset($this->httpHeaders['HTTP_X_WAP_PROFILE']) || // @todo: validate + isset($this->httpHeaders['HTTP_X_WAP_CLIENTID']) || + isset($this->httpHeaders['HTTP_WAP_CONNECTION']) || + isset($this->httpHeaders['HTTP_PROFILE']) || + isset($this->httpHeaders['HTTP_X_OPERAMINI_PHONE_UA']) || // Reported by Nokia devices (eg. C3) + isset($this->httpHeaders['HTTP_X_NOKIA_IPADDRESS']) || + isset($this->httpHeaders['HTTP_X_NOKIA_GATEWAY_ID']) || + isset($this->httpHeaders['HTTP_X_ORANGE_ID']) || + isset($this->httpHeaders['HTTP_X_VODAFONE_3GPDPCONTEXT']) || + isset($this->httpHeaders['HTTP_X_HUAWEI_USERID']) || + isset($this->httpHeaders['HTTP_UA_OS']) || // Reported by Windows Smartphones. + isset($this->httpHeaders['HTTP_X_MOBILE_GATEWAY']) || // Reported by Verizon, Vodafone proxy system. + isset($this->httpHeaders['HTTP_X_ATT_DEVICEID']) || // Seen this on HTC Sensation. @ref: SensationXE_Beats_Z715e + //HTTP_X_NETWORK_TYPE = WIFI + ( isset($this->httpHeaders['HTTP_UA_CPU']) && + $this->httpHeaders['HTTP_UA_CPU'] == 'ARM' // Seen this on a HTC. + ) + ); + } + + /** + * Magic overloading method. + * + * @method boolean is[...]() + * @param string $name + * @param array $arguments + * @return mixed + * @throws \BadMethodCallException when the method doesn't exist and doesn't start with 'is' + */ + public function __call($name, $arguments) + { + //make sure the name starts with 'is', otherwise + if (substr($name, 0, 2) != 'is') { + throw new \BadMethodCallException("No such method exists: $name"); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + $key = substr($name, 2); + + return $this->matchUAAgainstKey($key); + } + + /** + * Find a detection rule that matches the current User-agent. + * + * @param null $userAgent deprecated + * @return boolean + */ + private function matchDetectionRulesAgainstUA($userAgent = null) + { + // Begin general search. + foreach ($this->getRules() as $_regex) { + if (empty($_regex)) { + continue; + } + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * Search for a certain key in the rules array. + * If the key is found the try to match the corresponding + * regex agains the User-Agent. + * + * @param string $key + * @param null $userAgent deprecated + * @return mixed + */ + private function matchUAAgainstKey($key, $userAgent = null) + { + // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. + $key = strtolower($key); + + //change the keys to lower case + $_rules = array_change_key_case($this->getRules()); + + if (array_key_exists($key, $_rules)) { + if (empty($_rules[$key])) { + return null; + } + + return $this->match($_rules[$key], $userAgent); + } + + return false; + } + + /** + * Check if the device is mobile. + * Returns true if any type of mobile device detected, including special ones + * @param null $userAgent deprecated + * @param null $httpHeaders deprecated + * @return bool + */ + public function isMobile($userAgent = null, $httpHeaders = null) + { + + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + if ($this->checkHttpHeadersForMobile()) { + return true; + } else { + return $this->matchDetectionRulesAgainstUA(); + } + + } + + /** + * Check if the device is a tablet. + * Return true if any type of tablet device is detected. + * + * @param string $userAgent deprecated + * @param array $httpHeaders deprecated + * @return bool + */ + public function isTablet($userAgent = null, $httpHeaders = null) + { + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + foreach ($this->tabletDevices as $_regex) { + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * This method checks for a certain property in the + * userAgent. + * @todo: The httpHeaders part is not yet used. + * + * @param $key + * @param string $userAgent deprecated + * @param string $httpHeaders deprecated + * @return bool|int|null + */ + public function is($key, $userAgent = null, $httpHeaders = null) + { + // Set the UA and HTTP headers only if needed (eg. batch mode). + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); + + return $this->matchUAAgainstKey($key); + } + + /** + * Retrieve the list of mobile operating systems. + * + * @return array The list of mobile operating systems. + */ + public function getOperatingSystems() + { + return $this->operatingSystems; + } + + /** + * Some detection rules are relative (not standard), + * because of the diversity of devices, vendors and + * their conventions in representing the User-Agent or + * the HTTP headers. + * + * This method will be used to check custom regexes against + * the User-Agent string. + * + * @param $regex + * @param string $userAgent + * @return bool + * + * @todo: search in the HTTP headers too. + */ + public function match($regex, $userAgent = null) + { + // Escape the special character which is the delimiter. + $regex = str_replace('/', '\/', $regex); + + return (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent)); + } + + /** + * Get the properties array. + * + * @return array + */ + public function getProperties() + { + return $this->properties; + } + + /** + * Prepare the version number. + * + * @todo Remove the error supression from str_replace() call. + * + * @param string $ver The string version, like "2.6.21.2152"; + * + * @return float + */ + public function prepareVersionNo($ver) + { + $ver = str_replace(array('_', ' ', '/'), array('.', '.', '.'), $ver); + $arrVer = explode('.', $ver, 2); + + if (isset($arrVer[1])) { + $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. + } + + return (float) implode('.', $arrVer); + } + + /** + * Check the version of the given property in the User-Agent. + * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param string $propertyName + * @param string $type + * @return mixed $version + */ + public function version($propertyName, $type = 'text') + { + if (empty($propertyName)) { + return false; + } + + if (!in_array($type, array('text', 'float'))) { + $type = 'text'; + } + + $properties = $this->getProperties(); + + // Check if the property exists in the properties array. + if (array_key_exists($propertyName, $properties)) { + + // Prepare the pattern to be matched. + // Make sure we always deal with an array (string is converted). + $properties[$propertyName] = (array) $properties[$propertyName]; + + foreach ($properties[$propertyName] as $propertyMatchString) { + + $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); + + // Escape the special character which is the delimiter. + $propertyPattern = str_replace('/', '\/', $propertyPattern); + + // Identify and extract the version. + preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); + + if (!empty($match[1])) { + $version = ( $type == 'float' ? $this->prepareVersionNo($match[1]) : $match[1] ); + + return $version; + } + + } + + } + + return false; + } + + /** + * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. + * + * @return string One of the self::MOBILE_GRADE_* constants. + */ + public function mobileGrade() + { + $isMobile = $this->isMobile(); + + if ( + // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1) + $this->version('iPad', 'float')>=4.3 || + $this->version('iPhone', 'float')>=3.1 || + $this->version('iPod', 'float')>=3.1 || + + // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) + // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM + // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices + // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 + ( $this->version('Android', 'float')>2.1 && $this->is('Webkit') ) || + + // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800 + $this->version('Windows Phone OS', 'float')>=7.0 || + + // Blackberry 7 - Tested on BlackBerry® Torch 9810 + // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670 + $this->is('BlackBerry') && $this->version('BlackBerry', 'float')>=6.0 || + // Blackberry Playbook (1.0-2.0) - Tested on PlayBook + $this->match('Playbook.*Tablet') || + + // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0) + ( $this->version('webOS', 'float')>=1.4 && $this->match('Palm|Pre|Pixi') ) || + // Palm WebOS 3.0 - Tested on HP TouchPad + $this->match('hp.*TouchPad') || + + // Firefox Mobile (12 Beta) - Tested on Android 2.3 device + ( $this->is('Firefox') && $this->version('Firefox', 'float')>=12 ) || + + // Chrome for Android - Tested on Android 4.0, 4.1 device + ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', 'float')>=4.0 ) || + + // Skyfire 4.1 - Tested on Android 2.3 device + ( $this->is('Skyfire') && $this->version('Skyfire', 'float')>=4.1 && $this->is('AndroidOS') && $this->version('Android', 'float')>=2.3 ) || + + // Opera Mobile 11.5-12: Tested on Android 2.3 + ( $this->is('Opera') && $this->version('Opera Mobi', 'float')>11 && $this->is('AndroidOS') ) || + + // Meego 1.2 - Tested on Nokia 950 and N9 + $this->is('MeeGoOS') || + + // Tizen (pre-release) - Tested on early hardware + $this->is('Tizen') || + + // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser + // @todo: more tests here! + $this->is('Dolfin') && $this->version('Bada', 'float')>=2.0 || + + // UC Browser - Tested on Android 2.3 device + ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', 'float')>=2.3 ) || + + // Kindle 3 and Fire - Tested on the built-in WebKit browser for each + ( $this->match('Kindle Fire') || + $this->is('Kindle') && $this->version('Kindle', 'float')>=3.0 ) || + + // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet + $this->is('AndroidOS') && $this->is('NookTablet') || + + // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7 + $this->version('Chrome', 'float')>=11 && !$isMobile || + + // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7 + $this->version('Safari', 'float')>=5.0 && !$isMobile || + + // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7 + $this->version('Firefox', 'float')>=4.0 && !$isMobile || + + // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 + $this->version('MSIE', 'float')>=7.0 && !$isMobile || + + // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 + // @reference: http://my.opera.com/community/openweb/idopera/ + $this->version('Opera', 'float')>=10 && !$isMobile + + + ){ + return self::MOBILE_GRADE_A; + } + + if ( + $this->version('iPad', 'float')<4.3 || + $this->version('iPhone', 'float')<3.1 || + $this->version('iPod', 'float')<3.1 || + + // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 + $this->is('Blackberry') && $this->version('BlackBerry', 'float')>=5 && $this->version('BlackBerry', 'float')<6 || + + //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 + ( $this->version('Opera Mini', 'float')>=5.0 && $this->version('Opera Mini', 'float')<=6.5 && + ($this->version('Android', 'float')>=2.3 || $this->is('iOS')) ) || + + // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) + $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || + + // @todo: report this (tested on Nokia N71) + $this->version('Opera Mobi', 'float')>=11 && $this->is('SymbianOS') + ){ + return self::MOBILE_GRADE_B; + } + + if ( + // Blackberry 4.x - Tested on the Curve 8330 + $this->version('BlackBerry', 'float')<5.0 || + // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) + $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', 'float')<=5.2 + + + ){ + return self::MOBILE_GRADE_C; + } + + //All older smartphone platforms and featurephones - Any device that doesn't support media queries + //will receive the basic, C grade experience. + return self::MOBILE_GRADE_C; + } +} diff --git a/local/modules/Paypal/Config/config.xml b/local/modules/Paypal/Config/config.xml new file mode 100644 index 00000000..abffb4b5 --- /dev/null +++ b/local/modules/Paypal/Config/config.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/Paypal/Config/module.xml b/local/modules/Paypal/Config/module.xml new file mode 100644 index 00000000..8cc486cf --- /dev/null +++ b/local/modules/Paypal/Config/module.xml @@ -0,0 +1,24 @@ + + + Paypal\Paypal + + Pay with Paypal + + + Paiement avec Paypal + + + en_US + fr_FR + + 2.1.3 + + Thelia + info@thelia.net + + payment + 2.1.0 + prod + diff --git a/local/modules/Paypal/Config/routing.xml b/local/modules/Paypal/Config/routing.xml new file mode 100644 index 00000000..6442fa2a --- /dev/null +++ b/local/modules/Paypal/Config/routing.xml @@ -0,0 +1,22 @@ + + + + Paypal\Controller\ConfigurationController::configure + + + + Paypal\Controller\ConfigurationController::downloadLog + + + + Paypal\Controller\PaypalResponse::cancel + \d+ + + + + Paypal\Controller\PaypalResponse::ok + \d+ + + diff --git a/local/modules/Paypal/Controller/ConfigurationController.php b/local/modules/Paypal/Controller/ConfigurationController.php new file mode 100644 index 00000000..45279ff7 --- /dev/null +++ b/local/modules/Paypal/Controller/ConfigurationController.php @@ -0,0 +1,123 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Controller; + +use Paypal\Classes\API\PaypalApiLogManager; +use Paypal\Paypal; +use Thelia\Controller\Admin\BaseAdminController; +use Thelia\Core\HttpFoundation\Response; +use Thelia\Core\Security\AccessManager; +use Thelia\Core\Security\Resource\AdminResources; +use Thelia\Core\Thelia; +use Thelia\Form\Exception\FormValidationException; +use Thelia\Tools\URL; +use Thelia\Tools\Version\Version; + +/** + * Class ConfigurePaypal + * @package Paypal\Controller + * @author Thelia + */ +class ConfigurationController extends BaseAdminController +{ + + public function downloadLog() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'atos', AccessManager::UPDATE)) { + return $response; + } + + $logFilePath = PaypalApiLogManager::getLogFilePath(); + + return Response::create( + @file_get_contents($logFilePath), + 200, + array( + 'Content-type' => "text/plain", + 'Content-Disposition' => sprintf('Attachment;filename=paypal-log.txt') + ) + ); + } + + /* + * Checks paypal.configure || paypal.configure.sandbox form and save config into json file + */ + public function configure() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'Paypal', AccessManager::UPDATE)) { + return $response; + } + + $configurationForm = $this->createForm('paypal.form.configure'); + + try { + $form = $this->validateForm($configurationForm, "POST"); + + // Get the form field values + $data = $form->getData(); + + foreach ($data as $name => $value) { + if (is_array($value)) { + $value = implode(';', $value); + } + + Paypal::setConfigValue($name, $value); + } + + $this->adminLogAppend( + "paypal.configuration.message", + AccessManager::UPDATE, + sprintf("Paypal configuration updated") + ); + + if ($this->getRequest()->get('save_mode') == 'stay') { + // If we have to stay on the same page, redisplay the configuration page/ + $url = '/admin/module/Paypal'; + } else { + // If we have to close the page, go back to the module back-office page. + $url = '/admin/modules'; + } + + return $this->generateRedirect(URL::getInstance()->absoluteUrl($url)); + } catch (FormValidationException $ex) { + $error_msg = $this->createStandardFormValidationErrorMessage($ex); + } catch (\Exception $ex) { + $error_msg = $ex->getMessage(); + } + + $this->setupFormErrorContext( + $this->getTranslator()->trans("Paypal configuration", [], Paypal::DOMAIN), + $error_msg, + $configurationForm, + $ex + ); + + // Before 2.2, the errored form is not stored in session + if (Version::test(Thelia::THELIA_VERSION, '2.2', false, "<")) { + return $this->render('module-configure', [ 'module_code' => 'Paypal' ]); + } else { + return $this->generateRedirect(URL::getInstance()->absoluteUrl('/admin/module/Paypal')); + } + } +} diff --git a/local/modules/Paypal/Controller/PaypalResponse.php b/local/modules/Paypal/Controller/PaypalResponse.php new file mode 100644 index 00000000..5862f63e --- /dev/null +++ b/local/modules/Paypal/Controller/PaypalResponse.php @@ -0,0 +1,253 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Controller; + +use Paypal\Classes\API\PaypalApiCredentials; +use Paypal\Classes\API\PaypalApiLogManager; +use Paypal\Classes\API\PaypalApiManager; +use Paypal\Classes\NVP\Operations\PaypalNvpOperationsDoExpressCheckoutPayment; +use Paypal\Classes\NVP\Operations\PaypalNvpOperationsGetExpressCheckoutDetails; +use Paypal\Classes\NVP\PaypalNvpMessageSender; +use Paypal\Paypal; +use Thelia\Core\Event\Order\OrderEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Core\HttpKernel\Exception\RedirectException; +use Thelia\Model\Base\OrderQuery; +use Thelia\Model\OrderStatus; +use Thelia\Model\OrderStatusQuery; +use Thelia\Module\BasePaymentModuleController; +use Thelia\Tools\URL; + +/** + * Class PaypalResponse + * @package Paypal\Controller + * @author Thelia + */ +class PaypalResponse extends BasePaymentModuleController +{ + /** @var PaypalApiLogManager */ + private $logger; + + public function __construct() + { + $this->logger = new PaypalApiLogManager(); + } + + /** + * @param $order_id + * @return \Thelia\Core\HttpFoundation\Response + */ + public function ok($order_id) + { + $token = null; + + $message = ''; + + try { + $order = $this->checkorder($order_id, $token); + /* + * $payerid string value returned by paypal + * $logger PaypalApiLogManager used to log transctions with paypal + */ + $payerid = $this->getRequest()->get('PayerID'); + + if (! empty($payerid)) { + /* + * $config ConfigInterface Object that contains configuration + * $api PaypalApiCredentials Class used by the library to store and use 3T login(username, password, signature) + * $sandbox bool true if sandbox is enabled + */ + $api = new PaypalApiCredentials(); + $sandbox = Paypal::isSandboxMode(); + /* + * Send getExpressCheckout & doExpressCheckout + * empty cart + */ + $getExpressCheckout = new PaypalNvpOperationsGetExpressCheckoutDetails( + $api, + $token + ); + + $request = new PaypalNvpMessageSender($getExpressCheckout, $sandbox); + $response = PaypalApiManager::nvpToArray($request->send()); + + $this->logger->logTransaction($response); + + if (isset($response['ACK']) && $response['ACK'] === 'Success' && + isset($response['PAYERID']) && $response['PAYERID'] === $payerid && + isset($response['TOKEN']) && $response['TOKEN'] === $token + ) { + $doExpressCheckout = new PaypalNvpOperationsDoExpressCheckoutPayment( + $api, + round($order->getTotalAmount(), 2), + $order->getCurrency()->getCode(), + $payerid, + PaypalApiManager::PAYMENT_TYPE_SALE, + $token, + // FIXME This URL is not used in PaypalNvpOperationsDoExpressCheckoutPayment, and has no defined route + URL::getInstance()->absoluteUrl("/module/paypal/listen"), + PaypalApiManager::BUTTON_SOURCE + ); + + $request = new PaypalNvpMessageSender($doExpressCheckout, $token); + $response = PaypalApiManager::nvpToArray($request->send()); + + $this->logger->logTransaction($response); + + // Store correlation ID in the order + if (isset($response['CORRELATIONID'])) { + $order + ->setTransactionRef($response['CORRELATIONID']) + ->save(); + ; + } + + // In case of pending status, log the reason to get usefull information (multi-currency problem, ...) + if (isset($response['ACK']) && $response['ACK'] === "Success" && + isset($response['PAYMENTINFO_0_PAYMENTSTATUS']) && $response['PAYMENTINFO_0_PAYMENTSTATUS'] === "Pending") { + $message = $this->getTranslator()->trans( + "Paypal transaction is pending. Reason: %reason", + [ 'reason' => $response['PAYMENTINFO_0_PENDINGREASON'] ], + Paypal::DOMAIN + ); + } + + /* + * In case of success, go to success page + * In case of error, show it + */ + if (isset($response['ACK']) && $response['ACK'] === "Success" + && isset($response['PAYMENTINFO_0_PAYMENTSTATUS']) && $response['PAYMENTINFO_0_PAYMENTSTATUS'] === "Completed" + && isset($response['TOKEN']) && $response['TOKEN'] === $token + ) { + /* + * Set order status as paid + */ + $event = new OrderEvent($order); + $event->setStatus(OrderStatusQuery::getPaidStatus()->getId()); + $this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event); + + $this->redirectToSuccessPage($order_id); + } else { + $message = $this->getTranslator()->trans("Failed to validate your payment", [], Paypal::DOMAIN); + } + } else { + $message = $this->getTranslator()->trans("Failed to validate payment parameters", [], Paypal::DOMAIN); + } + } else { + $message = $this->getTranslator()->trans("Failed to find PayerID", [], Paypal::DOMAIN); + } + + $this->logger->getLogger()->info("Order [" . $order_id . "] : " . $message); + } catch (RedirectException $ex) { + throw $ex; + } catch (\Exception $ex) { + $this->logger->getLogger()->error("Error occured while processing express checkout : " . $ex->getMessage()); + + $message = $this->getTranslator()->trans( + "Unexpected error: %mesg", + [ '%mesg' => $ex->getMessage()], + Paypal::DOMAIN + ); + } + + $this->redirectToFailurePage($order_id, $message); + } + + /* + * @param $order_id int + * @return \Thelia\Core\HttpFoundation\Response + */ + public function cancel($order_id) + { + $token = null; + + try { + $order = $this->checkorder($order_id, $token); + + $logger = new PaypalApiLogManager(); + $logger->getLogger()->warning("User canceled payment of order ".$order->getRef()); + + $event = new OrderEvent($order); + $event->setStatus(OrderStatusQuery::create()->findOneByCode(OrderStatus::CODE_CANCELED)->getId()); + $this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event); + + $message = $this->getTranslator()->trans("You canceled your payment", [], Paypal::DOMAIN); + } catch (\Exception $ex) { + $this->logger->getLogger()->error("Error occured while canceling express checkout : " . $ex->getMessage()); + + $message = $this->getTranslator()->trans( + "Unexpected error: %mesg", + [ '%mesg' => $ex->getMessage()], + Paypal::DOMAIN + ); + } + + $this->redirectToFailurePage($order_id, $message); + } + + /* + * @param $order_id int + * @param &$token string|null + * @throws \Exception + * @return \Thelia\Model\Order + */ + public function checkorder($order_id, &$token) + { + $token = $this->getRequest()->getSession()->get('Paypal.token'); + + if ($token !== $this->getRequest()->get('token')) { + throw new \Exception( + $this->getTranslator()->trans( + "Invalid Paypal token. Please try again.", + [], + Paypal::DOMAIN + ) + ); + } + + if (null === $order = OrderQuery::create()->findPk($order_id)) { + throw new \Exception( + $this->getTranslator()->trans( + "Invalid order ID. This order doesn't exists or doesn't belong to you.", + [], + Paypal::DOMAIN + ) + ); + } + + return $order; + } + + /** + * Return a module identifier used to calculate the name of the log file, + * and in the log messages. + * + * @return string the module code + */ + protected function getModuleCode() + { + return "Paypal"; + } +} diff --git a/local/modules/Paypal/Form/ConfigurationForm.php b/local/modules/Paypal/Form/ConfigurationForm.php new file mode 100644 index 00000000..4b4bd01d --- /dev/null +++ b/local/modules/Paypal/Form/ConfigurationForm.php @@ -0,0 +1,248 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Paypal\Form; + +use Paypal\Paypal; +use Symfony\Component\Validator\Constraints\GreaterThanOrEqual; +use Symfony\Component\Validator\Constraints\NotBlank; +use Thelia\Form\BaseForm; + +/** + * Class ConfigurePaypal + * @package Paypal\Form + * @author Thelia + */ +class ConfigurationForm extends BaseForm +{ + protected function buildForm() + { + $this->formBuilder + ->add( + 'login', + 'text', + [ + 'constraints' => [ new NotBlank() ], + 'label' => $this->translator->trans('login', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans('Your Paypal login', [], Paypal::DOMAIN) + ] + ] + ) + ->add( + 'password', + 'text', + [ + 'constraints' => [ new NotBlank() ], + 'label' => $this->translator->trans('password', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans('Your Paypal password', [], Paypal::DOMAIN) + ] + ] + ) + ->add( + 'signature', + 'text', + [ + 'constraints' => [ new NotBlank() ], + 'label' => $this->translator->trans('signature', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans('The Paypal signature', [], Paypal::DOMAIN) + ] + ] + ) + ->add( + 'sandbox', + 'checkbox', + [ + 'value' => 1, + 'required' => false, + 'label' => $this->translator->trans('Activate sandbox mode', [], Paypal::DOMAIN), + ] + ) + ->add( + 'sandbox_login', + 'text', + [ + 'required' => false, + 'label' => $this->translator->trans('login', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans('Your Paypal sandbox login', [], Paypal::DOMAIN) + ] + ] + ) + ->add( + 'sandbox_password', + 'text', + [ + 'required' => false, + 'label' => $this->translator->trans('password', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans('Your Paypal sandbox password', [], Paypal::DOMAIN) + ] + ] + ) + ->add( + 'sandbox_signature', + 'text', + [ + 'required' => false, + 'label' => $this->translator->trans('signature', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans('The Paypal sandbox signature', [], Paypal::DOMAIN) + ] + ] + ) + ->add( + 'allowed_ip_list', + 'textarea', + [ + 'required' => false, + 'label' => $this->translator->trans('Allowed IPs in test mode', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'List of IP addresses allowed to use this payment on the front-office when in test mode (your current IP is %ip). One address per line', + [ '%ip' => $this->getRequest()->getClientIp() ], + Paypal::DOMAIN + ) + ], + 'attr' => [ + 'rows' => 3 + ] + ] + ) + ->add( + 'minimum_amount', + 'text', + [ + 'constraints' => [ + new NotBlank(), + new GreaterThanOrEqual(array('value' => 0)) + ], + 'required' => false, + 'label' => $this->translator->trans('Minimum order total', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'Minimum order total in the default currency for which this payment method is available. Enter 0 for no minimum', + [], + Paypal::DOMAIN + ) + ] + ] + ) + ->add( + 'maximum_amount', + 'text', + [ + 'constraints' => [ + new NotBlank(), + new GreaterThanOrEqual(array('value' => 0)) + ], + 'required' => false, + 'label' => $this->translator->trans('Maximum order total', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'Maximum order total in the default currency for which this payment method is available. Enter 0 for no maximum', + [], + Paypal::DOMAIN + ) + ] + ] + ) + ->add( + 'cart_item_count', + 'text', + [ + 'constraints' => [ + new NotBlank(), + new GreaterThanOrEqual(array('value' => 0)) + ], + 'required' => false, + 'label' => $this->translator->trans('Maximum items in cart', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'Maximum number of items in the customer cart for which this payment method is available.', + [], + Paypal::DOMAIN + ) + ] + ] + ) + ->add( + 'send_confirmation_message_only_if_paid', + 'checkbox', + [ + 'value' => 1, + 'required' => false, + 'label' => $this->translator->trans('Send order confirmation on payment success', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'If checked, the order confirmation message is sent to the customer only when the payment is successful. The order notification is always sent to the shop administrator', + [], + Paypal::DOMAIN + ) + ] + ] + ) + ->add( + 'send_payment_confirmation_message', + 'checkbox', + [ + 'value' => 1, + 'required' => false, + 'label' => $this->translator->trans('Send a payment confirmation e-mail', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'If checked, a payment confirmation e-mail is sent to the customer.', + [], + Paypal::DOMAIN + ) + ] + ] + ) + ->add( + 'send_cart_detail', + 'checkbox', + [ + 'value' => 1, + 'required' => false, + 'label' => $this->translator->trans('Send details of all products to Paypal', [], Paypal::DOMAIN), + 'label_attr' => [ + 'help' => $this->translator->trans( + 'If checked, all products will be sent to Paypal.', + [], + Paypal::DOMAIN + ) + ] + ] + ) + ; + } + + /** + * @return string the name of your form. This name must be unique + */ + public function getName() + { + return "configurepaypalform"; + } +} diff --git a/local/modules/Paypal/Hook/HookManager.php b/local/modules/Paypal/Hook/HookManager.php new file mode 100644 index 00000000..4259def9 --- /dev/null +++ b/local/modules/Paypal/Hook/HookManager.php @@ -0,0 +1,81 @@ +. */ +/* */ +/*************************************************************************************/ +/** + * Created by Franck Allimant, CQFDev + * Date: 11/01/2016 11:57 + */ + +namespace Paypal\Hook; + +use Paypal\Classes\API\PaypalApiLogManager; +use Paypal\Paypal; +use Thelia\Core\Event\Hook\HookRenderEvent; +use Thelia\Core\Hook\BaseHook; +use Thelia\Model\ModuleConfig; +use Thelia\Model\ModuleConfigQuery; + +class HookManager extends BaseHook +{ + const MAX_TRACE_SIZE_IN_BYTES = 40000; + + public function onModuleConfigure(HookRenderEvent $event) + { + $logFilePath = PaypalApiLogManager::getLogFilePath(); + + $traces = @file_get_contents($logFilePath); + + if (false === $traces) { + $traces = $this->translator->trans("The log file doesn't exists yet.", [], Paypal::DOMAIN); + } elseif (empty($traces)) { + $traces = $this->translator->trans("The log file is empty.", [], Paypal::DOMAIN); + } else { + // Limiter la taille des traces à 1MO + if (strlen($traces) > self::MAX_TRACE_SIZE_IN_BYTES) { + $traces = substr($traces, strlen($traces) - self::MAX_TRACE_SIZE_IN_BYTES); + // Cut a first line break; + if (false !== $lineBreakPos = strpos($traces, "\n")) { + $traces = substr($traces, $lineBreakPos+1); + } + + $traces = $this->translator->trans( + "(Previous log is in %file file.)\n", + [ '%file' => sprintf("log".DS."%s.log", Paypal::DOMAIN) ], + Paypal::DOMAIN + ) . $traces; + } + } + + $vars = ['trace_content' => nl2br($traces) ]; + + if (null !== $params = ModuleConfigQuery::create()->findByModuleId(Paypal::getModuleId())) { + /** @var ModuleConfig $param */ + foreach ($params as $param) { + $vars[ $param->getName() ] = $param->getValue(); + } + } + + $event->add( + $this->render('paypal/module-configuration.html', $vars) + ); + } +} diff --git a/local/modules/Paypal/I18n/backOffice/default/en_US.php b/local/modules/Paypal/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..49a67811 --- /dev/null +++ b/local/modules/Paypal/I18n/backOffice/default/en_US.php @@ -0,0 +1,11 @@ + 'Download full log', + 'Payment configuration' => 'Payment configuration', + 'Paypal Configuration' => 'Paypal Configuration', + 'Paypal Production parameters' => 'Paypal Production parameters', + 'Paypal Sandbox parameters' => 'Paypal Sandbox parameters', + 'Paypal responses history' => 'Paypal responses history', + 'You can edit the payment confirmation email sent to the customer after a successful payment.' => 'You can edit the payment confirmation email sent to the customer after a successful payment.', +); diff --git a/local/modules/Paypal/I18n/backOffice/default/fr_FR.php b/local/modules/Paypal/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..ecf09aed --- /dev/null +++ b/local/modules/Paypal/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,11 @@ + 'Télécharger l\'historique complet', + 'Payment configuration' => 'Configuration du paiement', + 'Paypal Configuration' => 'Configuration Paypal', + 'Paypal Production parameters' => 'Paramètre de production', + 'Paypal Sandbox parameters' => 'Paramètres sandbox', + 'Paypal responses history' => 'Log des échanges avec la plate-forme Paypal', + 'You can edit the payment confirmation email sent to the customer after a successful payment.' => 'Vous pouvez modifier le mail de confirmation de paiement envoyé au client.', +); diff --git a/local/modules/Paypal/I18n/email/default/en_US.php b/local/modules/Paypal/I18n/email/default/en_US.php new file mode 100644 index 00000000..ebc271c6 --- /dev/null +++ b/local/modules/Paypal/I18n/email/default/en_US.php @@ -0,0 +1,12 @@ + 'Dear customer', + 'Payment of your order %ref' => 'Payment of your order %ref', + 'Thank you again for your purchase.' => 'Thank you again for your purchase.', + 'The %store_name team.' => 'The %store_name team.', + 'The payment of your order %ref is confirmed' => 'The payment of your order %ref is confirmed', + 'This is a confirmation of the payment of your order %ref via Paypal on our shop.' => 'This is a confirmation of the payment of your order %ref via Paypal on our shop.', + 'View this order in your account at %shop_name' => 'View this order in your account at %shop_name', + 'Your invoice is now available in your customer account at %url.' => 'Your invoice is now available in your customer account at %url.', +); diff --git a/local/modules/Paypal/I18n/email/default/fr_FR.php b/local/modules/Paypal/I18n/email/default/fr_FR.php new file mode 100644 index 00000000..28582021 --- /dev/null +++ b/local/modules/Paypal/I18n/email/default/fr_FR.php @@ -0,0 +1,12 @@ + 'Cher client', + 'Payment of your order %ref' => 'Paiement de votre commande %ref', + 'Thank you again for your purchase.' => 'Merci encore pour votre commande.', + 'The %store_name team.' => 'L\'équipe %store_name', + 'The payment of your order %ref is confirmed' => 'Le paiement Paypal de votre commande %ref est confirmé.', + 'This is a confirmation of the payment of your order %ref via Paypal on our shop.' => 'Ceci est une confirmation du paiement Paypal de votre commande %ref.', + 'View this order in your account at %shop_name' => 'Les détails de cette commande sont disponibles dans votre compte client sur %shop_name', + 'Your invoice is now available in your customer account at %url.' => 'Les détails de cette commande sont disponibles dans votre compte client sur %url', +); diff --git a/local/modules/Paypal/I18n/en_US.php b/local/modules/Paypal/I18n/en_US.php new file mode 100644 index 00000000..9f274cc8 --- /dev/null +++ b/local/modules/Paypal/I18n/en_US.php @@ -0,0 +1,45 @@ + '(Previous log is in %file file.)\n', + 'Activate sandbox mode' => 'Activate sandbox mode', + 'Allowed IPs in test mode' => 'Allowed IPs in test mode', + 'Discount' => 'Discount', + 'Failed to find PayerID' => 'Failed to find PayerID', + 'Failed to get a valid Paypal response. Please try again' => 'Failed to get a valid Paypal response. Please try again', + 'Failed to get customer delivery address' => 'Failed to get customer delivery address', + 'Failed to validate payment parameters' => 'Failed to validate payment parameters', + 'Failed to validate your payment' => 'Failed to validate your payment', + 'If checked, a payment confirmation e-mail is sent to the customer.' => 'If checked, a payment confirmation e-mail is sent to the customer.', + 'If checked, the order confirmation message is sent to the customer only when the payment is successful. The order notification is always sent to the shop administrator' => 'If checked, the order confirmation message is sent to the customer only when the payment is successful. The order notification is always sent to the shop administrator', + 'Invalid Paypal token. Please try again.' => 'Invalid Paypal token. Please try again.', + 'Invalid order ID. This order doesn\'t exists or doesn\'t belong to you.' => 'Invalid order ID. This order doesn\'t exists or doesn\'t belong to you.', + 'List of IP addresses allowed to use this payment on the front-office when in test mode (your current IP is %ip). One address per line' => 'List of IP addresses allowed to use this payment on the front-office when in test mode (your current IP is %ip). One address per line', + 'Maximum items in cart' => 'Maximum items in cart', + 'Maximum number of items in the customer cart for which this payment method is available.' => 'Maximum number of items in the customer cart for which this payment method is available.', + 'Maximum order total' => 'Maximum order total', + 'Maximum order total in the default currency for which this payment method is available. Enter 0 for no maximum' => 'Maximum order total in the default currency for which this payment method is available. Enter 0 for no maximum', + 'Minimum order total' => 'Minimum order total', + 'Minimum order total in the default currency for which this payment method is available. Enter 0 for no minimum' => 'Minimum order total in the default currency for which this payment method is available. Enter 0 for no minimum', + 'Paypal configuration' => 'Paypal configuration', + 'Paypal transaction is pending. Reason: %reason' => 'Paypal transaction is pending. Reason: %reason', + 'Send a payment confirmation e-mail' => 'Send a payment confirmation e-mail', + 'Send order confirmation on payment success' => 'Send order confirmation on payment success', + 'Sorry, something did not worked with Paypal. Please try again, or use another payment type' => 'Sorry, something did not worked with Paypal. Please try again, or use another payment type', + 'The Paypal sandbox signature' => 'The Paypal sandbox signature', + 'The Paypal signature' => 'The Paypal signature', + 'The log file doesn\'t exists yet.' => 'The log file doesn\'t exists yet.', + 'The log file is empty.' => 'The log file is empty.', + 'The password option must be set.' => 'The password option must be set.', + 'The signature option must be set.' => 'The signature option must be set.', + 'The username option must be set.' => 'The username option must be set.', + 'Unexpected error: %mesg' => 'Unexpected error: %mesg', + 'You canceled your payment' => 'You canceled your payment', + 'Your Paypal login' => 'Your Paypal login', + 'Your Paypal password' => 'Your Paypal password', + 'Your Paypal sandbox login' => 'Your Paypal sandbox login', + 'Your Paypal sandbox password' => 'Your Paypal sandbox password', + 'login' => 'username', + 'password' => 'password', + 'signature' => 'signature', +); diff --git a/local/modules/Paypal/I18n/fr_FR.php b/local/modules/Paypal/I18n/fr_FR.php new file mode 100644 index 00000000..98898e0e --- /dev/null +++ b/local/modules/Paypal/I18n/fr_FR.php @@ -0,0 +1,48 @@ + '(L\'historique précédent est dans %file file.)\n', + 'Activate sandbox mode' => 'Activer la sandbox ( mode de test )', + 'Allowed IPs in test mode' => 'Adresse IP autorisées en mode sandbox', + 'Discount' => 'Remise', + 'Failed to find PayerID' => 'Ne peut obtenir le PayerID', + 'Failed to get a valid Paypal response. Please try again' => 'Ne peut obtenir la réponse de Paypal', + 'Failed to get customer delivery address' => 'Ne peut obtenir l\'adresse de livraison du client', + 'Failed to validate payment parameters' => 'La validation des paramètres de paiement a échoué', + 'Failed to validate your payment' => 'La validation du paiement a échoué', + 'If checked, a payment confirmation e-mail is sent to the customer.' => 'Si cette case est cochée, un mail de confirmation de paiement sera envoyé au client.', + 'If checked, all products will be sent to Paypal.' => 'Si cette case est cochée, tout les produits seront envoyé à Paypal.', + 'If checked, the order confirmation message is sent to the customer only when the payment is successful. The order notification is always sent to the shop administrator' => 'Si cette case est cochée, le mail de confirmation de commande sera envoyé au client seulement si son paiement est validé.', + 'Invalid Paypal token. Please try again.' => 'Le token Paypal est invalide. Merci de ré-essayer', + 'Invalid order ID. This order doesn\'t exists or doesn\'t belong to you.' => 'ID de commande invalide', + 'List of IP addresses allowed to use this payment on the front-office when in test mode (your current IP is %ip). One address per line' => 'En mode sandbox, liste des adresses IP autorisées à utiliser le module de paiement en front office. Indiquer une adresse par ligne. Votre IP actuelle est %ip', + 'Maximum items in cart' => 'Nombre maximum d\'éléments dans le panier', + 'Maximum number of items in the customer cart for which this payment method is available.' => 'Nombre d\'éléments dans le panier au delà duquel ce paiement n\'est plus disponible.', + 'Maximum order total' => 'Montant de commande maximum', + 'Maximum order total in the default currency for which this payment method is available. Enter 0 for no maximum' => 'Montant de commande maximum dans la devise par défaut au delà duquel ce paiement n\'est plus disponible. 0 = pas de maximum', + 'Minimum order total' => 'Montant de commande minimum', + 'Minimum order total in the default currency for which this payment method is available. Enter 0 for no minimum' => 'Montant de commande minimum dans la devise par défaut à partir duquel ce paiement devient disponible. 0 = pas de minimum', + 'Order' => 'Commande', + 'Paypal configuration' => 'Configuration Paypal', + 'Paypal transaction is pending. Reason: %reason' => 'La transaction Paypal est suspendue: %reason', + 'Send a payment confirmation e-mail' => 'Envoyer une confirmation de paiement', + 'Send details of all products to Paypal' => 'Envoyer les détails de tout les produits à Paypal', + 'Send order confirmation on payment success' => 'Confirmation de commande si le paiement réussit', + 'Sorry, something did not worked with Paypal. Please try again, or use another payment type' => 'Désolé, quelque chose n\'a pas marché avec Paypal', + 'The Paypal sandbox signature' => 'Le mot de passe de votre compte sandbox Paypal', + 'The Paypal signature' => 'La signature associée à votre compte.', + 'The log file doesn\'t exists yet.' => 'Le fichier de log n\'existe pas encore.', + 'The log file is empty.' => 'Le fichier de log est vide.', + 'The password option must be set.' => 'Veuillez indiquer le mot de passe', + 'The signature option must be set.' => 'Veuillez indiquer la signature', + 'The username option must be set.' => 'Veuillez indiquer le nom d\'utilisateur', + 'Unexpected error: %mesg' => 'Erreur inattendue: %mesg', + 'You canceled your payment' => 'Vous avez annulé votre demande de paiement', + 'Your Paypal login' => 'Le login de votre compte Paypal', + 'Your Paypal password' => 'Le mot de passe de votre compte Paypal', + 'Your Paypal sandbox login' => 'Le login de votre compte sandbox Paypal', + 'Your Paypal sandbox password' => 'Le mot de passe de votre compte sandbox Paypal', + 'login' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'signature' => 'Signature', +); diff --git a/local/modules/Paypal/LICENSE.txt b/local/modules/Paypal/LICENSE.txt new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/local/modules/Paypal/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/local/modules/Paypal/Listener/SendConfirmationEmail.php b/local/modules/Paypal/Listener/SendConfirmationEmail.php new file mode 100644 index 00000000..3032c4ba --- /dev/null +++ b/local/modules/Paypal/Listener/SendConfirmationEmail.php @@ -0,0 +1,101 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal\Listener; + +use Paypal\Paypal; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Thelia\Action\BaseAction; +use Thelia\Core\Event\Order\OrderEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Mailer\MailerFactory; + +/** + * Class SendEMail + * @package IciRelais\Listener + * @author Thelia + */ +class SendConfirmationEmail extends BaseAction implements EventSubscriberInterface +{ + /** + * @var MailerFactory + */ + protected $mailer; + + public function __construct(MailerFactory $mailer) + { + $this->mailer = $mailer; + } + + /** + * @param OrderEvent $event + * + * @throws \Exception if the message cannot be loaded. + */ + public function sendConfirmationEmail(OrderEvent $event) + { + if (Paypal::getConfigValue('send_confirmation_message_only_if_paid')) { + // We send the order confirmation email only if the order is paid + $order = $event->getOrder(); + + if (! $order->isPaid() && $order->getPaymentModuleId() == Paypal::getModuleId()) { + $event->stopPropagation(); + } + } + } + + /* + * @params OrderEvent $order + * Checks if order payment module is paypal and if order new status is paid, send an email to the customer. + */ + public function updateStatus(OrderEvent $event) + { + $order = $event->getOrder(); + + if ($order->isPaid() && $order->getPaymentModuleId() === Paypal::getModuleId()) { + if (Paypal::getConfigValue('send_payment_confirmation_message')) { + $this->mailer->sendEmailToCustomer( + Paypal::CONFIRMATION_MESSAGE_NAME, + $order->getCustomer(), + [ + 'order_id' => $order->getId(), + 'order_ref' => $order->getRef() + ] + ); + } + + // Send confirmation email if required. + if (Paypal::getConfigValue('send_confirmation_message_only_if_paid')) { + $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL, $event); + } + } + } + + public static function getSubscribedEvents() + { + return array( + TheliaEvents::ORDER_UPDATE_STATUS => array("updateStatus", 128), + TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL => array("sendConfirmationEmail", 129) + ); + } +} diff --git a/local/modules/Paypal/Paypal.php b/local/modules/Paypal/Paypal.php new file mode 100644 index 00000000..81aac904 --- /dev/null +++ b/local/modules/Paypal/Paypal.php @@ -0,0 +1,353 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Paypal; + +use Paypal\Classes\API\PaypalApiCredentials; +use Paypal\Classes\API\PaypalApiLogManager; +use Paypal\Classes\API\PaypalApiManager; +use Paypal\Classes\NVP\Operations\PaypalNvpOperationsSetExpressCheckout; +use Paypal\Classes\NVP\PaypalNvpMessageSender; +use Propel\Runtime\Connection\ConnectionInterface; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\Routing\Router; +use Thelia\Core\Translation\Translator; +use Thelia\Install\Database; +use Thelia\Model\CountryQuery; +use Thelia\Model\Message; +use Thelia\Model\MessageQuery; +use Thelia\Model\ModuleImageQuery; +use Thelia\Model\Order; +use Thelia\Model\OrderAddressQuery; +use Thelia\Model\OrderQuery; +use Thelia\Module\AbstractPaymentModule; +use Thelia\Tools\URL; + +/** + * Class Paypal + * @package Paypal + * @author Thelia + */ +class Paypal extends AbstractPaymentModule +{ + const DOMAIN = 'paypal'; + + /** + * The confirmation message identifier + */ + const CONFIRMATION_MESSAGE_NAME = 'paypal_payment_confirmation'; + + public function pay(Order $order) + { + $orderId = $order->getId(); + + /** @var Router $router */ + $router = $this->getContainer()->get('router.paypal'); + + $successUrl = URL::getInstance()->absoluteUrl( + $router->generate('paypal.ok', ['order_id' => $order->getId()]) + ); + + $cancelUrl = URL::getInstance()->absoluteUrl( + $router->generate('paypal.cancel', ['order_id' => $order->getId()]) + ); + + $order = OrderQuery::create()->findPk($orderId); + + $api = new PaypalApiCredentials(); + $redirect_api = new PaypalApiManager(); + $products = array(array()); + $itemIndex = 0; + $logger = new PaypalApiLogManager(); + + $send_cart_detail = (int) Paypal::getConfigValue('send_cart_detail', 0); + + if ($send_cart_detail == 1) { + + /* + * Store products into 2d array $products + */ + $products_amount = 0; + + foreach ($order->getOrderProducts() as $product) { + if ($product !== null) { + $amount = floatval($product->getWasInPromo() ? $product->getPromoPrice() : $product->getPrice()); + foreach ($product->getOrderProductTaxes() as $tax) { + $amount += $product->getWasInPromo() ? $tax->getPromoAmount() : $tax->getAmount(); + } + $rounded_amounts = round($amount, 2); + $products_amount += $rounded_amounts * $product->getQuantity(); + $products[0][ "NAME" . $itemIndex ] = urlencode($product->getTitle()); + $products[0][ "AMT" . $itemIndex ] = urlencode($rounded_amounts); + $products[0][ "QTY" . $itemIndex ] = urlencode($product->getQuantity()); + $itemIndex ++; + } + } + + /* + * Compute difference between prodcts total and cart amount + * -> get Coupons. + */ + $delta = round($products_amount - $order->getTotalAmount($useless, false), 2); + + if ($delta > 0) { + $products[0][ "NAME" . $itemIndex ] = Translator::getInstance()->trans("Discount"); + $products[0][ "AMT" . $itemIndex ] = - $delta; + $products[0][ "QTY" . $itemIndex ] = 1; + } + } else { + $products[0]["NAME" . $itemIndex] = urlencode(Translator::getInstance()->trans("Order").' '.$orderId); + $products[0]["AMT" . $itemIndex] = round($order->getTotalAmount($useless, false),2); + $products[0]["QTY" . $itemIndex] = 1; + } + + /* + * Create setExpressCheckout request + */ + $setExpressCheckout = new PaypalNvpOperationsSetExpressCheckout( + $api, + round($order->getTotalAmount(), 2), + $order->getCurrency()->getCode(), + $successUrl, + $cancelUrl, + 0, + array( + "L_PAYMENTREQUEST" => $products, + "PAYMENTREQUEST" => array( + array( + "SHIPPINGAMT" => round($order->getPostage(), 2), + "ITEMAMT" => round($order->getTotalAmount($useless, false), 2) + ) + ) + ) + ); + + /* + * Try to get customer's delivery address + */ + if (null !== $address = OrderAddressQuery::create()->findPk($order->getDeliveryOrderAddressId())) { + /* + * If address is found, set address in setExpressCheckout request + */ + $setExpressCheckout->setCustomerDeliveryAddress( + $address->getLastname(), + $address->getAddress1(), + $address->getAddress2(), + $address->getCity(), + "", // State + $address->getZipcode(), + CountryQuery::create()->findPk($address->getCountryId())->getIsoalpha2() + ); + + /* + * $sender PaypalNvpMessageSender Instance of the class that sends requests + * $response string NVP response of paypal for setExpressCheckout request + * $req array array cast of NVP response + */ + $sender = new PaypalNvpMessageSender($setExpressCheckout, self::isSandboxMode()); + + $response = $sender->send(); + + if ($response) { + $responseData = PaypalApiManager::nvpToArray($response); + + $logger->logTransaction($responseData); + /* + * if setExpressCheckout is correct, store values in the session & redirect to paypal checkout page + * else print error. ( return $this->render ... ) + */ + if (isset($responseData['ACK']) && $responseData['ACK'] === "Success" + && + isset($responseData['TOKEN']) && ! empty($responseData['TOKEN']) + ) { + $sess = $this->getRequest()->getSession(); + $sess->set("Paypal.token", $responseData['TOKEN']); + + return new RedirectResponse( + $redirect_api->getExpressCheckoutUrl($responseData['TOKEN']) + ); + } + } else { + $logger->getLogger()->error( + Translator::getInstance()->trans( + "Failed to get a valid Paypal response. Please try again", + [], + self::DOMAIN + ) + ); + } + } else { + $logger->getLogger()->error( + Translator::getInstance()->trans( + "Failed to get customer delivery address", + [], + self::DOMAIN + ) + ); + } + + // Failure ! + return new RedirectResponse( + $this->getPaymentFailurePageUrl( + $orderId, + // Pas de point final, sinon 404 ! + Translator::getInstance()->trans( + "Sorry, something did not worked with Paypal. Please try again, or use another payment type", + [], + self::DOMAIN + ) + ) + ); + } + + public function isValidPayment() + { + $valid = false; + + // Check if total order amount is within the module's limits + $order_total = $this->getCurrentOrderTotalAmount(); + + $min_amount = Paypal::getConfigValue('minimum_amount', 0); + $max_amount = Paypal::getConfigValue('maximum_amount', 0); + + if ( + ($order_total > 0) + && + ($min_amount <= 0 || $order_total >= $min_amount) + && + ($max_amount <= 0 || $order_total <= $max_amount) + ) { + // Check cart item count + $cartItemCount = $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->countCartItems(); + + if ($cartItemCount <= Paypal::getConfigValue('cart_item_count', 9)) { + $valid = true; + + if (Paypal::isSandboxMode()) { + // In sandbox mode, check the current IP + $raw_ips = explode("\n", Paypal::getConfigValue('allowed_ip_list', '')); + + $allowed_client_ips = array(); + + foreach ($raw_ips as $ip) { + $allowed_client_ips[] = trim($ip); + } + + $client_ip = $this->getRequest()->getClientIp(); + + $valid = in_array($client_ip, $allowed_client_ips); + } + } + } + + return $valid; + } + + public function postActivation(ConnectionInterface $con = null) + { + // Setup some default values at first install + if (null === self::getConfigValue('minimum_amount', null)) { + self::setConfigValue('minimum_amount', 0); + self::setConfigValue('maximum_amount', 0); + self::setConfigValue('send_payment_confirmation_message', 1); + } + + if (null === MessageQuery::create()->findOneByName(self::CONFIRMATION_MESSAGE_NAME)) { + $message = new Message(); + + $message + ->setName(self::CONFIRMATION_MESSAGE_NAME) + ->setHtmlTemplateFileName('paypal-payment-confirmation.html') + ->setTextTemplateFileName('paypal-payment-confirmation.txt') + ->setLocale('en_US') + ->setTitle('Paypal payment confirmation') + ->setSubject('Payment of order {$order_ref}') + ->setLocale('fr_FR') + ->setTitle('Confirmation de paiement par Paypal') + ->setSubject('Confirmation du paiement de votre commande {$order_ref}') + ->save() + ; + } + + /* Deploy the module's image */ + $module = $this->getModuleModel(); + + if (ModuleImageQuery::create()->filterByModule($module)->count() == 0) { + $this->deployImageFolder($module, sprintf('%s/images', __DIR__), $con); + } + } + + public function update($currentVersion, $newVersion, ConnectionInterface $con = null) + { + if (null === self::getConfigValue('login', null)) { + $database = new Database($con); + + $statement = $database->execute('select * from paypal_config'); + + while ($statement && $config = $statement->fetchObject()) { + switch($config->name) { + case 'login_sandbox': + Paypal::setConfigValue('sandbox_login', $config->value); + break; + + case 'password_sandbox': + Paypal::setConfigValue('sandbox_password', $config->value); + break; + + case 'signature_sandbox': + Paypal::setConfigValue('sandbox_signature', $config->value); + break; + + default: + Paypal::setConfigValue($config->name, $config->value); + break; + } + } + } + + parent::update($currentVersion, $newVersion, $con); + } + + public static function isSandboxMode() + { + return 1 == intval(self::getConfigValue('sandbox')); + } + + public function destroy(ConnectionInterface $con = null, $deleteModuleData = false) + { + if ($deleteModuleData) { + MessageQuery::create()->findOneByName(self::CONFIRMATION_MESSAGE_NAME)->delete(); + } + } + + /** + * if you want, you can manage stock in your module instead of order process. + * Return false to decrease the stock when order status switch to pay + * + * @return bool + */ + public function manageStockOnCreation() + { + return false; + } +} diff --git a/local/modules/Paypal/README.md b/local/modules/Paypal/README.md new file mode 100644 index 00000000..de5541bc --- /dev/null +++ b/local/modules/Paypal/README.md @@ -0,0 +1,32 @@ +# PayPal + +* I) Install notes +* II) How to use +* III) Integration + +## I) Installation + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is ```Paypal```. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/paypal-module:~2.0.0 +``` + +## II) How to use + +To use the module, you first need to activate it in the back-office, tab Modules, and click on "Configure" on the line +of paypal module. Enter your paypal login informations and save. +Don't forget to do some fake orders in sandbox mode ( check "Active sandbox mode" box in tab Configure sandbox in the +configuration page, and save ). + +## III) Integration + +There is an integration example in the directory /templates/frontOffice/deufault +You must do a page containing a internal error message called gotopaypalfail.html and a order cancel page called ordercanacled.html diff --git a/local/modules/Paypal/composer.json b/local/modules/Paypal/composer.json new file mode 100644 index 00000000..b4276bd1 --- /dev/null +++ b/local/modules/Paypal/composer.json @@ -0,0 +1,19 @@ +{ + "name": "thelia/paypal-module", + "type": "thelia-module", + "license": "LGPL V3", + "description": "Paypal module for Thelia ecommerce solution", + "authors": [ + { + "name": "Thelia", + "email": "info@thelia.net", + "homepage": "https://github.com/thelia-modules" + } + ], + "require": { + "thelia/installer": "~1.0" + }, + "extra": { + "installer-name": "Paypal" + } +} diff --git a/local/modules/Paypal/images/logo.png b/local/modules/Paypal/images/logo.png new file mode 100644 index 00000000..1fe1879f Binary files /dev/null and b/local/modules/Paypal/images/logo.png differ diff --git a/local/modules/Paypal/templates/backOffice/default/paypal/module-configuration.html b/local/modules/Paypal/templates/backOffice/default/paypal/module-configuration.html new file mode 100644 index 00000000..a6811b1a --- /dev/null +++ b/local/modules/Paypal/templates/backOffice/default/paypal/module-configuration.html @@ -0,0 +1,120 @@ +
+
+
+
+ {intl d='paypal.bo.default' l="Paypal Configuration"} +
+
+ +
+
+
+ {form name="paypal.form.configure"} + + {form_hidden_fields form=$form} + + {include file = "includes/inner-form-toolbar.html" + hide_flags = true + page_url = "{url path='/admin/module/Paypal'}" + close_url = "{url path='/admin/modules'}" + } + + {if $form_error} +
+
+
{$form_error_message}
+
+
+ {/if} + +
+
+

{intl d='paypal.bo.default' l="Paypal Production parameters"}

+ + {render_form_field form=$form field="login" value=$login} + {render_form_field form=$form field="password" value=$password} + {render_form_field form=$form field="signature" value=$signature} +
+ +
+

{intl d='paypal.bo.default' l="Paypal Sandbox parameters"}

+ + {custom_render_form_field form=$form field="sandbox"} + + {$label} + {/custom_render_form_field} + + {render_form_field form=$form field="sandbox_login" value=$sandbox_login} + {render_form_field form=$form field="sandbox_password" value=$sandbox_password} + {render_form_field form=$form field="sandbox_signature" value=$sandbox_signature} + + {render_form_field form=$form field="allowed_ip_list" value=$allowed_ip_list} +
+ +
+

{intl d='paypal.bo.default' l="Payment configuration"}

+ + {custom_render_form_field form=$form field="send_confirmation_message_only_if_paid"} + + {$label} + {/custom_render_form_field} + + {custom_render_form_field form=$form field="send_payment_confirmation_message"} + + {$label} + {/custom_render_form_field} + +
+ + {intl d='paypal.bo.default' l='You can edit the payment confirmation email sent to the customer after a successful payment.' url={url path="/admin/configuration/messages"}} +
+ + {custom_render_form_field form=$form field="minimum_amount"} +
+ + {currency attr='symbol'} +
+ {/custom_render_form_field} + + {custom_render_form_field form=$form field="maximum_amount"} +
+ + {currency attr='symbol'} +
+ {/custom_render_form_field} + + {render_form_field form=$form field="cart_item_count" value=$cart_item_count} + + {custom_render_form_field form=$form field="send_cart_detail"} + + {$label} + {/custom_render_form_field} +
+
+ + {/form} +
+
+ +
+
+

+ + {intl d='paypal.bo.default' l="Paypal responses history"} +

+
+
+
+ {$trace_content nofilter} +
+
+ +
+
+
+
\ No newline at end of file diff --git a/local/modules/Paypal/templates/email/default/paypal-payment-confirmation.html b/local/modules/Paypal/templates/email/default/paypal-payment-confirmation.html new file mode 100644 index 00000000..26b217d1 --- /dev/null +++ b/local/modules/Paypal/templates/email/default/paypal-payment-confirmation.html @@ -0,0 +1,23 @@ +{extends file="email-layout.tpl"} + +{* Do not provide a "Open in browser" link *} +{block name="browser"}{/block} +{* No pre-header *} +{block name="pre-header"}{/block} + +{* Subject *} +{block name="email-subject"}{intl d='paypal.email.default' l="Payment of your order %ref" ref={$order_ref}}{/block} + +{* Title *} +{block name="email-title"}{intl d='paypal.email.default' l="The payment of your order %ref is confirmed" ref={$order_ref}}{/block} + +{* Content *} +{block name="email-content"} +

+ + {intl d='paypal.email.default' l="View this order in your account at %shop_name" shop_name={config key="store_name"}} + +

+

{intl d='paypal.email.default' l='Thank you again for your purchase.'}

+

{intl d='paypal.email.default' l='The %store_name team.' store_name={config key="store_name"}}

+{/block} diff --git a/local/modules/Paypal/templates/email/default/paypal-payment-confirmation.txt b/local/modules/Paypal/templates/email/default/paypal-payment-confirmation.txt new file mode 100644 index 00000000..0a02339d --- /dev/null +++ b/local/modules/Paypal/templates/email/default/paypal-payment-confirmation.txt @@ -0,0 +1,9 @@ +{intl d='paypal.email.default' l='Dear customer'}, +
+{intl d='paypal.email.default' l='This is a confirmation of the payment of your order %ref via Paypal on our shop.' ref=$order_ref} +
+{intl d='paypal.email.default' l='Your invoice is now available in your customer account at %url.'} url={config key="url_site"}} +
+{intl d='paypal.email.default' l='Thank you again for your purchase.'} +
+{intl d='paypal.email.default' l='The %store_name team.' store_name={config key="store_name"}} diff --git a/local/modules/Sitemap/Config/config.xml b/local/modules/Sitemap/Config/config.xml new file mode 100644 index 00000000..e68c0af1 --- /dev/null +++ b/local/modules/Sitemap/Config/config.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + +
+ + + diff --git a/local/modules/Sitemap/Config/module.xml b/local/modules/Sitemap/Config/module.xml new file mode 100644 index 00000000..ef10d201 --- /dev/null +++ b/local/modules/Sitemap/Config/module.xml @@ -0,0 +1,26 @@ + + + Sitemap\Sitemap + + Create sitemap and sitemap image files more quickly + + + Génère les fichiers sitemap et sitemap image plus rapidement + + + en_US + fr_FR + + 1.3.2 + + + Etienne Perriere + eperriere@openstudio.fr + + + classic + 2.1.0 + beta + diff --git a/local/modules/Sitemap/Config/routing.xml b/local/modules/Sitemap/Config/routing.xml new file mode 100644 index 00000000..d12b4a48 --- /dev/null +++ b/local/modules/Sitemap/Config/routing.xml @@ -0,0 +1,23 @@ + + + + + + Sitemap\Controller\SitemapController::generateAction + + + + Sitemap\Controller\SitemapController::generateImageAction + + + + Sitemap:SitemapConfig:default + + + + Sitemap:SitemapConfig:save + + + diff --git a/local/modules/Sitemap/Controller/CategorySitemapTrait.php b/local/modules/Sitemap/Controller/CategorySitemapTrait.php new file mode 100644 index 00000000..6ac26eb9 --- /dev/null +++ b/local/modules/Sitemap/Controller/CategorySitemapTrait.php @@ -0,0 +1,82 @@ + + */ +trait CategorySitemapTrait +{ + /** + * Get categories + * + * @param $sitemap + * @param $locale + * @throws \Propel\Runtime\Exception\PropelException + */ + protected function setSitemapCategories(&$sitemap, $locale) + { + // Prepare query - get categories URL + $query = RewritingUrlQuery::create() + ->filterByView('category') + ->filterByRedirected(null) + ->filterByViewLocale($locale); + + // Join with visible categories + self::addJoinCategory($query, $locale); + + // Get categories last update + $query->withColumn(CategoryTableMap::UPDATED_AT, 'CATEGORY_UPDATE_AT'); + + // Execute query + $results = $query->find(); + + // For each result, hydrate XML file + /** @var RewritingUrl $result */ + foreach ($results as $result) { + + // Open new sitemap line & set category URL & update date + $sitemap[] = ' + + '.URL::getInstance()->absoluteUrl($result->getUrl()).' + '.date('c', strtotime($result->getVirtualColumn('CATEGORY_UPDATE_AT'))).' + '; + } + } + + /** + * Join categories and their URLs + * + * @param Criteria $query + */ + protected function addJoinCategory(Criteria &$query) + { + // Join RewritingURL with Category to have only visible categories + $join = new Join(); + + $join->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + CategoryTableMap::TABLE_NAME, + 'ID', + null + ); + + $join->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($join, 'categoryJoin'); + + // Get only visible categories + $query->addJoinCondition('categoryJoin', CategoryTableMap::VISIBLE, 1, Criteria::EQUAL, \PDO::PARAM_INT); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Controller/ContentSitemapTrait.php b/local/modules/Sitemap/Controller/ContentSitemapTrait.php new file mode 100644 index 00000000..0a74f4a8 --- /dev/null +++ b/local/modules/Sitemap/Controller/ContentSitemapTrait.php @@ -0,0 +1,83 @@ + + */ +trait ContentSitemapTrait +{ + /** + * Get contents + * + * @param $sitemap + * @param $locale + * @throws \Propel\Runtime\Exception\PropelException + */ + protected function setSitemapContents(&$sitemap, $locale) + { + // Prepare query - get contents URL + $query = RewritingUrlQuery::create() + ->filterByView('content') + ->filterByRedirected(null) + ->filterByViewLocale($locale); + + // Join with visible contents + self::addJoinContent($query); + + // Get contents last update + $query->withColumn(ContentTableMap::UPDATED_AT, 'CONTENT_UPDATE_AT'); + + // Execute query + $results = $query->find(); + + // For each result, hydrate XML file + /** @var RewritingUrl $result */ + foreach ($results as $result) { + + // Open new sitemap line & set content URL & update date + $sitemap[] = ' + + '.URL::getInstance()->absoluteUrl($result->getUrl()).' + '.date('c', strtotime($result->getVirtualColumn('CONTENT_UPDATE_AT'))).' + '; + } + } + + /** + * Join contents and their URLs + * + * @param Criteria $query + */ + protected function addJoinContent(Criteria &$query) + { + // Join RewritingURL with Content to have only visible contents + $join = new Join(); + + $join->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + ContentTableMap::TABLE_NAME, + 'ID', + null + ); + + $join->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($join, 'contentJoin'); + + // Get only visible products + $query->addJoinCondition('contentJoin', ContentTableMap::VISIBLE, 1, Criteria::EQUAL, \PDO::PARAM_INT); + } + +} \ No newline at end of file diff --git a/local/modules/Sitemap/Controller/FolderSitemapTrait.php b/local/modules/Sitemap/Controller/FolderSitemapTrait.php new file mode 100644 index 00000000..78ba2807 --- /dev/null +++ b/local/modules/Sitemap/Controller/FolderSitemapTrait.php @@ -0,0 +1,82 @@ + + */ +trait FolderSitemapTrait +{ + /** + * Get folders + * + * @param $sitemap + * @param $locale + * @throws \Propel\Runtime\Exception\PropelException + */ + protected function setSitemapFolders(&$sitemap, $locale) + { + // Prepare query - get folders URL + $query = RewritingUrlQuery::create() + ->filterByView('folder') + ->filterByRedirected(null) + ->filterByViewLocale($locale); + + // Join with visible folders + self::addJoinFolder($query); + + // Get folders last update + $query->withColumn(FolderTableMap::UPDATED_AT, 'FOLDER_UPDATE_AT'); + + // Execute query + $results = $query->find(); + + // For each result, hydrate XML file + /** @var RewritingUrl $result */ + foreach ($results as $result) { + + // Open new sitemap line & set folder URL & update date + $sitemap[] = ' + + '.URL::getInstance()->absoluteUrl($result->getUrl()).' + '.date('c', strtotime($result->getVirtualColumn('FOLDER_UPDATE_AT'))).' + '; + } + } + + /** + * Join folders and their URLs + * + * @param Criteria $query + */ + protected function addJoinFolder(Criteria &$query) + { + // Join RewritingURL with Folder to have only visible folders + $join = new Join(); + + $join->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + FolderTableMap::TABLE_NAME, + 'ID', + null + ); + + $join->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($join, 'folderJoin'); + + // Get only visible folders + $query->addJoinCondition('folderJoin', FolderTableMap::VISIBLE, 1, Criteria::EQUAL, \PDO::PARAM_INT); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Controller/ProductImageTrait.php b/local/modules/Sitemap/Controller/ProductImageTrait.php new file mode 100644 index 00000000..ec00a32c --- /dev/null +++ b/local/modules/Sitemap/Controller/ProductImageTrait.php @@ -0,0 +1,129 @@ + + */ +trait ProductImageTrait +{ + protected function setSitemapProductImages(&$sitemap, $locale) + { + // Change timeout for this script + ini_set('max_execution_time', Sitemap::getConfigValue('timeout', 30)); + + // Prepare query - get products URL + $query = RewritingUrlQuery::create() + ->filterByView('product') + ->filterByRedirected(null) + ->filterByViewLocale($locale); + + // Join with visible products + self::addJoinProductI18n($query); + + // Get products title & image file name + $query->withColumn(ProductI18nTableMap::TITLE, 'PRODUCT_TITLE'); + $query->addDescendingOrderByColumn(ProductImageTableMap::POSITION); + $query->addGroupByColumn(RewritingUrlTableMap::VIEW_ID); + $query->withColumn(ProductImageTableMap::FILE, 'PRODUCT_FILE'); + + // Execute query + $results = $query->find(); + + // Get image generation configuration values + $configValues = []; + $configValues['width'] = Sitemap::getConfigValue('width'); + $configValues['height'] = Sitemap::getConfigValue('height'); + $configValues['quality'] = Sitemap::getConfigValue('quality', 75); + $configValues['rotation'] = Sitemap::getConfigValue('rotation', 0); + $configValues['resizeMode'] = Sitemap::getConfigValue('resize_mode', \Thelia\Action\Image::EXACT_RATIO_WITH_BORDERS); + $configValues['bgColor'] = Sitemap::getConfigValue('background_color'); + $configValues['allowZoom'] = Sitemap::getConfigValue('allow_zoom', false); + + // For each result, hydrate XML file + /** @var RewritingUrl $result */ + foreach ($results as $result) { + + // Generate image data + $this->generateSitemapImage('product', $result, $configValues, $sitemap); + } + } + + /** + * Join products and their URLs + * + * @param Criteria $query + */ + protected function addJoinProductI18n(Criteria &$query) + { + // Join RewritingURL with Product to have only visible products + $join = new Join(); + + $join->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + ProductTableMap::TABLE_NAME, + 'ID', + null + ); + + $join->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($join, 'productJoin'); + + $query->addJoinCondition('productJoin', ProductTableMap::VISIBLE, 1, Criteria::EQUAL, \PDO::PARAM_INT); + + // Join RewritingURL with ProductI18n to have product title for it's image + $joinI18n = new Join(); + + $joinI18n->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + ProductI18nTableMap::TABLE_NAME, + 'ID', + null + ); + $joinI18n->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_LOCALE', + null, + ProductI18nTableMap::TABLE_NAME, + 'LOCALE', + null + ); + + $joinI18n->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($joinI18n); + + + // Join RewritingURL with ProductImage to have image file + $joinImage = new Join(); + + $joinImage->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + ProductImageTableMap::TABLE_NAME, + 'PRODUCT_ID', + null + ); + + $joinImage->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($joinImage, 'productImageJoin'); + + $query->addJoinCondition('productImageJoin', ProductImageTableMap::VISIBLE, 1, Criteria::EQUAL, \PDO::PARAM_INT); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Controller/ProductSitemapTrait.php b/local/modules/Sitemap/Controller/ProductSitemapTrait.php new file mode 100644 index 00000000..ef49edec --- /dev/null +++ b/local/modules/Sitemap/Controller/ProductSitemapTrait.php @@ -0,0 +1,82 @@ + + */ +trait ProductSitemapTrait +{ + /** + * Get products + * + * @param $sitemap + * @param $locale + * @throws \Propel\Runtime\Exception\PropelException + */ + protected function setSitemapProducts(&$sitemap, $locale) + { + // Prepare query - get products URL + $query = RewritingUrlQuery::create() + ->filterByView('product') + ->filterByRedirected(null) + ->filterByViewLocale($locale); + + // Join with visible products + self::addJoinProduct($query); + + // Get products last update + $query->withColumn(ProductTableMap::UPDATED_AT, 'PRODUCT_UPDATE_AT'); + + // Execute query + $results = $query->find(); + + // For each result, hydrate XML file + /** @var RewritingUrl $result */ + foreach ($results as $result) { + + // Open new sitemap line & set product URL & update date + $sitemap[] = ' + + '.URL::getInstance()->absoluteUrl($result->getUrl()).' + '.date('c', strtotime($result->getVirtualColumn('PRODUCT_UPDATE_AT'))).' + '; + } + } + + /** + * Join products and their URLs + * + * @param Criteria $query + */ + protected function addJoinProduct(Criteria &$query) + { + // Join RewritingURL with Product to have only visible products + $join = new Join(); + + $join->addExplicitCondition( + RewritingUrlTableMap::TABLE_NAME, + 'VIEW_ID', + null, + ProductTableMap::TABLE_NAME, + 'ID', + null + ); + + $join->setJoinType(Criteria::INNER_JOIN); + $query->addJoinObject($join, 'productJoin'); + + // Get only visible products + $query->addJoinCondition('productJoin', ProductTableMap::VISIBLE, 1, Criteria::EQUAL, \PDO::PARAM_INT); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Controller/SitemapConfigController.php b/local/modules/Sitemap/Controller/SitemapConfigController.php new file mode 100644 index 00000000..1c4d36e3 --- /dev/null +++ b/local/modules/Sitemap/Controller/SitemapConfigController.php @@ -0,0 +1,137 @@ + + */ +class SitemapConfigController extends BaseAdminController +{ + public function defaultAction() + { + if (null !== $response = $this->checkAuth([AdminResources::MODULE], ["sitemap"], AccessManager::VIEW)) { + return $response; + } + + // Get resize mode name + switch (Sitemap::getConfigValue('resize_mode')) { + case 1: + $resizeMode = 'borders'; + break; + + case 2: + $resizeMode = 'crop'; + break; + + case 3: + $resizeMode = 'none'; + break; + + default: + $resizeMode = ''; + break; + } + + // Build form + $form = $this->createForm( + "sitemap_config_form", + 'form', + [ + 'timeout' => Sitemap::getConfigValue('timeout'), + 'width' => Sitemap::getConfigValue('width'), + 'height' => Sitemap::getConfigValue('height'), + 'quality' => Sitemap::getConfigValue('quality'), + 'rotation' => Sitemap::getConfigValue('rotation'), + 'resize_mode' => $resizeMode, + 'background_color' => Sitemap::getConfigValue('background_color'), + 'allow_zoom' => Sitemap::getConfigValue('allow_zoom') + ] + ); + + $this->getParserContext()->addForm($form); + + return $this->render("sitemap-configuration"); + } + + /** + * Save data + * + * @return mixed|\Thelia\Core\HttpFoundation\Response + */ + public function saveAction() + { + if (null !== $response = $this->checkAuth([AdminResources::MODULE], ["sitemap"], AccessManager::UPDATE)) { + return $response; + } + + $baseForm = $this->createForm("sitemap_config_form"); + + $errorMessage = null; + + // Get current edition language locale + $locale = $this->getCurrentEditionLocale(); + + try { + $form = $this->validateForm($baseForm); + $data = $form->getData(); + + // Get resize mode + switch ($data["resize_mode"]) { + case 'none': + $resizeMode = \Thelia\Action\Image::KEEP_IMAGE_RATIO; + break; + + case 'crop': + $resizeMode = \Thelia\Action\Image::EXACT_RATIO_WITH_CROP; + break; + + case 'borders': + default: + $resizeMode = \Thelia\Action\Image::EXACT_RATIO_WITH_BORDERS; + break; + } + + // Save data + Sitemap::setConfigValue('timeout', $data['timeout']); + Sitemap::setConfigValue('width', $data['width']); + Sitemap::setConfigValue('height', $data['height']); + Sitemap::setConfigValue('quality', $data['quality']); + Sitemap::setConfigValue('rotation', $data['rotation']); + Sitemap::setConfigValue('resize_mode', $resizeMode); + Sitemap::setConfigValue('background_color', $data['background_color']); + Sitemap::setConfigValue('allow_zoom', $data['allow_zoom']); + + } catch (FormValidationException $ex) { + // Invalid data entered + $errorMessage = $this->createStandardFormValidationErrorMessage($ex); + } catch (\Exception $ex) { + // Any other error + $errorMessage = $this->getTranslator()->trans('Sorry, an error occurred: %err', ['%err' => $ex->getMessage()], Sitemap::DOMAIN_NAME, $locale); + } + + if (null !== $errorMessage) { + // Mark the form as with error + $baseForm->setErrorMessage($errorMessage); + + // Send the form and the error to the parser + $this->getParserContext() + ->addForm($baseForm) + ->setGeneralError($errorMessage) + ; + } else { + $this->getParserContext() + ->set("success", true) + ; + } + + return $this->defaultAction(); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Controller/SitemapController.php b/local/modules/Sitemap/Controller/SitemapController.php new file mode 100644 index 00000000..79683a27 --- /dev/null +++ b/local/modules/Sitemap/Controller/SitemapController.php @@ -0,0 +1,270 @@ + + */ +class SitemapController extends BaseFrontController +{ + use CategorySitemapTrait; + use ProductSitemapTrait; + use FolderSitemapTrait; + use ContentSitemapTrait; + + use ProductImageTrait; + + /** Folder name for sitemap cache */ + const SITEMAP_CACHE_DIR = "sitemap"; + + /** Key prefix for sitemap cache */ + const SITEMAP_CACHE_KEY = "sitemap"; + + /** Folder name for sitemap image cache */ + const SITEMAP_IMAGE_CACHE_DIR = "sitemap-image"; + + /** Key prefix for sitemap image cache */ + const SITEMAP_IMAGE_CACHE_KEY = "sitemap-image"; + + protected $useFallbackTemplate = true; + + /** + * Generate sitemap + */ + public function generateAction() + { + return $this->generateSitemap(self::SITEMAP_CACHE_KEY, self::SITEMAP_CACHE_DIR); + } + + /** + * Generate sitemap image + */ + public function generateImageAction() + { + return $this->generateSitemap(self::SITEMAP_IMAGE_CACHE_KEY, self::SITEMAP_IMAGE_CACHE_DIR); + } + + /** + * Check if cached sitemap can be used or generate a new one and cache it + * + * @param $cacheKey + * @param $cacheDirName + * @return Response + */ + public function generateSitemap($cacheKey, $cacheDirName) + { + // Get and check locale + $locale = $this->getSession()->getLang()->getLocale(); + + if ("" !== $locale) { + if (! $this->checkLang($locale)){ + $this->pageNotFound(); + } + } + + // Get sitemap cache information + $sitemapContent = false; + $cacheDir = $this->getCacheDir($cacheDirName); + $cacheKey .= $locale; + $cacheExpire = intval(ConfigQuery::read("sitemap_ttl", '7200')) ?: 7200; + $cacheDriver = new FilesystemCache($cacheDir); + + // Check if sitemap has to be deleted + if (!($this->checkAdmin() && "" !== $this->getRequest()->query->get("flush", ""))){ + // Get cached sitemap + $sitemapContent = $cacheDriver->fetch($cacheKey); + } else { + $cacheDriver->delete($cacheKey); + } + + // If not in cache, generate and cache it + if (false === $sitemapContent){ + + // Check if we generate the standard sitemap or the sitemap image + switch ($cacheDirName) { + // Image + case self::SITEMAP_IMAGE_CACHE_DIR: + $sitemap = $this->hydrateSitemapImage($locale); + break; + + // Standard + case self::SITEMAP_CACHE_DIR: + default: + $sitemap = $this->hydrateSitemap($locale); + break; + } + + $sitemapContent = implode("\n", $sitemap); + + // Save cache + $cacheDriver->save($cacheKey, $sitemapContent, $cacheExpire); + } + + // Render + $response = new Response(); + $response->setContent($sitemapContent); + $response->headers->set('Content-Type', 'application/xml'); + + return $response; + } + + /* ------------------ */ + + /** + * Build sitemap array + * + * @param $locale + * @return array + */ + protected function hydrateSitemap($locale) + { + // Begin sitemap + $sitemap = [' + + + + '.URL::getInstance()->getIndexPage().' + ' + ]; + + // Hydrate sitemap + $this->setSitemapCategories($sitemap, $locale); + $this->setSitemapProducts($sitemap, $locale); + $this->setSitemapFolders($sitemap, $locale); + $this->setSitemapContents($sitemap, $locale); + + // End sitemap + $sitemap[] = "\t".''; + + return $sitemap; + } + + /** + * Build sitemap image array + * + * @param $locale + * @return array + */ + protected function hydrateSitemapImage($locale) + { + // Begin sitemap image + $sitemap = [' + + + + '.URL::getInstance()->getIndexPage().' + ' + ]; + + // Hydrate sitemap image + $this->setSitemapProductImages($sitemap, $locale); + + // End sitemap image + $sitemap[] = "\t".''; + + return $sitemap; + } + + /* ------------------ */ + + /** + * @param $type + * @param RewritingUrl $result + * @param $configValues + * @param $sitemap + */ + protected function generateSitemapImage($type, $result, $configValues, &$sitemap) + { + $event = new ImageEvent(); + + $event + ->setWidth($configValues['width']) + ->setHeight($configValues['height']) + ->setQuality($configValues['quality']) + ->setRotation($configValues['rotation']) + ->setResizeMode($configValues['resizeMode']) + ->setBackgroundColor($configValues['bgColor']) + ->setAllowZoom($configValues['allowZoom']); + + // Put source image file path + $source_filepath = sprintf("%s%s/%s/%s", + THELIA_ROOT, + ConfigQuery::read('images_library_path', 'local/media/images'), + $type, + $result->getVirtualColumn('PRODUCT_FILE') + ); + + $event->setSourceFilepath($source_filepath); + $event->setCacheSubdirectory($type); + + try { + // Dispatch image processing event + $this->dispatch(TheliaEvents::IMAGE_PROCESS, $event); + + // New sitemap image entry + $sitemap[] = ' + + '.URL::getInstance()->absoluteUrl($result->getUrl()).' + + '.$event->getFileUrl().' + '.htmlspecialchars($result->getVirtualColumn('PRODUCT_TITLE')).' + + '; + + } catch (\Exception $ex) { + } + } + + /* ------------------ */ + + /** + * @param $locale + * @return bool true if the language is used, otherwise false + */ + protected function checkLang($locale) + { + // Load locales + $locale = LangQuery::create() + ->findOneByLocale($locale); + + return (null !== $locale); + } + + /** + * Get the cache directory for sitemap + * + * @param $cacheDirName + * @return mixed|string + */ + protected function getCacheDir($cacheDirName) + { + $cacheDir = $this->container->getParameter("kernel.cache_dir"); + $cacheDir = rtrim($cacheDir, '/'); + $cacheDir .= '/' . $cacheDirName . '/'; + + return $cacheDir; + } + + /** + * Check if current user has ADMIN role + * + * @return bool + */ + protected function checkAdmin(){ + return $this->getSecurityContext()->hasAdminUser(); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Form/SitemapConfigForm.php b/local/modules/Sitemap/Form/SitemapConfigForm.php new file mode 100644 index 00000000..07b317fa --- /dev/null +++ b/local/modules/Sitemap/Form/SitemapConfigForm.php @@ -0,0 +1,67 @@ + + */ +class SitemapConfigForm extends BaseForm +{ + public function getName() + { + return 'sitemap_config_form'; + } + + /** + * @return null + */ + protected function buildForm() + { + $this->formBuilder + ->add( + 'timeout', + 'number', + ['label' => $this->translator->trans('Script timeout (in seconds) for images generation (default: 30)', [], 'sitemap')] + ) + ->add( + 'width', + 'text', + ['label' => $this->translator->trans('Image width', [], 'sitemap')] + ) + ->add( + 'height', + 'text', + ['label' => $this->translator->trans('Image height', [], 'sitemap')] + ) + ->add( + 'quality', + 'text', + ['label' => $this->translator->trans('Image quality', [], 'sitemap')] + ) + ->add( + 'rotation', + 'text', + ['label' => $this->translator->trans('Image rotation', [], 'sitemap')] + ) + ->add( + 'resize_mode', + 'text', + ['label' => $this->translator->trans('Image resize mode ([borders] / crop / none)', [], 'sitemap')] + ) + ->add( + 'background_color', + 'text', + ['label' => $this->translator->trans('Image background color', [], 'sitemap')] + ) + ->add( + 'allow_zoom', + 'text', + ['label' => $this->translator->trans('Allow image zoom ([false] / true)', [], 'sitemap')] + ) + ; + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/Hook/SitemapHook.php b/local/modules/Sitemap/Hook/SitemapHook.php new file mode 100644 index 00000000..33287c8c --- /dev/null +++ b/local/modules/Sitemap/Hook/SitemapHook.php @@ -0,0 +1,19 @@ + + */ +class SitemapHook extends BaseHook +{ + public function onModuleConfig(HookRenderEvent $event) + { + $event->add($this->render('sitemap-configuration.html')); + } +} \ No newline at end of file diff --git a/local/modules/Sitemap/I18n/backOffice/default/en_US.php b/local/modules/Sitemap/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..52c58c3c --- /dev/null +++ b/local/modules/Sitemap/I18n/backOffice/default/en_US.php @@ -0,0 +1,12 @@ +Warning! Only fill this input with a greater value than 30 if you have so many images that the sitemap-image can\'t be generated because of timeout.' => 'Warning! Only fill this input with a greater value than 30 if you have so many images that the sitemap-image can\'t be generated because of timeout.', + 'Configuration correctly saved' => 'Configuration correctly saved', + 'Configure sitemap images' => 'Configure sitemap images', + 'Depending on your server, this may have no effect.' => 'Depending on your server, this may have no effect.', + 'Home' => 'Home', + 'Modules' => 'Modules', + 'Set the same information as in your product image loop' => 'Set the same information as in your product image loop', + 'Sitemap images configuration' => 'Sitemap images configuration', +); diff --git a/local/modules/Sitemap/I18n/backOffice/default/fr_FR.php b/local/modules/Sitemap/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..d19ada6b --- /dev/null +++ b/local/modules/Sitemap/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,12 @@ +Warning! Only fill this input with a greater value than 30 if you have so many images that the sitemap-image can\'t be generated because of timeout.' => 'Attention ! Ne remplissez ce champ avec une valeur plus grande que 30 que si vous avez beaucoup d\'images et que le sitemap-image n\'arrive pas à se générer.', + 'Configuration correctly saved' => 'Configuration sauvegardée avec succès', + 'Configure sitemap images' => 'Configurer les images du sitemap', + 'Depending on your server, this may have no effect.' => 'En fonction de votre serveur, cela pourrait n\'avoir aucun effet.', + 'Home' => 'Accueil', + 'Modules' => 'Modules', + 'Set the same information as in your product image loop' => 'Entrez les mêmes informations que dans la boucle image des produits', + 'Sitemap images configuration' => 'Configuration des images du module Sitemap', +); diff --git a/local/modules/Sitemap/I18n/en_US.php b/local/modules/Sitemap/I18n/en_US.php new file mode 100644 index 00000000..ab45081e --- /dev/null +++ b/local/modules/Sitemap/I18n/en_US.php @@ -0,0 +1,13 @@ + 'Allow image zoom ([false] / true)', + 'Image background color' => 'Image background color', + 'Image height' => 'Image height', + 'Image quality' => 'Image quality', + 'Image resize mode ([borders] / crop / none)' => 'Image resize mode ([borders] / crop / none)', + 'Image rotation' => 'Image rotation', + 'Image width' => 'Image width', + 'Script timeout (in seconds) for images generation (default: 30)' => 'Script timeout (in seconds) for images generation (default: 30)', + 'Sorry, an error occurred: %err' => 'Sorry, an error occurred: %err', +); diff --git a/local/modules/Sitemap/I18n/fr_FR.php b/local/modules/Sitemap/I18n/fr_FR.php new file mode 100644 index 00000000..d7ac9542 --- /dev/null +++ b/local/modules/Sitemap/I18n/fr_FR.php @@ -0,0 +1,13 @@ + 'Autoriser le zoom des images ([false] / true)', + 'Image background color' => 'Couleur de fond des images', + 'Image height' => 'Hauteur des images', + 'Image quality' => 'Qualité des images', + 'Image resize mode ([borders] / crop / none)' => 'Mode de redimensionnement des images ([borders] / crop / none)', + 'Image rotation' => 'Rotation des images', + 'Image width' => 'Largeur des images', + 'Script timeout (in seconds) for images generation (default: 30)' => 'Temps maximum d\'exécution (en secondes) pour la génération des images (par défaut : 30)', + 'Sorry, an error occurred: %err' => 'Désolé, une erreur s\'est produite : %err', +); diff --git a/local/modules/Sitemap/Readme.md b/local/modules/Sitemap/Readme.md new file mode 100644 index 00000000..dba3996d --- /dev/null +++ b/local/modules/Sitemap/Readme.md @@ -0,0 +1,30 @@ +# Sitemap + +Generate sitemaps faster than Thelia default ones. + +## Installation + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is Sitemap. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/sitemap-module:~1.3 +``` + +## Usage + +Configure the module with the same information as in you product image loop. + +If you have a lot of products with images, change the timeout in the configuration. **However, be aware** that it may not work depending on your server. + +The sitemap will be filled with all your categories, products, folders and contents URLs, depending on the language. + +The sitemap-image will be filled with all your product images (1 by product) URLs, depending on the language. + +The module will be used to generate sitemap when going on http://yourSite.com/sitemap and the sitemap-image on http://yourSite.com/sitemap-image. \ No newline at end of file diff --git a/local/modules/Sitemap/Sitemap.php b/local/modules/Sitemap/Sitemap.php new file mode 100644 index 00000000..b6eb247c --- /dev/null +++ b/local/modules/Sitemap/Sitemap.php @@ -0,0 +1,21 @@ + + + + +
+ +
+ {intl l="Configure sitemap images" d="sitemap.bo.default"} +
+ +
+
+ {if $success} +
+ {intl l="Configuration correctly saved" d="sitemap.bo.default"} +
+ {/if} + + {form name='sitemap_config_form'} + + + {form_hidden_fields form=$form} + + {include "includes/inner-form-toolbar.html" hide_flags=true close_url={url path='/admin/modules'}} + +

{intl l="Set the same information as in your product image loop" d="sitemap.bo.default"}.

+ + {form_field form=$form field="timeout"} +
+ + +

{intl l='Warning! Only fill this input with a greater value than 30 if you have so many images that the sitemap-image can\'t be generated because of timeout.' d='sitemap.bo.default'}

+

{intl l='Depending on your server, this may have no effect.' d="sitemap.bo.default"}

+ +
+ {/form_field} + + {form_field form=$form field="width"} +
+ + + +
+ {/form_field} + + {form_field form=$form field="height"} +
+ + + +
+ {/form_field} + + {form_field form=$form field="quality"} +
+ + + +
+ {/form_field} + + {form_field form=$form field="rotation"} +
+ + + +
+ {/form_field} + + {form_field form=$form field="resize_mode"} +
+ + + +
+ {/form_field} + + {form_field form=$form field="background_color"} +
+ + + +
+ {/form_field} + + {form_field form=$form field="allow_zoom"} +
+ + + +
+ {/form_field} + + + {/form} +
+
+ +
+
+{/block} \ No newline at end of file diff --git a/local/modules/Slide/Config/config.xml b/local/modules/Slide/Config/config.xml new file mode 100644 index 00000000..eab37b70 --- /dev/null +++ b/local/modules/Slide/Config/config.xml @@ -0,0 +1,66 @@ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/Slide/Config/module.xml b/local/modules/Slide/Config/module.xml new file mode 100644 index 00000000..6b6abd31 --- /dev/null +++ b/local/modules/Slide/Config/module.xml @@ -0,0 +1,24 @@ + + + Slide\Slide + + Slide + + + Slide + + + en_US + fr_FR + + 0.1 + + Julien + jchanseaume@openstudio.fr + + classic + 2.1.0 + alpha + diff --git a/local/modules/Slide/Config/routing.xml b/local/modules/Slide/Config/routing.xml new file mode 100644 index 00000000..62c88977 --- /dev/null +++ b/local/modules/Slide/Config/routing.xml @@ -0,0 +1,36 @@ + + + + + + + Slide\Controller\BackController::defaultAction + + + + Slide\Controller\BackController::createAction + + + + Slide\Controller\BackController::updateAction + \d+ + + + + Slide\Controller\BackController::processUpdateAction + \d+ + + + + Slide\Controller\BackController::deleteAction + + + + Slide\Controller\BackController::savePositionAction + .* + \d+ + + + diff --git a/local/modules/Slide/Config/schema.xml b/local/modules/Slide/Config/schema.xml new file mode 100644 index 00000000..87f29d2e --- /dev/null +++ b/local/modules/Slide/Config/schema.xml @@ -0,0 +1,26 @@ + + + + + + + +
+ + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/local/modules/Slide/Config/sqldb.map b/local/modules/Slide/Config/sqldb.map new file mode 100644 index 00000000..63a93baa --- /dev/null +++ b/local/modules/Slide/Config/sqldb.map @@ -0,0 +1,2 @@ +# Sqlfile -> Database map +thelia.sql=thelia diff --git a/local/modules/Slide/Config/thelia.sql b/local/modules/Slide/Config/thelia.sql new file mode 100644 index 00000000..2e3cb472 --- /dev/null +++ b/local/modules/Slide/Config/thelia.sql @@ -0,0 +1,42 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- slide_item +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `slide_item`; + +CREATE TABLE `slide_item` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `title` VARCHAR(255), + `content` TEXT, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- slide_rel +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `slide_rel`; + +CREATE TABLE `slide_rel` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `position` INTEGER DEFAULT 1 NOT NULL, + `slide_id` INTEGER NOT NULL, + `ref` VARCHAR(255) NOT NULL, + `ref_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `FI_de_rel_slide_id` (`slide_id`), + CONSTRAINT `slide_rel_slide_id` + FOREIGN KEY (`slide_id`) + REFERENCES `slide_item` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/Slide/Controller/BackController.php b/local/modules/Slide/Controller/BackController.php new file mode 100644 index 00000000..4c15a37d --- /dev/null +++ b/local/modules/Slide/Controller/BackController.php @@ -0,0 +1,290 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Slide\Controller; + +use Slide\EventListeners\SlideCreateEvent; +use Slide\Model\SlideRel; +use Slide\Model\SlideRelQuery; +use Slide\Slide; +use Slide\EventListeners\SlideDeleteEvent; +use Slide\EventListeners\SlideEvent; +use Slide\EventListeners\SlideEvents; +use Slide\EventListeners\SlideUpdateEvent; +use Slide\Model\SlideItemQuery; +use Thelia\Controller\Admin\AbstractCrudController; +use Thelia\Core\Security\AccessManager; + +/** + * Class BackController + * @package Slide\Controller + * @author Julien Chanséaume + */ +class BackController extends AbstractCrudController +{ + + protected $currentRouter = "router.slide"; + + public function __construct() + { + parent::__construct( + 'slide', + 'created_reverse', + 'order', + null, + SlideEvents::SLIDE_CREATE, + SlideEvents::SLIDE_UPDATE, + SlideEvents::SLIDE_DELETE, + null, // No visibility toggle + null, // no position change + Slide::getModuleCode() + ); + } + + /** + * Return the creation form for this object + */ + protected function getCreationForm() + { + $form = $this->createForm('slide.create.form', 'form'); + + return $form; + } + + /** + * Return the update form for this object + */ + protected function getUpdateForm() + { + $form = $this->createForm('slide.update.form', 'form'); + + return $form; + } + + /** + * Hydrate the update form for this object, before passing it to the update template + * + * @param \Slide\Model\SlideItem $object + */ + protected function hydrateObjectForm($object) + { + // Prepare the data that will hydrate the form + $data = [ + 'id' => $object->getId(), + 'content' => $object->getContent(), + 'title' => $object->getTitle() + ]; + + // Setup the object form + $form = $this->createForm('slide.update.form', 'form', $data); + return $form; + } + + /** + * Creates the creation event with the provided form data + * + * @param unknown $formData + */ + protected function getCreationEvent($formData) + { + $event = $this->bindFormData( + new SlideCreateEvent(), + $formData + ); + + return $event; + } + + /** + * Creates the update event with the provided form data + * + * @param unknown $formData + */ + protected function getUpdateEvent($formData) + { + $event = $this->bindFormData( + new SlideUpdateEvent(), + $formData + ); + + $event->setId($formData['id']); + $event->setContent($formData['content']); + + + return $event; + } + + protected function bindFormData($event, $formData) + { + $event->setTitle($formData['title']); + + return $event; + } + + /** + * Creates the delete event with the provided form data + */ + protected function getDeleteEvent() + { + $event = new SlideDeleteEvent(); + + $event->setId($this->getRequest()->get('slide_id')); + + return $event; + } + + /** + * Return true if the event contains the object, e.g. the action has updated the object in the event. + * + * @param SlideEvent $event + */ + protected function eventContainsObject($event) + { + return null !== $event->getSlide(); + } + + /** + * Get the created object from an event. + * + * @param SlideEvent $event + * + * @return \Slide\Model\Slide + */ + protected function getObjectFromEvent($event) + { + return $event->getSlide(); + } + + /** + * Load an existing object from the database + */ + protected function getExistingObject() + { + + $slide_id = $this->getRequest()->get('slide_id'); + if (null === $slide_id) { + $slide_id = $this->getRequest()->attributes('slide_id'); + } + + return SlideItemQuery::create()->findPk($slide_id); + } + + /** + * Returns the object label form the object event (name, title, etc.) + * + * @param \Slide\Model\SlideItem $object + */ + protected function getObjectLabel($object) + { + $object->getTitle(); + } + + /** + * Returns the object ID from the object + * + * @param \Slide\Model\SlideItem $object + */ + protected function getObjectId($object) + { + return $object->getId(); + } + + /** + * Render the main list template + * + * @param string $currentOrder , if any, null otherwise. + */ + protected function renderListTemplate($currentOrder) + { + return $this->render('slides', ['order' => $currentOrder]); + } + + /** + * Render the edition template + */ + protected function renderEditionTemplate() + { + return $this->render( + 'slide-edit', + [ + 'slide_id' => $this->getRequest()->get('slide_id') + ] + ); + } + + /** + * Must return a RedirectResponse instance + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + protected function redirectToEditionTemplate() + { + return $this->generateRedirectFromRoute( + "admin.slide.slides.update", + [], + ['slide_id' => $this->getRequest()->get('slide_id')] + ); + } + + /** + * Must return a RedirectResponse instance + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + protected function redirectToListTemplate() + { + return $this->generateRedirectFromRoute('admin.slide.slides.default'); + } + + + public function savePositionAction($ref, $ref_id) + { + if (null !== $response = $this->checkAuth($this->resourceCode, $this->getModuleCode(), AccessManager::CREATE)) { + return $response; + } + + $this->checkXmlHttpRequest(); + + $data = $this->getRequest()->request->all(); + $message = [ + "success" => true, + "message" => "ok" + ]; + + SlideRelQuery::create() + ->filterByRef($ref) + ->filterByRefId($ref_id) + ->delete(); + + foreach ($data as $slideId => $position) { + $slide = new SlideRel(); + $slide + ->setRef($ref) + ->setRefId($ref_id) + ->setSlideId($slideId) + ->setPosition($position) + ->save() + ; + } + + return $this->jsonResponse(json_encode($message)); + } +} diff --git a/local/modules/Slide/EventListeners/SlideAction.php b/local/modules/Slide/EventListeners/SlideAction.php new file mode 100644 index 00000000..6ae4cf61 --- /dev/null +++ b/local/modules/Slide/EventListeners/SlideAction.php @@ -0,0 +1,71 @@ + + */ +class SlideAction implements EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + return [ + SlideEvents::SLIDE_CREATE => ["create", 128], + SlideEvents::SLIDE_UPDATE => ["update", 128], + SlideEvents::SLIDE_DELETE => ["delete", 128] + ]; + } + + public function create(SlideCreateEvent $event) + { + $slideItem = new SlideItem(); + $slideItem + ->setTitle($event->getTitle()) + ->save() + ; + + $event->setSlide($slideItem); + } + + public function update(SlideUpdateEvent $event) + { + $slideItem = SlideItemQuery::create()->findPk($event->getId()); + + if (null !== $slideItem) { + $slideItem + ->setTitle($event->getTitle()) + ->setContent($event->getContent()) + ->save() + ; + $event->setSlide($slideItem); + } + } + + public function delete(SlideEvent $event) + { + $slideItem = SlideItemQuery::create()->findPk($event->getId()); + + if (null !== $slideItem) { + $slideItem->delete(); + + $event->setSlide($slideItem); + } + } +} diff --git a/local/modules/Slide/EventListeners/SlideCreateEvent.php b/local/modules/Slide/EventListeners/SlideCreateEvent.php new file mode 100644 index 00000000..9b7648b9 --- /dev/null +++ b/local/modules/Slide/EventListeners/SlideCreateEvent.php @@ -0,0 +1,42 @@ + + */ +class SlideCreateEvent extends SlideEvent +{ + protected $title; + + /** + * @return mixed + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param mixed $title + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } +} diff --git a/local/modules/Slide/EventListeners/SlideDeleteEvent.php b/local/modules/Slide/EventListeners/SlideDeleteEvent.php new file mode 100644 index 00000000..d0553369 --- /dev/null +++ b/local/modules/Slide/EventListeners/SlideDeleteEvent.php @@ -0,0 +1,24 @@ + + */ +class SlideDeleteEvent extends SlideEvent +{ + +} diff --git a/local/modules/Slide/EventListeners/SlideEvent.php b/local/modules/Slide/EventListeners/SlideEvent.php new file mode 100644 index 00000000..fffd4183 --- /dev/null +++ b/local/modules/Slide/EventListeners/SlideEvent.php @@ -0,0 +1,66 @@ + + */ +class SlideEvent extends ActionEvent +{ + protected $id; + + protected $slide; + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @param mixed $id + */ + public function setId($id) + { + $this->id = $id; + + return $this; + } + + /** + * @return mixed + */ + public function getSlide() + { + return $this->slide; + } + + /** + * @param mixed $slide + */ + public function setSlide($slide) + { + $this->slide = $slide; + + return $this; + } + + +} diff --git a/local/modules/Slide/EventListeners/SlideEvents.php b/local/modules/Slide/EventListeners/SlideEvents.php new file mode 100644 index 00000000..bd156a02 --- /dev/null +++ b/local/modules/Slide/EventListeners/SlideEvents.php @@ -0,0 +1,26 @@ + + */ +class SlideEvents +{ + const SLIDE_CREATE = 'slide.create.action'; + const SLIDE_UPDATE = 'slide.update.action'; + const SLIDE_DELETE = 'slide.delete.action'; +} diff --git a/local/modules/Slide/EventListeners/SlideUpdateEvent.php b/local/modules/Slide/EventListeners/SlideUpdateEvent.php new file mode 100644 index 00000000..e6b47472 --- /dev/null +++ b/local/modules/Slide/EventListeners/SlideUpdateEvent.php @@ -0,0 +1,42 @@ + + */ +class SlideUpdateEvent extends SlideCreateEvent +{ + protected $content; + + /** + * @return mixed + */ + public function getContent() + { + return $this->content; + } + + /** + * @param mixed $content + */ + public function setContent($content) + { + $this->content = $content; + + return $this; + } +} diff --git a/local/modules/Slide/Form/SlideCreateForm.php b/local/modules/Slide/Form/SlideCreateForm.php new file mode 100644 index 00000000..41f6995d --- /dev/null +++ b/local/modules/Slide/Form/SlideCreateForm.php @@ -0,0 +1,72 @@ + + */ +class SlideCreateForm extends BaseForm +{ + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + $this->formBuilder + ->add( + "title", + "text", + [ + "constraints" => [ + new NotBlank() + ], + "label" => Translator::getInstance()->trans("Title", [], Slide::getModuleCode()) + ] + ) + ; + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "slide_create_form"; + } +} diff --git a/local/modules/Slide/Form/SlideUpdateForm.php b/local/modules/Slide/Form/SlideUpdateForm.php new file mode 100644 index 00000000..d4acb9e6 --- /dev/null +++ b/local/modules/Slide/Form/SlideUpdateForm.php @@ -0,0 +1,56 @@ + + */ +class SlideUpdateForm extends SlideCreateForm +{ + protected function buildForm() + { + parent::buildForm(); + + $this + ->formBuilder + ->add( + "content", + "textarea", + [ + "constraints" => [ + new NotBlank() + ], + "label" => Translator::getInstance()->trans("Content", [], Slide::getModuleCode()), + "attr" => [ + "rows" => 8 + ] + ] + ) + ->add('id', 'number'); + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "slide_update_form"; + } +} diff --git a/local/modules/Slide/Hook/BackHook.php b/local/modules/Slide/Hook/BackHook.php new file mode 100644 index 00000000..0da7569a --- /dev/null +++ b/local/modules/Slide/Hook/BackHook.php @@ -0,0 +1,63 @@ + + */ +class BackHook extends BaseHook +{ + public function onMainTopMenuTools(HookRenderBlockEvent $event) + { + $event->add( + [ + 'id' => 'tools_menu_slide', + 'class' => '', + 'url' => URL::getInstance()->absoluteUrl('/admin/module/slides'), + 'title' => $this->trans('Slides', [], Slide::getModuleCode()) + ] + ); + } + + public function onTabContent(HookRenderEvent $event) + { + $event->add( + $this->render( + 'tab-content.html', + [ + 'ref' => $event->getArgument('view'), + 'ref_id' => $event->getArgument('id') + ] + ) + ); + } + + + public function onTabContentJs(HookRenderEvent $event) + { + $event->add( + $this->render( + 'tab-content-js.html' + ) + ); + } +} diff --git a/local/modules/Slide/Hook/FrontHook.php b/local/modules/Slide/Hook/FrontHook.php new file mode 100644 index 00000000..c98b9903 --- /dev/null +++ b/local/modules/Slide/Hook/FrontHook.php @@ -0,0 +1,123 @@ + + */ +class FrontHook extends BaseHook +{ + public function onMainContentTop(HookRenderEvent $event) + { + $view = $this->getView(); + if ($this->isAcceptedView($view)) { + + if($view!=="index"){ + $content = $this->render( + 'main-content-top.html', + [ + "ref" => $view, + "ref_id" => $this->getRequest()->get( + sprintf("%s_id", $view) + ), + ] + ); + + } + else { + + + $content = $this->render( + 'main-content-top.html', + [ + "ref" => 'folder', + "ref_id" => '1', + + ] + ); + + } + if (!empty($content)) { + $event->add($content); + } + } + } + + protected function isAcceptedView($view) + { + $acceptedViews = [ + 'category', + 'product', + 'folder', + 'content', + 'brand', + 'index' + ]; + + return in_array($view, $acceptedViews); + } + + public function onMainJavascriptInitialization (HookRenderEvent $event) + { + $view = $this->getView(); + if ($this->isAcceptedView($view)) { + $content = $this->render( + 'main-javascript-initialization.html' + ); + + if (!empty($content)) { + $event->add($content); + } + + } + } + + public function onMainStylesheet (HookRenderEvent $event) + { + $view = $this->getView(); + if ($this->isAcceptedView($view)) { + $content = $this->render( + 'main-stylesheet.html' + ); + + if (!empty($content)) { + $event->add($content); + } + + } + } + + + public function onMainAfterJavascriptInclude (HookRenderEvent $event) + { + $view = $this->getView(); + if ($this->isAcceptedView($view)) { + $content = $this->render( + 'main-after-javascript-include.html' + ); + + if (!empty($content)) { + $event->add($content); + } + + } + } + + +} diff --git a/local/modules/Slide/I18n/en_US.php b/local/modules/Slide/I18n/en_US.php new file mode 100644 index 00000000..0b4fa142 --- /dev/null +++ b/local/modules/Slide/I18n/en_US.php @@ -0,0 +1,4 @@ + 'The displayed english string', +); diff --git a/local/modules/Slide/I18n/fr_FR.php b/local/modules/Slide/I18n/fr_FR.php new file mode 100644 index 00000000..37086245 --- /dev/null +++ b/local/modules/Slide/I18n/fr_FR.php @@ -0,0 +1,4 @@ + 'La traduction française de la chaine', +); diff --git a/local/modules/Slide/Loop/SlideItemLoop.php b/local/modules/Slide/Loop/SlideItemLoop.php new file mode 100644 index 00000000..6435ff95 --- /dev/null +++ b/local/modules/Slide/Loop/SlideItemLoop.php @@ -0,0 +1,140 @@ + + */ +class SlideItemLoop extends BaseLoop implements PropelSearchLoopInterface +{ + protected $timestampable = false; + + protected $versionable = false; + + /** + * @param LoopResult $loopResult + * + * @return LoopResult + */ + public function parseResults(LoopResult $loopResult) + { + /** @var SlideItem $slideItem */ + foreach ($loopResult->getResultDataCollection() as $slideItem) { + + $loopResultRow = new LoopResultRow($slideItem); + + $loopResultRow + ->set("ID", $slideItem->getId()) + ->set("TITLE", $slideItem->getTitle()) + ->set("CONTENT", $slideItem->getContent()); + + $this->addOutputFields($loopResultRow, $slideItem); + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + /** + * this method returns a Propel ModelCriteria + * + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria() + { + $query = SlideItemQuery::create(); + + $id = $this->getArgValue('id'); + if (null !== $id) { + $query->filterById($id, Criteria::IN); + } + + $orders = $this->getArgValue('order'); + + foreach ($orders as $order) { + switch ($order) { + case "id": + $query->orderById(Criteria::ASC); + break; + case "id_reverse": + $query->orderById(Criteria::DESC); + break; + } + } + + return $query; + } + + /** + * Definition of loop arguments + * + * example : + * + * public function getArgDefinitions() + * { + * return new ArgumentCollection( + * + * Argument::createIntListTypeArgument('id'), + * new Argument( + * 'ref', + * new TypeCollection( + * new Type\AlphaNumStringListType() + * ) + * ), + * Argument::createIntListTypeArgument('category'), + * Argument::createBooleanTypeArgument('new'), + * ... + * ); + * } + * + * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + new Argument( + 'order', + new TypeCollection( + new EnumListType( + [ + 'id', + 'id_reverse' + ] + ) + ), + 'id' + ) + ); + } +} diff --git a/local/modules/Slide/Loop/SlideRelLoop.php b/local/modules/Slide/Loop/SlideRelLoop.php new file mode 100644 index 00000000..08e9b453 --- /dev/null +++ b/local/modules/Slide/Loop/SlideRelLoop.php @@ -0,0 +1,177 @@ + + */ +class SlideRelLoop extends BaseLoop implements PropelSearchLoopInterface +{ + protected $timestampable = false; + + protected $versionable = false; + + /** + * @param LoopResult $loopResult + * + * @return LoopResult + */ + public function parseResults(LoopResult $loopResult) + { + /** @var SlideRel $slideRel */ + foreach ($loopResult->getResultDataCollection() as $slideRel) { + + $loopResultRow = new LoopResultRow($slideRel); + + $loopResultRow + ->set("ID", $slideRel->getId()) + ->set("SLIDE_ID", $slideRel->getSlideId()) + ->set("REF", $slideRel->getRef()) + ->set("REF_ID", $slideRel->getRefId()) + ->set("POSITION", $slideRel->getPosition()) + ->set("CONTENT", $slideRel->getVirtualColumn("Content")) + ; + + $this->addOutputFields($loopResultRow, $slideRel); + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + /** + * this method returns a Propel ModelCriteria + * + * @return \Propel\Runtime\ActiveQuery\ModelCriteria + */ + public function buildModelCriteria() + { + $query = SlideRelQuery::create(); + + $id = $this->getArgValue('id'); + if (null !== $id) { + $query->filterById($id, Criteria::IN); + } + + $slideId = $this->getArgValue('slide_id'); + if (null !== $slideId) { + $query->filterBySlideId($slideId, Criteria::IN); + } + + $ref = $this->getArgValue('ref'); + $refId = $this->getArgValue('ref_id'); + + if (null !== $ref || null !== $refId) { + if (null === $ref || null === $refId) { + throw new InvalidArgumentException("ref and ref_id mandatory"); + } else { + $query + ->filterByRef($ref) + ->filterByRefId($refId); + } + } + + $query + ->join('SlideRel.SlideItem') + ->withColumn('SlideItem.Content', 'Content') + ; + + $orders = $this->getArgValue('order'); + + foreach ($orders as $order) { + switch ($order) { + case "id": + $query->orderById(Criteria::ASC); + break; + case "id_reverse": + $query->orderById(Criteria::DESC); + break; + case "position": + $query->orderByPosition(Criteria::ASC); + break; + case "position_reverse": + $query->orderByPosition(Criteria::DESC); + break; + } + } + + return $query; + } + + /** + * Definition of loop arguments + * + * example : + * + * public function getArgDefinitions() + * { + * return new ArgumentCollection( + * + * Argument::createIntListTypeArgument('id'), + * new Argument( + * 'ref', + * new TypeCollection( + * new Type\AlphaNumStringListType() + * ) + * ), + * Argument::createIntListTypeArgument('category'), + * Argument::createBooleanTypeArgument('new'), + * ... + * ); + * } + * + * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + Argument::createIntListTypeArgument('slide_id'), + Argument::createAnyTypeArgument('ref'), + Argument::createIntTypeArgument('ref_id'), + new Argument( + 'order', + new TypeCollection( + new EnumListType( + [ + 'id', + 'id_reverse', + 'position', + 'position_reverse' + ] + ) + ), + 'position' + ) + ); + } +} diff --git a/local/modules/Slide/Model/Base/Kits.php b/local/modules/Slide/Model/Base/Kits.php new file mode 100644 index 00000000..2216b69f --- /dev/null +++ b/local/modules/Slide/Model/Base/Kits.php @@ -0,0 +1,1489 @@ +modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another Kits instance. If + * obj is an instance of Kits, delegates to + * equals(Kits). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return Kits The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return Kits The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [title] column value. + * + * @return string + */ + public function getTitle() + { + + return $this->title; + } + + /** + * Get the [type] column value. + * + * @return string + */ + public function getType() + { + + return $this->type; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \Slide\Model\Kits The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[KitsTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [title] column. + * + * @param string $v new value + * @return \Slide\Model\Kits The current object (for fluent API support) + */ + public function setTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->title !== $v) { + $this->title = $v; + $this->modifiedColumns[KitsTableMap::TITLE] = true; + } + + + return $this; + } // setTitle() + + /** + * Set the value of [type] column. + * + * @param string $v new value + * @return \Slide\Model\Kits The current object (for fluent API support) + */ + public function setType($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->type !== $v) { + $this->type = $v; + $this->modifiedColumns[KitsTableMap::TYPE] = true; + } + + + return $this; + } // setType() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : KitsTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : KitsTableMap::translateFieldName('Title', TableMap::TYPE_PHPNAME, $indexType)]; + $this->title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : KitsTableMap::translateFieldName('Type', TableMap::TYPE_PHPNAME, $indexType)]; + $this->type = (null !== $col) ? (string) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 3; // 3 = KitsTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \Slide\Model\Kits object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(KitsTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildKitsQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collkitComponents = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see Kits::setDeleted() + * @see Kits::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(KitsTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildKitsQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(KitsTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + KitsTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->kitComponentsScheduledForDeletion !== null) { + if (!$this->kitComponentsScheduledForDeletion->isEmpty()) { + \Kits\Model\kitComponentQuery::create() + ->filterByPrimaryKeys($this->kitComponentsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->kitComponentsScheduledForDeletion = null; + } + } + + if ($this->collkitComponents !== null) { + foreach ($this->collkitComponents as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[KitsTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . KitsTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(KitsTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(KitsTableMap::TITLE)) { + $modifiedColumns[':p' . $index++] = 'TITLE'; + } + if ($this->isColumnModified(KitsTableMap::TYPE)) { + $modifiedColumns[':p' . $index++] = 'TYPE'; + } + + $sql = sprintf( + 'INSERT INTO kits (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'TITLE': + $stmt->bindValue($identifier, $this->title, PDO::PARAM_STR); + break; + case 'TYPE': + $stmt->bindValue($identifier, $this->type, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = KitsTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getTitle(); + break; + case 2: + return $this->getType(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['Kits'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['Kits'][$this->getPrimaryKey()] = true; + $keys = KitsTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getTitle(), + $keys[2] => $this->getType(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collkitComponents) { + $result['kitComponents'] = $this->collkitComponents->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = KitsTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setTitle($value); + break; + case 2: + $this->setType($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = KitsTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setTitle($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setType($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(KitsTableMap::DATABASE_NAME); + + if ($this->isColumnModified(KitsTableMap::ID)) $criteria->add(KitsTableMap::ID, $this->id); + if ($this->isColumnModified(KitsTableMap::TITLE)) $criteria->add(KitsTableMap::TITLE, $this->title); + if ($this->isColumnModified(KitsTableMap::TYPE)) $criteria->add(KitsTableMap::TYPE, $this->type); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(KitsTableMap::DATABASE_NAME); + $criteria->add(KitsTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Slide\Model\Kits (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setTitle($this->getTitle()); + $copyObj->setType($this->getType()); + + if ($deepCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + + foreach ($this->getkitComponents() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addkitComponent($relObj->copy($deepCopy)); + } + } + + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Slide\Model\Kits Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('kitComponent' == $relationName) { + return $this->initkitComponents(); + } + } + + /** + * Clears out the collkitComponents collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return void + * @see addkitComponents() + */ + public function clearkitComponents() + { + $this->collkitComponents = null; // important to set this to NULL since that means it is uninitialized + } + + /** + * Reset is the collkitComponents collection loaded partially. + */ + public function resetPartialkitComponents($v = true) + { + $this->collkitComponentsPartial = $v; + } + + /** + * Initializes the collkitComponents collection. + * + * By default this just sets the collkitComponents collection to an empty array (like clearcollkitComponents()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initkitComponents($overrideExisting = true) + { + if (null !== $this->collkitComponents && !$overrideExisting) { + return; + } + $this->collkitComponents = new ObjectCollection(); + $this->collkitComponents->setModel('\Kits\Model\kitComponent'); + } + + /** + * Gets an array of ChildkitComponent objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this ChildKits is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param ConnectionInterface $con optional connection object + * @return Collection|ChildkitComponent[] List of ChildkitComponent objects + * @throws PropelException + */ + public function getkitComponents($criteria = null, ConnectionInterface $con = null) + { + $partial = $this->collkitComponentsPartial && !$this->isNew(); + if (null === $this->collkitComponents || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collkitComponents) { + // return empty collection + $this->initkitComponents(); + } else { + $collkitComponents = kitComponentQuery::create(null, $criteria) + ->filterByKits($this) + ->find($con); + + if (null !== $criteria) { + if (false !== $this->collkitComponentsPartial && count($collkitComponents)) { + $this->initkitComponents(false); + + foreach ($collkitComponents as $obj) { + if (false == $this->collkitComponents->contains($obj)) { + $this->collkitComponents->append($obj); + } + } + + $this->collkitComponentsPartial = true; + } + + reset($collkitComponents); + + return $collkitComponents; + } + + if ($partial && $this->collkitComponents) { + foreach ($this->collkitComponents as $obj) { + if ($obj->isNew()) { + $collkitComponents[] = $obj; + } + } + } + + $this->collkitComponents = $collkitComponents; + $this->collkitComponentsPartial = false; + } + } + + return $this->collkitComponents; + } + + /** + * Sets a collection of kitComponent objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param Collection $kitComponents A Propel collection. + * @param ConnectionInterface $con Optional connection object + * @return ChildKits The current object (for fluent API support) + */ + public function setkitComponents(Collection $kitComponents, ConnectionInterface $con = null) + { + $kitComponentsToDelete = $this->getkitComponents(new Criteria(), $con)->diff($kitComponents); + + + $this->kitComponentsScheduledForDeletion = $kitComponentsToDelete; + + foreach ($kitComponentsToDelete as $kitComponentRemoved) { + $kitComponentRemoved->setKits(null); + } + + $this->collkitComponents = null; + foreach ($kitComponents as $kitComponent) { + $this->addkitComponent($kitComponent); + } + + $this->collkitComponents = $kitComponents; + $this->collkitComponentsPartial = false; + + return $this; + } + + /** + * Returns the number of related kitComponent objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param ConnectionInterface $con + * @return int Count of related kitComponent objects. + * @throws PropelException + */ + public function countkitComponents(Criteria $criteria = null, $distinct = false, ConnectionInterface $con = null) + { + $partial = $this->collkitComponentsPartial && !$this->isNew(); + if (null === $this->collkitComponents || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collkitComponents) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getkitComponents()); + } + + $query = kitComponentQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterByKits($this) + ->count($con); + } + + return count($this->collkitComponents); + } + + /** + * Method called to associate a ChildkitComponent object to this object + * through the ChildkitComponent foreign key attribute. + * + * @param ChildkitComponent $l ChildkitComponent + * @return \Slide\Model\Kits The current object (for fluent API support) + */ + public function addkitComponent(ChildkitComponent $l) + { + if ($this->collkitComponents === null) { + $this->initkitComponents(); + $this->collkitComponentsPartial = true; + } + + if (!in_array($l, $this->collkitComponents->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddkitComponent($l); + } + + return $this; + } + + /** + * @param kitComponent $kitComponent The kitComponent object to add. + */ + protected function doAddkitComponent($kitComponent) + { + $this->collkitComponents[]= $kitComponent; + $kitComponent->setKits($this); + } + + /** + * @param kitComponent $kitComponent The kitComponent object to remove. + * @return ChildKits The current object (for fluent API support) + */ + public function removekitComponent($kitComponent) + { + if ($this->getkitComponents()->contains($kitComponent)) { + $this->collkitComponents->remove($this->collkitComponents->search($kitComponent)); + if (null === $this->kitComponentsScheduledForDeletion) { + $this->kitComponentsScheduledForDeletion = clone $this->collkitComponents; + $this->kitComponentsScheduledForDeletion->clear(); + } + $this->kitComponentsScheduledForDeletion[]= clone $kitComponent; + $kitComponent->setKits(null); + } + + return $this; + } + + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this Kits is new, it will return + * an empty collection; or if this Kits has previously + * been saved, it will retrieve related kitComponents from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in Kits. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param ConnectionInterface $con optional connection object + * @param string $joinBehavior optional join type to use (defaults to Criteria::LEFT_JOIN) + * @return Collection|ChildkitComponent[] List of ChildkitComponent objects + */ + public function getkitComponentsJoinProduct($criteria = null, $con = null, $joinBehavior = Criteria::LEFT_JOIN) + { + $query = kitComponentQuery::create(null, $criteria); + $query->joinWith('Product', $joinBehavior); + + return $this->getkitComponents($query, $con); + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->title = null; + $this->type = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + if ($this->collkitComponents) { + foreach ($this->collkitComponents as $o) { + $o->clearAllReferences($deep); + } + } + } // if ($deep) + + $this->collkitComponents = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(KitsTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/Slide/Model/Base/KitsQuery.php b/local/modules/Slide/Model/Base/KitsQuery.php new file mode 100644 index 00000000..ddcdaf4d --- /dev/null +++ b/local/modules/Slide/Model/Base/KitsQuery.php @@ -0,0 +1,491 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildKits|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = KitsTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(KitsTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildKits A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, TITLE, TYPE FROM kits WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildKits(); + $obj->hydrate($row); + KitsTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildKits|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(KitsTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(KitsTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(KitsTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(KitsTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(KitsTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the title column + * + * Example usage: + * + * $query->filterByTitle('fooValue'); // WHERE title = 'fooValue' + * $query->filterByTitle('%fooValue%'); // WHERE title LIKE '%fooValue%' + * + * + * @param string $title The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function filterByTitle($title = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($title)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $title)) { + $title = str_replace('*', '%', $title); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(KitsTableMap::TITLE, $title, $comparison); + } + + /** + * Filter the query on the type column + * + * Example usage: + * + * $query->filterByType('fooValue'); // WHERE type = 'fooValue' + * $query->filterByType('%fooValue%'); // WHERE type LIKE '%fooValue%' + * + * + * @param string $type The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function filterByType($type = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($type)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $type)) { + $type = str_replace('*', '%', $type); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(KitsTableMap::TYPE, $type, $comparison); + } + + /** + * Filter the query by a related \Kits\Model\kitComponent object + * + * @param \Kits\Model\kitComponent|ObjectCollection $kitComponent the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function filterBykitComponent($kitComponent, $comparison = null) + { + if ($kitComponent instanceof \Kits\Model\kitComponent) { + return $this + ->addUsingAlias(KitsTableMap::ID, $kitComponent->getKitId(), $comparison); + } elseif ($kitComponent instanceof ObjectCollection) { + return $this + ->usekitComponentQuery() + ->filterByPrimaryKeys($kitComponent->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterBykitComponent() only accepts arguments of type \Kits\Model\kitComponent or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the kitComponent relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function joinkitComponent($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('kitComponent'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'kitComponent'); + } + + return $this; + } + + /** + * Use the kitComponent relation kitComponent object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Kits\Model\kitComponentQuery A secondary query class using the current class as primary query + */ + public function usekitComponentQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinkitComponent($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'kitComponent', '\Kits\Model\kitComponentQuery'); + } + + /** + * Exclude object from result + * + * @param ChildKits $kits Object to remove from the list of results + * + * @return ChildKitsQuery The current query, for fluid interface + */ + public function prune($kits = null) + { + if ($kits) { + $this->addUsingAlias(KitsTableMap::ID, $kits->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the kits table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(KitsTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + KitsTableMap::clearInstancePool(); + KitsTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildKits or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildKits object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(KitsTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(KitsTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + KitsTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + KitsTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // KitsQuery diff --git a/local/modules/Slide/Model/Base/SlideItem.php b/local/modules/Slide/Model/Base/SlideItem.php new file mode 100644 index 00000000..585394cb --- /dev/null +++ b/local/modules/Slide/Model/Base/SlideItem.php @@ -0,0 +1,1463 @@ +modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another SlideItem instance. If + * obj is an instance of SlideItem, delegates to + * equals(SlideItem). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return SlideItem The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return SlideItem The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [title] column value. + * + * @return string + */ + public function getTitle() + { + + return $this->title; + } + + /** + * Get the [content] column value. + * + * @return string + */ + public function getContent() + { + + return $this->content; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \Slide\Model\SlideItem The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[SlideItemTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [title] column. + * + * @param string $v new value + * @return \Slide\Model\SlideItem The current object (for fluent API support) + */ + public function setTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->title !== $v) { + $this->title = $v; + $this->modifiedColumns[SlideItemTableMap::TITLE] = true; + } + + + return $this; + } // setTitle() + + /** + * Set the value of [content] column. + * + * @param string $v new value + * @return \Slide\Model\SlideItem The current object (for fluent API support) + */ + public function setContent($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->content !== $v) { + $this->content = $v; + $this->modifiedColumns[SlideItemTableMap::CONTENT] = true; + } + + + return $this; + } // setContent() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : SlideItemTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : SlideItemTableMap::translateFieldName('Title', TableMap::TYPE_PHPNAME, $indexType)]; + $this->title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : SlideItemTableMap::translateFieldName('Content', TableMap::TYPE_PHPNAME, $indexType)]; + $this->content = (null !== $col) ? (string) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 3; // 3 = SlideItemTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \Slide\Model\SlideItem object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(SlideItemTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildSlideItemQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->collSlideRels = null; + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see SlideItem::setDeleted() + * @see SlideItem::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideItemTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildSlideItemQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideItemTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + SlideItemTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + if ($this->slideRelsScheduledForDeletion !== null) { + if (!$this->slideRelsScheduledForDeletion->isEmpty()) { + \Slide\Model\SlideRelQuery::create() + ->filterByPrimaryKeys($this->slideRelsScheduledForDeletion->getPrimaryKeys(false)) + ->delete($con); + $this->slideRelsScheduledForDeletion = null; + } + } + + if ($this->collSlideRels !== null) { + foreach ($this->collSlideRels as $referrerFK) { + if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { + $affectedRows += $referrerFK->save($con); + } + } + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[SlideItemTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . SlideItemTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(SlideItemTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(SlideItemTableMap::TITLE)) { + $modifiedColumns[':p' . $index++] = 'TITLE'; + } + if ($this->isColumnModified(SlideItemTableMap::CONTENT)) { + $modifiedColumns[':p' . $index++] = 'CONTENT'; + } + + $sql = sprintf( + 'INSERT INTO slide_item (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'TITLE': + $stmt->bindValue($identifier, $this->title, PDO::PARAM_STR); + break; + case 'CONTENT': + $stmt->bindValue($identifier, $this->content, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = SlideItemTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getTitle(); + break; + case 2: + return $this->getContent(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['SlideItem'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['SlideItem'][$this->getPrimaryKey()] = true; + $keys = SlideItemTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getTitle(), + $keys[2] => $this->getContent(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->collSlideRels) { + $result['SlideRels'] = $this->collSlideRels->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = SlideItemTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setTitle($value); + break; + case 2: + $this->setContent($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = SlideItemTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setTitle($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setContent($arr[$keys[2]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(SlideItemTableMap::DATABASE_NAME); + + if ($this->isColumnModified(SlideItemTableMap::ID)) $criteria->add(SlideItemTableMap::ID, $this->id); + if ($this->isColumnModified(SlideItemTableMap::TITLE)) $criteria->add(SlideItemTableMap::TITLE, $this->title); + if ($this->isColumnModified(SlideItemTableMap::CONTENT)) $criteria->add(SlideItemTableMap::CONTENT, $this->content); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(SlideItemTableMap::DATABASE_NAME); + $criteria->add(SlideItemTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Slide\Model\SlideItem (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setTitle($this->getTitle()); + $copyObj->setContent($this->getContent()); + + if ($deepCopy) { + // important: temporarily setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); + + foreach ($this->getSlideRels() as $relObj) { + if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves + $copyObj->addSlideRel($relObj->copy($deepCopy)); + } + } + + } // if ($deepCopy) + + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Slide\Model\SlideItem Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + + /** + * Initializes a collection based on the name of a relation. + * Avoids crafting an 'init[$relationName]s' method name + * that wouldn't work when StandardEnglishPluralizer is used. + * + * @param string $relationName The name of the relation to initialize + * @return void + */ + public function initRelation($relationName) + { + if ('SlideRel' == $relationName) { + return $this->initSlideRels(); + } + } + + /** + * Clears out the collSlideRels collection + * + * This does not modify the database; however, it will remove any associated objects, causing + * them to be refetched by subsequent calls to accessor method. + * + * @return void + * @see addSlideRels() + */ + public function clearSlideRels() + { + $this->collSlideRels = null; // important to set this to NULL since that means it is uninitialized + } + + /** + * Reset is the collSlideRels collection loaded partially. + */ + public function resetPartialSlideRels($v = true) + { + $this->collSlideRelsPartial = $v; + } + + /** + * Initializes the collSlideRels collection. + * + * By default this just sets the collSlideRels collection to an empty array (like clearcollSlideRels()); + * however, you may wish to override this method in your stub class to provide setting appropriate + * to your application -- for example, setting the initial array to the values stored in database. + * + * @param boolean $overrideExisting If set to true, the method call initializes + * the collection even if it is not empty + * + * @return void + */ + public function initSlideRels($overrideExisting = true) + { + if (null !== $this->collSlideRels && !$overrideExisting) { + return; + } + $this->collSlideRels = new ObjectCollection(); + $this->collSlideRels->setModel('\Slide\Model\SlideRel'); + } + + /** + * Gets an array of ChildSlideRel objects which contain a foreign key that references this object. + * + * If the $criteria is not null, it is used to always fetch the results from the database. + * Otherwise the results are fetched from the database the first time, then cached. + * Next time the same method is called without $criteria, the cached collection is returned. + * If this ChildSlideItem is new, it will return + * an empty collection or the current collection; the criteria is ignored on a new object. + * + * @param Criteria $criteria optional Criteria object to narrow the query + * @param ConnectionInterface $con optional connection object + * @return Collection|ChildSlideRel[] List of ChildSlideRel objects + * @throws PropelException + */ + public function getSlideRels($criteria = null, ConnectionInterface $con = null) + { + $partial = $this->collSlideRelsPartial && !$this->isNew(); + if (null === $this->collSlideRels || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collSlideRels) { + // return empty collection + $this->initSlideRels(); + } else { + $collSlideRels = ChildSlideRelQuery::create(null, $criteria) + ->filterBySlideItem($this) + ->find($con); + + if (null !== $criteria) { + if (false !== $this->collSlideRelsPartial && count($collSlideRels)) { + $this->initSlideRels(false); + + foreach ($collSlideRels as $obj) { + if (false == $this->collSlideRels->contains($obj)) { + $this->collSlideRels->append($obj); + } + } + + $this->collSlideRelsPartial = true; + } + + reset($collSlideRels); + + return $collSlideRels; + } + + if ($partial && $this->collSlideRels) { + foreach ($this->collSlideRels as $obj) { + if ($obj->isNew()) { + $collSlideRels[] = $obj; + } + } + } + + $this->collSlideRels = $collSlideRels; + $this->collSlideRelsPartial = false; + } + } + + return $this->collSlideRels; + } + + /** + * Sets a collection of SlideRel objects related by a one-to-many relationship + * to the current object. + * It will also schedule objects for deletion based on a diff between old objects (aka persisted) + * and new objects from the given Propel collection. + * + * @param Collection $slideRels A Propel collection. + * @param ConnectionInterface $con Optional connection object + * @return ChildSlideItem The current object (for fluent API support) + */ + public function setSlideRels(Collection $slideRels, ConnectionInterface $con = null) + { + $slideRelsToDelete = $this->getSlideRels(new Criteria(), $con)->diff($slideRels); + + + $this->slideRelsScheduledForDeletion = $slideRelsToDelete; + + foreach ($slideRelsToDelete as $slideRelRemoved) { + $slideRelRemoved->setSlideItem(null); + } + + $this->collSlideRels = null; + foreach ($slideRels as $slideRel) { + $this->addSlideRel($slideRel); + } + + $this->collSlideRels = $slideRels; + $this->collSlideRelsPartial = false; + + return $this; + } + + /** + * Returns the number of related SlideRel objects. + * + * @param Criteria $criteria + * @param boolean $distinct + * @param ConnectionInterface $con + * @return int Count of related SlideRel objects. + * @throws PropelException + */ + public function countSlideRels(Criteria $criteria = null, $distinct = false, ConnectionInterface $con = null) + { + $partial = $this->collSlideRelsPartial && !$this->isNew(); + if (null === $this->collSlideRels || null !== $criteria || $partial) { + if ($this->isNew() && null === $this->collSlideRels) { + return 0; + } + + if ($partial && !$criteria) { + return count($this->getSlideRels()); + } + + $query = ChildSlideRelQuery::create(null, $criteria); + if ($distinct) { + $query->distinct(); + } + + return $query + ->filterBySlideItem($this) + ->count($con); + } + + return count($this->collSlideRels); + } + + /** + * Method called to associate a ChildSlideRel object to this object + * through the ChildSlideRel foreign key attribute. + * + * @param ChildSlideRel $l ChildSlideRel + * @return \Slide\Model\SlideItem The current object (for fluent API support) + */ + public function addSlideRel(ChildSlideRel $l) + { + if ($this->collSlideRels === null) { + $this->initSlideRels(); + $this->collSlideRelsPartial = true; + } + + if (!in_array($l, $this->collSlideRels->getArrayCopy(), true)) { // only add it if the **same** object is not already associated + $this->doAddSlideRel($l); + } + + return $this; + } + + /** + * @param SlideRel $slideRel The slideRel object to add. + */ + protected function doAddSlideRel($slideRel) + { + $this->collSlideRels[]= $slideRel; + $slideRel->setSlideItem($this); + } + + /** + * @param SlideRel $slideRel The slideRel object to remove. + * @return ChildSlideItem The current object (for fluent API support) + */ + public function removeSlideRel($slideRel) + { + if ($this->getSlideRels()->contains($slideRel)) { + $this->collSlideRels->remove($this->collSlideRels->search($slideRel)); + if (null === $this->slideRelsScheduledForDeletion) { + $this->slideRelsScheduledForDeletion = clone $this->collSlideRels; + $this->slideRelsScheduledForDeletion->clear(); + } + $this->slideRelsScheduledForDeletion[]= clone $slideRel; + $slideRel->setSlideItem(null); + } + + return $this; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->title = null; + $this->content = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + if ($this->collSlideRels) { + foreach ($this->collSlideRels as $o) { + $o->clearAllReferences($deep); + } + } + } // if ($deep) + + $this->collSlideRels = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(SlideItemTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/Slide/Model/Base/SlideItemQuery.php b/local/modules/Slide/Model/Base/SlideItemQuery.php new file mode 100644 index 00000000..b0467375 --- /dev/null +++ b/local/modules/Slide/Model/Base/SlideItemQuery.php @@ -0,0 +1,490 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildSlideItem|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = SlideItemTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(SlideItemTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildSlideItem A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, TITLE, CONTENT FROM slide_item WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildSlideItem(); + $obj->hydrate($row); + SlideItemTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildSlideItem|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(SlideItemTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(SlideItemTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(SlideItemTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(SlideItemTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SlideItemTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the title column + * + * Example usage: + * + * $query->filterByTitle('fooValue'); // WHERE title = 'fooValue' + * $query->filterByTitle('%fooValue%'); // WHERE title LIKE '%fooValue%' + * + * + * @param string $title The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function filterByTitle($title = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($title)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $title)) { + $title = str_replace('*', '%', $title); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(SlideItemTableMap::TITLE, $title, $comparison); + } + + /** + * Filter the query on the content column + * + * Example usage: + * + * $query->filterByContent('fooValue'); // WHERE content = 'fooValue' + * $query->filterByContent('%fooValue%'); // WHERE content LIKE '%fooValue%' + * + * + * @param string $content The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function filterByContent($content = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($content)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $content)) { + $content = str_replace('*', '%', $content); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(SlideItemTableMap::CONTENT, $content, $comparison); + } + + /** + * Filter the query by a related \Slide\Model\SlideRel object + * + * @param \Slide\Model\SlideRel|ObjectCollection $slideRel the related object to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function filterBySlideRel($slideRel, $comparison = null) + { + if ($slideRel instanceof \Slide\Model\SlideRel) { + return $this + ->addUsingAlias(SlideItemTableMap::ID, $slideRel->getSlideId(), $comparison); + } elseif ($slideRel instanceof ObjectCollection) { + return $this + ->useSlideRelQuery() + ->filterByPrimaryKeys($slideRel->getPrimaryKeys()) + ->endUse(); + } else { + throw new PropelException('filterBySlideRel() only accepts arguments of type \Slide\Model\SlideRel or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the SlideRel relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function joinSlideRel($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('SlideRel'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'SlideRel'); + } + + return $this; + } + + /** + * Use the SlideRel relation SlideRel object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Slide\Model\SlideRelQuery A secondary query class using the current class as primary query + */ + public function useSlideRelQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinSlideRel($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'SlideRel', '\Slide\Model\SlideRelQuery'); + } + + /** + * Exclude object from result + * + * @param ChildSlideItem $slideItem Object to remove from the list of results + * + * @return ChildSlideItemQuery The current query, for fluid interface + */ + public function prune($slideItem = null) + { + if ($slideItem) { + $this->addUsingAlias(SlideItemTableMap::ID, $slideItem->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the slide_item table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideItemTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + SlideItemTableMap::clearInstancePool(); + SlideItemTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildSlideItem or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildSlideItem object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideItemTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(SlideItemTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + SlideItemTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + SlideItemTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // SlideItemQuery diff --git a/local/modules/Slide/Model/Base/SlideRel.php b/local/modules/Slide/Model/Base/SlideRel.php new file mode 100644 index 00000000..a2e9ef87 --- /dev/null +++ b/local/modules/Slide/Model/Base/SlideRel.php @@ -0,0 +1,1388 @@ +position = 1; + } + + /** + * Initializes internal state of Slide\Model\Base\SlideRel object. + * @see applyDefaults() + */ + public function __construct() + { + $this->applyDefaultValues(); + } + + /** + * Returns whether the object has been modified. + * + * @return boolean True if the object has been modified. + */ + public function isModified() + { + return !!$this->modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another SlideRel instance. If + * obj is an instance of SlideRel, delegates to + * equals(SlideRel). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return SlideRel The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return SlideRel The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [position] column value. + * + * @return int + */ + public function getPosition() + { + + return $this->position; + } + + /** + * Get the [slide_id] column value. + * + * @return int + */ + public function getSlideId() + { + + return $this->slide_id; + } + + /** + * Get the [ref] column value. + * + * @return string + */ + public function getRef() + { + + return $this->ref; + } + + /** + * Get the [ref_id] column value. + * + * @return int + */ + public function getRefId() + { + + return $this->ref_id; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \Slide\Model\SlideRel The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[SlideRelTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [position] column. + * + * @param int $v new value + * @return \Slide\Model\SlideRel The current object (for fluent API support) + */ + public function setPosition($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->position !== $v) { + $this->position = $v; + $this->modifiedColumns[SlideRelTableMap::POSITION] = true; + } + + + return $this; + } // setPosition() + + /** + * Set the value of [slide_id] column. + * + * @param int $v new value + * @return \Slide\Model\SlideRel The current object (for fluent API support) + */ + public function setSlideId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->slide_id !== $v) { + $this->slide_id = $v; + $this->modifiedColumns[SlideRelTableMap::SLIDE_ID] = true; + } + + if ($this->aSlideItem !== null && $this->aSlideItem->getId() !== $v) { + $this->aSlideItem = null; + } + + + return $this; + } // setSlideId() + + /** + * Set the value of [ref] column. + * + * @param string $v new value + * @return \Slide\Model\SlideRel The current object (for fluent API support) + */ + public function setRef($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->ref !== $v) { + $this->ref = $v; + $this->modifiedColumns[SlideRelTableMap::REF] = true; + } + + + return $this; + } // setRef() + + /** + * Set the value of [ref_id] column. + * + * @param int $v new value + * @return \Slide\Model\SlideRel The current object (for fluent API support) + */ + public function setRefId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->ref_id !== $v) { + $this->ref_id = $v; + $this->modifiedColumns[SlideRelTableMap::REF_ID] = true; + } + + + return $this; + } // setRefId() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->position !== 1) { + return false; + } + + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : SlideRelTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : SlideRelTableMap::translateFieldName('Position', TableMap::TYPE_PHPNAME, $indexType)]; + $this->position = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : SlideRelTableMap::translateFieldName('SlideId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->slide_id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : SlideRelTableMap::translateFieldName('Ref', TableMap::TYPE_PHPNAME, $indexType)]; + $this->ref = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : SlideRelTableMap::translateFieldName('RefId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->ref_id = (null !== $col) ? (int) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 5; // 5 = SlideRelTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \Slide\Model\SlideRel object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + if ($this->aSlideItem !== null && $this->slide_id !== $this->aSlideItem->getId()) { + $this->aSlideItem = null; + } + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(SlideRelTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildSlideRelQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + $this->aSlideItem = null; + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see SlideRel::setDeleted() + * @see SlideRel::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideRelTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildSlideRelQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideRelTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + SlideRelTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + // We call the save method on the following object(s) if they + // were passed to this object by their corresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this->aSlideItem !== null) { + if ($this->aSlideItem->isModified() || $this->aSlideItem->isNew()) { + $affectedRows += $this->aSlideItem->save($con); + } + $this->setSlideItem($this->aSlideItem); + } + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[SlideRelTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . SlideRelTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(SlideRelTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(SlideRelTableMap::POSITION)) { + $modifiedColumns[':p' . $index++] = 'POSITION'; + } + if ($this->isColumnModified(SlideRelTableMap::SLIDE_ID)) { + $modifiedColumns[':p' . $index++] = 'SLIDE_ID'; + } + if ($this->isColumnModified(SlideRelTableMap::REF)) { + $modifiedColumns[':p' . $index++] = 'REF'; + } + if ($this->isColumnModified(SlideRelTableMap::REF_ID)) { + $modifiedColumns[':p' . $index++] = 'REF_ID'; + } + + $sql = sprintf( + 'INSERT INTO slide_rel (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'POSITION': + $stmt->bindValue($identifier, $this->position, PDO::PARAM_INT); + break; + case 'SLIDE_ID': + $stmt->bindValue($identifier, $this->slide_id, PDO::PARAM_INT); + break; + case 'REF': + $stmt->bindValue($identifier, $this->ref, PDO::PARAM_STR); + break; + case 'REF_ID': + $stmt->bindValue($identifier, $this->ref_id, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = SlideRelTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getPosition(); + break; + case 2: + return $this->getSlideId(); + break; + case 3: + return $this->getRef(); + break; + case 4: + return $this->getRefId(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE. + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) + { + if (isset($alreadyDumpedObjects['SlideRel'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['SlideRel'][$this->getPrimaryKey()] = true; + $keys = SlideRelTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getPosition(), + $keys[2] => $this->getSlideId(), + $keys[3] => $this->getRef(), + $keys[4] => $this->getRefId(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + if ($includeForeignObjects) { + if (null !== $this->aSlideItem) { + $result['SlideItem'] = $this->aSlideItem->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); + } + } + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = SlideRelTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setPosition($value); + break; + case 2: + $this->setSlideId($value); + break; + case 3: + $this->setRef($value); + break; + case 4: + $this->setRefId($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = SlideRelTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setPosition($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setSlideId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setRef($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setRefId($arr[$keys[4]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(SlideRelTableMap::DATABASE_NAME); + + if ($this->isColumnModified(SlideRelTableMap::ID)) $criteria->add(SlideRelTableMap::ID, $this->id); + if ($this->isColumnModified(SlideRelTableMap::POSITION)) $criteria->add(SlideRelTableMap::POSITION, $this->position); + if ($this->isColumnModified(SlideRelTableMap::SLIDE_ID)) $criteria->add(SlideRelTableMap::SLIDE_ID, $this->slide_id); + if ($this->isColumnModified(SlideRelTableMap::REF)) $criteria->add(SlideRelTableMap::REF, $this->ref); + if ($this->isColumnModified(SlideRelTableMap::REF_ID)) $criteria->add(SlideRelTableMap::REF_ID, $this->ref_id); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(SlideRelTableMap::DATABASE_NAME); + $criteria->add(SlideRelTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Slide\Model\SlideRel (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setPosition($this->getPosition()); + $copyObj->setSlideId($this->getSlideId()); + $copyObj->setRef($this->getRef()); + $copyObj->setRefId($this->getRefId()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Slide\Model\SlideRel Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Declares an association between this object and a ChildSlideItem object. + * + * @param ChildSlideItem $v + * @return \Slide\Model\SlideRel The current object (for fluent API support) + * @throws PropelException + */ + public function setSlideItem(ChildSlideItem $v = null) + { + if ($v === null) { + $this->setSlideId(NULL); + } else { + $this->setSlideId($v->getId()); + } + + $this->aSlideItem = $v; + + // Add binding for other direction of this n:n relationship. + // If this object has already been added to the ChildSlideItem object, it will not be re-added. + if ($v !== null) { + $v->addSlideRel($this); + } + + + return $this; + } + + + /** + * Get the associated ChildSlideItem object + * + * @param ConnectionInterface $con Optional Connection object. + * @return ChildSlideItem The associated ChildSlideItem object. + * @throws PropelException + */ + public function getSlideItem(ConnectionInterface $con = null) + { + if ($this->aSlideItem === null && ($this->slide_id !== null)) { + $this->aSlideItem = ChildSlideItemQuery::create()->findPk($this->slide_id, $con); + /* The following can be used additionally to + guarantee the related object contains a reference + to this object. This level of coupling may, however, be + undesirable since it could result in an only partially populated collection + in the referenced object. + $this->aSlideItem->addSlideRels($this); + */ + } + + return $this->aSlideItem; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->position = null; + $this->slide_id = null; + $this->ref = null; + $this->ref_id = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + $this->aSlideItem = null; + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(SlideRelTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/Slide/Model/Base/SlideRelQuery.php b/local/modules/Slide/Model/Base/SlideRelQuery.php new file mode 100644 index 00000000..7b9d75fe --- /dev/null +++ b/local/modules/Slide/Model/Base/SlideRelQuery.php @@ -0,0 +1,596 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildSlideRel|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = SlideRelTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(SlideRelTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildSlideRel A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, POSITION, SLIDE_ID, REF, REF_ID FROM slide_rel WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildSlideRel(); + $obj->hydrate($row); + SlideRelTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildSlideRel|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(SlideRelTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(SlideRelTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(SlideRelTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(SlideRelTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SlideRelTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the position column + * + * Example usage: + * + * $query->filterByPosition(1234); // WHERE position = 1234 + * $query->filterByPosition(array(12, 34)); // WHERE position IN (12, 34) + * $query->filterByPosition(array('min' => 12)); // WHERE position > 12 + * + * + * @param mixed $position The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterByPosition($position = null, $comparison = null) + { + if (is_array($position)) { + $useMinMax = false; + if (isset($position['min'])) { + $this->addUsingAlias(SlideRelTableMap::POSITION, $position['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($position['max'])) { + $this->addUsingAlias(SlideRelTableMap::POSITION, $position['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SlideRelTableMap::POSITION, $position, $comparison); + } + + /** + * Filter the query on the slide_id column + * + * Example usage: + * + * $query->filterBySlideId(1234); // WHERE slide_id = 1234 + * $query->filterBySlideId(array(12, 34)); // WHERE slide_id IN (12, 34) + * $query->filterBySlideId(array('min' => 12)); // WHERE slide_id > 12 + * + * + * @see filterBySlideItem() + * + * @param mixed $slideId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterBySlideId($slideId = null, $comparison = null) + { + if (is_array($slideId)) { + $useMinMax = false; + if (isset($slideId['min'])) { + $this->addUsingAlias(SlideRelTableMap::SLIDE_ID, $slideId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($slideId['max'])) { + $this->addUsingAlias(SlideRelTableMap::SLIDE_ID, $slideId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SlideRelTableMap::SLIDE_ID, $slideId, $comparison); + } + + /** + * Filter the query on the ref column + * + * Example usage: + * + * $query->filterByRef('fooValue'); // WHERE ref = 'fooValue' + * $query->filterByRef('%fooValue%'); // WHERE ref LIKE '%fooValue%' + * + * + * @param string $ref The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterByRef($ref = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($ref)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $ref)) { + $ref = str_replace('*', '%', $ref); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(SlideRelTableMap::REF, $ref, $comparison); + } + + /** + * Filter the query on the ref_id column + * + * Example usage: + * + * $query->filterByRefId(1234); // WHERE ref_id = 1234 + * $query->filterByRefId(array(12, 34)); // WHERE ref_id IN (12, 34) + * $query->filterByRefId(array('min' => 12)); // WHERE ref_id > 12 + * + * + * @param mixed $refId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterByRefId($refId = null, $comparison = null) + { + if (is_array($refId)) { + $useMinMax = false; + if (isset($refId['min'])) { + $this->addUsingAlias(SlideRelTableMap::REF_ID, $refId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($refId['max'])) { + $this->addUsingAlias(SlideRelTableMap::REF_ID, $refId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SlideRelTableMap::REF_ID, $refId, $comparison); + } + + /** + * Filter the query by a related \Slide\Model\SlideItem object + * + * @param \Slide\Model\SlideItem|ObjectCollection $slideItem The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function filterBySlideItem($slideItem, $comparison = null) + { + if ($slideItem instanceof \Slide\Model\SlideItem) { + return $this + ->addUsingAlias(SlideRelTableMap::SLIDE_ID, $slideItem->getId(), $comparison); + } elseif ($slideItem instanceof ObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(SlideRelTableMap::SLIDE_ID, $slideItem->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterBySlideItem() only accepts arguments of type \Slide\Model\SlideItem or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the SlideItem relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function joinSlideItem($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('SlideItem'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'SlideItem'); + } + + return $this; + } + + /** + * Use the SlideItem relation SlideItem object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Slide\Model\SlideItemQuery A secondary query class using the current class as primary query + */ + public function useSlideItemQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinSlideItem($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'SlideItem', '\Slide\Model\SlideItemQuery'); + } + + /** + * Exclude object from result + * + * @param ChildSlideRel $slideRel Object to remove from the list of results + * + * @return ChildSlideRelQuery The current query, for fluid interface + */ + public function prune($slideRel = null) + { + if ($slideRel) { + $this->addUsingAlias(SlideRelTableMap::ID, $slideRel->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the slide_rel table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideRelTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + SlideRelTableMap::clearInstancePool(); + SlideRelTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildSlideRel or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildSlideRel object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideRelTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(SlideRelTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + SlideRelTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + SlideRelTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // SlideRelQuery diff --git a/local/modules/Slide/Model/Kits.php b/local/modules/Slide/Model/Kits.php new file mode 100644 index 00000000..4b1701fa --- /dev/null +++ b/local/modules/Slide/Model/Kits.php @@ -0,0 +1,10 @@ + array('Id', 'Title', 'Type', ), + self::TYPE_STUDLYPHPNAME => array('id', 'title', 'type', ), + self::TYPE_COLNAME => array(KitsTableMap::ID, KitsTableMap::TITLE, KitsTableMap::TYPE, ), + self::TYPE_RAW_COLNAME => array('ID', 'TITLE', 'TYPE', ), + self::TYPE_FIELDNAME => array('id', 'title', 'type', ), + self::TYPE_NUM => array(0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'Title' => 1, 'Type' => 2, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'title' => 1, 'type' => 2, ), + self::TYPE_COLNAME => array(KitsTableMap::ID => 0, KitsTableMap::TITLE => 1, KitsTableMap::TYPE => 2, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'TITLE' => 1, 'TYPE' => 2, ), + self::TYPE_FIELDNAME => array('id' => 0, 'title' => 1, 'type' => 2, ), + self::TYPE_NUM => array(0, 1, 2, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('kits'); + $this->setPhpName('Kits'); + $this->setClassName('\\Slide\\Model\\Kits'); + $this->setPackage('Slide.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addColumn('TITLE', 'Title', 'VARCHAR', false, 255, null); + $this->addColumn('TYPE', 'Type', 'VARCHAR', false, 255, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('kitComponent', '\\Kits\\Model\\kitComponent', RelationMap::ONE_TO_MANY, array('id' => 'kit_id', ), 'CASCADE', null, 'kitComponents'); + } // buildRelations() + /** + * Method to invalidate the instance pool of all tables related to kits * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + kitComponentTableMap::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? KitsTableMap::CLASS_DEFAULT : KitsTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (Kits object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = KitsTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = KitsTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + KitsTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = KitsTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + KitsTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = KitsTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = KitsTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + KitsTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(KitsTableMap::ID); + $criteria->addSelectColumn(KitsTableMap::TITLE); + $criteria->addSelectColumn(KitsTableMap::TYPE); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.TITLE'); + $criteria->addSelectColumn($alias . '.TYPE'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(KitsTableMap::DATABASE_NAME)->getTable(KitsTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(KitsTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(KitsTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new KitsTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a Kits or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or Kits object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(KitsTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Slide\Model\Kits) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(KitsTableMap::DATABASE_NAME); + $criteria->add(KitsTableMap::ID, (array) $values, Criteria::IN); + } + + $query = KitsQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { KitsTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { KitsTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the kits table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return KitsQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a Kits or Criteria object. + * + * @param mixed $criteria Criteria or Kits object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(KitsTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from Kits object + } + + if ($criteria->containsKey(KitsTableMap::ID) && $criteria->keyContainsValue(KitsTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.KitsTableMap::ID.')'); + } + + + // Set the correct dbName + $query = KitsQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // KitsTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +KitsTableMap::buildTableMap(); diff --git a/local/modules/Slide/Model/Map/SlideItemTableMap.php b/local/modules/Slide/Model/Map/SlideItemTableMap.php new file mode 100644 index 00000000..0b6b081c --- /dev/null +++ b/local/modules/Slide/Model/Map/SlideItemTableMap.php @@ -0,0 +1,428 @@ + array('Id', 'Title', 'Content', ), + self::TYPE_STUDLYPHPNAME => array('id', 'title', 'content', ), + self::TYPE_COLNAME => array(SlideItemTableMap::ID, SlideItemTableMap::TITLE, SlideItemTableMap::CONTENT, ), + self::TYPE_RAW_COLNAME => array('ID', 'TITLE', 'CONTENT', ), + self::TYPE_FIELDNAME => array('id', 'title', 'content', ), + self::TYPE_NUM => array(0, 1, 2, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'Title' => 1, 'Content' => 2, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'title' => 1, 'content' => 2, ), + self::TYPE_COLNAME => array(SlideItemTableMap::ID => 0, SlideItemTableMap::TITLE => 1, SlideItemTableMap::CONTENT => 2, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'TITLE' => 1, 'CONTENT' => 2, ), + self::TYPE_FIELDNAME => array('id' => 0, 'title' => 1, 'content' => 2, ), + self::TYPE_NUM => array(0, 1, 2, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('slide_item'); + $this->setPhpName('SlideItem'); + $this->setClassName('\\Slide\\Model\\SlideItem'); + $this->setPackage('Slide.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addColumn('TITLE', 'Title', 'VARCHAR', false, 255, null); + $this->addColumn('CONTENT', 'Content', 'LONGVARCHAR', false, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('SlideRel', '\\Slide\\Model\\SlideRel', RelationMap::ONE_TO_MANY, array('id' => 'slide_id', ), 'CASCADE', null, 'SlideRels'); + } // buildRelations() + /** + * Method to invalidate the instance pool of all tables related to slide_item * by a foreign key with ON DELETE CASCADE + */ + public static function clearRelatedInstancePool() + { + // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, + // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. + SlideRelTableMap::clearInstancePool(); + } + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? SlideItemTableMap::CLASS_DEFAULT : SlideItemTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (SlideItem object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = SlideItemTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = SlideItemTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + SlideItemTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = SlideItemTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + SlideItemTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = SlideItemTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = SlideItemTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + SlideItemTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(SlideItemTableMap::ID); + $criteria->addSelectColumn(SlideItemTableMap::TITLE); + $criteria->addSelectColumn(SlideItemTableMap::CONTENT); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.TITLE'); + $criteria->addSelectColumn($alias . '.CONTENT'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(SlideItemTableMap::DATABASE_NAME)->getTable(SlideItemTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(SlideItemTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(SlideItemTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new SlideItemTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a SlideItem or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or SlideItem object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideItemTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Slide\Model\SlideItem) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(SlideItemTableMap::DATABASE_NAME); + $criteria->add(SlideItemTableMap::ID, (array) $values, Criteria::IN); + } + + $query = SlideItemQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { SlideItemTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { SlideItemTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the slide_item table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return SlideItemQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a SlideItem or Criteria object. + * + * @param mixed $criteria Criteria or SlideItem object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideItemTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from SlideItem object + } + + if ($criteria->containsKey(SlideItemTableMap::ID) && $criteria->keyContainsValue(SlideItemTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.SlideItemTableMap::ID.')'); + } + + + // Set the correct dbName + $query = SlideItemQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // SlideItemTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +SlideItemTableMap::buildTableMap(); diff --git a/local/modules/Slide/Model/Map/SlideRelTableMap.php b/local/modules/Slide/Model/Map/SlideRelTableMap.php new file mode 100644 index 00000000..4ffee056 --- /dev/null +++ b/local/modules/Slide/Model/Map/SlideRelTableMap.php @@ -0,0 +1,435 @@ + array('Id', 'Position', 'SlideId', 'Ref', 'RefId', ), + self::TYPE_STUDLYPHPNAME => array('id', 'position', 'slideId', 'ref', 'refId', ), + self::TYPE_COLNAME => array(SlideRelTableMap::ID, SlideRelTableMap::POSITION, SlideRelTableMap::SLIDE_ID, SlideRelTableMap::REF, SlideRelTableMap::REF_ID, ), + self::TYPE_RAW_COLNAME => array('ID', 'POSITION', 'SLIDE_ID', 'REF', 'REF_ID', ), + self::TYPE_FIELDNAME => array('id', 'position', 'slide_id', 'ref', 'ref_id', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'Position' => 1, 'SlideId' => 2, 'Ref' => 3, 'RefId' => 4, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'position' => 1, 'slideId' => 2, 'ref' => 3, 'refId' => 4, ), + self::TYPE_COLNAME => array(SlideRelTableMap::ID => 0, SlideRelTableMap::POSITION => 1, SlideRelTableMap::SLIDE_ID => 2, SlideRelTableMap::REF => 3, SlideRelTableMap::REF_ID => 4, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'POSITION' => 1, 'SLIDE_ID' => 2, 'REF' => 3, 'REF_ID' => 4, ), + self::TYPE_FIELDNAME => array('id' => 0, 'position' => 1, 'slide_id' => 2, 'ref' => 3, 'ref_id' => 4, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('slide_rel'); + $this->setPhpName('SlideRel'); + $this->setClassName('\\Slide\\Model\\SlideRel'); + $this->setPackage('Slide.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addColumn('POSITION', 'Position', 'INTEGER', true, null, 1); + $this->addForeignKey('SLIDE_ID', 'SlideId', 'INTEGER', 'slide_item', 'ID', true, null, null); + $this->addColumn('REF', 'Ref', 'VARCHAR', true, 255, null); + $this->addColumn('REF_ID', 'RefId', 'INTEGER', true, null, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + $this->addRelation('SlideItem', '\\Slide\\Model\\SlideItem', RelationMap::MANY_TO_ONE, array('slide_id' => 'id', ), 'CASCADE', null); + } // buildRelations() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? SlideRelTableMap::CLASS_DEFAULT : SlideRelTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (SlideRel object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = SlideRelTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = SlideRelTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + SlideRelTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = SlideRelTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + SlideRelTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = SlideRelTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = SlideRelTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + SlideRelTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(SlideRelTableMap::ID); + $criteria->addSelectColumn(SlideRelTableMap::POSITION); + $criteria->addSelectColumn(SlideRelTableMap::SLIDE_ID); + $criteria->addSelectColumn(SlideRelTableMap::REF); + $criteria->addSelectColumn(SlideRelTableMap::REF_ID); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.POSITION'); + $criteria->addSelectColumn($alias . '.SLIDE_ID'); + $criteria->addSelectColumn($alias . '.REF'); + $criteria->addSelectColumn($alias . '.REF_ID'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(SlideRelTableMap::DATABASE_NAME)->getTable(SlideRelTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(SlideRelTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(SlideRelTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new SlideRelTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a SlideRel or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or SlideRel object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideRelTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Slide\Model\SlideRel) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(SlideRelTableMap::DATABASE_NAME); + $criteria->add(SlideRelTableMap::ID, (array) $values, Criteria::IN); + } + + $query = SlideRelQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { SlideRelTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { SlideRelTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the slide_rel table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return SlideRelQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a SlideRel or Criteria object. + * + * @param mixed $criteria Criteria or SlideRel object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SlideRelTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from SlideRel object + } + + if ($criteria->containsKey(SlideRelTableMap::ID) && $criteria->keyContainsValue(SlideRelTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.SlideRelTableMap::ID.')'); + } + + + // Set the correct dbName + $query = SlideRelQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // SlideRelTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +SlideRelTableMap::buildTableMap(); diff --git a/local/modules/Slide/Model/SlideItem.php b/local/modules/Slide/Model/SlideItem.php new file mode 100644 index 00000000..72179c26 --- /dev/null +++ b/local/modules/Slide/Model/SlideItem.php @@ -0,0 +1,10 @@ +findOne(); + } catch (\Exception $ex) { + // the table doest not exist + $injectSql = true; + } + + if (true === $injectSql) { + $database = new Database($con); + $database->insertSql(null, array(__DIR__ . '/Config/thelia.sql')); + } + + return true; + } +} diff --git a/local/modules/Slide/templates/backOffice/default/slide-edit.html b/local/modules/Slide/templates/backOffice/default/slide-edit.html new file mode 100644 index 00000000..692c6a40 --- /dev/null +++ b/local/modules/Slide/templates/backOffice/default/slide-edit.html @@ -0,0 +1,88 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} +{$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl d='slide.bo.default' l='Edit slide'}{/block} + +{block name="check-module"}slide{/block} +{block name="check-access"}update{/block} + +{block name="main-content"} + +
+ +
+ + {loop name="slide_edit" type="slide" active="*" id="$slide_id" backend_context="1" limit="1"} + + + +
+
+
+ +
+ {intl d='slide.bo.default' l="Edit slide %name" name={$ID}} +
+ +
+
+ {form name="slide.update.form"} + +
+ {* Be sure to get the slide ID, even if the form could not be validated *} + + + {include file="includes/inner-form-toolbar.html" close_url="{url path='/admin/module/slides'}"} + + {form_hidden_fields form=$form} + + {form_field form=$form field='success_url'} + + {/form_field} + + {form_field form=$form field='id'} + + {/form_field} + + {if $form_error}
{$form_error_message}
{/if} + + {render_form_field form=$form field="title"} + + {render_form_field form=$form field="content"} + +
+ + {/form} +
+
+
+
+ +
+ + {/loop} + + {elseloop rel="slide_edit"} +
+
+
+ {intl d='slide.bo.default' l="Sorry, slide ID=%id was not found." id={$slide_id}} +
+
+
+ {/elseloop} + +
+
+{/block} + +{block name="javascript-last-call"} +{hook name="slide.edit-js" location="slide-edit-js" } +{/block} \ No newline at end of file diff --git a/local/modules/Slide/templates/backOffice/default/slides.html b/local/modules/Slide/templates/backOffice/default/slides.html new file mode 100644 index 00000000..793e21fe --- /dev/null +++ b/local/modules/Slide/templates/backOffice/default/slides.html @@ -0,0 +1,219 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} +{$admin_current_location = 'tools'} +{/block} + +{block name="page-title"}{intl d='slide.bo.default' l='Comments'}{/block} + +{block name="check-module"}slide{/block} +{block name="check-access"}view{/block} + +{block name="main-content"} + +
+ +
+ + + + {hook name="slides.top" location="slides_top" } + + {if $error_message} +
+
+
+ {$error_message} +
+
+
+ {/if} + + {* Loop Filter *} + {$loop_limit={$smarty.get.loop_limit|default:20}} + {$loop_page={$smarty.get.page|default:1}} + {$loop_order={$smarty.get.loop_order|default:'id'}} + + {assign var="amount" value={count type="slide" order=$loop_order backend_context="1"}} + {if $amount < ($loop_limit * ($loop_page - 1))} + {$loop_page=1} + {/if} + +
+
+
+ + + + + + + + + + + {loop type="slide" name="slide.list" order=$loop_order page=$loop_page limit=$loop_limit backend_context="1"} + + + + + + {/loop} + + + + + + +
+ {intl d='slide.bo.default' l="Slides management"} + + {loop type="auth" name="can_create" role="ADMIN" module="slide" access="CREATE"} + + + + + + {/loop} +
+ {admin_sortable_header + current_order=$loop_order + order='id' + reverse_order='id_reverse' + path={url path='/admin/module/slides'} + request_parameter_name='loop_order' + label="{intl l='ID'}" + } + {intl d='slide.bo.default' l="Title"}{intl d='slide.bo.default' l="Actions"}
{$ID}{$TITLE} + + {loop type="auth" name="can_change" role="ADMIN" module="slide" access="UPDATE"} + + + + {/loop} + + {loop type="auth" name="can_change" role="ADMIN" module="slide" access="DELETE"} + + + + {/loop} + +
+ {include + file = "includes/pagination.html" + + loop_ref = "slide.list" + max_page_count = $loop_limit + page_url = "{url path="/admin/module/slides"}" + } +
+
+
+ +
+ + {hook name="slides.bottom" location="slides_bottom" } + +
+
+ + + +{* Adding a new slide *} + +{form name="slide.create.form"} + +{* Capture the dialog body, to pass it to the generic dialog *} +{capture "creation_dialog"} + {form_hidden_fields form=$form} + + {render_form_field form=$form field="success_url" value={url path='/admin/module/slide/update/_ID_'}} + + {render_form_field form=$form field="title"} + +{/capture} + +{include + file = "includes/generic-create-dialog.html" + + dialog_id = "creation_dialog" + dialog_title = {intl l="Create a new slide"} + dialog_body = {$smarty.capture.creation_dialog nofilter} + + dialog_ok_label = {intl l="Create this slide"} + + form_action = {url path='/admin/module/slide/create'} + form_enctype = {form_enctype form=$form} + form_error_message = $form_error_message +} +{/form} + + +{* Delete confirmation dialog *} + +{capture "delete_dialog"} + + {hook name="slides.delete-form" location="slides_delete_form" } +{/capture} + +{include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "delete_dialog" + dialog_title = {intl d='slide.bo.default' l="Delete slide"} + dialog_message = {intl d='slide.bo.default' l="Do you really want to delete this slide ?"} + + form_action = {token_url path='/admin/module/slide/delete'} + form_content = {$smarty.capture.delete_dialog nofilter} + form_error_message = $error_delete_message +} + +
+ + + + +{/block} + +{block name="javascript-initialization"} + + +{/block} + +{block name="javascript-last-call"} +{hook name="slides.js" location="slides-js" } +{/block} \ No newline at end of file diff --git a/local/modules/Slide/templates/backOffice/default/tab-content-js.html b/local/modules/Slide/templates/backOffice/default/tab-content-js.html new file mode 100644 index 00000000..9ec2d271 --- /dev/null +++ b/local/modules/Slide/templates/backOffice/default/tab-content-js.html @@ -0,0 +1,50 @@ + \ No newline at end of file diff --git a/local/modules/Slide/templates/backOffice/default/tab-content.html b/local/modules/Slide/templates/backOffice/default/tab-content.html new file mode 100644 index 00000000..bf1b1c7f --- /dev/null +++ b/local/modules/Slide/templates/backOffice/default/tab-content.html @@ -0,0 +1,24 @@ +

{intl l="Slides" d='slide.bo.default'}

+ +
+{loop type="slide" name="slide"} + + {$position=''} + {loop type="slide-rel" name="slide-rel" limit="1" slide_id="$ID" ref="$ref" ref_id="$ref_id"} + {$position=$POSITION} + {/loop} + +
+
+ +
+ +
+{/loop} +
+ +
+
+ + + diff --git a/local/modules/Slide/templates/frontOffice/default/main-after-javascript-include.html b/local/modules/Slide/templates/frontOffice/default/main-after-javascript-include.html new file mode 100644 index 00000000..e6bd16fe --- /dev/null +++ b/local/modules/Slide/templates/frontOffice/default/main-after-javascript-include.html @@ -0,0 +1,4 @@ +{ifloop rel="main-slide"} + + +{/ifloop} \ No newline at end of file diff --git a/local/modules/Slide/templates/frontOffice/default/main-content-top.html b/local/modules/Slide/templates/frontOffice/default/main-content-top.html new file mode 100644 index 00000000..c4da94ee --- /dev/null +++ b/local/modules/Slide/templates/frontOffice/default/main-content-top.html @@ -0,0 +1,21 @@ +{ifloop rel="main-slide"} +
+
+ + +
+
+
+
    + {loop name="main-slide" type="slide-rel" ref="$ref" ref_id="$ref_id" order="position"} + {$CONTENT nofilter} + {/loop} +
+
+
+
+
+
+
+{/ifloop} \ No newline at end of file diff --git a/local/modules/Slide/templates/frontOffice/default/main-javascript-initialization.html b/local/modules/Slide/templates/frontOffice/default/main-javascript-initialization.html new file mode 100644 index 00000000..ba97636a --- /dev/null +++ b/local/modules/Slide/templates/frontOffice/default/main-javascript-initialization.html @@ -0,0 +1,24 @@ +{ifloop rel="main-slide"} + +{/ifloop} \ No newline at end of file diff --git a/local/modules/Slide/templates/frontOffice/default/main-stylesheet.html b/local/modules/Slide/templates/frontOffice/default/main-stylesheet.html new file mode 100644 index 00000000..3bb5f496 --- /dev/null +++ b/local/modules/Slide/templates/frontOffice/default/main-stylesheet.html @@ -0,0 +1,3 @@ + + + diff --git a/local/modules/SliderRevolution/Config/config.xml b/local/modules/SliderRevolution/Config/config.xml new file mode 100644 index 00000000..fb34e004 --- /dev/null +++ b/local/modules/SliderRevolution/Config/config.xml @@ -0,0 +1,42 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/SliderRevolution/Config/module.xml b/local/modules/SliderRevolution/Config/module.xml new file mode 100644 index 00000000..c577b4d8 --- /dev/null +++ b/local/modules/SliderRevolution/Config/module.xml @@ -0,0 +1,24 @@ + + + SliderRevolution\SliderRevolution + + Intégration du slider Slider Revolution + + + fr_FR + + 1.0.0 + + + Franck Allimant + CQFDev + thelia@cqfdev.fr + www.cqfdev.fr + + + classic + 2.3.0 + prod + diff --git a/local/modules/SliderRevolution/Config/routing.xml b/local/modules/SliderRevolution/Config/routing.xml new file mode 100644 index 00000000..6d5e45d7 --- /dev/null +++ b/local/modules/SliderRevolution/Config/routing.xml @@ -0,0 +1,10 @@ + + + + + + SliderRevolution\Controller\ConfigurationController::configure + + \ No newline at end of file diff --git a/local/modules/SliderRevolution/Config/schema.xml b/local/modules/SliderRevolution/Config/schema.xml new file mode 100644 index 00000000..af89b080 --- /dev/null +++ b/local/modules/SliderRevolution/Config/schema.xml @@ -0,0 +1,15 @@ + + + + + + + + + +
+ + +
diff --git a/local/modules/SliderRevolution/Config/sqldb.map b/local/modules/SliderRevolution/Config/sqldb.map new file mode 100644 index 00000000..63a93baa --- /dev/null +++ b/local/modules/SliderRevolution/Config/sqldb.map @@ -0,0 +1,2 @@ +# Sqlfile -> Database map +thelia.sql=thelia diff --git a/local/modules/SliderRevolution/Config/thelia.sql b/local/modules/SliderRevolution/Config/thelia.sql new file mode 100644 index 00000000..d7db122a --- /dev/null +++ b/local/modules/SliderRevolution/Config/thelia.sql @@ -0,0 +1,22 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- slider_association +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `slider_association`; + +CREATE TABLE `slider_association` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `slider_alias` VARCHAR(255), + `object_id` INTEGER NOT NULL, + `object_type` VARCHAR(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/local/modules/SliderRevolution/Controller/ConfigurationController.php b/local/modules/SliderRevolution/Controller/ConfigurationController.php new file mode 100644 index 00000000..08a7f573 --- /dev/null +++ b/local/modules/SliderRevolution/Controller/ConfigurationController.php @@ -0,0 +1,76 @@ + + */ +class ConfigurationController extends BaseAdminController +{ + public function configure() + { + if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'SliderRevolution', AccessManager::UPDATE)) { + return $response; + } + + $configurationForm = $this->createForm('sliderrevolution.form.configure'); + + try { + $form = $this->validateForm($configurationForm, "POST"); + + // Get the form field values + $data = $form->getData(); + + foreach ($data as $name => $value) { + if (is_array($value)) { + $value = implode(';', $value); + } + + SliderRevolution::setConfigValue($name, $value); + } + + $this->adminLogAppend( + "sliderrevolution.configuration.message", + AccessManager::UPDATE, + sprintf("Configuration du franco mise à jour") + ); + + if ($this->getRequest()->get('save_mode') == 'stay') { + // If we have to stay on the same page, redisplay the configuration page/ + $url = '/admin/module/SliderRevolution'; + } else { + // If we have to close the page, go back to the module back-office page. + $url = '/admin/modules'; + } + + return $this->generateRedirect(URL::getInstance()->absoluteUrl($url)); + } catch (FormValidationException $ex) { + $error_msg = $this->createStandardFormValidationErrorMessage($ex); + } catch (\Exception $ex) { + $error_msg = $ex->getMessage(); + } + + $this->setupFormErrorContext( + $this->getTranslator()->trans("Configuration du franco", [], SliderRevolution::DOMAIN_NAME), + $error_msg, + $configurationForm, + $ex + ); + + return $this->generateRedirect(URL::getInstance()->absoluteUrl('/admin/module/SliderRevolution')); + } +} diff --git a/local/modules/SliderRevolution/EventListener/EventManager.php b/local/modules/SliderRevolution/EventListener/EventManager.php new file mode 100644 index 00000000..a99ab6da --- /dev/null +++ b/local/modules/SliderRevolution/EventListener/EventManager.php @@ -0,0 +1,161 @@ + + * Date: 28/03/2019 17:22 + */ +namespace SliderRevolution\EventListener; + +use SliderRevolution\Model\SliderAssociation; +use SliderRevolution\Model\SliderAssociationQuery; +use SliderRevolution\SliderRevolution; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Thelia\Core\Event\Brand\BrandEvent; +use Thelia\Core\Event\Category\CategoryEvent; +use Thelia\Core\Event\Content\ContentEvent; +use Thelia\Core\Event\Folder\FolderEvent; +use Thelia\Core\Event\Product\ProductEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Core\Event\TheliaFormEvent; +use Thelia\Core\Translation\Translator; + +class EventManager implements EventSubscriberInterface +{ + + public static function getSubscribedEvents() + { + return [ + TheliaEvents::FORM_BEFORE_BUILD . ".thelia_product_modification" => ['addSliderSelectorToForm', 128], + TheliaEvents::FORM_BEFORE_BUILD . ".thelia_category_modification" => ['addSliderSelectorToForm', 128], + TheliaEvents::FORM_BEFORE_BUILD . ".thelia_content_modification" => ['addSliderSelectorToForm', 128], + TheliaEvents::FORM_BEFORE_BUILD . ".thelia_folder_modification" => ['addSliderSelectorToForm', 128], + TheliaEvents::FORM_BEFORE_BUILD . ".thelia_brand_modification" => ['addSliderSelectorToForm', 128], + + TheliaEvents::CATEGORY_UPDATE => ['processCategorySelectedSlider', 100], + TheliaEvents::PRODUCT_UPDATE => ['processProductSelectedSlider', 100], + TheliaEvents::CONTENT_UPDATE => ['processContentSelectedSlider', 100], + TheliaEvents::FOLDER_UPDATE => ['processFolderSelectedSlider', 100], + TheliaEvents::BRAND_UPDATE => ['processBrandSelectedSlider', 100], + ]; + } + + public function addSliderSelectorToForm(TheliaFormEvent $event) + { + $event->getForm()->getFormBuilder()->add( + 'slider_id', + 'text', + [ + 'required' => false, + 'label' => Translator::getInstance()->trans( + 'Slider associé', + [], + SliderRevolution::DOMAIN_NAME + ), + 'label_attr' => [ + 'help' => Translator::getInstance()->trans( + 'Choisissez ici le slider à associer à cet élément.', + [ ], + SliderRevolution::DOMAIN_NAME + ) + ] + ] + ); + } + + /** + * @param CategoryEvent $event + * @throws \Propel\Runtime\Exception\PropelException + */ + public function processCategorySelectedSlider(CategoryEvent $event) + { + // Utilise le principe NON DOCUMENTE qui dit que si une form bindée à un event trouve + // un champ absent de l'event, elle le rend accessible à travers une méthode magique. + // (cf. ActionEvent::bindForm()) + $sliderId = trim($event->slider_id); + + $this->processSelectedSlider($sliderId, 'category', $event->getCategory()->getId()); + } + + /** + * @param CategoryEvent $event + * @throws \Propel\Runtime\Exception\PropelException + */ + public function processProductSelectedSlider(ProductEvent $event) + { + // Utilise le principe NON DOCUMENTE qui dit que si une form bindée à un event trouve + // un champ absent de l'event, elle le rend accessible à travers une méthode magique. + // (cf. ActionEvent::bindForm()) + $sliderId = trim($event->slider_id); + + $this->processSelectedSlider($sliderId, 'product', $event->getProduct()->getId()); + } + + /** + * @param CategoryEvent $event + * @throws \Propel\Runtime\Exception\PropelException + */ + public function processContentSelectedSlider(ContentEvent $event) + { + // Utilise le principe NON DOCUMENTE qui dit que si une form bindée à un event trouve + // un champ absent de l'event, elle le rend accessible à travers une méthode magique. + // (cf. ActionEvent::bindForm()) + $sliderId = trim($event->slider_id); + + $this->processSelectedSlider($sliderId, 'content', $event->getContent()->getId()); + } + + /** + * @param CategoryEvent $event + * @throws \Propel\Runtime\Exception\PropelException + */ + public function processFolderSelectedSlider(FolderEvent $event) + { + // Utilise le principe NON DOCUMENTE qui dit que si une form bindée à un event trouve + // un champ absent de l'event, elle le rend accessible à travers une méthode magique. + // (cf. ActionEvent::bindForm()) + $sliderId = trim($event->slider_id); + + $this->processSelectedSlider($sliderId, 'folder', $event->getFolder()->getId()); + } + + /** + * @param CategoryEvent $event + * @throws \Propel\Runtime\Exception\PropelException + */ + public function processBrandSelectedSlider(BrandEvent $event) + { + // Utilise le principe NON DOCUMENTE qui dit que si une form bindée à un event trouve + // un champ absent de l'event, elle le rend accessible à travers une méthode magique. + // (cf. ActionEvent::bindForm()) + $sliderId = trim($event->slider_id); + + $this->processSelectedSlider($sliderId, 'brand', $event->getBrand()->getId()); + } + + /** + * @param $sliderId + * @param $objectId + * @param $objectType + * @throws \Propel\Runtime\Exception\PropelException + */ + protected function processSelectedSlider($sliderId, $objectType, $objectId) + { + if (null === $sliderAssoc = SliderAssociationQuery::create()->filterByObjectId($objectId)->filterByObjectType($objectType)->findOne()) { + $sliderAssoc = (new SliderAssociation()) + ->setObjectId($objectId) + ->setObjectType($objectType); + } + + $sliderAssoc + ->setSliderAlias($sliderId) + ->save(); + } +} diff --git a/local/modules/SliderRevolution/Form/ConfigurationForm.php b/local/modules/SliderRevolution/Form/ConfigurationForm.php new file mode 100644 index 00000000..4ce259dd --- /dev/null +++ b/local/modules/SliderRevolution/Form/ConfigurationForm.php @@ -0,0 +1,59 @@ + + */ +class ConfigurationForm extends BaseForm +{ + protected function buildForm() + { + $this->formBuilder + ->add( + SliderRevolution::SLIDER_ID, + 'text', + [ + 'constraints' => [new NotBlank()], + 'label' => $this->translator->trans('Identifiant du slider à afficher', [], SliderRevolution::DOMAIN_NAME), + 'data' => SliderRevolution::getConfigValue(SliderRevolution::SLIDER_ID), + ] + ) + ->add( + SliderRevolution::FIN_COMPTE_A_REBOURS, + 'text', + [ + 'required' => false, + 'constraints' => [new Callback([ "methods" => [[ $this, "checkDate" ]]]),], + 'label' => $this->translator->trans('Date de fin de compte à rebours (format JJ/MM/AAAA HH:MM:SS)', [], SliderRevolution::DOMAIN_NAME), + 'data' => SliderRevolution::getConfigValue(SliderRevolution::FIN_COMPTE_A_REBOURS, ''), + 'label_attr' => [ + 'help' => $this->translator->trans("Si une date est indiquée, un compte à rebours sera affiché sur les sliders qui ont les layer texte requises (ID t_days, t_hours, t_minutes et t_seconds), cf https://www.themepunch.com/revsliderjquery-doc/countdown", [], SliderRevolution::DOMAIN_NAME) + ] + ] + ) + ; + } + + public function checkDate($value, ExecutionContextInterface $context) + { + if (! empty($value) && false === \DateTime::createFromFormat('d/m/Y H:i:s', $value)) { + $context->addViolation("Merci d'indiquer une date au format JJ/MM/AAAA HH:MM:SS, par exemple 17/11/2018 12:30:00"); + } + } +} diff --git a/local/modules/SliderRevolution/Hook/BackHookManager.php b/local/modules/SliderRevolution/Hook/BackHookManager.php new file mode 100644 index 00000000..f0660b78 --- /dev/null +++ b/local/modules/SliderRevolution/Hook/BackHookManager.php @@ -0,0 +1,88 @@ + + * Date: 05/03/2016 18:11 + */ + +namespace SliderRevolution\Hook; + +use SliderRevolution\Model\SliderAssociationQuery; +use SliderRevolution\SliderRevolution; +use Thelia\Core\Event\Hook\HookRenderEvent; +use Thelia\Core\Hook\BaseHook; +use Thelia\Model\ModuleConfig; +use Thelia\Model\ModuleConfigQuery; + +class BackHookManager extends BaseHook +{ + public function onModuleConfigure(HookRenderEvent $event) + { + $vars = []; + + if (null !== $params = ModuleConfigQuery::create()->findByModuleId(SliderRevolution::getModuleId())) { + /** @var ModuleConfig $param */ + foreach ($params as $param) { + $vars[ $param->getName() ] = $param->getValue(); + } + } + + $event->add( + $this->render('sliderrevolution/module-configuration.html', $vars) + ); + } + + public function onCategoryEditRightColumnBottom(HookRenderEvent $event) + { + return $this->renderSliderAssocSelector($event, 'category', $event->getArgument('category_id')); + } + + public function onContentEditRightColumnBottom(HookRenderEvent $event) + { + return $this->renderSliderAssocSelector($event, 'content', $event->getArgument('content_id')); + } + + public function onFolderEditRightColumnBottom(HookRenderEvent $event) + { + return $this->renderSliderAssocSelector($event, 'folder', $event->getArgument('folder_id')); + } + + public function onBrandEditRightColumnBottom(HookRenderEvent $event) + { + return $this->renderSliderAssocSelector($event, 'brand', $event->getArgument('brand_id')); + } + + public function onProductEditRightColumnBottom(HookRenderEvent $event) + { + return $this->renderSliderAssocSelector($event, 'product', $event->getArgument('product_id')); + } + + protected function renderSliderAssocSelector(HookRenderEvent $event, $objectType, $objectId) + { + if (null !== $sliderAssoc = SliderAssociationQuery::create() + ->filterByObjectType($objectType) + ->filterByObjectId($objectId) + ->findOne()) { + $sliderAlias = $sliderAssoc->getSliderAlias(); + } else { + $sliderAlias = ''; + } + + $event->add( + $this->render( + "sliderrevolution/slider-selector.html", + [ + 'slider_alias' => $sliderAlias + ] + ) + ); + } + +} diff --git a/local/modules/SliderRevolution/Hook/FrontHookManager.php b/local/modules/SliderRevolution/Hook/FrontHookManager.php new file mode 100644 index 00000000..c2ec6c4e --- /dev/null +++ b/local/modules/SliderRevolution/Hook/FrontHookManager.php @@ -0,0 +1,85 @@ + + * Date: 05/03/2016 18:11 + */ + +namespace SliderRevolution\Hook; + +use Propel\Runtime\ActiveQuery\Criteria; +use SliderRevolution\Model\SliderAssociationQuery; +use SliderRevolution\SliderRevolution; +use Thelia\Core\Event\Hook\HookRenderEvent; +use Thelia\Core\Hook\BaseHook; + +require_once __DIR__ . "/../../../../web/revslider/embed_thelia.php"; + +class FrontHookManager extends BaseHook +{ + private $jsCode = ''; + + public function onMainStylesheet(HookRenderEvent $event) + { + if (null !== SliderRevolution::getConfigValue(SliderRevolution::SLIDER_ID)) { + $event->add( + \RevSliderEmbedder::cssIncludes(false) + ); + } + } + + public function onMainJavascriptInitialization(HookRenderEvent $event) + { + if (null !== SliderRevolution::getConfigValue(SliderRevolution::SLIDER_ID)) { + $event->add( + \RevSliderEmbedder::jsIncludes(false, false) . $this->jsCode + ); + } + } + + public function onMainContentTop(HookRenderEvent $event) + { + $view = $this->getView(); + + if ($this->isAcceptedView($view)) { + if ($view === "index") { + if (null !== $slider = SliderRevolution::getConfigValue(SliderRevolution::SLIDER_ID)) { + $event->add( + \RevSliderEmbedder::putRevSlider($slider, '', $this->jsCode) + ); + } + } else { + if (null !== $sliderAssoc = SliderAssociationQuery::create() + ->filterByObjectType($view) + ->filterByObjectId( $this->getRequest()->get($view . '_id')) + ->filterBySliderAlias('', Criteria::NOT_EQUAL) + ->findOne()) { + $event->add( + \RevSliderEmbedder::putRevSlider($sliderAssoc->getSliderAlias(), '', $this->jsCode) + ); + } + } + } + } + + protected function isAcceptedView($view) + { + $acceptedViews = [ + 'category', + 'product', + 'folder', + 'content', + 'brand', + 'index' + ]; + + return in_array($view, $acceptedViews); + } +} diff --git a/local/modules/SliderRevolution/I18n/en_US.php b/local/modules/SliderRevolution/I18n/en_US.php new file mode 100644 index 00000000..0b4fa142 --- /dev/null +++ b/local/modules/SliderRevolution/I18n/en_US.php @@ -0,0 +1,4 @@ + 'The displayed english string', +); diff --git a/local/modules/SliderRevolution/I18n/fr_FR.php b/local/modules/SliderRevolution/I18n/fr_FR.php new file mode 100644 index 00000000..37086245 --- /dev/null +++ b/local/modules/SliderRevolution/I18n/fr_FR.php @@ -0,0 +1,4 @@ + 'La traduction française de la chaine', +); diff --git a/local/modules/SliderRevolution/Loop/SliderLoop.php b/local/modules/SliderRevolution/Loop/SliderLoop.php new file mode 100644 index 00000000..059340e0 --- /dev/null +++ b/local/modules/SliderRevolution/Loop/SliderLoop.php @@ -0,0 +1,71 @@ + + * Date: 25/04/2019 18:57 + */ +namespace SliderRevolution\Loop; + +use Propel\Runtime\Connection\PropelPDO; +use Propel\Runtime\Propel; +use Propel\Runtime\ServiceContainer\ServiceContainerInterface; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; +use Thelia\Core\Template\Element\BaseLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; + +class SliderLoop extends BaseLoop implements ArraySearchLoopInterface +{ + public function buildArray() + { + $query = "select id,alias,title from revslider_sliders where type = ''"; + + /** @var PropelPDO $connection */ + $connection = Propel::getConnection('thelia'); + + $statement = $connection->query($query); + + $result = []; + + while ($statement && $row = $statement->fetch(\PDO::FETCH_ASSOC)) { + $result[] = [ + 'id' => $row['id'], + 'alias' => $row['alias'], + 'title' => $row['title'] + ]; + } + + return $result; + } + + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $data) { + $loopResultRow = new LoopResultRow($data); + + $loopResultRow + ->set("ID", $data['id']) + ->set("ALIAS", $data['alias']) + ->set("TITLE", $data['title']) + ; + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + protected function getArgDefinitions() + { + return new ArgumentCollection(); + } +} diff --git a/local/modules/SliderRevolution/Model/Base/SliderAssociation.php b/local/modules/SliderRevolution/Model/Base/SliderAssociation.php new file mode 100644 index 00000000..2f8f8347 --- /dev/null +++ b/local/modules/SliderRevolution/Model/Base/SliderAssociation.php @@ -0,0 +1,1226 @@ +modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (Boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (Boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another SliderAssociation instance. If + * obj is an instance of SliderAssociation, delegates to + * equals(SliderAssociation). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + $thisclazz = get_class($this); + if (!is_object($obj) || !($obj instanceof $thisclazz)) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() + || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + if (null !== $this->getPrimaryKey()) { + return crc32(serialize($this->getPrimaryKey())); + } + + return crc32(serialize(clone $this)); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return SliderAssociation The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * + * @return SliderAssociation The current object, for fluid interface + */ + public function importFrom($parser, $data) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), TableMap::TYPE_PHPNAME); + + return $this; + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + + return $this->id; + } + + /** + * Get the [slider_alias] column value. + * + * @return string + */ + public function getSliderAlias() + { + + return $this->slider_alias; + } + + /** + * Get the [object_id] column value. + * + * @return int + */ + public function getObjectId() + { + + return $this->object_id; + } + + /** + * Get the [object_type] column value. + * + * @return string + */ + public function getObjectType() + { + + return $this->object_type; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return \SliderRevolution\Model\SliderAssociation The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[SliderAssociationTableMap::ID] = true; + } + + + return $this; + } // setId() + + /** + * Set the value of [slider_alias] column. + * + * @param string $v new value + * @return \SliderRevolution\Model\SliderAssociation The current object (for fluent API support) + */ + public function setSliderAlias($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->slider_alias !== $v) { + $this->slider_alias = $v; + $this->modifiedColumns[SliderAssociationTableMap::SLIDER_ALIAS] = true; + } + + + return $this; + } // setSliderAlias() + + /** + * Set the value of [object_id] column. + * + * @param int $v new value + * @return \SliderRevolution\Model\SliderAssociation The current object (for fluent API support) + */ + public function setObjectId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->object_id !== $v) { + $this->object_id = $v; + $this->modifiedColumns[SliderAssociationTableMap::OBJECT_ID] = true; + } + + + return $this; + } // setObjectId() + + /** + * Set the value of [object_type] column. + * + * @param string $v new value + * @return \SliderRevolution\Model\SliderAssociation The current object (for fluent API support) + */ + public function setObjectType($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->object_type !== $v) { + $this->object_type = $v; + $this->modifiedColumns[SliderAssociationTableMap::OBJECT_TYPE] = true; + } + + + return $this; + } // setObjectType() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : SliderAssociationTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : SliderAssociationTableMap::translateFieldName('SliderAlias', TableMap::TYPE_PHPNAME, $indexType)]; + $this->slider_alias = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : SliderAssociationTableMap::translateFieldName('ObjectId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->object_id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : SliderAssociationTableMap::translateFieldName('ObjectType', TableMap::TYPE_PHPNAME, $indexType)]; + $this->object_type = (null !== $col) ? (string) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 4; // 4 = SliderAssociationTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException("Error populating \SliderRevolution\Model\SliderAssociation object", 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(SliderAssociationTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildSliderAssociationQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see SliderAssociation::setDeleted() + * @see SliderAssociation::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(SliderAssociationTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + try { + $deleteQuery = ChildSliderAssociationQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $con->commit(); + $this->setDeleted(true); + } else { + $con->commit(); + } + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(SliderAssociationTableMap::DATABASE_NAME); + } + + $con->beginTransaction(); + $isInsert = $this->isNew(); + try { + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + SliderAssociationTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + $con->commit(); + + return $affectedRows; + } catch (Exception $e) { + $con->rollBack(); + throw $e; + } + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + } else { + $this->doUpdate($con); + } + $affectedRows += 1; + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[SliderAssociationTableMap::ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . SliderAssociationTableMap::ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(SliderAssociationTableMap::ID)) { + $modifiedColumns[':p' . $index++] = 'ID'; + } + if ($this->isColumnModified(SliderAssociationTableMap::SLIDER_ALIAS)) { + $modifiedColumns[':p' . $index++] = 'SLIDER_ALIAS'; + } + if ($this->isColumnModified(SliderAssociationTableMap::OBJECT_ID)) { + $modifiedColumns[':p' . $index++] = 'OBJECT_ID'; + } + if ($this->isColumnModified(SliderAssociationTableMap::OBJECT_TYPE)) { + $modifiedColumns[':p' . $index++] = 'OBJECT_TYPE'; + } + + $sql = sprintf( + 'INSERT INTO slider_association (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'ID': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'SLIDER_ALIAS': + $stmt->bindValue($identifier, $this->slider_alias, PDO::PARAM_STR); + break; + case 'OBJECT_ID': + $stmt->bindValue($identifier, $this->object_id, PDO::PARAM_INT); + break; + case 'OBJECT_TYPE': + $stmt->bindValue($identifier, $this->object_type, PDO::PARAM_STR); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = SliderAssociationTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getSliderAlias(); + break; + case 2: + return $this->getObjectId(); + break; + case 3: + return $this->getObjectType(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + if (isset($alreadyDumpedObjects['SliderAssociation'][$this->getPrimaryKey()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['SliderAssociation'][$this->getPrimaryKey()] = true; + $keys = SliderAssociationTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getSliderAlias(), + $keys[2] => $this->getObjectId(), + $keys[3] => $this->getObjectType(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return void + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = SliderAssociationTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setSliderAlias($value); + break; + case 2: + $this->setObjectId($value); + break; + case 3: + $this->setObjectType($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = SliderAssociationTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); + if (array_key_exists($keys[1], $arr)) $this->setSliderAlias($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setObjectId($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setObjectType($arr[$keys[3]]); + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(SliderAssociationTableMap::DATABASE_NAME); + + if ($this->isColumnModified(SliderAssociationTableMap::ID)) $criteria->add(SliderAssociationTableMap::ID, $this->id); + if ($this->isColumnModified(SliderAssociationTableMap::SLIDER_ALIAS)) $criteria->add(SliderAssociationTableMap::SLIDER_ALIAS, $this->slider_alias); + if ($this->isColumnModified(SliderAssociationTableMap::OBJECT_ID)) $criteria->add(SliderAssociationTableMap::OBJECT_ID, $this->object_id); + if ($this->isColumnModified(SliderAssociationTableMap::OBJECT_TYPE)) $criteria->add(SliderAssociationTableMap::OBJECT_TYPE, $this->object_type); + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(SliderAssociationTableMap::DATABASE_NAME); + $criteria->add(SliderAssociationTableMap::ID, $this->id); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \SliderRevolution\Model\SliderAssociation (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setSliderAlias($this->getSliderAlias()); + $copyObj->setObjectId($this->getObjectId()); + $copyObj->setObjectType($this->getObjectType()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \SliderRevolution\Model\SliderAssociation Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Clears the current object and sets all attributes to their default values + */ + public function clear() + { + $this->id = null; + $this->slider_alias = null; + $this->object_id = null; + $this->object_type = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references to other model objects or collections of model objects. + * + * This method is a user-space workaround for PHP's inability to garbage collect + * objects with circular references (even in PHP 5.3). This is currently necessary + * when using Propel in certain daemon or large-volume/high-memory operations. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(SliderAssociationTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/local/modules/SliderRevolution/Model/Base/SliderAssociationQuery.php b/local/modules/SliderRevolution/Model/Base/SliderAssociationQuery.php new file mode 100644 index 00000000..685d25e2 --- /dev/null +++ b/local/modules/SliderRevolution/Model/Base/SliderAssociationQuery.php @@ -0,0 +1,455 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildSliderAssociation|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = SliderAssociationTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(SliderAssociationTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildSliderAssociation A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, SLIDER_ALIAS, OBJECT_ID, OBJECT_TYPE FROM slider_association WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildSliderAssociation(); + $obj->hydrate($row); + SliderAssociationTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildSliderAssociation|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(SliderAssociationTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(SliderAssociationTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(SliderAssociationTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(SliderAssociationTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SliderAssociationTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the slider_alias column + * + * Example usage: + * + * $query->filterBySliderAlias('fooValue'); // WHERE slider_alias = 'fooValue' + * $query->filterBySliderAlias('%fooValue%'); // WHERE slider_alias LIKE '%fooValue%' + * + * + * @param string $sliderAlias The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function filterBySliderAlias($sliderAlias = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($sliderAlias)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $sliderAlias)) { + $sliderAlias = str_replace('*', '%', $sliderAlias); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(SliderAssociationTableMap::SLIDER_ALIAS, $sliderAlias, $comparison); + } + + /** + * Filter the query on the object_id column + * + * Example usage: + * + * $query->filterByObjectId(1234); // WHERE object_id = 1234 + * $query->filterByObjectId(array(12, 34)); // WHERE object_id IN (12, 34) + * $query->filterByObjectId(array('min' => 12)); // WHERE object_id > 12 + * + * + * @param mixed $objectId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function filterByObjectId($objectId = null, $comparison = null) + { + if (is_array($objectId)) { + $useMinMax = false; + if (isset($objectId['min'])) { + $this->addUsingAlias(SliderAssociationTableMap::OBJECT_ID, $objectId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($objectId['max'])) { + $this->addUsingAlias(SliderAssociationTableMap::OBJECT_ID, $objectId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(SliderAssociationTableMap::OBJECT_ID, $objectId, $comparison); + } + + /** + * Filter the query on the object_type column + * + * Example usage: + * + * $query->filterByObjectType('fooValue'); // WHERE object_type = 'fooValue' + * $query->filterByObjectType('%fooValue%'); // WHERE object_type LIKE '%fooValue%' + * + * + * @param string $objectType The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function filterByObjectType($objectType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($objectType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $objectType)) { + $objectType = str_replace('*', '%', $objectType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(SliderAssociationTableMap::OBJECT_TYPE, $objectType, $comparison); + } + + /** + * Exclude object from result + * + * @param ChildSliderAssociation $sliderAssociation Object to remove from the list of results + * + * @return ChildSliderAssociationQuery The current query, for fluid interface + */ + public function prune($sliderAssociation = null) + { + if ($sliderAssociation) { + $this->addUsingAlias(SliderAssociationTableMap::ID, $sliderAssociation->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the slider_association table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SliderAssociationTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + SliderAssociationTableMap::clearInstancePool(); + SliderAssociationTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildSliderAssociation or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildSliderAssociation object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SliderAssociationTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(SliderAssociationTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + SliderAssociationTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + SliderAssociationTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + +} // SliderAssociationQuery diff --git a/local/modules/SliderRevolution/Model/Map/SliderAssociationTableMap.php b/local/modules/SliderRevolution/Model/Map/SliderAssociationTableMap.php new file mode 100644 index 00000000..8a4c7638 --- /dev/null +++ b/local/modules/SliderRevolution/Model/Map/SliderAssociationTableMap.php @@ -0,0 +1,426 @@ + array('Id', 'SliderAlias', 'ObjectId', 'ObjectType', ), + self::TYPE_STUDLYPHPNAME => array('id', 'sliderAlias', 'objectId', 'objectType', ), + self::TYPE_COLNAME => array(SliderAssociationTableMap::ID, SliderAssociationTableMap::SLIDER_ALIAS, SliderAssociationTableMap::OBJECT_ID, SliderAssociationTableMap::OBJECT_TYPE, ), + self::TYPE_RAW_COLNAME => array('ID', 'SLIDER_ALIAS', 'OBJECT_ID', 'OBJECT_TYPE', ), + self::TYPE_FIELDNAME => array('id', 'slider_alias', 'object_id', 'object_type', ), + self::TYPE_NUM => array(0, 1, 2, 3, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'SliderAlias' => 1, 'ObjectId' => 2, 'ObjectType' => 3, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'sliderAlias' => 1, 'objectId' => 2, 'objectType' => 3, ), + self::TYPE_COLNAME => array(SliderAssociationTableMap::ID => 0, SliderAssociationTableMap::SLIDER_ALIAS => 1, SliderAssociationTableMap::OBJECT_ID => 2, SliderAssociationTableMap::OBJECT_TYPE => 3, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'SLIDER_ALIAS' => 1, 'OBJECT_ID' => 2, 'OBJECT_TYPE' => 3, ), + self::TYPE_FIELDNAME => array('id' => 0, 'slider_alias' => 1, 'object_id' => 2, 'object_type' => 3, ), + self::TYPE_NUM => array(0, 1, 2, 3, ) + ); + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('slider_association'); + $this->setPhpName('SliderAssociation'); + $this->setClassName('\\SliderRevolution\\Model\\SliderAssociation'); + $this->setPackage('SliderRevolution.Model'); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); + $this->addColumn('SLIDER_ALIAS', 'SliderAlias', 'VARCHAR', false, 255, null); + $this->addColumn('OBJECT_ID', 'ObjectId', 'INTEGER', true, null, null); + $this->addColumn('OBJECT_TYPE', 'ObjectType', 'VARCHAR', true, 10, null); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? SliderAssociationTableMap::CLASS_DEFAULT : SliderAssociationTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (SliderAssociation object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = SliderAssociationTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = SliderAssociationTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + SliderAssociationTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = SliderAssociationTableMap::OM_CLASS; + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + SliderAssociationTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = SliderAssociationTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = SliderAssociationTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + SliderAssociationTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(SliderAssociationTableMap::ID); + $criteria->addSelectColumn(SliderAssociationTableMap::SLIDER_ALIAS); + $criteria->addSelectColumn(SliderAssociationTableMap::OBJECT_ID); + $criteria->addSelectColumn(SliderAssociationTableMap::OBJECT_TYPE); + } else { + $criteria->addSelectColumn($alias . '.ID'); + $criteria->addSelectColumn($alias . '.SLIDER_ALIAS'); + $criteria->addSelectColumn($alias . '.OBJECT_ID'); + $criteria->addSelectColumn($alias . '.OBJECT_TYPE'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(SliderAssociationTableMap::DATABASE_NAME)->getTable(SliderAssociationTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(SliderAssociationTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(SliderAssociationTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new SliderAssociationTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a SliderAssociation or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or SliderAssociation object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SliderAssociationTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \SliderRevolution\Model\SliderAssociation) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(SliderAssociationTableMap::DATABASE_NAME); + $criteria->add(SliderAssociationTableMap::ID, (array) $values, Criteria::IN); + } + + $query = SliderAssociationQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { SliderAssociationTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { SliderAssociationTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the slider_association table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return SliderAssociationQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a SliderAssociation or Criteria object. + * + * @param mixed $criteria Criteria or SliderAssociation object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(SliderAssociationTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from SliderAssociation object + } + + if ($criteria->containsKey(SliderAssociationTableMap::ID) && $criteria->keyContainsValue(SliderAssociationTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.SliderAssociationTableMap::ID.')'); + } + + + // Set the correct dbName + $query = SliderAssociationQuery::create()->mergeWith($criteria); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->beginTransaction(); + $pk = $query->doInsert($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $pk; + } + +} // SliderAssociationTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +SliderAssociationTableMap::buildTableMap(); diff --git a/local/modules/SliderRevolution/Model/SliderAssociation.php b/local/modules/SliderRevolution/Model/SliderAssociation.php new file mode 100644 index 00000000..1580d04e --- /dev/null +++ b/local/modules/SliderRevolution/Model/SliderAssociation.php @@ -0,0 +1,10 @@ +/local/modules/``` directory and be sure that the name of the module is SliderRevolution. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require your-vendor/slider-revolution-module:~1.0 +``` + +## Usage + +Explain here how to use your module, how to configure it, etc. + +## Hook + +If your module use one or more hook, fill this part. Explain which hooks are used. + + +## Loop + +If your module declare one or more loop, describe them here like this : + +[loop name] + +### Input arguments + +|Argument |Description | +|--- |--- | +|**arg1** | describe arg1 with an exemple. | +|**arg2** | describe arg2 with an exemple. | + +### Output arguments + +|Variable |Description | +|--- |--- | +|$VAR1 | describe $VAR1 variable | +|$VAR2 | describe $VAR2 variable | + +### Exemple + +Add a complete exemple of your loop + +## Other ? + +If you have other think to put, feel free to complete your readme as you want. diff --git a/local/modules/SliderRevolution/SliderRevolution.php b/local/modules/SliderRevolution/SliderRevolution.php new file mode 100644 index 00000000..dcda744d --- /dev/null +++ b/local/modules/SliderRevolution/SliderRevolution.php @@ -0,0 +1,40 @@ +findOne(); + } catch (\Exception $ex) { + $database = new Database($con); + + $database->insertSql(null, [__DIR__ . '/Config/thelia.sql']); + } + } +} diff --git a/local/modules/SliderRevolution/Smarty/CountdownDate.php b/local/modules/SliderRevolution/Smarty/CountdownDate.php new file mode 100644 index 00000000..a4bd1ac9 --- /dev/null +++ b/local/modules/SliderRevolution/Smarty/CountdownDate.php @@ -0,0 +1,64 @@ + $today) { + return $date->getTimestamp(); + } + } + } + + return 0; + } + + /** + * Defines the various smarty plugins handled by this class + * + * @return \TheliaSmarty\Template\SmartyPluginDescriptor[] smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'slider_revolution_countdown', $this, 'getCountdownDate') + ); + } +} diff --git a/local/modules/SliderRevolution/composer.json b/local/modules/SliderRevolution/composer.json new file mode 100644 index 00000000..e2ef1ea4 --- /dev/null +++ b/local/modules/SliderRevolution/composer.json @@ -0,0 +1,11 @@ +{ + "name": "your-vendor/slider-revolution-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "SliderRevolution" + } +} \ No newline at end of file diff --git a/local/modules/SliderRevolution/templates/backOffice/default/sliderrevolution/module-configuration.html b/local/modules/SliderRevolution/templates/backOffice/default/sliderrevolution/module-configuration.html new file mode 100644 index 00000000..8dc73590 --- /dev/null +++ b/local/modules/SliderRevolution/templates/backOffice/default/sliderrevolution/module-configuration.html @@ -0,0 +1,52 @@ +
+
+
+
+ {intl d='sliderrevolution.bo.default' l="Configuration Slider Revolution"} +
+
+ +
+
+
+ {form name="sliderrevolution.form.configure"} + + + {form_hidden_fields form=$form} + + {include file = "includes/inner-form-toolbar.html" + hide_flags = true + page_url = "{url path='/admin/module/sliderrevolution'}" + close_url = "{url path='/admin/modules'}" + } + + {if $form_error} +
+
+
{$form_error_message}
+
+
+ {/if} + +
+ {custom_render_form_field field='slider_id'} + + {/custom_render_form_field} + {render_form_field field='countdown_end'} +
+ + {/form} +
+ + +
+
+
+
diff --git a/local/modules/SliderRevolution/templates/backOffice/default/sliderrevolution/slider-selector.html b/local/modules/SliderRevolution/templates/backOffice/default/sliderrevolution/slider-selector.html new file mode 100644 index 00000000..43983a2f --- /dev/null +++ b/local/modules/SliderRevolution/templates/backOffice/default/sliderrevolution/slider-selector.html @@ -0,0 +1,8 @@ +{custom_render_form_field field='slider_id'} + +{/custom_render_form_field} diff --git a/local/modules/TakeCustomerAccount/CHANGELOG.md b/local/modules/TakeCustomerAccount/CHANGELOG.md new file mode 100644 index 00000000..375122b6 --- /dev/null +++ b/local/modules/TakeCustomerAccount/CHANGELOG.md @@ -0,0 +1,17 @@ +# 1.0.1 + +- Remove old cart in the session + +# 1.0.2 + +- #2 Fix checkAuth in controller + +# 1.1.0 + +- Add event `TakeCustomerAccountEvents::TAKE_CUSTOMER_ACCOUNT` +- Add hook `take-customer-account.form` +- Add the ability to change the redirection from event listener. For this, to throw an exception of type `RedirectException` +- Add screenshot and logo +- Fix error message in form +- Fix checkAuth in template + diff --git a/local/modules/TakeCustomerAccount/Config/config.xml b/local/modules/TakeCustomerAccount/Config/config.xml new file mode 100644 index 00000000..a84483d7 --- /dev/null +++ b/local/modules/TakeCustomerAccount/Config/config.xml @@ -0,0 +1,26 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/modules/TakeCustomerAccount/Config/module.xml b/local/modules/TakeCustomerAccount/Config/module.xml new file mode 100644 index 00000000..9a1ddd17 --- /dev/null +++ b/local/modules/TakeCustomerAccount/Config/module.xml @@ -0,0 +1,24 @@ + + + TakeCustomerAccount\TakeCustomerAccount + + Lets take control of a customer account + + + Permet de prendre le contrôle d'un compte client + + + en_US + fr_FR + + 1.1.0 + + Gilles Bourgeat + gbourgeat@openstudio.fr + + classic + 2.1.0 + prod + diff --git a/local/modules/TakeCustomerAccount/Config/routing.xml b/local/modules/TakeCustomerAccount/Config/routing.xml new file mode 100644 index 00000000..6369ad02 --- /dev/null +++ b/local/modules/TakeCustomerAccount/Config/routing.xml @@ -0,0 +1,11 @@ + + + + + + TakeCustomerAccount\Controller\TakeCustomerAccountController::takeAction + \d+ + + \ No newline at end of file diff --git a/local/modules/TakeCustomerAccount/Controller/TakeCustomerAccountController.php b/local/modules/TakeCustomerAccount/Controller/TakeCustomerAccountController.php new file mode 100644 index 00000000..d2deb94e --- /dev/null +++ b/local/modules/TakeCustomerAccount/Controller/TakeCustomerAccountController.php @@ -0,0 +1,75 @@ + + */ +class TakeCustomerAccountController extends BaseAdminController +{ + /** + * @param int $customer_id + * @return \Symfony\Component\HttpFoundation\Response + * @throws \Exception + */ + public function takeAction($customer_id) + { + if (null !== $response = $this->checkAuth(array(), 'TakeCustomerAccount', AccessManager::VIEW)) { + return $response; + } + + $form = $this->createForm('take_customer_account'); + + try { + if (null !== $customer = CustomerQuery::create()->findPk($customer_id)) { + $this->validateForm($form); + + $this->dispatch( + TakeCustomerAccountEvents::TAKE_CUSTOMER_ACCOUNT, + new TakeCustomerAccountEvent($customer) + ); + } else { + throw new \Exception($this->getTranslator()->trans( + "Customer not found", + [], + TakeCustomerAccount::MODULE_DOMAIN + )); + } + + $this->setCurrentRouter('router.front'); + return $this->generateRedirectFromRoute('customer.home', [], [], 'router.front'); + } catch (RedirectException $e) { + return $this->generateRedirect($e->getUrl(), $e->getCode()); + } catch (\Exception $e) { + $form->setErrorMessage($e->getMessage()); + + $this->getParserContext()->addForm($form); + + $this->setCurrentRouter('router.admin'); + return $this->generateRedirectFromRoute( + 'admin.customer.update.view', + ['customer_id' => $customer_id] + ); + } + } +} diff --git a/local/modules/TakeCustomerAccount/Event/TakeCustomerAccountEvent.php b/local/modules/TakeCustomerAccount/Event/TakeCustomerAccountEvent.php new file mode 100644 index 00000000..c7fe77a9 --- /dev/null +++ b/local/modules/TakeCustomerAccount/Event/TakeCustomerAccountEvent.php @@ -0,0 +1,53 @@ + + */ +class TakeCustomerAccountEvent extends ActionEvent +{ + /** @var Customer */ + protected $customer; + + /** + * @param Customer $customer + */ + public function __construct(Customer $customer) + { + $this->customer = $customer; + } + + /** + * @return Customer + */ + public function getCustomer() + { + return $this->customer; + } + + /** + * @param Customer $customer + * @return TakeCustomerAccountEvent + */ + public function setCustomer($customer) + { + $this->customer = $customer; + return $this; + } +} diff --git a/local/modules/TakeCustomerAccount/Event/TakeCustomerAccountEvents.php b/local/modules/TakeCustomerAccount/Event/TakeCustomerAccountEvents.php new file mode 100644 index 00000000..369936de --- /dev/null +++ b/local/modules/TakeCustomerAccount/Event/TakeCustomerAccountEvents.php @@ -0,0 +1,23 @@ + + */ +class TakeCustomerAccountEvents +{ + const TAKE_CUSTOMER_ACCOUNT = "take.customer.account"; +} diff --git a/local/modules/TakeCustomerAccount/EventListener/TakeCustomerAccountListener.php b/local/modules/TakeCustomerAccount/EventListener/TakeCustomerAccountListener.php new file mode 100644 index 00000000..a31c4935 --- /dev/null +++ b/local/modules/TakeCustomerAccount/EventListener/TakeCustomerAccountListener.php @@ -0,0 +1,93 @@ + + */ +class TakeCustomerAccountListener implements EventSubscriberInterface +{ + /** @var EventDispatcherInterface */ + protected $eventDispatcher; + + /** @var SecurityContext */ + protected $securityContext; + + /** @var Request */ + protected $request; + + /** + * @param EventDispatcherInterface $eventDispatcher + * @param SecurityContext $securityContext + * @param Request $request + */ + public function __construct( + EventDispatcherInterface $eventDispatcher, + SecurityContext $securityContext, + Request $request + ) { + $this->eventDispatcher = $eventDispatcher; + + $this->securityContext = $securityContext; + + $this->request = $request; + } + + /** + * @param TakeCustomerAccountEvent $event + */ + public function take(TakeCustomerAccountEvent $event) + { + $this->eventDispatcher->dispatch(TheliaEvents::CUSTOMER_LOGOUT, new DefaultActionEvent()); + + $this->request->getSession()->getSessionCart($this->eventDispatcher)->clear(); + + $this->eventDispatcher->dispatch( + TheliaEvents::CUSTOMER_LOGIN, + new CustomerLoginEvent($event->getCustomer()) + ); + + AdminLog::append( + TakeCustomerAccount::MODULE_DOMAIN, + AccessManager::VIEW, + 'Took control of the customer account "' . $event->getCustomer()->getId() . '"', + $this->request, + $this->securityContext->getAdminUser() + ); + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() + { + return array( + TakeCustomerAccountEvents::TAKE_CUSTOMER_ACCOUNT => ['take', 128] + ); + } +} diff --git a/local/modules/TakeCustomerAccount/Form/TakeCustomerAccountForm.php b/local/modules/TakeCustomerAccount/Form/TakeCustomerAccountForm.php new file mode 100644 index 00000000..4a3ae7e6 --- /dev/null +++ b/local/modules/TakeCustomerAccount/Form/TakeCustomerAccountForm.php @@ -0,0 +1,41 @@ + + */ +class TakeCustomerAccountForm extends BaseForm +{ + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return 'take_customer_account'; + } + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + */ + protected function buildForm() + { + } +} diff --git a/local/modules/TakeCustomerAccount/Hook/AdminCustomerHook.php b/local/modules/TakeCustomerAccount/Hook/AdminCustomerHook.php new file mode 100644 index 00000000..1af93b97 --- /dev/null +++ b/local/modules/TakeCustomerAccount/Hook/AdminCustomerHook.php @@ -0,0 +1,50 @@ + + */ +class AdminCustomerHook extends BaseHook +{ + /** + * @param HookRenderEvent $event + */ + public function onCustomerEdit(HookRenderEvent $event) + { + $event->add($this->render( + 'take-customer-account/hook/customer-edit.html', + array( + 'customer_id' => $event->getArgument('customer_id') + ) + )); + } + + /** + * @param HookRenderEvent $event + */ + public function onCustomerEditJs(HookRenderEvent $event) + { + $event->add($this->render( + 'take-customer-account/hook/customer-edit-js.html', + array( + 'customer_id' => $event->getArgument('customer_id') + ) + )); + } +} diff --git a/local/modules/TakeCustomerAccount/I18n/backOffice/default/en_US.php b/local/modules/TakeCustomerAccount/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..2c1e0c30 --- /dev/null +++ b/local/modules/TakeCustomerAccount/I18n/backOffice/default/en_US.php @@ -0,0 +1,10 @@ + 'Help !!!', + 'If you are logged in with another customer he will be offline' => 'If you are logged in with another customer he will be offline', + 'Take customer account' => 'Take customer account', + 'To ask for help' => 'To ask for help', + 'To connect to the customer\'s account' => 'To connect to the customer\'s account', + 'You have not need the customer password' => 'You have not need the customer password', +); diff --git a/local/modules/TakeCustomerAccount/I18n/backOffice/default/fr_FR.php b/local/modules/TakeCustomerAccount/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..9ae37daa --- /dev/null +++ b/local/modules/TakeCustomerAccount/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,10 @@ + 'Aide !!!', + 'If you are logged in with another customer he will be offline' => 'Si vous êtes connecté avec un autre client, il sera déconnecté', + 'Take customer account' => 'Se connecter au compte client', + 'To ask for help' => 'Pour de l\'aide', + 'To connect to the customer\'s account' => 'Pour vous connecter au compte client', + 'You have not need the customer password' => 'Vous n\'avez pas besoin du mot de passe du client', +); diff --git a/local/modules/TakeCustomerAccount/I18n/en_US.php b/local/modules/TakeCustomerAccount/I18n/en_US.php new file mode 100644 index 00000000..16061303 --- /dev/null +++ b/local/modules/TakeCustomerAccount/I18n/en_US.php @@ -0,0 +1,5 @@ + ' Customer not found', +); diff --git a/local/modules/TakeCustomerAccount/I18n/fr_FR.php b/local/modules/TakeCustomerAccount/I18n/fr_FR.php new file mode 100644 index 00000000..d2ebe343 --- /dev/null +++ b/local/modules/TakeCustomerAccount/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Impossible de trouver le client', +); diff --git a/local/modules/TakeCustomerAccount/LICENSE.txt b/local/modules/TakeCustomerAccount/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/TakeCustomerAccount/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/TakeCustomerAccount/Readme.md b/local/modules/TakeCustomerAccount/Readme.md new file mode 100644 index 00000000..2ca1aa5f --- /dev/null +++ b/local/modules/TakeCustomerAccount/Readme.md @@ -0,0 +1,37 @@ +# Take Customer Account + +Authors: Thelia , Gilles Bourgeat + +* This module is used to connect to a client account from admin. +* You have not need the customer password + +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/thelia-modules/TakeCustomerAccount/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/thelia-modules/TakeCustomerAccount/?branch=master) +[![License](https://poser.pugx.org/thelia/take-customer-account-module/license)](https://packagist.org/packages/thelia/take-customer-account-module) +[![Latest Stable Version](https://poser.pugx.org/thelia/take-customer-account-module/v/stable)](https://packagist.org/packages/thelia/take-customer-account-module) + +## Screenshot + +![Take Customer Account Screenchot 1](https://github.com/thelia-modules/TakeCustomerAccount/blob/master/screenshot/screenshot-1.jpeg) + +## Compatibility + +Thelia > 2.1 + +## Installation + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is ```TakeCustomerAccount```. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require thelia/take-customer-account-module:~1.0 +``` + +## Usage + +* See you in a customer account in the admin, then go to the area "Take customer account" diff --git a/local/modules/TakeCustomerAccount/TakeCustomerAccount.php b/local/modules/TakeCustomerAccount/TakeCustomerAccount.php new file mode 100644 index 00000000..4e938584 --- /dev/null +++ b/local/modules/TakeCustomerAccount/TakeCustomerAccount.php @@ -0,0 +1,43 @@ + TemplateDefinition::BACK_OFFICE, + "code" => "take-customer-account.form", + "title" => array( + "fr_FR" => "Module Take Customer Account, form", + "en_US" => "Module Take Customer Account, form", + ), + "description" => array( + "fr_FR" => "En haut du formulaire", + "en_US" => "Top of form", + ), + "active" => true + ] + ]; + } +} diff --git a/local/modules/TakeCustomerAccount/composer.json b/local/modules/TakeCustomerAccount/composer.json new file mode 100644 index 00000000..a7a3cb85 --- /dev/null +++ b/local/modules/TakeCustomerAccount/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/take-customer-account-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "TakeCustomerAccount" + } +} \ No newline at end of file diff --git a/local/modules/TakeCustomerAccount/logo.jpg b/local/modules/TakeCustomerAccount/logo.jpg new file mode 100644 index 00000000..d3e32330 Binary files /dev/null and b/local/modules/TakeCustomerAccount/logo.jpg differ diff --git a/local/modules/TakeCustomerAccount/screenshot/screenshot-1.jpeg b/local/modules/TakeCustomerAccount/screenshot/screenshot-1.jpeg new file mode 100644 index 00000000..55c1ca2e Binary files /dev/null and b/local/modules/TakeCustomerAccount/screenshot/screenshot-1.jpeg differ diff --git a/local/modules/TakeCustomerAccount/templates/backOffice/default/take-customer-account/hook/customer-edit-js.html b/local/modules/TakeCustomerAccount/templates/backOffice/default/take-customer-account/hook/customer-edit-js.html new file mode 100644 index 00000000..0ca079c5 --- /dev/null +++ b/local/modules/TakeCustomerAccount/templates/backOffice/default/take-customer-account/hook/customer-edit-js.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/local/modules/TakeCustomerAccount/templates/backOffice/default/take-customer-account/hook/customer-edit.html b/local/modules/TakeCustomerAccount/templates/backOffice/default/take-customer-account/hook/customer-edit.html new file mode 100644 index 00000000..dbaccf0a --- /dev/null +++ b/local/modules/TakeCustomerAccount/templates/backOffice/default/take-customer-account/hook/customer-edit.html @@ -0,0 +1,49 @@ +{loop type="auth" name="auth" role="ADMIN" module="TakeCustomerAccount" access="VIEW"} +{form name="take_customer_account"} +
+
+ +
+ {intl l="Take customer account" d="takecustomeraccount.bo.default"} +
+ + {form_hidden_fields form=$form} +
+
+ {if $form_error} +
+
{$form_error_message}
+
+ {/if} + + {hook name="take-customer-account.form"} + +
+
+ - {intl l="To connect to the customer's account" d="takecustomeraccount.bo.default"}
+ - {intl l="If you are logged in with another customer he will be offline" d="takecustomeraccount.bo.default"}
+ - {intl l="You have not need the customer password" d="takecustomeraccount.bo.default"} +
+
+
+
+
+ +
+
+
+ +
+
+{/form} +{/loop} \ No newline at end of file diff --git a/local/modules/TemplateSwitcher/Config/config.xml b/local/modules/TemplateSwitcher/Config/config.xml new file mode 100644 index 00000000..9e865663 --- /dev/null +++ b/local/modules/TemplateSwitcher/Config/config.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/local/modules/TemplateSwitcher/Config/module.xml b/local/modules/TemplateSwitcher/Config/module.xml new file mode 100644 index 00000000..01a15624 --- /dev/null +++ b/local/modules/TemplateSwitcher/Config/module.xml @@ -0,0 +1,28 @@ + + + TemplateSwitcher\TemplateSwitcher + + Change current active template in real time + + + Choisissez le template actif en temps réel + + + en_US + fr_FR + + 0.5.1 + + + Franck Allimant + CQFDev + thelia@cqfdev.fr + www.cqfdev.fr + + + classic + 2.2.0 + prod + diff --git a/local/modules/TemplateSwitcher/Config/routing.xml b/local/modules/TemplateSwitcher/Config/routing.xml new file mode 100644 index 00000000..8462610f --- /dev/null +++ b/local/modules/TemplateSwitcher/Config/routing.xml @@ -0,0 +1,11 @@ + + + + + + TemplateSwitcher\Controller\SwitcherController::set + .* + + diff --git a/local/modules/TemplateSwitcher/Controller/SwitcherController.php b/local/modules/TemplateSwitcher/Controller/SwitcherController.php new file mode 100644 index 00000000..f3988823 --- /dev/null +++ b/local/modules/TemplateSwitcher/Controller/SwitcherController.php @@ -0,0 +1,33 @@ + + * Date: 09/02/2017 22:45 + */ + +namespace TemplateSwitcher\Controller; + +use TemplateSwitcher\Events\TemplateSwitcherEvent; +use Thelia\Controller\Front\BaseFrontController; +use Thelia\Tools\URL; + +class SwitcherController extends BaseFrontController +{ + public function set($templateName) + { + $this->getDispatcher()->dispatch( + TemplateSwitcherEvent::SWITCH_TEMPLATE_EVENT, + new TemplateSwitcherEvent($templateName) + ); + + return $this->generateRedirect(URL::getInstance()->absoluteUrl('/')); + } +} diff --git a/local/modules/TemplateSwitcher/EventListener/TemplateSwitcherListener.php b/local/modules/TemplateSwitcher/EventListener/TemplateSwitcherListener.php new file mode 100644 index 00000000..ac2115df --- /dev/null +++ b/local/modules/TemplateSwitcher/EventListener/TemplateSwitcherListener.php @@ -0,0 +1,84 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace TemplateSwitcher\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\RequestStack; +use TemplateSwitcher\TemplateSwitcher; +use TemplateSwitcher\Events\TemplateSwitcherEvent; +use Thelia\Core\Template\TemplateDefinition; +use Thelia\Core\Template\TemplateHelperInterface; + +/** + * Template switcher event listener + * + * @author Franck Allimant + */ +class TemplateSwitcherListener implements EventSubscriberInterface +{ + /** @var RequestStack */ + protected $requestStack; + + /** @var TemplateHelperInterface */ + protected $templateHelper; + + /** + * TemplateSwitcherListener constructor. + * @param RequestStack $request + * @param TemplateHelperInterface $templateHelper + */ + public function __construct(RequestStack $request, TemplateHelperInterface $templateHelper) + { + $this->requestStack = $request; + $this->templateHelper = $templateHelper; + } + + + public function switchTo(TemplateSwitcherEvent $event) + { + // Check template name + $tplList = $this->templateHelper->getList(TemplateDefinition::FRONT_OFFICE); + + $requiredTemplateName = $event->getTemplateName(); + + /** @var TemplateDefinition $tpl */ + foreach ($tplList as $tpl) { + if ($tpl->getName() == $requiredTemplateName) { + $this->requestStack + ->getCurrentRequest() + ->getSession() + ->set(TemplateSwitcher::ACTIVE_FRONT_VAR_NAME, $requiredTemplateName); + + break; + } + } + } + + public static function getSubscribedEvents() + { + return array( + TemplateSwitcherEvent::SWITCH_TEMPLATE_EVENT => array("switchTo", 128) + ); + } +} diff --git a/local/modules/TemplateSwitcher/Events/TemplateSwitcherEvent.php b/local/modules/TemplateSwitcher/Events/TemplateSwitcherEvent.php new file mode 100644 index 00000000..302a6a5e --- /dev/null +++ b/local/modules/TemplateSwitcher/Events/TemplateSwitcherEvent.php @@ -0,0 +1,52 @@ + + * Date: 26/04/2017 11:04 + */ +namespace TemplateSwitcher\Events; + +use Thelia\Core\Event\ActionEvent; + +class TemplateSwitcherEvent extends ActionEvent +{ + const SWITCH_TEMPLATE_EVENT = "templateswitcher.switch-to"; + + /** @var string */ + protected $templateName; + + /** + * TemplateSwitcherEvent constructor. + * @param string $templateName + */ + public function __construct($templateName) + { + $this->templateName = $templateName; + } + + /** + * @return string + */ + public function getTemplateName() + { + return $this->templateName; + } + + /** + * @param string $templateName + * @return $this + */ + public function setTemplateName($templateName) + { + $this->templateName = $templateName; + return $this; + } +} diff --git a/local/modules/TemplateSwitcher/LICENSE.txt b/local/modules/TemplateSwitcher/LICENSE.txt new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/local/modules/TemplateSwitcher/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/local/modules/TemplateSwitcher/Readme.md b/local/modules/TemplateSwitcher/Readme.md new file mode 100644 index 00000000..ddf27d5e --- /dev/null +++ b/local/modules/TemplateSwitcher/Readme.md @@ -0,0 +1,18 @@ +# Template Switcher + +Ce module permet de changer le template front actif à la volée, en utilisant l'URL `/ts/`, +par exemple http://domain.tld/ts/my_super_template + +`` doit être le nom d'un sous-répertoire de `templates/frontOffice`. + +C'est tout. + +D'un loint de vue technique, le module definit un template Helper qui va chercher le template actif en session +plutôt qu'en base de données. + +Le module propose un évènement TemplateSwitcherEvent, à dispatcher avec TemplateSwitcherEvent::SWITCH_TEMPLATE_EVENT : + + $this->getDispatcher()->dispatch( + TemplateSwitcherEvent::SWITCH_TEMPLATE_EVENT, + new TemplateSwitcherEvent('nom-du-template-front') + ); diff --git a/local/modules/TemplateSwitcher/Template/SessionTemplateHelper.php b/local/modules/TemplateSwitcher/Template/SessionTemplateHelper.php new file mode 100644 index 00000000..97f98834 --- /dev/null +++ b/local/modules/TemplateSwitcher/Template/SessionTemplateHelper.php @@ -0,0 +1,123 @@ + + * Creation date: 26/03/2015 16:36 + */ +namespace TemplateSwitcher\Template; + +use Symfony\Component\Finder\Finder; +use Symfony\Component\HttpFoundation\RequestStack; +use TemplateSwitcher\TemplateSwitcher; +use Thelia\Core\Template\TemplateDefinition; +use Thelia\Core\Template\TheliaTemplateHelper; +use Thelia\Core\Translation\Translator; + +class SessionTemplateHelper extends TheliaTemplateHelper +{ + /** @var RequestStack */ + protected $requestStack; + + protected $translationsLoaded = false; + + /** + * SessionTheliaTemplateHelper constructor. + * @param RequestStack $requestStack + */ + public function __construct(RequestStack $requestStack) + { + $this->requestStack = $requestStack; + } + + /** + * Check if a template definition is the current active template + * + * @param TemplateDefinition $tplDefinition + * @return bool true is the given template is the active template + */ + public function isActive(TemplateDefinition $tplDefinition) + { + if ($tplDefinition->getType() === TemplateDefinition::FRONT_OFFICE) { + return $tplDefinition->getName() == $this->getSessionTplName(); + } else { + return parent::isActive($tplDefinition); + } + } + + /** + * @return TemplateDefinition + * @throws \Exception + */ + public function getActiveFrontTemplate() + { + if (null === $sessionTplName = $this->getSessionTplName()) { + return parent::getActiveFrontTemplate(); + } + + $tplDef = new TemplateDefinition( + $sessionTplName, + TemplateDefinition::FRONT_OFFICE + ); + + // Etre sur de charger les ressources de langue de ce template, et des templates parent + if (! $this->translationsLoaded) { + /** @var TemplateDefinition $parentTemplate */ + if (method_exists($tplDef, 'getParentList')) { + foreach ($tplDef->getParentList() as $parentTemplate) { + $this->loadTranslation($parentTemplate->getAbsoluteI18nPath(), $parentTemplate->getTranslationDomain()); + } + } + + $this->loadTranslation($tplDef->getAbsoluteI18nPath(), $tplDef->getTranslationDomain()); + + $this->translationsLoaded = true; + } + + if (! is_dir($tplDef->getAbsolutePath())) { + throw new \InvalidArgumentException("Template directory '$sessionTplName' not found."); + } + + return $tplDef; + } + + protected function getSessionTplName() + { + $request = $this->requestStack->getCurrentRequest(); + + // Request maybe null when the container is built. + if (null === $request) { + return null; + } + + return $request->getSession()->get(TemplateSwitcher::ACTIVE_FRONT_VAR_NAME, null); + } + + private function loadTranslation($directory, $domain) + { + try { + $finder = Finder::create() + ->files() + ->depth(0) + ->in($directory); + + /** @var \DirectoryIterator $file */ + foreach ($finder as $file) { + list($locale, $format) = explode('.', $file->getBaseName(), 2); + + Translator::getInstance()->addResource($format, $file->getPathname(), $locale, $domain); + } + } catch (\InvalidArgumentException $ex) { + // Ignore missing I18n directories + } + } +} diff --git a/local/modules/TemplateSwitcher/TemplateSwitcher.php b/local/modules/TemplateSwitcher/TemplateSwitcher.php new file mode 100644 index 00000000..24280330 --- /dev/null +++ b/local/modules/TemplateSwitcher/TemplateSwitcher.php @@ -0,0 +1,23 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + diff --git a/local/modules/TheliaMigrateCountry/Config/module.xml b/local/modules/TheliaMigrateCountry/Config/module.xml new file mode 100644 index 00000000..7573971c --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Config/module.xml @@ -0,0 +1,26 @@ + + + TheliaMigrateCountry\TheliaMigrateCountry + + Countries/states migration tool + + + Utilitaire de migration des pays/états + + + en_US + fr_FR + + 2.3.1 + + + Julien Chanséaume + julien@thelia.net + + + classic + 2.3.0 + alpha + diff --git a/local/modules/TheliaMigrateCountry/Config/routing.xml b/local/modules/TheliaMigrateCountry/Config/routing.xml new file mode 100644 index 00000000..111b7cb7 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Config/routing.xml @@ -0,0 +1,15 @@ + + + + + + TheliaMigrateCountry\Controller\MigrateController::migrateSystemAction + + + + TheliaMigrateCountry\Controller\MigrateController::doMigrateSystemAction + + + diff --git a/local/modules/TheliaMigrateCountry/Controller/MigrateController.php b/local/modules/TheliaMigrateCountry/Controller/MigrateController.php new file mode 100644 index 00000000..9b582845 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Controller/MigrateController.php @@ -0,0 +1,175 @@ + + */ +class MigrateController extends BaseAdminController +{ + protected $useFallbackTemplate = true; + + public function migrateSystemAction() + { + $response = $this->checkAuth(AdminResources::COUNTRY, array(), AccessManager::UPDATE); + if (null !== $response) { + return $response; + } + + // load country not migrated + $dataForm = []; + + $migratedCountries = json_decode(ConfigQuery::read('thelia_country_state_migration', '[]'), true); + + $countries = CountryQuery::create() + ->filterByHasStates(1) + ; + + /** @var Country $country */ + foreach ($countries as $country) { + $oldCountries = CountryQuery::create() + ->filterByHasStates(0) + ->filterByIsocode($country->getIsoCode()) + ->find() + ; + /** @var Country $oldCountry */ + foreach ($oldCountries as $oldCountry) { + if (!isset($migratedCountries[$oldCountry->getId()])) { + $dataForm[] = [ + 'migrate' => false, + 'country' => $oldCountry->getId(), + 'new_country' => $country->getId(), + 'new_state' => null + ]; + } + } + } + + // prepare form + $form = $this->createForm('thelia.admin.country.state.migration', 'form', ['migrations' => $dataForm]); + $this->getParserContext()->addForm($form); + + return $this->render( + 'countries-migrate', + [ + 'countriesMigrated' => $migratedCountries, + 'showForm' => count($dataForm) != 0 + ] + ); + } + + public function doMigrateSystemAction() + { + $response = $this->checkAuth(AdminResources::COUNTRY, array(), AccessManager::UPDATE); + if (null !== $response) { + return $response; + } + + $changeForm = $this->createForm('thelia.admin.country.state.migration', 'form'); + + try { + // Check the form against constraints violations + $form = $this->validateForm($changeForm, "POST"); + + // Get the form field values + $data = $form->getData(); + + foreach ($data['migrations'] as $migration) { + + if (!$migration['migrate']) { + continue; + } + + $changeEvent = new MigrateCountryEvent( + $migration['country'], + $migration['new_country'], + $migration['new_state'] + ); + + $this->dispatch(MigrateCountryEvents::MIGRATE_COUNTRY, $changeEvent); + + // memorize the migration + $migratedCountries = json_decode(ConfigQuery::read('thelia_country_state_migration', '[]'), true); + $migratedCountries[$changeEvent->getCountry()] = [ + 'country' => $changeEvent->getNewCountry(), + 'state' => $changeEvent->getNewState(), + 'counter' => $changeEvent->getCounter() + ]; + ConfigQuery::write('thelia_country_state_migration', json_encode($migratedCountries)); + + // message + $message = $this->getTranslator()->trans( + 'Country %id migrated to country (ID %country) and state (ID %state) (address: %address, tax rules: %tax, shipping zones: %zone)', + [ + '%id' => $changeEvent->getCountry(), + '%country' => $changeEvent->getNewCountry(), + '%state' => $changeEvent->getNewState(), + '%address' => $changeEvent->getCounter()[AddressTableMap::TABLE_NAME], + '%tax' => $changeEvent->getCounter()[TaxRuleCountryTableMap::TABLE_NAME], + '%zone' => $changeEvent->getCounter()[CountryAreaTableMap::TABLE_NAME] + ] + ); + + // add flash message + $this->getSession()->getFlashBag()->add('migrate', $message); + + // Log migration + $this->adminLogAppend( + AdminResources::COUNTRY, + AccessManager::UPDATE, + $message, + $changeEvent->getCountry() + ); + + } + + return $this->generateSuccessRedirect($changeForm); + } catch (FormValidationException $ex) { + // Form cannot be validated + $error_msg = $this->createStandardFormValidationErrorMessage($ex); + } + + if (false !== $error_msg) { + $this->setupFormErrorContext( + $this->getTranslator()->trans("Country migration"), + $error_msg, + $changeForm, + $ex + ); + + return $this->render( + 'countries-migrate', + [ + 'countriesMigrated' => $migratedCountries, + 'showForm' => true + ] + ); + } + } +} diff --git a/local/modules/TheliaMigrateCountry/EventListeners/MigrateCountryListener.php b/local/modules/TheliaMigrateCountry/EventListeners/MigrateCountryListener.php new file mode 100644 index 00000000..9271e117 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/EventListeners/MigrateCountryListener.php @@ -0,0 +1,155 @@ + + */ +class MigrateCountryListener implements EventSubscriberInterface +{ + + public function migrateCountry(MigrateCountryEvent $event) + { + $counter = []; + + // update address + $counter[AddressTableMap::TABLE_NAME] = $this->migrateAddress($event); + + // tax rules + $counter[TaxRuleCountryTableMap::TABLE_NAME] = $this->migrateAddress($event); + + // shipping zone + $counter[CountryAreaTableMap::TABLE_NAME] = $this->migrateAddress($event); + + // if it succeeds we toggle the visibility of old country and new + $this->setCountriesVisibility($event); + + $event->setCounter($counter); + + } + + protected function migrateAddress(MigrateCountryEvent $event) + { + $con = Propel::getWriteConnection(AddressTableMap::DATABASE_NAME); + $con->beginTransaction(); + try { + $updatedRows = AddressQuery::create() + ->filterByCountryId($event->getCountry()) + ->update( + [ + 'CountryId' => $event->getNewCountry(), + 'StateId' => $event->getNewState(), + ] + ); + + $con->commit(); + + return $updatedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + protected function migrateTaxRules(MigrateCountryEvent $event) + { + $con = Propel::getWriteConnection(TaxRuleCountryTableMap::DATABASE_NAME); + $con->beginTransaction(); + try { + $updatedRows = TaxRuleCountryQuery::create() + ->filterByCountryId($event->getCountry()) + ->update( + [ + 'CountryId' => $event->getNewCountry(), + 'StateId' => $event->getNewState(), + ] + ); + + $con->commit(); + + return $updatedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + protected function migrateShippingZones(MigrateCountryEvent $event) + { + $con = Propel::getWriteConnection(CountryAreaTableMap::DATABASE_NAME); + $con->beginTransaction(); + try { + $updatedRows = CountryAreaQuery::create() + ->filterByCountryId($event->getCountry()) + ->update( + [ + 'CountryId' => $event->getNewCountry(), + 'StateId' => $event->getNewState(), + ] + ); + + $con->commit(); + + return $updatedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + private function setCountriesVisibility(MigrateCountryEvent $event) + { + $oldCountry = CountryQuery::create()->findPk($event->getCountry()); + + if (null !== $oldCountry) { + $oldCountry + ->setVisible(0) + ->save() + ; + } + + $newCountry = CountryQuery::create()->findPk($event->getNewCountry()); + if (null !== $newCountry) { + $newCountry + ->setVisible(1) + ->save() + ; + } + } + + /** + * @inheritdoc + */ + public static function getSubscribedEvents() + { + return [ + MigrateCountryEvents::MIGRATE_COUNTRY => 'migrateCountry' + ]; + } +} diff --git a/local/modules/TheliaMigrateCountry/Events/MigrateCountryEvent.php b/local/modules/TheliaMigrateCountry/Events/MigrateCountryEvent.php new file mode 100644 index 00000000..53613b09 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Events/MigrateCountryEvent.php @@ -0,0 +1,117 @@ + + */ +class MigrateCountryEvent extends ActionEvent +{ + /** @var int Old country Id */ + protected $country; + + /** @var int New country Id */ + protected $newCountry; + + /** @var int New state Id */ + protected $newState; + + /** @var array counter */ + protected $counter = []; + + /** + * MigrateCountryEvent constructor. + * @param $country + * @param int $newCountry + * @param int $newState + */ + public function __construct($country, $newCountry, $newState) + { + $this->country = $country; + $this->newCountry = $newCountry; + $this->newState = $newState; + } + + /** + * @return mixed + */ + public function getCountry() + { + return $this->country; + } + + /** + * @param mixed $country + */ + public function setCountry($country) + { + $this->country = $country; + return $this; + } + + /** + * @return int + */ + public function getNewCountry() + { + return $this->newCountry; + } + + /** + * @param int $newCountry + */ + public function setNewCountry($newCountry) + { + $this->newCountry = $newCountry; + return $this; + } + + /** + * @return int + */ + public function getNewState() + { + return $this->newState; + } + + /** + * @param int $newState + */ + public function setNewState($newState) + { + $this->newState = $newState; + return $this; + } + + /** + * @return array + */ + public function getCounter() + { + return $this->counter; + } + + /** + * @param array $counter + */ + public function setCounter($counter) + { + $this->counter = $counter; + return $this; + } +} diff --git a/local/modules/TheliaMigrateCountry/Events/MigrateCountryEvents.php b/local/modules/TheliaMigrateCountry/Events/MigrateCountryEvents.php new file mode 100644 index 00000000..3a1cdcb0 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Events/MigrateCountryEvents.php @@ -0,0 +1,24 @@ + + */ +class MigrateCountryEvents +{ + const MIGRATE_COUNTRY = 'action.migrate-country.migrate'; +} diff --git a/local/modules/TheliaMigrateCountry/Form/CountryStateMigrationForm.php b/local/modules/TheliaMigrateCountry/Form/CountryStateMigrationForm.php new file mode 100644 index 00000000..9a352af9 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Form/CountryStateMigrationForm.php @@ -0,0 +1,54 @@ + + */ +class CountryStateMigrationForm extends BaseForm +{ + + /** + * @inheritdocs + */ + protected function buildForm() + { + $this->formBuilder + ->add( + 'migrations', + 'collection', + [ + "type" => "country_state_migration", + "allow_add" => true, + "required" => true, + "cascade_validation" => true, + "constraints" => array( + new Count(["min" => 1]), + ), + ] + ) + ; + } + + public function getName() + { + return "thelia_country_state_migration"; + } +} diff --git a/local/modules/TheliaMigrateCountry/Form/Type/CountryStateMigrationType.php b/local/modules/TheliaMigrateCountry/Form/Type/CountryStateMigrationType.php new file mode 100644 index 00000000..acbf43fa --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Form/Type/CountryStateMigrationType.php @@ -0,0 +1,114 @@ + + */ +class CountryStateMigrationType extends AbstractTheliaType +{ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults( + [ + "cascade_validation" => true, + "constraints" => array( + new Callback([ + "methods" => array( + [$this, "checkStateId"], + ), + ]), + ), + ] + ); + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + ->add("migrate", "checkbox") + ->add( + "country", + "country_id" + ) + ->add( + "new_country", + "country_id" + ) + ->add( + "new_state", + "state_id", + [ + "constraints" => [], + ] + ) + ; + } + + public function checkStateId($value, ExecutionContextInterface $context) + { + + if ($value['migrate']) { + if (null !== $state = StateQuery::create()->findPk($value['new_state'])) { + if ($state->getCountryId() !== $value['new_country']) { + $context->addViolation( + Translator::getInstance()->trans( + "The state id '%id' does not belong to country id '%id_country'", + [ + '%id' => $value['new_state'], + '%id_country' => $value['new_country'] + ] + ) + ); + } + } else { + $context->addViolation( + Translator::getInstance()->trans( + "The state id '%id' doesn't exist", + ['%id' => $value['new_state']] + ) + ); + } + } + + } + + private function getRowData(ExecutionContextInterface $context) + { + $propertyPath = $context->getPropertyPath(); + $data = $this->getRowData($context); + + + } + + /** + * Returns the name of this type. + * + * @return string The name of this type + */ + public function getName() + { + return 'country_state_migration'; + } +} diff --git a/local/modules/TheliaMigrateCountry/I18n/backOffice/default/en_US.php b/local/modules/TheliaMigrateCountry/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..35906899 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/I18n/backOffice/default/en_US.php @@ -0,0 +1,31 @@ + ' country ', + ' migrated to ' => ' migrated to ', + ' state ' => ' state ', + 'After the migration the old country will be hide and the new one shown' => 'After the migration the old country will be hide and the new one shown', + 'All States' => 'All States', + 'All countries have been migrated' => 'All countries have been migrated', + 'Configuration' => 'Configuration', + 'Countries' => 'Countries', + 'Countries migrated' => 'Countries migrated', + 'Countries to migrate' => 'Countries to migrate', + 'Country ' => 'Country ', + 'Country migration' => 'Country migration', + 'For USA and Canada the states already exists as countries, so you have to select the right state.' => 'For USA and Canada the states already exists as countries, so you have to select the right state.', + 'For other countries, you should decide to use state or not. ' => 'For other countries, you should decide to use state or not. ', + 'Home' => 'Home', + 'If you want to use the new country with its states, you have to check the migrate checkbox and select a state.' => 'If you want to use the new country with its states, you have to check the migrate checkbox and select a state.', + 'In version 2.3 of Thelia, the system of country has changed.' => 'In version 2.3 of Thelia, the system of country has changed.', + 'Migrate ?' => 'Migrate ?', + 'Migrate countries' => 'Migrate countries', + 'New country' => 'New country', + 'Now, countries has been splited in countries and states.' => 'Now, countries has been splited in countries and states.', + 'Old country' => 'Old country', + 'State' => 'State', + 'The migration proccess is tricky and couldn\'t be automated.' => 'The migration proccess is tricky and couldn\'t be automated.', + 'The migration will change the address, tax rules and shipping zones to match with the new system.' => 'The migration will change the address, tax rules and shipping zones to match with the new system.', + 'The update proccess has created new countries (even if it exists) and associated states.' => 'The update proccess has created new countries (even if it exists) and associated states.', + 'We added a \'default\' state with a blank name as a fallback. Customer will have the possibility to change it later.' => 'We added a \'default\' state with a blank name as a fallback. Customer will have the possibility to change it later.', +); diff --git a/local/modules/TheliaMigrateCountry/I18n/backOffice/default/fr_FR.php b/local/modules/TheliaMigrateCountry/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..70b7092b --- /dev/null +++ b/local/modules/TheliaMigrateCountry/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,31 @@ + ' le pays', + ' migrated to ' => 'migré vers', + ' state ' => ' état ', + 'After the migration the old country will be hide and the new one shown' => 'Après la migration l\'ancien pays sera caché et le nouveau sera activé.', + 'All States' => 'Tous les états', + 'All countries have been migrated' => 'Tous les pays ont été migré', + 'Configuration' => 'Configuration', + 'Countries' => 'Pays', + 'Countries migrated' => 'Pays migrés', + 'Countries to migrate' => 'Pays à migrer.', + 'Country ' => 'Le pays', + 'Country migration' => 'Migration pays', + 'For USA and Canada the states already exists as countries, so you have to select the right state.' => 'Pour les USA et le Canada les états étaient déjà présents mais en tant que pays. Vous devrez donc choisir l\'état correspondant.', + 'For other countries, you should decide to use state or not. ' => 'Pour les autres pays, vous devrez choisir d\'utiliser ou pas les états.', + 'Home' => 'Accueil', + 'If you want to use the new country with its states, you have to check the migrate checkbox and select a state.' => 'Si vous voulez utiliser les nouveaux pays avec les états, vous devrez cocher la boîte à cocher \'migrer\' et sélectionner un état.', + 'In version 2.3 of Thelia, the system of country has changed.' => 'En version 2.3 de Thelia, le sysème des pays a changé.', + 'Migrate ?' => 'Migrer ?', + 'Migrate countries' => 'Migrer les pays', + 'New country' => 'Nouveau pays', + 'Now, countries has been splited in countries and states.' => 'Les pays ont été séparé en pays et états.', + 'Old country' => 'Ancien pays', + 'State' => 'État/région', + 'The migration proccess is tricky and couldn\'t be automated.' => 'Le processus de migration est compliqué et ne peux pas être automatisé', + 'The migration will change the address, tax rules and shipping zones to match with the new system.' => 'La migration changera les adresses, les règles de taxe et les zones de livraisons pour fonctionner avec le nouveau système.', + 'The update proccess has created new countries (even if it exists) and associated states.' => 'Le processus de mise à jour a créé de nouveaux pays (même si il existait) et associé des états.', + 'We added a \'default\' state with a blank name as a fallback. Customer will have the possibility to change it later.' => 'Nous avons ajouté un état par \'défaut\' avec un nom vide. Par la suite, le client pourra le changer.', +]; diff --git a/local/modules/TheliaMigrateCountry/I18n/backOffice/default/it_IT.php b/local/modules/TheliaMigrateCountry/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..8aaa7bfe --- /dev/null +++ b/local/modules/TheliaMigrateCountry/I18n/backOffice/default/it_IT.php @@ -0,0 +1,19 @@ + 'paese', + ' migrated to ' => ' migrato a ', + ' state ' => ' stato ', + 'All States' => 'Tutti gli Stati', + 'Configuration' => 'Impostazione', + 'Countries' => 'Paesi', + 'Country ' => 'Paese', + 'Country migration' => 'Migrazione del paese', + 'Home' => 'Home', + 'Migrate countries' => 'Migrazione dei paesi', + 'New country' => 'Nuovo paese', + 'Now, countries has been splited in countries and states.' => 'Ora, i paesi sono stati divisi in paesi e stati.', + 'State' => 'Stato', + 'The update proccess has created new countries (even if it exists) and associated states.' => 'Il processo di aggiornamento ha creato nuovi paesi (anche esistenti) e stati associati.', + 'We added a \'default\' state with a blank name as a fallback. Customer will have the possibility to change it later.' => 'Abbiamo aggiunto uno stato di \'default\' con un nome vuoto come fallback. Il cliente avrà la possibilità di modificarlo in seguito.', +]; diff --git a/local/modules/TheliaMigrateCountry/I18n/en_US.php b/local/modules/TheliaMigrateCountry/I18n/en_US.php new file mode 100644 index 00000000..582bf0dc --- /dev/null +++ b/local/modules/TheliaMigrateCountry/I18n/en_US.php @@ -0,0 +1,8 @@ + 'Country %id migrated to country (ID %country) and state (ID %state) (address: %address, tax rules: %tax, shipping zones: %zone)', + 'Country migration' => 'Country migration', + 'The state id \'%id\' does not belong to country id \'%id_country\'' => 'The state id \'%id\' does not belong to country id \'%id_country\'', + 'The state id \'%id\' doesn\'t exist' => 'The state id \'%id\' doesn\'t exist', +); diff --git a/local/modules/TheliaMigrateCountry/I18n/fr_FR.php b/local/modules/TheliaMigrateCountry/I18n/fr_FR.php new file mode 100644 index 00000000..e36af4c7 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/I18n/fr_FR.php @@ -0,0 +1,8 @@ + 'Le pays %id migré vers le pays (ID %country) et état (ID %state) (adresses: %address, règles de taxe: %tax, zones de livraison: %zone)', + 'Country migration' => 'Migration pays', + 'The state id \'%id\' does not belong to country id \'%id_country\'' => 'L\'état id \'%id\' n\'appartient pas au pays id \'%id_country\'', + 'The state id \'%id\' doesn\'t exist' => 'L\'état id \'%id\' n\'existe pas', +]; diff --git a/local/modules/TheliaMigrateCountry/I18n/it_IT.php b/local/modules/TheliaMigrateCountry/I18n/it_IT.php new file mode 100644 index 00000000..ebcb746f --- /dev/null +++ b/local/modules/TheliaMigrateCountry/I18n/it_IT.php @@ -0,0 +1,8 @@ + 'Paese %id migrato a paese (ID %country) e stato (ID %state) (Indirizzo: %address, norme fiscali: %tax, zone di spedizione: %zone)', + 'Country migration' => 'Migrazione del paese', + 'The state id \'%id\' does not belong to country id \'%id_country\'' => 'L\'id dello stato \'%id\' non appartiene a id paese \'%id_country\'', + 'The state id \'%id\' doesn\'t exist' => 'L\'id dello stato \'%id\' non esiste', +]; diff --git a/local/modules/TheliaMigrateCountry/LICENSE.txt b/local/modules/TheliaMigrateCountry/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/TheliaMigrateCountry/Readme.md b/local/modules/TheliaMigrateCountry/Readme.md new file mode 100644 index 00000000..ae6aee51 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/Readme.md @@ -0,0 +1,18 @@ +# Thelia Migrate Country + +This module allow you to migrate the system of country from Thelia version <= 2.2.* to version >= 2.3.0-alpha1. + +## Installation + +### Manually + +* Copy the module into ```/local/modules/``` directory and be sure that the name of the module is TheliaMigrateCountry. +* Activate it in your thelia administration panel + +### Composer + +Add it in your main thelia composer.json file + +``` +composer require your-vendor/thelia-migrate-country-module:~1.0 +``` diff --git a/local/modules/TheliaMigrateCountry/TheliaMigrateCountry.php b/local/modules/TheliaMigrateCountry/TheliaMigrateCountry.php new file mode 100644 index 00000000..b8772687 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/TheliaMigrateCountry.php @@ -0,0 +1,28 @@ + + {intl l='Migrate countries'} + + +{/loop} \ No newline at end of file diff --git a/local/modules/TheliaMigrateCountry/templates/backOffice/default/countries-migrate.html b/local/modules/TheliaMigrateCountry/templates/backOffice/default/countries-migrate.html new file mode 100644 index 00000000..79b068a9 --- /dev/null +++ b/local/modules/TheliaMigrateCountry/templates/backOffice/default/countries-migrate.html @@ -0,0 +1,299 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} + {$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl l='Country migration'}{/block} + +{block name="check-resource"}admin.configuration.country{/block} +{block name="check-access"}update{/block} + +{block name="main-content"} +
+ +
+ + + +
+
+
+ +
+ {intl l='Migrate countries'} +
+ +
+
+ {intl l='In version 2.3 of Thelia, the system of country has changed.'} + {intl l='Now, countries has been split in countries and states.'}
+ {intl l="The migration process is tricky and couldn't be automated."}

+ {intl l="The update process has created new countries (even if it exists) and associated states."}
+ {intl l="The migration will change the address, tax rules and shipping zones to match with the new system."}
+ {intl l="After the migration the old country will be hide and the new one shown"}

+ {intl l="For USA and Canada the states already exists as countries, so you have to select the right state."}
+ {intl l="For other countries, you should decide to use state or not. "} + {intl l="If you want to use the new country with its states, you have to check the migrate checkbox and select a state."} + {intl l="We added a 'default' state with a blank name as a fallback. Customer will have the possibility to change it later."} +
+
+ + {if $showForm} +
+
+ + {form name="thelia.admin.country.state.migration"} + + {include + file = "includes/inner-form-toolbar.html" + hide_submit_buttons = false + + page_url = {url path="/admin/configuration/countries/migrate"} + close_url = {url path="/admin/configuration/countries"} + } + + {form_hidden_fields exclude="locale"} + + {render_form_field field='success_url' value={url path="/admin/configuration/countries/migrate"}} + + {if $form_error}
{$form_error_message}
{/if} + + {if {hasflash type="migrate"}} +
+ {flash type="migrate"} +
{$MESSAGE}
+ {/flash} +
+ {/if} + +
+ + + + + + + + + + + + {form_collection form=$form collection="migrations"} + {$newCountryId=0} + {$countryId=0} + + + + + + + {/form_collection} + +
+ {intl l='Countries to migrate'} +
{intl l="Migrate ?"}{intl l="Old country"}{intl l="New country"}{intl l="State"}
+ {form_collection_field form=$form row=$row field="migrate"} + + {/form_collection_field} + + {form_collection_field form=$form row=$row field="country"} + {$countryId={$value}} + + + {/form_collection_field} + + {form_collection_field form=$form row=$row field="new_country"} + {$newCountryId={$value}} + + + {/form_collection_field} + + {form_collection_field form=$form row=$row field="new_state"} + {$ref[]={$label_attr.for}} + + + {/form_collection_field} +
+
+ + + {/form} + +
+
+ {else} +
+ {intl l="All countries have been migrated"} +
+ {/if} + +
+
+ + {if count($countriesMigrated) > 0 } +
+
+
+ {intl l='Countries migrated'} +
+
+ + {foreach $countriesMigrated as $country => $new} +
+
+ {intl l='Country '} + {intl l=' migrated to '} + {intl l=' country '} + + {intl l=' state '} + +
+
+ {/foreach} +
+ {/if} + +
+ +
+
+{/block} + +{block name="javascript-initialization"} + {javascripts file='assets/js/bootstrap-select/bootstrap-select.js'} + + {/javascripts} + + {javascripts file='assets/js/libs/underscore-min.js'} + + {/javascripts} + + + + +{/block} + +{block name="javascript-last-call"} + {hook name="wysiwyg.js" location="wysiwyg-country-edit-js" } +{/block} \ No newline at end of file diff --git a/local/modules/TheliaSmarty/CREDITS.md b/local/modules/TheliaSmarty/CREDITS.md new file mode 100644 index 00000000..3e89e239 --- /dev/null +++ b/local/modules/TheliaSmarty/CREDITS.md @@ -0,0 +1,40 @@ +# Credits + +## Yii framework + +TheliaSmarty module uses a function that comes from [Yii framework](http://www.yiiframework.com/) + +License : + +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/local/modules/TheliaSmarty/Compiler/RegisterParserPluginPass.php b/local/modules/TheliaSmarty/Compiler/RegisterParserPluginPass.php new file mode 100644 index 00000000..76514fff --- /dev/null +++ b/local/modules/TheliaSmarty/Compiler/RegisterParserPluginPass.php @@ -0,0 +1,48 @@ + + */ +class RegisterParserPluginPass implements CompilerPassInterface +{ + /** + * You can modify the container here before it is dumped to PHP code. + * + * @param ContainerBuilder $container + * + * @api + */ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition("thelia.parser")) { + return; + } + + $smarty = $container->getDefinition("thelia.parser"); + + foreach ($container->findTaggedServiceIds("thelia.parser.register_plugin") as $id => $plugin) { + $smarty->addMethodCall("addPlugins", array(new Reference($id))); + } + + $smarty->addMethodCall("registerPlugins"); + } +} diff --git a/local/modules/TheliaSmarty/Config/config.xml b/local/modules/TheliaSmarty/Config/config.xml new file mode 100644 index 00000000..fa3efdf6 --- /dev/null +++ b/local/modules/TheliaSmarty/Config/config.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + %kernel.environment% + %kernel.debug% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %thelia.parser.loops% + + + + + + + + + + + + + + + + + + + + + + + + + + + + %thelia.parser.forms% + + + + + + + + + + %kernel.debug% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %kernel.debug% + + + + + + diff --git a/local/modules/TheliaSmarty/Config/module.xml b/local/modules/TheliaSmarty/Config/module.xml new file mode 100644 index 00000000..1a24d8f7 --- /dev/null +++ b/local/modules/TheliaSmarty/Config/module.xml @@ -0,0 +1,18 @@ + + + TheliaSmarty\TheliaSmarty + + Smarty template engine integration + + + Intégration du moteur de template Smarty + + 2.3.1 + + Manuel Raynaud + manu@raynaud.io + + classic + 2.2.0 + alpha + diff --git a/local/modules/TheliaSmarty/I18n/en_US.php b/local/modules/TheliaSmarty/I18n/en_US.php new file mode 100644 index 00000000..173d397f --- /dev/null +++ b/local/modules/TheliaSmarty/I18n/en_US.php @@ -0,0 +1,21 @@ + '\'%type\' loop class should extends Thelia\Core\Template\Element\BaseLoop', + 'A loop named \'%name\' already exists in the current scope.' => 'A loop named \'%name\' already exists in the current scope.', + 'Loop type \'%type\' is not defined.' => 'Loop type \'%type\' is not defined.', + 'Missing \'name\' parameter in loop arguments' => 'Missing \'name\' parameter in loop arguments', + 'Missing \'rel\' parameter in forHook arguments' => 'Missing \'rel\' parameter in forHook arguments', + 'Missing \'rel\' parameter in ifhook/elsehook arguments' => 'Missing \'rel\' parameter in ifhook/elsehook arguments', + 'Missing \'rel\' parameter in ifloop/elseloop arguments' => 'Missing \'rel\' parameter in ifloop/elseloop arguments', + 'Missing \'rel\' parameter in page loop' => 'Missing \'rel\' parameter in page loop', + 'Missing \'type\' parameter in loop arguments' => 'Missing \'type\' parameter in loop arguments', + 'Missing \'type\' parameter in {count} loop arguments' => 'Missing \'type\' parameter in {count} loop arguments', + 'Missing \'type\' parameter in {hasflash} function arguments' => 'Missing \'type\' parameter in {hasflash} function arguments', + 'No pagination currently defined for loop name \'%name\'' => 'No pagination currently defined for loop name \'%name\'', + 'Please specify either \'path\' or \'file\' parameter in {url} function.' => 'Please specify either \'path\' or \'file\' parameter in {url} function.', + 'Related hook name \'%name\' is not defined.' => 'Related hook name \'%name\' is not defined.', + 'Related loop name \'%name\'\' is not defined.' => 'Related loop name \'%name\'\' is not defined.', + 'Template file %file cannot be found.' => 'Template file %file cannot be found.', + 'The loop name \'%name\' is already defined in %className class' => 'The loop name \'%name\' is already defined in %className class', +); diff --git a/local/modules/TheliaSmarty/I18n/fr_FR.php b/local/modules/TheliaSmarty/I18n/fr_FR.php new file mode 100644 index 00000000..67b516db --- /dev/null +++ b/local/modules/TheliaSmarty/I18n/fr_FR.php @@ -0,0 +1,21 @@ + 'La loop "%type" doit étendre la class Thelia\Core\Template\Element\BaseLoop', + 'A loop named \'%name\' already exists in the current scope.' => 'une loop avec comme nom \'%name\' existe déjà dans le scope courant', + 'Loop type \'%type\' is not defined.' => 'La loop de type "%type" n\'est pas défini', + 'Missing \'name\' parameter in loop arguments' => 'Le paramètre \'name\' est manquant dans la liste des arguments', + 'Missing \'rel\' parameter in forHook arguments' => 'Le paramètre \'rel\' est manquant dans les arguments de forHook', + 'Missing \'rel\' parameter in ifhook/elsehook arguments' => 'Le paramètre \'rel\' est manquant des arguments ifhook/elsehook', + 'Missing \'rel\' parameter in ifloop/elseloop arguments' => 'Paramètre \'rel\' manquant dans la liste des arguments d\'une loop ifloop/elseloop', + 'Missing \'rel\' parameter in page loop' => 'Paramètre \'rel\' manquant dans la loop page', + 'Missing \'type\' parameter in loop arguments' => 'Le paramètre \'type\' est manquant dans la liste des arguments', + 'Missing \'type\' parameter in {count} loop arguments' => 'Le paramètre \'type\' dans la loop {count} est manquant', + 'Missing \'type\' parameter in {hasflash} function arguments' => 'Le paramètre \'type\' est manquant dans', + 'No pagination currently defined for loop name \'%name\'' => 'Il n\'y a pas de pagination définie pour la loop \'%name\'', + 'Please specify either \'path\' or \'file\' parameter in {url} function.' => 'Merci de spécifier le \'path\' ou le \'file\'.parameter dans la fonction {url}', + 'Related hook name \'%name\' is not defined.' => 'le hook ayat pour nom "%name" n\'est pas défini', + 'Related loop name \'%name\'\' is not defined.' => 'La loop ayant pour nom "%name" n\'est pas défini', + 'Template file %file cannot be found.' => 'Le fichier %s ne semble pas présent', + 'The loop name \'%name\' is already defined in %className class' => 'La loop "%name" est déjà définie dans la class %className', +]; diff --git a/local/modules/TheliaSmarty/I18n/tr_TR.php b/local/modules/TheliaSmarty/I18n/tr_TR.php new file mode 100644 index 00000000..05f834a0 --- /dev/null +++ b/local/modules/TheliaSmarty/I18n/tr_TR.php @@ -0,0 +1,21 @@ + '\'%type\' döngü sınıfını genişleten Thelia\Core\Template\Element\BaseLoop', + 'A loop named \'%name\' already exists in the current scope.' => '\'%name\' adlı bir döngü geçerli etki alanında bulunmaktadır.', + 'Loop type \'%type\' is not defined.' => 'Döngü türü \'%type\' tanımlı değil.', + 'Missing \'name\' parameter in loop arguments' => 'Döngü değişkenlerde \'ad\' parametresi eksik', + 'Missing \'rel\' parameter in forHook arguments' => 'ForHook değişkenlerde \'rel\' parametresi eksik', + 'Missing \'rel\' parameter in ifhook/elsehook arguments' => 'İfhook/elsehook bağımsız değişkenleri \'rel\' parametresi eksik', + 'Missing \'rel\' parameter in ifloop/elseloop arguments' => 'İfloop/elseloop bağımsız değişkenleri \'rel\' parametresi eksik', + 'Missing \'rel\' parameter in page loop' => 'Sayfa döngü içinde \'rel\' parametresi eksik', + 'Missing \'type\' parameter in loop arguments' => '\'Tür\' parametresinde döngü bağımsız değişkenleri eksik', + 'Missing \'type\' parameter in {count} loop arguments' => '{count} döngü değişkenlerde \'type\' parametresi eksik', + 'Missing \'type\' parameter in {hasflash} function arguments' => '\'Tür\' parametresinde {hasflash} fonksiyon bağımsız değişkenleri eksik', + 'No pagination currently defined for loop name \'%name\'' => 'Şu anda döngü adı \'%name\' tanımlı hiçbir pagination', + 'Please specify either \'path\' or \'file\' parameter in {url} function.' => 'Lütfen \'yol\' ya da \'dosya\' parametre {url} işlevinde belirtin.', + 'Related hook name \'%name\' is not defined.' => 'İlgili kanca adı \'%name\' tanımlı değil.', + 'Related loop name \'%name\'\' is not defined.' => 'İlgili kanca adı \'%name\' tanımlı değil.', + 'Template file %file cannot be found.' => 'Şablon dosyası %file bulunamadı.', + 'The loop name \'%name\' is already defined in %className class' => 'Döngü adı \'%name\' zaten %className sınıfında tanımlanmış', +]; diff --git a/local/modules/TheliaSmarty/LICENSE.txt b/local/modules/TheliaSmarty/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/TheliaSmarty/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/TheliaSmarty/Readme.md b/local/modules/TheliaSmarty/Readme.md new file mode 100644 index 00000000..96b8b328 --- /dev/null +++ b/local/modules/TheliaSmarty/Readme.md @@ -0,0 +1,2 @@ +## Smarty for Thelia + diff --git a/local/modules/TheliaSmarty/Template/AbstractSmartyPlugin.php b/local/modules/TheliaSmarty/Template/AbstractSmartyPlugin.php new file mode 100644 index 00000000..92c54a5c --- /dev/null +++ b/local/modules/TheliaSmarty/Template/AbstractSmartyPlugin.php @@ -0,0 +1,97 @@ +getParam($params, $name, $default); + + if (is_string($value)) { + $value = strtolower(trim($value)); + } + return $value; + } + + /** + * Get a function or block parameter value + * + * @param array $params the parameters array + * @param mixed $name as single parameter name, or an array of names. In this case, the first defined parameter is returned. Use this for aliases (context, ctx, c) + * @param mixed $default the defaut value if parameter is missing (default to null) + * @return mixed the parameter value, or the default value if it is not found. + */ + public function getParam($params, $name, $default = null) + { + if (is_array($name)) { + foreach ($name as $test) { + if (isset($params[$test])) { + return $params[$test]; + } + } + } elseif (isset($params[$name])) { + return $params[$name]; + } + + return $default; + } + + /** + * @return SmartyPluginDescriptor[] an array of SmartyPluginDescriptor + */ + abstract public function getPluginDescriptors(); +} diff --git a/local/modules/TheliaSmarty/Template/Assets/SmartyAssetsManager.php b/local/modules/TheliaSmarty/Template/Assets/SmartyAssetsManager.php new file mode 100644 index 00000000..64ec3db6 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Assets/SmartyAssetsManager.php @@ -0,0 +1,268 @@ +web_root = $web_root; + $this->path_relative_to_web_root = $path_relative_to_web_root; + + $this->assetsManager = $assetsManager; + $this->assetsResolver = $assetsResolver; + } + + + /** + * Prepare current template assets + * + * @param string $assets_directory the assets directory in the template + * @param \Smarty_Internal_Template $smarty the smarty parser + */ + public function prepareAssets($assets_directory, \Smarty_Internal_Template $smarty) + { + // Be sure to use the proper path separator + if (DS != '/') { + $assets_directory = str_replace('/', DS, $assets_directory); + } + + // Set the current template assets directory + self::$assetsDirectory = $assets_directory; + + /** @var SmartyParser $smartyParser */ + $smartyParser = $smarty->smarty; + + $this->prepareTemplateAssets($smartyParser->getTemplateDefinition(), $assets_directory, $smartyParser); + } + + /** + * Prepare template assets + * + * @param TemplateDefinition $templateDefinition the template to process + * @param string $assets_directory the assets directory in the template + * @param \TheliaSmarty\Template\SmartyParser $smartyParser the current parser. + */ + protected function prepareTemplateAssets( + TemplateDefinition $templateDefinition, + $assets_directory, + SmartyParser $smartyParser + ) { + // Get the registered template directories for the current template path + $templateDirectories = $smartyParser->getTemplateDirectories($templateDefinition->getType()); + + if (isset($templateDirectories[$templateDefinition->getName()])) { + /* create assets foreach registered directory : main @ modules */ + foreach ($templateDirectories[$templateDefinition->getName()] as $key => $directory) { + // This is the assets directory in the template's tree + $tpl_path = $directory . DS . $assets_directory; + + $asset_dir_absolute_path = realpath($tpl_path); + + if (false !== $asset_dir_absolute_path) { + // If we're processing template assets (not module assets), + // we will use the $assets_directory as the assets parent dir. + if (SmartyParser::TEMPLATE_ASSETS_KEY == $key && ! null !== $assets_directory) { + $assetsWebDir = SmartyParser::TEMPLATE_ASSETS_KEY . DS . $assets_directory; + } else { + $assetsWebDir = $key; + } + + Tlog::getInstance()->addDebug( + "Preparing assets: source assets directory $asset_dir_absolute_path, " + . "web assets dir base: " . $this->web_root . $this->path_relative_to_web_root . ", " + . "template: ".$templateDefinition->getPath().", " + . "web asset key: $assetsWebDir (key=$key)" + ); + + $this->assetsManager->prepareAssets( + $asset_dir_absolute_path, + $this->web_root . $this->path_relative_to_web_root, + $templateDefinition->getPath(), + $key . DS . $assets_directory + ); + } + } + } + } + + /** + * Retrieve asset URL + * + * @param string $assetType js|css|image + * @param array $params Parameters + * - file File path in the default template + * - source module asset + * - filters filter to apply + * - debug + * - template if you want to load asset from another template + * @param \Smarty_Internal_Template $template Smarty Template + * + * @param bool $allowFilters if false, the 'filters' parameter is ignored + * @return string + */ + public function computeAssetUrl($assetType, $params, \Smarty_Internal_Template $template, $allowFilters = true) + { + $assetUrl = ""; + + $file = $params['file']; + + // The 'file' parameter is mandatory + if (empty($file)) { + throw new \InvalidArgumentException( + "The 'file' parameter is missing in an asset directive (type is '$assetType')" + ); + } + + $assetOrigin = isset($params['source']) ? $params['source'] : SmartyParser::TEMPLATE_ASSETS_KEY; + $filters = $allowFilters && isset($params['filters']) ? $params['filters'] : ''; + $debug = isset($params['debug']) ? trim(strtolower($params['debug'])) == 'true' : false; + $templateName = isset($params['template']) ? $params['template'] : false; + $failsafe = isset($params['failsafe']) ? $params['failsafe'] : false; + + Tlog::getInstance()->debug("Searching asset $file in source $assetOrigin, with template $templateName"); + + /** @var \TheliaSmarty\Template\SmartyParser $smartyParser */ + $smartyParser = $template->smarty; + + if (false !== $templateName) { + // We have to be sure that this external template assets have been properly prepared. + // We will assume the following: + // 1) this template have the same type as the current template, + // 2) this template assets have the same structure as the current template + // (which is in self::$assetsDirectory) + $currentTemplate = $smartyParser->getTemplateDefinition(); + + $templateDefinition = new TemplateDefinition( + $templateName, + $currentTemplate->getType() + ); + + /* Add this templates directory to the current list */ + $smartyParser->addTemplateDirectory( + $templateDefinition->getType(), + $templateDefinition->getName(), + THELIA_TEMPLATE_DIR . $templateDefinition->getPath(), + SmartyParser::TEMPLATE_ASSETS_KEY + ); + + $this->prepareTemplateAssets($templateDefinition, self::$assetsDirectory, $smartyParser); + } + + $assetSource = $this->assetsResolver->resolveAssetSourcePath($assetOrigin, $templateName, $file, $smartyParser); + + if (null !== $assetSource) { + $assetUrl = $this->assetsResolver->resolveAssetURL( + $assetOrigin, + $file, + $assetType, + $smartyParser, + $filters, + $debug, + self::$assetsDirectory, + $templateName + ); + } else { + // Log the problem + if ($failsafe) { + // The asset URL will be '' + Tlog::getInstance()->addWarning("Failed to find asset source file " . $params['file']); + } else { + throw new TheliaProcessException("Failed to find asset source file " . $params['file']); + } + } + + return $assetUrl; + } + + public function processSmartyPluginCall( + $assetType, + $params, + $content, + \Smarty_Internal_Template $template, + &$repeat + ) { + // Opening tag (first call only) + if ($repeat) { + $isfailsafe = false; + + $url = ''; + try { + // Check if we're in failsafe mode + if (isset($params['failsafe'])) { + $isfailsafe = $params['failsafe']; + } + + $url = $this->computeAssetUrl($assetType, $params, $template); + + if (empty($url)) { + $message = sprintf("Failed to get real path of asset %s without exception", $params['file']); + + Tlog::getInstance()->addWarning($message); + + // In debug mode, throw exception + if ($this->assetsManager->isDebugMode() && ! $isfailsafe) { + throw new TheliaProcessException($message); + } + } + } catch (\Exception $ex) { + Tlog::getInstance()->addWarning( + sprintf( + "Failed to get real path of asset %s with exception: %s", + $params['file'], + $ex->getMessage() + ) + ); + + // If we're in development mode, just retrow the exception, so that it will be displayed + if ($this->assetsManager->isDebugMode() && ! $isfailsafe) { + throw $ex; + } + } + $template->assign('asset_url', $url); + } elseif (isset($content)) { + return $content; + } + + return null; + } +} diff --git a/local/modules/TheliaSmarty/Template/Assets/SmartyAssetsResolver.php b/local/modules/TheliaSmarty/Template/Assets/SmartyAssetsResolver.php new file mode 100644 index 00000000..34c248c5 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Assets/SmartyAssetsResolver.php @@ -0,0 +1,223 @@ +path_relative_to_web_root = ConfigQuery::read('asset_dir_from_web_root', 'assets'); + + $this->assetsManager = $assetsManager; + } + + /** + * Generate an asset URL + * + * @param string $source a module code, or SmartyParser::TEMPLATE_ASSETS_KEY + * @param string $file the file path, relative to a template base directory (e.g. assets/css/style.css) + * @param string $type the asset type, either 'css' or ' + * @param ParserInterface $parserInterface the current template parser + * @param array $filters the filters to pass to the asset manager + * @param bool $debug the debug mode + * @param string $declaredAssetsDirectory if not null, this is the assets directory declared in the {declare_assets} function of a template. + * @param mixed $sourceTemplateName A template name, of false. If provided, the assets will be searched in this template directory instead of the current one. + * @return mixed + */ + public function resolveAssetURL($source, $file, $type, ParserInterface $parserInterface, $filters = [], $debug = false, $declaredAssetsDirectory = null, $sourceTemplateName = false) + { + $url = ""; + + // Normalize path separator + $file = $this->fixPathSeparator($file); + + $fileRoot = $this->resolveAssetSourcePath($source, $sourceTemplateName, $file, $parserInterface); + + if (null !== $fileRoot) { + $templateDefinition = $parserInterface->getTemplateDefinition($sourceTemplateName); + + $url = $this->assetsManager->processAsset( + $fileRoot . DS . $file, + $fileRoot, + THELIA_WEB_DIR . $this->path_relative_to_web_root, + $templateDefinition->getPath(), + $source, // $this->getBaseWebAssetDirectory($source, $declaredAssetsDirectory), + URL::getInstance()->absoluteUrl($this->path_relative_to_web_root, null, URL::PATH_TO_FILE /* path only */), + $type, + $filters, + $debug + ); + } else { + Tlog::getInstance()->addError("Asset $file (type $type) was not found."); + } + + return $url; + } + + + /** + * Return an asset source file path. + * + * A system of fallback enables file overriding. It will look for the template : + * - in the current template in directory /modules/{module code}/ + * - in the module in the current template if it exists + * - in the module in the default template + * + * @param string $source a module code, or or SmartyParser::TEMPLATE_ASSETS_KEY + * @param string $templateName a template name, or false to use the current template + * @param string $fileName the filename + * @param ParserInterface $parserInterface the current template parser + * + * @return mixed the path to directory containing the file, or null if the file doesn't exists. + */ + public function resolveAssetSourcePath($source, $templateName, $fileName, ParserInterface $parserInterface) + { + $filePath = null; + + $templateDefinition = $parserInterface->getTemplateDefinition(false); + + // Get all possible directories to search + $paths = $this->getPossibleAssetSources( + $parserInterface->getTemplateDirectories($templateDefinition->getType()), + $templateName ?: $templateDefinition->getName(), + $source + ); + + // Normalize path separator if required (e.g., / becomes \ on windows) + $fileName = $this->fixPathSeparator($fileName); + + /* Absolute paths are not allowed. This may be a mistake, such as '/assets/...' instead of 'assets/...'. Forgive it. */ + $fileName = ltrim($fileName, DS); + + /* Navigating in the server's directory tree is not allowed :) */ + if (preg_match('!\.\.\\'.DS.'!', $fileName)) { + // This time, we will not forgive. + throw new \InvalidArgumentException("Relative paths are not allowed in assets names."); + } + + // Find the first occurrence of the file in the directories lists + foreach ($paths as $path) { + if ($this->filesExist($path, $fileName)) { + // Got it ! + $filePath = $path; + break; + } + } + + return $filePath; + } + + + /** + * Be sure that the pat separator of a pathname is always the platform path separator. + * + * @param string $path the iput path + * @return string the fixed path + */ + protected function fixPathSeparator($path) + { + if (DS != '/') { + $path = str_replace('/', DS, $path); + } + + return $path; + } + + /** + * Check if a file(s) exists in a directory + * + * @param string $dir the directory path + * @param string $file the file path. It can contain wildcard. eg: /path/*.css + * @return bool true if file(s) + */ + protected function filesExist($dir, $file) + { + if (!file_exists($dir)) { + return false; + } + + $full_path = rtrim($dir, DS) . DS . ltrim($file, DS); + + try { + $files = glob($full_path); + + $files_found = ! empty($files); + } catch (\Exception $ex) { + Tlog::getInstance()->addError($ex->getMessage()); + + $files_found = false; + } + + return $files_found; + } + + /** + * Get all possible directories from which the asset can be found. + * It returns an array of directories ordered by priority. + * + * @param array $directories all directories source available for the template type + * @param string $template the name of the template + * @param string $source the module code or SmartyParser::TEMPLATE_ASSETS_KEY + * @return array possible directories + */ + protected function getPossibleAssetSources($directories, $template, $source) + { + $paths = []; + + if (SmartyParser::TEMPLATE_ASSETS_KEY !== $source) { + // We're in a module. + + // First look into the current template in the right scope : frontOffice, backOffice, ... + // template should be overridden in : {template_path}/modules/{module_code}/{template_name} + if (isset($directories[$template][SmartyParser::TEMPLATE_ASSETS_KEY])) { + $paths[] = + $directories[$template][SmartyParser::TEMPLATE_ASSETS_KEY] + . DS + . self::MODULE_OVERRIDE_DIRECTORY_NAME . DS + . $source; + } + + // then in the implementation for the current template used in the module directory + if (isset($directories[$template][$source])) { + $paths[] = $directories[$template][$source]; + } + + // then in the default theme in the module itself + if (isset($directories[self::DEFAULT_TEMPLATE_NAME][$source])) { + $paths[] = $directories[self::DEFAULT_TEMPLATE_NAME][$source]; + } + } else { + $paths[] = $directories[$template][SmartyParser::TEMPLATE_ASSETS_KEY]; + } + + return $paths; + } +} diff --git a/local/modules/TheliaSmarty/Template/Exception/SmartyPluginException.php b/local/modules/TheliaSmarty/Template/Exception/SmartyPluginException.php new file mode 100644 index 00000000..41119ecf --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Exception/SmartyPluginException.php @@ -0,0 +1,22 @@ + + */ +class SmartyPluginException extends \SmartyException +{ +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/AdminUtilities.php b/local/modules/TheliaSmarty/Template/Plugins/AdminUtilities.php new file mode 100644 index 00000000..35f03530 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/AdminUtilities.php @@ -0,0 +1,160 @@ + + */ +class AdminUtilities extends AbstractSmartyPlugin +{ + private $securityContext; + private $templateHelper; + + public function __construct(SecurityContext $securityContext, TemplateHelperInterface $templateHelper) + { + $this->securityContext = $securityContext; + $this->templateHelper = $templateHelper; + } + + protected function fetchSnippet($smarty, $templateName, $variablesArray) + { + $data = ''; + + $snippet_path = sprintf( + '%s/%s/%s.html', + THELIA_TEMPLATE_DIR, + $this->templateHelper->getActiveAdminTemplate()->getPath(), + $templateName + ); + + if (false !== $snippet_content = file_get_contents($snippet_path)) { + $smarty->assign($variablesArray); + + $data = $smarty->fetch(sprintf('string:%s', $snippet_content)); + } + + return $data; + } + + public function generatePositionChangeBlock($params, &$smarty) + { + // The required permissions + $resource = $this->getParam($params, 'resource'); + $module = $this->getParam($params, 'module'); + $access = $this->getParam($params, 'access'); + + // The base position change path + $path = $this->getParam($params, 'path'); + + // The URL parameter the object ID is assigned + $url_parameter = $this->getParam($params, 'url_parameter'); + + // The current object position + $position = $this->getParam($params, 'position'); + + // The object ID + $id = $this->getParam($params, 'id'); + + // The in place dition class + $in_place_edit_class = $this->getParam($params, 'in_place_edit_class'); + + /* + + {$POSITION} + + */ + + if ($this->securityContext->isGranted( + array("ADMIN"), + $resource === null ? array() : array($resource), + $module === null ? array() : array($module), + array($access) + ) + ) { + return $this->fetchSnippet($smarty, 'includes/admin-utilities-position-block', array( + 'admin_utilities_go_up_url' => URL::getInstance()->absoluteUrl($path, array('mode' => 'up', $url_parameter => $id)), + 'admin_utilities_in_place_edit_class' => $in_place_edit_class, + 'admin_utilities_object_id' => $id, + 'admin_utilities_current_position' => $position, + 'admin_utilities_go_down_url' => URL::getInstance()->absoluteUrl($path, array('mode' => 'down', $url_parameter => $id)) + )); + } else { + return $position; + } + } + + /** + * Generates the link of a sortable column header + * + * @param array $params + * @param unknown $smarty + * @return string no text is returned. + */ + public function generateSortableColumnHeader($params, &$smarty) + { + // The current order of the table + $current_order = $this->getParam($params, 'current_order'); + + // The column ascending order + $order = $this->getParam($params, 'order'); + + // The column descending order label + $reverse_order = $this->getParam($params, 'reverse_order'); + + // The order change path + $path = $this->getParam($params, 'path'); + + // The column label + $label = $this->getParam($params, 'label'); + + // The request parameter + $request_parameter_name = $this->getParam($params, 'request_parameter_name', 'order'); + + if ($current_order == $order) { + $sort_direction = 'up'; + $order_change = $reverse_order; + } elseif ($current_order == $reverse_order) { + $sort_direction = 'down'; + $order_change = $order; + } else { + $order_change = $order; + } + + return $this->fetchSnippet($smarty, 'includes/admin-utilities-sortable-column-header', array( + 'admin_utilities_sort_direction' => $sort_direction, + 'admin_utilities_sorting_url' => URL::getInstance()->absoluteUrl($path, array($request_parameter_name => $order_change)), + 'admin_utilities_header_text' => $label + )); + } + + /** + * Define the various smarty plugins handled by this class + * + * @return array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'admin_sortable_header', $this, 'generateSortableColumnHeader'), + new SmartyPluginDescriptor('function', 'admin_position_block', $this, 'generatePositionChangeBlock'), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Assets.php b/local/modules/TheliaSmarty/Template/Plugins/Assets.php new file mode 100644 index 00000000..a64578dd --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Assets.php @@ -0,0 +1,106 @@ +assetManager = new SmartyAssetsManager( + $assetsManager, + $assetsResolver, + THELIA_WEB_DIR, + $asset_dir_from_web_root + ); + } + + public function declareAssets($params, \Smarty_Internal_Template $template) + { + if (false !== $asset_dir = $this->getParam($params, 'directory', false)) { + $this->assetManager->prepareAssets($asset_dir, $template); + + return ''; + } + + throw new \InvalidArgumentException('declare_assets: parameter "directory" is required'); + } + + public function blockJavascripts($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + return $this->assetManager->processSmartyPluginCall('js', $params, $content, $template, $repeat); + } + + public function blockImages($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + return $this + ->assetManager + ->processSmartyPluginCall(SmartyAssetsManager::ASSET_TYPE_AUTO, $params, $content, $template, $repeat); + } + + public function blockStylesheets($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + return $this->assetManager->processSmartyPluginCall('css', $params, $content, $template, $repeat); + } + + public function functionImage($params, \Smarty_Internal_Template $template) + { + return $this->assetManager->computeAssetUrl(SmartyAssetsManager::ASSET_TYPE_AUTO, $params, $template); + } + + public function functionAsset($params, \Smarty_Internal_Template $template) + { + return $this->assetManager->computeAssetUrl(SmartyAssetsManager::ASSET_TYPE_AUTO, $params, $template, false); + } + + public function functionJavascript($params, \Smarty_Internal_Template $template) + { + return $this->assetManager->computeAssetUrl(SmartyAssetsManager::ASSET_TYPE_AUTO, $params, $template); + } + + public function functionStylesheet($params, \Smarty_Internal_Template $template) + { + return $this->assetManager->computeAssetUrl('css', $params, $template); + } + + /** + * Define the various smarty plugins hendled by this class + * + * @return array an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('block', 'stylesheets', $this, 'blockStylesheets'), + new SmartyPluginDescriptor('block', 'javascripts', $this, 'blockJavascripts'), + new SmartyPluginDescriptor('block', 'images', $this, 'blockImages'), + + new SmartyPluginDescriptor('function', 'asset', $this, 'functionAsset'), + new SmartyPluginDescriptor('function', 'image', $this, 'functionImage'), + new SmartyPluginDescriptor('function', 'javascript', $this, 'functionJavascript'), + new SmartyPluginDescriptor('function', 'stylesheet', $this, 'functionStylesheet'), + + new SmartyPluginDescriptor('function', 'declare_assets', $this, 'declareAssets') + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/CartPostage.php b/local/modules/TheliaSmarty/Template/Plugins/CartPostage.php new file mode 100644 index 00000000..b760060d --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/CartPostage.php @@ -0,0 +1,251 @@ +container = $container; + + $this->requestStack = $container->get('request_stack'); + + $this->request = $this->getCurrentRequest(); + + $this->dispatcher = $container->get('event_dispatcher'); + } + + /** + * Get postage amount for cart + * + * @param array $params Block parameters + * @param mixed $content Block content + * @param \Smarty_Internal_Template $template Template + * @param bool $repeat Control how many times + * the block is displayed + * + * @return mixed + */ + public function postage($params, $content, $template, &$repeat) + { + if (!$repeat) { + return (null !== $this->countryId) ? $content : ""; + } + + $customer = $this->getCurrentRequest()->getSession()->getCustomerUser(); + /** @var Address $address */ + /** @var Country $country */ + list($address, $country, $state) = $this->getDeliveryInformation($customer); + + if (null !== $country) { + $this->countryId = $country->getId(); + // try to get the cheapest delivery for this country + $this->getCheapestDelivery($address, $country); + } + + $template->assign('country_id', $this->countryId); + $template->assign('delivery_id', $this->deliveryId); + $template->assign('postage', $this->postage ?: 0.0); + $template->assign('postage_tax', $this->postageTax ?: 0.0); + $template->assign('postage_title', $this->postageTaxRuleTitle ?: 0.0); + $template->assign('is_customizable', $this->isCustomizable); + } + + /** + * Retrieve the delivery country for a customer + * + * The rules : + * - the country of the delivery address of the customer related to the + * cart if it exists + * - the country saved in cookie if customer have changed + * the default country + * - the default country for the shop if it exists + * + * + * @param \Thelia\Model\Customer $customer + * @return \Thelia\Model\Country + */ + protected function getDeliveryInformation(Customer $customer = null) + { + $address = null; + // get the selected delivery address + if (null !== $addressId = $this->getCurrentRequest()->getSession()->getOrder()->getChoosenDeliveryAddress()) { + if (null !== $address = AddressQuery::create()->findPk($addressId)) { + $this->isCustomizable = false; + return [$address, $address->getCountry(), null]; + } + } + + // get country from customer addresses + if (null !== $customer) { + $address = AddressQuery::create() + ->filterByCustomerId($customer->getId()) + ->filterByIsDefault(1) + ->findOne() + ; + + if (null !== $address) { + $this->isCustomizable = false; + + return [$address, $address->getCountry(), null]; + } + } + + // get country from cookie + $cookieName = ConfigQuery::read('front_cart_country_cookie_name', 'fcccn'); + if ($this->getCurrentRequest()->cookies->has($cookieName)) { + $cookieVal = $this->getCurrentRequest()->cookies->getInt($cookieName, 0); + if (0 !== $cookieVal) { + $country = CountryQuery::create()->findPk($cookieVal); + if (null !== $country) { + return [null, $country, null]; + } + } + } + + // get default country for store. + try { + $country = Country::getDefaultCountry(); + + return [null, $country, null]; + } catch (\LogicException $e) { + ; + } + + return [null, null, null]; + } + + /** + * Retrieve the cheapest delivery for country + * + * @param Address $address + * @param \Thelia\Model\Country $country + * @return DeliveryModuleInterface + */ + protected function getCheapestDelivery(Address $address = null, Country $country = null) + { + $cart = $this->getCurrentRequest()->getSession()->getSessionCart(); + + $deliveryModules = ModuleQuery::create() + ->filterByActivate(1) + ->filterByType(BaseModule::DELIVERY_MODULE_TYPE, Criteria::EQUAL) + ->find() + ; + + /** @var \Thelia\Model\Module $deliveryModule */ + foreach ($deliveryModules as $deliveryModule) { + $moduleInstance = $deliveryModule->getDeliveryModuleInstance($this->container); + + try { + $deliveryPostageEvent = new DeliveryPostageEvent($moduleInstance, $cart, $address, $country, $state); + $this->dispatcher->dispatch( + TheliaEvents::MODULE_DELIVERY_GET_POSTAGE, + $deliveryPostageEvent + ); + + if ($deliveryPostageEvent->isValidModule()) { + $postage = $deliveryPostageEvent->getPostage(); + + if (null === $this->postage || $this->postage > $postage->getAmount()) { + $this->postage = $postage->getAmount(); + $this->postageTax = $postage->getAmountTax(); + $this->postageTaxRuleTitle = $postage->getTaxRuleTitle(); + $this->deliveryId = $deliveryModule->getId(); + } + } + } catch (DeliveryException $ex) { + // Module is not available + } + } + } + + /** + * Defines the various smarty plugins handled by this class + * + * @return \TheliaSmarty\Template\SmartyPluginDescriptor[] smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('block', 'postage', $this, 'postage') + ); + } + + /** + * @return null|Request + */ + protected function getCurrentRequest() + { + return $this->requestStack->getCurrentRequest(); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/DataAccessFunctions.php b/local/modules/TheliaSmarty/Template/Plugins/DataAccessFunctions.php new file mode 100644 index 00000000..d8ee4545 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/DataAccessFunctions.php @@ -0,0 +1,786 @@ + + * + */ +class DataAccessFunctions extends AbstractSmartyPlugin +{ + /** @var SecurityContext */ + private $securityContext; + + /** @var ParserContext */ + protected $parserContext; + + /** @var RequestStack */ + protected $requestStack; + + /** @var EventDispatcherInterface */ + protected $dispatcher; + + /** @var TaxEngine */ + protected $taxEngine; + + private static $dataAccessCache = array(); + + public function __construct( + RequestStack $requestStack, + SecurityContext $securityContext, + TaxEngine $taxEngine, + ParserContext $parserContext, + EventDispatcherInterface $dispatcher + ) { + $this->securityContext = $securityContext; + $this->parserContext = $parserContext; + $this->requestStack = $requestStack; + $this->dispatcher = $dispatcher; + $this->taxEngine = $taxEngine; + } + + /** + * Provides access to the current logged administrator attributes using the accessors. + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function adminDataAccess($params, &$smarty) + { + return $this->dataAccess("Admin User", $params, $this->securityContext->getAdminUser()); + } + + /** + * Provides access to the current logged customer attributes thought the accessor + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function customerDataAccess($params, &$smarty) + { + return $this->dataAccess("Customer User", $params, $this->securityContext->getCustomerUser()); + } + + /** + * Provides access to an attribute of the current product + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function productDataAccess($params, &$smarty) + { + $productId = $this->getRequest()->get('product_id'); + + if ($productId !== null) { + return $this->dataAccessWithI18n( + "Product", + $params, + ProductQuery::create()->filterByPrimaryKey($productId) + ); + } + + return ''; + } + + /** + * Provides access to an attribute of the current category + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function categoryDataAccess($params, &$smarty) + { + $categoryId = $this->getRequest()->get('category_id'); + + if ($categoryId === null) { + $productId = $this->getRequest()->get('product_id'); + + if ($productId !== null) { + if (null !== $product = ProductQuery::create()->findPk($productId)) { + $categoryId = $product->getDefaultCategoryId(); + } + } + } + + if ($categoryId !== null) { + return $this->dataAccessWithI18n( + "Category", + $params, + CategoryQuery::create()->filterByPrimaryKey($categoryId) + ); + } + + return ''; + } + + /** + * Provides access to an attribute of the current content + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function contentDataAccess($params, &$smarty) + { + $contentId = $this->getRequest()->get('content_id'); + + if ($contentId !== null) { + return $this->dataAccessWithI18n( + "Content", + $params, + ContentQuery::create()->filterByPrimaryKey($contentId) + ); + } + + return ''; + } + + /** + * Provides access to an attribute of the current folder + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function folderDataAccess($params, &$smarty) + { + $folderId = $this->getRequest()->get('folder_id'); + + if ($folderId === null) { + $contentId = $this->getRequest()->get('content_id'); + + if ($contentId !== null) { + if (null !== $content = ContentQuery::create()->findPk($contentId)) { + $folderId = $content->getDefaultFolderId(); + } + } + } + + if ($folderId !== null) { + return $this->dataAccessWithI18n( + "Folder", + $params, + FolderQuery::create()->filterByPrimaryKey($folderId) + ); + } + + return ''; + } + + /** + * Provides access to an attribute of the current brand + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function brandDataAccess($params, &$smarty) + { + $brandId = $this->getRequest()->get('brand_id'); + + if ($brandId === null) { + $productId = $this->getRequest()->get('product_id'); + + if ($productId !== null) { + if (null !== $product = ProductQuery::create()->findPk($productId)) { + $brandId = $product->getBrandId(); + } + } + } + + if ($brandId !== null) { + return $this->dataAccessWithI18n( + "Brand", + $params, + BrandQuery::create()->filterByPrimaryKey($brandId) + ); + } + + return ''; + } + + + /** + * Provides access to an attribute of the current currency + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function currencyDataAccess($params, $smarty) + { + $currency = $this->getSession()->getCurrency(); + + if ($currency) { + return $this->dataAccessWithI18n( + "Currency", + $params, + CurrencyQuery::create()->filterByPrimaryKey($currency->getId()), + array("NAME") + ); + } + + return ''; + } + + /** + * Provides access to an attribute of the default country + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function countryDataAccess($params, $smarty) + { + switch ($params["ask"]) { + case "default": + return $this->dataAccessWithI18n( + "defaultCountry", + $params, + CountryQuery::create()->filterByByDefault(1)->limit(1) + ); + } + + return ''; + } + + /** + * Provides access to an attribute of the cart + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function cartDataAccess($params, $smarty) + { + /** @var Country $taxCountry */ + if (array_key_exists('currentCountry', self::$dataAccessCache)) { + $taxCountry = self::$dataAccessCache['currentCountry']; + } else { + $taxCountry = $this->taxEngine->getDeliveryCountry(); + self::$dataAccessCache['currentCountry'] = $taxCountry; + } + + /** @var Cart $cart */ + $cart = $this->getSession()->getSessionCart($this->dispatcher); + + $result = ""; + switch ($params["attr"]) { + case "count_product": + case "product_count": + $result = $cart->getCartItems()->count(); + break; + case "count_item": + case "item_count": + $count_allitem = 0; + foreach ($cart->getCartItems() as $cartItem) { + $count_allitem += $cartItem->getQuantity(); + } + $result = $count_allitem; + break; + case "total_price": + case "total_price_with_discount": + $result = $cart->getTotalAmount(); + break; + case "total_price_without_discount": + $result = $cart->getTotalAmount(false); + break; + case "total_taxed_price": + case "total_taxed_price_with_discount": + $result = $cart->getTaxedAmount($taxCountry); + break; + case "total_taxed_price_without_discount": + $result = $cart->getTaxedAmount($taxCountry, false); + break; + case "is_virtual": + case "contains_virtual_product": + $result = $cart->isVirtual(); + break; + case "total_vat": + case 'total_tax_amount': + $result = $cart->getTotalVAT($taxCountry); + break; + case "weight": + $result = $cart->getWeight(); + break; + } + + return $result; + } + + /** + * Provides access to an attribute of the current order + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + public function orderDataAccess($params, &$smarty) + { + $order = $this->getSession()->getOrder(); + $attribute = $this->getNormalizedParam($params, array('attribute', 'attrib', 'attr')); + switch ($attribute) { + case 'untaxed_postage': + return $order->getUntaxedPostage(); + case 'postage': + return $order->getPostage(); + case 'postage_tax': + return $order->getPostageTax(); + case 'discount': + return $order->getDiscount(); + case 'delivery_address': + return $order->getChoosenDeliveryAddress(); + case 'invoice_address': + return $order->getChoosenInvoiceAddress(); + case 'delivery_module': + return $order->getDeliveryModuleId(); + case 'payment_module': + return $order->getPaymentModuleId(); + case 'has_virtual_product': + return $order->hasVirtualProduct(); + + } + + throw new \InvalidArgumentException(sprintf("%s has no '%s' attribute", 'Order', $attribute)); + } + + /** + * Provides access to an attribute of the current language + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + + public function langDataAccess($params, $smarty) + { + return $this->dataAccess("Lang", $params, $this->getSession()->getLang()); + } + + public function configDataAccess($params, $smarty) + { + $key = $this->getParam($params, 'key', false); + + if ($key === false) { + return null; + } + + $default = $this->getParam($params, 'default', ''); + + return ConfigQuery::read($key, $default); + } + + /** + * Provides access to a module configuration value + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the configuration value + */ + + public function moduleConfigDataAccess($params, $smarty) + { + $key = $this->getParam($params, 'key', false); + $moduleCode = $this->getParam($params, 'module', false); + $locale = $this->getParam($params, 'locale'); + + if (null === $locale) { + $locale = $this->getSession()->getLang()->getLocale(); + } + + if ($key === false || $moduleCode === false) { + return null; + } + + $default = $this->getParam($params, 'default', ''); + + if (null !== $module = ModuleQuery::create()->findOneByCode($moduleCode)) { + return ModuleConfigQuery::create() + ->getConfigValue( + $module->getId(), + $key, + $default, + $locale + ); + } else { + Tlog::getInstance()->addWarning( + sprintf( + "Module code '%s' not found in module-config Smarty function", + $moduleCode + ) + ); + + $value = $default; + } + + return $value; + } + + /** + * Provides access to sales statistics + * + * @param array $params + * @param \Smarty $smarty + * @return string the value of the requested attribute + */ + + public function statsAccess($params, $smarty) + { + if (false === array_key_exists("key", $params)) { + throw new \InvalidArgumentException(sprintf("missing key attribute in stats access function")); + } + if (false === array_key_exists("startDate", $params) || $params['startDate'] === '') { + throw new \InvalidArgumentException(sprintf("missing startDate attribute in stats access function")); + } + if (false === array_key_exists("endDate", $params) || $params['endDate'] === '') { + throw new \InvalidArgumentException(sprintf("missing endDate attribute in stats access function")); + } + + if (false !== array_key_exists("includeShipping", $params) && $params['includeShipping'] == 'false') { + $includeShipping = false; + } else { + $includeShipping = true; + } + + if ($params['startDate'] == 'today') { + $startDate = new \DateTime(); + $startDate->setTime(0, 0, 0); + } elseif ($params['startDate'] == 'yesterday') { + $startDate = new \DateTime(); + $startDate->setTime(0, 0, 0); + $startDate->modify('-1 day'); + } elseif ($params['startDate'] == 'this_month') { + $startDate = new \DateTime(); + $startDate->modify('first day of this month'); + $startDate->setTime(0, 0, 0); + } elseif ($params['startDate'] == 'last_month') { + $startDate = new \DateTime(); + $startDate->modify('first day of last month'); + $startDate->setTime(0, 0, 0); + } elseif ($params['startDate'] == 'this_year') { + $startDate = new \DateTime(); + $startDate->modify('first day of January this year'); + $startDate->setTime(0, 0, 0); + } elseif ($params['startDate'] == 'last_year') { + $startDate = new \DateTime(); + $startDate->modify('first day of January last year'); + $startDate->setTime(0, 0, 0); + } else { + try { + $startDate = new \DateTime($params['startDate']); + } catch (\Exception $e) { + throw new \InvalidArgumentException( + sprintf("invalid startDate attribute '%s' in stats access function", $params['startDate']) + ); + } + } + + if ($params['endDate'] == 'today') { + $endDate = new \DateTime(); + $endDate->setTime(0, 0, 0); + } elseif ($params['endDate'] == 'yesterday') { + $endDate = new \DateTime(); + $endDate->setTime(0, 0, 0); + $endDate->modify('-1 day'); + } elseif ($params['endDate'] == 'this_month') { + $endDate = new \DateTime(); + $endDate->modify('last day of this month'); + $endDate->setTime(0, 0, 0); + } elseif ($params['endDate'] == 'last_month') { + $endDate = new \DateTime(); + $endDate->modify('last day of last month'); + $endDate->setTime(0, 0, 0); + } elseif ($params['endDate'] == 'this_year') { + $endDate = new \DateTime(); + $endDate->modify('last day of December this year'); + $endDate->setTime(0, 0, 0); + } elseif ($params['endDate'] == 'last_year') { + $endDate = new \DateTime(); + $endDate->modify('last day of December last year'); + $endDate->setTime(0, 0, 0); + } else { + try { + $endDate = new \DateTime($params['endDate']); + } catch (\Exception $e) { + throw new \InvalidArgumentException( + sprintf("invalid endDate attribute '%s' in stats access function", $params['endDate']) + ); + } + } + + switch ($params['key']) { + case 'sales': + return OrderQuery::getSaleStats($startDate, $endDate, $includeShipping); + break; + case 'orders': + return OrderQuery::getOrderStats($startDate, $endDate, array(1,2,3,4)); + break; + } + + throw new \InvalidArgumentException( + sprintf("invalid key attribute '%s' in stats access function", $params['key']) + ); + } + + /** + * Retrieve meta data associated to an element + * + * params should contain at least key an id attributes. Thus it will return + * an array of associated data. + * + * If meta argument is specified then it will return an unique value. + * + * @param array $params + * @param \Smarty $smarty + * + * @throws \InvalidArgumentException + * + * @return string|array|null + */ + public function metaAccess($params, $smarty) + { + $meta = $this->getParam($params, 'meta', null); + $key = $this->getParam($params, 'key', null); + $id = $this->getParam($params, 'id', null); + + $cacheKey = sprintf('meta_%s_%s_%s', $meta, $key, $id); + + $out = null; + + if (array_key_exists($cacheKey, self::$dataAccessCache)) { + return self::$dataAccessCache[$cacheKey]; + } + + if ($key !== null && $id !== null) { + if ($meta === null) { + $out = MetaDataQuery::getAllVal($key, (int) $id); + } else { + $out = MetaDataQuery::getVal($meta, $key, (int) $id); + } + } else { + throw new \InvalidArgumentException("key and id arguments are required in meta access function"); + } + + self::$dataAccessCache[$cacheKey] = $out; + + if (!empty($params['out'])) { + $smarty->assign($params['out'], $out); + + return $out !== null ? true : false; + } else { + if (is_array($out)) { + throw new \InvalidArgumentException('The argument "out" is required if the meta value is an array'); + } + + return $out; + } + } + + /** + * @param $objectLabel + * @param $params + * @param ModelCriteria $search + * @param array $columns + * @param null $foreignTable + * @param string $foreignKey + * + * @return string + */ + protected function dataAccessWithI18n( + $objectLabel, + $params, + ModelCriteria $search, + $columns = array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'), + $foreignTable = null, + $foreignKey = 'ID' + ) { + if (array_key_exists('data_' . $objectLabel, self::$dataAccessCache)) { + $data = self::$dataAccessCache['data_' . $objectLabel]; + } else { + $lang = $this->getNormalizedParam($params, array('lang')); + if ($lang === null) { + $lang = $this->getSession()->getLang()->getId(); + } + + ModelCriteriaTools::getI18n( + false, + $lang, + $search, + $this->getSession()->getLang()->getLocale(), + $columns, + $foreignTable, + $foreignKey, + true + ); + + $data = $search->findOne(); + + self::$dataAccessCache['data_' . $objectLabel] = $data; + } + + if ($data !== null) { + $noGetterData = array(); + + foreach ($columns as $column) { + $noGetterData[$column] = $data->getVirtualColumn('i18n_' . $column); + } + + return $this->dataAccess($objectLabel, $params, $data, $noGetterData); + } else { + throw new NotFoundHttpException(); + } + } + + /** + * @param $objectLabel + * @param $params + * @param $data + * @param array $noGetterData + * + * @return string + * @throws \InvalidArgumentException + */ + protected function dataAccess($objectLabel, $params, $data, $noGetterData = array()) + { + $attribute = $this->getNormalizedParam($params, array('attribute', 'attrib', 'attr')); + + if (!empty($attribute)) { + if (null != $data) { + $keyAttribute = strtoupper($attribute); + if (array_key_exists($keyAttribute, $noGetterData)) { + return $noGetterData[$keyAttribute]; + } + + $getter = sprintf("get%s", $this->underscoreToCamelcase($attribute)); + if (method_exists($data, $getter)) { + $return = $data->$getter(); + + if ($return instanceof \DateTime) { + if (array_key_exists("format", $params)) { + $format = $params["format"]; + } else { + $format = DateTimeFormat::getInstance($this->getRequest())->getFormat( + array_key_exists("output", $params) ? $params["output"] : null + ); + } + + $return = $return->format($format); + } + + return $return; + } + + throw new \InvalidArgumentException(sprintf("%s has no '%s' attribute", $objectLabel, $attribute)); + } + } + + return ''; + } + + /** + * Transcode an underscored string into a camel-cased string, eg. default_folder into DefaultFolder + * + * @param string $str the string to convert from underscore to camel-case + * + * @return string the camel cased string. + */ + private function underscoreToCamelcase($str) + { + // Split string in words. + $words = explode('_', strtolower($str)); + + $return = ''; + + foreach ($words as $word) { + $return .= ucfirst(trim($word)); + } + + return $return; + } + + /** + * @inheritdoc + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'admin', $this, 'adminDataAccess'), + new SmartyPluginDescriptor('function', 'customer', $this, 'customerDataAccess'), + new SmartyPluginDescriptor('function', 'product', $this, 'productDataAccess'), + new SmartyPluginDescriptor('function', 'category', $this, 'categoryDataAccess'), + new SmartyPluginDescriptor('function', 'content', $this, 'contentDataAccess'), + new SmartyPluginDescriptor('function', 'folder', $this, 'folderDataAccess'), + new SmartyPluginDescriptor('function', 'brand', $this, 'brandDataAccess'), + new SmartyPluginDescriptor('function', 'currency', $this, 'currencyDataAccess'), + new SmartyPluginDescriptor('function', 'country', $this, 'countryDataAccess'), + new SmartyPluginDescriptor('function', 'lang', $this, 'langDataAccess'), + new SmartyPluginDescriptor('function', 'cart', $this, 'cartDataAccess'), + new SmartyPluginDescriptor('function', 'order', $this, 'orderDataAccess'), + new SmartyPluginDescriptor('function', 'config', $this, 'configDataAccess'), + new SmartyPluginDescriptor('function', 'stats', $this, 'statsAccess'), + new SmartyPluginDescriptor('function', 'meta', $this, 'metaAccess'), + new SmartyPluginDescriptor('function', 'module_config', $this, 'moduleConfigDataAccess'), + ); + } + + /** + * @return Request + */ + protected function getRequest() + { + return $this->requestStack->getCurrentRequest(); + } + + /** + * @return Session + */ + protected function getSession() + { + return $this->getRequest()->getSession(); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Esi.php b/local/modules/TheliaSmarty/Template/Plugins/Esi.php new file mode 100644 index 00000000..6bee285c --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Esi.php @@ -0,0 +1,73 @@ + + */ +class Esi extends AbstractSmartyPlugin +{ + /** @var EsiFragmentRenderer */ + protected $esiFragmentRender; + + /** @var RequestStack */ + protected $requestStack; + + public function __construct(EsiFragmentRenderer $esiFragmentRenderer, RequestStack $requestStack) + { + $this->esiFragmentRender = $esiFragmentRenderer; + $this->requestStack = $requestStack; + } + + public function renderEsi($params, $template = null) + { + $path = $this->getParam($params, 'path'); + $alt = $this->getParam($params, 'alt'); + $ignore_errors = $this->getParam($params, 'ignore_errors'); + $comment = $this->getParam($params, 'comment'); + + if (null === $path) { + return; + } + + $response = $this->esiFragmentRender->render($path, $this->requestStack->getCurrentRequest(), array( + 'alt' => $alt, + 'ignore_errors' => $ignore_errors, + 'comment' => $comment + )); + + if (!$response->isSuccessful()) { + return null; + } + + return $response->getContent(); + } + + /** + * @return array an array of SmartyPluginDescriptor + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'render_esi', $this, 'renderEsi') + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/FlashMessage.php b/local/modules/TheliaSmarty/Template/Plugins/FlashMessage.php new file mode 100644 index 00000000..7ad9a5a2 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/FlashMessage.php @@ -0,0 +1,155 @@ +{$MESSAGE}
+ * {/flash} + * ``` + * Class Form + * + * @package Thelia\Core\Template\Smarty\Plugins + * @author Guillaume MOREL + * @author Julien Chanséaume + */ +class FlashMessage extends AbstractSmartyPlugin +{ + /** @var RequestStack Request service */ + protected $requestStack; + + /** @var FlashMessageBag $results */ + protected $results; + + /** @var Translator */ + protected $translator; + + public function __construct(RequestStack $requestStack, Translator $translator) + { + $this->requestStack = $requestStack; + $this->translator = $translator; + } + + /** + * Process the count function: executes a loop and return the number of items found + * + * @param array $params parameters array + * @param \Smarty_Internal_Template $template + * + * @return int the item count + * @throws \InvalidArgumentException if a parameter is missing + * + */ + public function hasFlashMessage( + $params, + /** @noinspection PhpUnusedParameterInspection */ + $template + ) { + $type = $this->getParam($params, 'type', null); + + if (null == $type) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'type' parameter in {hasflash} function arguments") + ); + } + + return $this->getSession()->getFlashBag()->has($type); + } + + /** + * Get FlashMessage + * And clean session from this key + * + * @param array $params Block parameters + * @param mixed $content Block content + * @param \Smarty_Internal_Template $template Template + * @param bool $repeat Control how many times + * the block is displayed + * + * @return mixed + */ + public function getFlashMessage($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + $type = $this->getParam($params, 'type', false); + + if (null === $content) { + $this->results = new FlashMessageBag(); + + if (false === $type) { + $this->results->addAll($this->getSession()->getFlashBag()->all()); + } else { + $this->results->add( + $type, + $this->getSession()->getFlashBag()->get($type, []) + ); + } + + if ($this->results->isEmpty()) { + $repeat = false; + } + } else { + $this->results->next(); + } + + if ($this->results->valid()) { + $message = $this->results->current(); + $template->assign("TYPE", $message["type"]); + $template->assign("MESSAGE", $message["message"]); + + $repeat = true; + } + + if ($content !== null) { + if ($this->results->isEmpty()) { + $content = ""; + } + + return $content; + } + + return ''; + } + + /** + * @return array an array of SmartyPluginDescriptor + */ + public function getPluginDescriptors() + { + return [ + new SmartyPluginDescriptor("function", "hasflash", $this, "hasFlashMessage"), + new SmartyPluginDescriptor("block", "flash", $this, "getFlashMessage") + ]; + } + + /** + * @return Session + */ + protected function getSession() + { + return $this->requestStack->getCurrentRequest()->getSession(); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Form.php b/local/modules/TheliaSmarty/Template/Plugins/Form.php new file mode 100644 index 00000000..6a48aff9 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Form.php @@ -0,0 +1,1029 @@ + find form named myForm, + * create an instance and assign this instanciation into smarty variable. Form must be declare into + * config using tag + * + * - {form_field form=$form.fieldName} {/form_field} This block find info into the Form field containing by + * the form paramter. This field must be an instance of FormView. fieldName is the name of your field. This block + * can output these info : + * * $name => name of yout input + * * $value => value for your input + * * $label => label for your input + * * $error => boolean for know if there is error for this field + * * $attr => all your attribute for your input (define when you construct programmatically you form) + * + * - {form_error form=$form.fieldName} ... {/form_error} Display this block if there are errors on this field. + * fieldName is the name of your field + * + * Class Form + * @package Thelia\Core\Template\Smarty\Plugins + */ +class Form extends AbstractSmartyPlugin +{ + const COLLECTION_TYPE_NAME = "collection"; + + private static $taggedFieldsStack = null; + private static $taggedFieldsStackPosition = null; + + /** @var ContainerInterface */ + protected $container; + + /** @var ParserContext $parserContext */ + protected $parserContext; + + /** @var ParserInterface $parser */ + protected $parser; + + protected $formDefinition = array(); + + /** @var array|TheliaFormFactoryInterface */ + protected $formFactory = array(); + + /** @var array The form collection stack */ + protected $formCollectionStack = array(); + + /** @var array Counts collection loop in page */ + protected $formCollectionCount = array(); + + public function __construct( + TheliaFormFactoryInterface $formFactory, + ParserContext $parserContext, + ParserInterface $parser + ) { + $this->formFactory = $formFactory; + $this->parserContext = $parserContext; + $this->parser = $parser; + } + + public function setFormDefinition($formDefinition) + { + foreach ($formDefinition as $name => $className) { + if (array_key_exists($name, $this->formDefinition)) { + throw new \InvalidArgumentException( + sprintf("%s form name already exists for %s class", $name, $className) + ); + } + + $this->formDefinition[$name] = $className; + } + } + + public function generateForm($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + if ($repeat) { + $name = $this->getParam($params, 'name'); + $formType = $this->getParam($params, 'type', 'form'); + + if (null == $name) { + $name = "thelia.empty"; + } + + if (!isset($this->formDefinition[$name])) { + throw new ElementNotFoundException(sprintf("%s form does not exists", $name)); + } + + $formClass = $this->formDefinition[$name]; + + // Check if parser context contains our form + $instance = $this->parserContext->getForm($name, $formClass, $formType); + + if (null === $instance) { + // If not, create a new instance + $instance = $this->formFactory->createForm($name); + } + + // Set the current form + $this->parserContext->pushCurrentForm($instance); + + $instance->createView(); + + $template->assign("form", $instance); + $template->assign("form_name", $instance->getName()); + + $template->assign("form_error", $instance->hasError() ? true : false); + $template->assign("form_error_message", $instance->getErrorMessage()); + } else { + $this->parserContext->popCurrentForm(); + + return $content; + } + } + + /** + * @param \Smarty_Internal_Template $template + * @param string $fieldName + * @param string $fieldValue + * @param string $fieldType + * @param array $fieldVars + * @param int $total_value_count + */ + protected function assignFieldValues( + $template, + $fieldName, + $fieldValue, + $fieldType, + $fieldVars, + $total_value_count = 1 + ) { + $template->assign("name", $fieldName); + $template->assign("value", $fieldValue); + $template->assign("data", $fieldVars['data']); + + $template->assign("type", $fieldType); + + $template->assign("checked", isset($fieldVars['data']) ? $fieldVars['data'] : false); + $template->assign("choices", isset($fieldVars['choices']) ? $fieldVars['choices'] : false); + $template->assign("multiple", isset($fieldVars['multiple']) ? $fieldVars['multiple'] : false); + $template->assign("disabled", isset($fieldVars['disabled']) ? $fieldVars['disabled'] : false); + $template->assign("read_only", isset($fieldVars['read_only']) ? $fieldVars['read_only'] : false); + $template->assign("max_length", isset($fieldVars['max_length']) ? $fieldVars['max_length'] : false); + $template->assign('required', isset($fieldVars['required']) ? $fieldVars['required'] : false); + + $template->assign("label", $fieldVars["label"]); + $template->assign("label_attr", $fieldVars["label_attr"]); + + $template->assign('total_value_count', $total_value_count); + + /** @var FormErrorIterator $errors */ + $errors = $fieldVars["errors"]; + + $template->assign("error", $errors->count() ? true : false); + + $this->assignFieldErrorVars($template, $errors); + + $attr = array(); + + foreach ($fieldVars["attr"] as $key => $value) { + $attr[] = sprintf('%s="%s"', $key, $value); + } + + $template->assign("attr", implode(" ", $attr)); + $template->assign("attr_list", $fieldVars["attr"]); + } + + /** + * @param \Smarty_Internal_Template $template + * @param FormConfigInterface $formFieldConfig + * @param FormView $formFieldView + */ + protected function assignFormTypeValues($template, $formFieldConfig, $formFieldView) + { + $formFieldType = $formFieldConfig->getType()->getInnerType(); + + /* access to choices */ + if ($formFieldType instanceof ChoiceType) { + $template->assign("choices", $formFieldView->vars['choices']); + } + + /* access to collections */ + if ($formFieldType instanceof CollectionType) { + if (true === $formFieldConfig->getOption('prototype')) { + } else { + /* access to choices */ + if (isset($formFieldView->vars['choices'])) { + $template->assign("choices", $formFieldView->vars['choices']); + } + } + } + + /* access to date */ + if ($formFieldType instanceof DateType || $formFieldType instanceof DateTimeType || $formFieldType instanceof BirthdayType) { + if ('choice' === $formFieldConfig->getOption('widget')) { + /* access to years */ + if ($formFieldConfig->getOption('years')) { + $formFieldView->vars['years'] = $formFieldConfig->getOption('years'); + $template->assign("years", $formFieldView->vars['years']); + } + + /* access to month */ + if ($formFieldConfig->getOption('months')) { + $formFieldView->vars['months'] = $formFieldConfig->getOption('months'); + $template->assign("months", $formFieldView->vars['months']); + } + + /* access to days */ + if ($formFieldConfig->getOption('days')) { + $formFieldView->vars['days'] = $formFieldConfig->getOption('days'); + $template->assign("days", $formFieldView->vars['days']); + } + + /* access to empty_value */ + if ($formFieldConfig->getOption('empty_value')) { + $formFieldView->vars['empty_value'] = $formFieldConfig->getOption('empty_value'); + $template->assign("empty_value", $formFieldView->vars['empty_value']); + } + } + } + + /* access to thelia type */ + if ($formFieldType instanceof TheliaType) { + $template->assign("formType", $formFieldView->vars['type']); + + switch ($formFieldView->vars['type']) { + case "choice": + if (!isset($formFieldView->vars['options']['choices']) || + !is_array($formFieldView->vars['options']['choices']) + ) { + //throw new + } + $choices = array(); + foreach ($formFieldView->vars['options']['choices'] as $value => $choice) { + $choices[] = new ChoiceView($value, $value, $choice); + } + $template->assign("choices", $choices); + break; + } + } + } + + /** + * @param array $params + * @param \Smarty_Internal_Template $template + */ + protected function processFormField($params, $template) + { + $formFieldView = $this->getFormFieldView($params); + $formFieldConfig = $this->getFormFieldConfig($params); + + $formFieldType = $formFieldConfig->getType()->getName(); + + $this->assignFormTypeValues($template, $formFieldConfig, $formFieldView); + + $value = $formFieldView->vars["value"]; + + $key = $this->getParam($params, 'value_key', null); + + // We (may) have a collection + if ($key !== null) { + // Force array + if (!is_array($value)) { + $value = array(); + } + + // If the field is not found, use an empty value + $name = sprintf("%s[%s]", $formFieldView->vars["full_name"], $key); + + $val = $value[$key]; + + // For collection types, the type of field is defined in the 'type' option. + // We will use this instead of the 'collection' type + $formFieldType = $formFieldConfig->getType()->getInnerType(); + + if ($formFieldType instanceof CollectionType) { + $formFieldType = $formFieldConfig->getOption('type'); + } + + $this->assignFieldValues( + $template, + $name, + $val, + $formFieldType, + $formFieldView->vars, + count($formFieldView->children) + ); + } else { + $this->assignFieldValues( + $template, + $formFieldView->vars["full_name"], + $formFieldView->vars["value"], + $formFieldType, + $formFieldView->vars + ); + } + + $formFieldView->setRendered(); + } + + public function renderFormField($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + if ($repeat) { + $this->processFormField($params, $template); + } else { + return $content; + } + } + + /** + * @param array $params + * @param string $content + * @param string $templateFile + * @param \Smarty_Internal_Template $template + * @return string + */ + protected function automaticFormFieldRendering($params, $content, $template, $templateFile) + { + $data = ''; + + $templateStyle = $this->getParam($params, 'template', 'standard'); + + $snippet_path = sprintf( + '%s' . DS . 'forms' . DS . '%s' . DS . '%s.html', + $this->parser->getTemplateDefinition()->getAbsolutePath(), + $templateStyle, + $templateFile + ); + + if (false !== $snippet_content = file_get_contents($snippet_path)) { + $this->processFormField($params, $template); + + if (null === $form = $this->getParam($params, 'form', null)) { + $form = $this->parserContext->getCurrentForm(); + } + + $field_name = $this->getParam($params, 'field', false); + $field_extra_class = $this->getParam($params, 'extra_class', ''); + $field_extra_class = $this->getParam($params, 'extra_classes', $field_extra_class); + $field_no_standard_classes = $this->getParam($params, 'no_standard_classes', false); + $field_value = $this->getParam($params, 'value', ''); + $show_label = $this->getParam($params, 'show_label', true); + $value_key = $this->getParam($params, 'value_key', false); + + $template->assign([ + 'content' => trim($content), + 'form' => $form, + 'field_name' => $field_name, + 'field_extra_class' => $field_extra_class, + 'field_no_standard_classes' => $field_no_standard_classes, + 'field_value' => $field_value, + 'field_template' => $templateStyle, + 'value_key' => $value_key, + 'show_label' => $show_label, + ]); + + $data = $template->fetch(sprintf('string:%s', $snippet_content)); + } + + return $data; + } + + /** + * @param $params + * @param $content + * @param \Smarty_Internal_Template $template + * @param $repeat + * @return mixed + */ + public function customFormFieldRendering($params, $content, $template, &$repeat) + { + if (!$repeat) { + return $this->automaticFormFieldRendering($params, $content, $template, 'form-field-renderer'); + } + } + + public function standardFormFieldRendering($params, \Smarty_Internal_Template $template) + { + return $this->automaticFormFieldRendering($params, '', $template, 'form-field-renderer'); + } + + public function standardFormFieldAttributes($params, \Smarty_Internal_Template $template) + { + return $this->automaticFormFieldRendering($params, '', $template, 'form-field-attributes-renderer'); + } + + public function renderTaggedFormFields($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + if (null === $content) { + self::$taggedFieldsStack = $this->getFormFieldsFromTag($params); + self::$taggedFieldsStackPosition = 0; + } else { + self::$taggedFieldsStackPosition++; + } + + if (isset(self::$taggedFieldsStack[self::$taggedFieldsStackPosition])) { + $field = self::$taggedFieldsStack[self::$taggedFieldsStackPosition]; + + $this->assignFieldValues( + $template, + $field['view']->vars["full_name"], + $field['view']->vars["value"], + $field['config']->getType()->getName(), + $field['view']->vars + ); + + $this->assignFormTypeValues($template, $field['config'], $field['view']); + + $field['view']->setRendered(); + + $repeat = true; + } + + if (!$repeat) { + self::$taggedFieldsStack = null; + self::$taggedFieldsStackPosition = null; + } + + if (null !== $content) { + return $content; + } + } + + public function renderHiddenFormField($params, \Smarty_Internal_Template $template) + { + $attrFormat = '%s="%s"'; + $field = ''; + + $baseFormInstance = $this->getInstanceFromParams($params); + + $formView = $baseFormInstance->getView(); + + $return = ""; + + $exclude = explode(',', $this->getParam($params, 'exclude', '')); + + /** @var FormView $row */ + foreach ($formView->getIterator() as $row) { + // We have to exclude the fields for which value is defined in the template. + if ($baseFormInstance->isTemplateDefinedHiddenField($row) + || + in_array($row->vars['name'], $exclude) + ) { + continue; + } + + if ($this->isHidden($row) && $row->isRendered() === false) { + $attributeList = array(); + if (isset($row->vars["attr"])) { + foreach ($row->vars["attr"] as $attrKey => $attrValue) { + $attributeList[] = sprintf($attrFormat, $attrKey, $attrValue); + } + } + $return .= sprintf($field, $row->vars["full_name"], $row->vars["value"], implode(' ', $attributeList)); + } + } + + return $return; + } + + public function formEnctype($params, \Smarty_Internal_Template $template) + { + $instance = $this->getInstanceFromParams($params); + + $formView = $instance->getView(); + + if ($formView->vars["multipart"]) { + return sprintf('%s="%s"', "enctype", "multipart/form-data"); + } + } + + public function formError($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + $formFieldView = $this->getFormFieldView($params); + + /** @var FormErrorIterator $errors */ + $errors = $formFieldView->vars["errors"]; + + if (!$errors->count()) { + return ""; + } + + if ($repeat) { + $this->assignFieldErrorVars($template, $errors); + } else { + return $content; + } + } + + protected function assignFieldErrorVars(\Smarty_Internal_Template $template, FormErrorIterator $errors) + { + if ($errors->count()) { + $template->assign("message", $errors[0]->getMessage()); + $template->assign("parameters", $errors[0]->getMessageParameters()); + $template->assign("pluralization", $errors[0]->getMessagePluralization()); + } + } + + protected function isHidden(FormView $formView) + { + return array_search("hidden", $formView->vars["block_prefixes"]); + } + + /** + * @param $params + * @return FormView + * @throws \InvalidArgumentException + */ + protected function getFormFieldView($params) + { + $instance = $this->getInstanceFromParams($params); + + $fieldName = $this->getParam($params, 'field'); + + if (null == $fieldName) { + throw new \InvalidArgumentException("'field' parameter is missing"); + } + + $view = $this->retrieveField( + $fieldName, + $instance->getView(), + $instance->getName() + ); + + return $view; + } + + protected function getFormFieldsFromTag($params) + { + $instance = $this->getInstanceFromParams($params); + + $tag = $this->getParam($params, 'tag'); + + if (null == $tag) { + throw new \InvalidArgumentException("'tag' parameter is missing"); + } + + $viewList = array(); + foreach ($instance->getView() as $view) { + if (isset($view->vars['attr']['tag']) && $tag == $view->vars['attr']['tag']) { + $fieldData = $instance->getForm()->all()[$view->vars['name']]; + $viewList[] = array( + 'view' => $view, + 'config' => $fieldData->getConfig(), + ); + } + } + + return $viewList; + } + + /** + * @param $params + * @return FormConfigInterface + * @throws \InvalidArgumentException + */ + protected function getFormFieldConfig($params) + { + $instance = $this->getInstanceFromParams($params); + + $fieldName = $this->getParam($params, 'field'); + + if (null == $fieldName) { + throw new \InvalidArgumentException("'field' parameter is missing"); + } + + $fieldData = $this->retrieveField( + $fieldName, + $instance->getForm()->all(), + $instance->getName() + ); + + if (empty($fieldData)) { + throw new \InvalidArgumentException( + sprintf( + "Field name '%s' not found in form %s children", + $fieldName, + $instance->getName() + ) + ); + } + + return $fieldData->getConfig(); + } + + /** + * @param $params + * @return BaseForm + * @throws \InvalidArgumentException + */ + protected function getInstanceFromParams($params) + { + if (null === $instance = $this->getParam($params, 'form')) { + $instance = $this->parserContext->getCurrentForm(); + } + + if (null == $instance) { + throw new \InvalidArgumentException( + "Missing 'form' parameter in form arguments, and no current form was found." + ); + } + + if (!$instance instanceof BaseForm) { + throw new \InvalidArgumentException( + sprintf( + "form parameter in form_field block must be an instance of " . + "\Thelia\Form\BaseForm, instance of %s found", + get_class($instance) + ) + ); + } + + return $instance; + } + + /** + * @param $needle + * @param $haystack + * @param $formName + * @return \Symfony\Component\Form\Form + */ + protected function retrieveField($needle, $haystack, $formName) + { + $splitName = explode(".", $needle); + + foreach ($splitName as $level) { + if (empty($haystack[$level])) { + throw new \InvalidArgumentException( + sprintf("Field name '%s' not found in form %s", $needle, $formName) + ); + } + $haystack = $haystack[$level]; + } + + return $haystack; + } + + /** + * @param $params + * @param $name + * @param bool $throwException + * @return mixed|null + * + * Get a symfony form object form a function/block parameter + */ + protected function getSymfonyFormFromParams($params, $name, $throwException = false) + { + $sfForm = $this->getParam($params, $name); + + if (null === $sfForm && false === $throwException) { + return null; + } + + if (!$sfForm instanceof SymfonyForm) { + throw new \InvalidArgumentException( + sprintf( + "%s parameter must be an instance of " . + "\Symfony\Component\Form\Form, instance of %s found", + $name, + is_object($sfForm) ? get_class($sfForm) : gettype($sfForm) + ) + ); + } + + return $sfForm; + } + + /** + * @param $params + * @param $content + * @param \Smarty_Internal_Template $template + * @param $repeat + * @return mixed + * + * Loops around a form collection entries and assigns values to template + */ + public function renderFormCollection($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + /** + * Get parameters + */ + $form = $this->getInstanceFromParams($params); + $row = $this->getSymfonyFormFromParams($params, "row"); + $collection = $this->resolveCollection($this->getParam($params, "collection"), $form); + + $hash = $this->initializeCollection($form, $collection, $row); + + $limit = $this->getParam($params, "limit", -1); + + /** + * Check if it has a limit + */ + if (!preg_match("#^\-?\d+$#", $limit)) { + throw new \InvalidArgumentException( + sprintf( + "Invalid value for 'limit' parameter in 'form_collection'. '%s' given, integer expected", + $limit + ) + ); + } + + /** + * Then load stack and create the stack count + */ + $limit = (int)$limit; + $hasLimit = $limit >= 0; + + /** + * If we have reached the limit, stop + */ + $collectionLimit = $this->formCollectionCount[$hash]["limit"]; + + if (($hasLimit && $limit === $collectionLimit) || + null === $row = array_shift($this->formCollectionStack[$hash]) + ) { + $repeat = false; + + /** + * Reload stack limit + */ + $this->formCollectionCount[$hash]["limit"] = 0; + + return $content; + } + + /** + * Assign variables into the template + */ + $template->assign("row", $row); + $template->assign("collection_current", $this->formCollectionCount[$hash]["count"]++); + $template->assign("collection_count", $this->formCollectionCount[$hash]["total_count"]); + + /** + * Increment the current limit state + * Force the repeat + */ + $this->formCollectionCount[$hash]["limit"]++; + $repeat = true; + + /** + * ANd return the content + */ + + return $content; + } + + /** + * @param BaseForm $form + * @param SymfonyForm $field + * @return string + * + * Get definition, return hash + */ + protected function getFormStackHash(BaseForm $form, SymfonyForm $field = null) + { + $build = get_class($form) . ":" . $form->getType(); + + if (null !== $field) { + $build .= ":" . $this->buildFieldName($field); + } + + return md5($build); + } + + /** + * @param $collection + * @param BaseForm $form + * @return SymfonyForm + * + * Extract the collection object from the form + */ + protected function resolveCollection($collection, BaseForm $form) + { + if (null === $collection) { + throw new \InvalidArgumentException( + "Missing parameter 'collection' in 'form_collection" + ); + } + + $sfForm = $form->getForm(); + + if (!$sfForm->has($collection)) { + throw new \InvalidArgumentException( + sprintf( + "Field name '%s' not found in form %s children", + $collection, + $form->getName() + ) + ); + } + + /** + * Check that the field is a "collection" type + */ + $collectionConfig = $this->retrieveField( + $collection, + $sfForm->all(), + $form->getName() + ); + + $fieldType = $collectionConfig->getConfig()->getType(); + + if ($fieldType->getName() !== static::COLLECTION_TYPE_NAME) { + $baseFieldType = $fieldType; + $resolved = false; + + while (null !== $fieldType && !$resolved) { + if ($fieldType->getName() !== static::COLLECTION_TYPE_NAME) { + $fieldType = $fieldType->getParent(); + } + } + + if (!$resolved) { + throw new \LogicException( + sprintf( + "The field '%s' is not a collection, it's a '%s'." . + "You can't use it with the function 'form_collection' in form '%s'", + $collection, + $baseFieldType->getName(), + $form->getName() + ) + ); + } + } + + return $collectionConfig; + } + + /** + * @param $params + * @param $content + * @param \Smarty_Internal_Template $template + * @param $repeat + * @return string + * + * Injects a collection field variables into the parser + */ + public function renderFormCollectionField($params, $content, \Smarty_Internal_Template $template, &$repeat) + { + if (!$repeat) { + return $content; + } + + $form = $this->getInstanceFromParams($params); + /** @var \Symfony\Component\Form\Form $row */ + $row = $this->getSymfonyFormFromParams($params, "row", true); + $field = $this->getParam($params, "field"); + + $formField = $this->retrieveField($field, $row->all(), $form->getName()); + + $formFieldConfig = $formField->getConfig(); + + $this->assignFieldValues( + $template, + $this->buildFieldName($formField), + $formField->getViewData(), + $formFieldConfig->getType(), + $this->findCollectionFieldFormView($form->getView(), $formField) + ); + + return ''; + } + + /** + * @param FormView $formView + * @param SymfonyForm $formField + * @return array + */ + protected function findCollectionFieldFormView(FormView $formView, SymfonyForm $formField) + { + $formFieldParentList = []; + + do { + // don't need to set first form name child + if (null === $formField->getParent()) { + break; + } + + $formFieldParentList[] = $formField->getConfig()->getName(); + + } while (null !== $formField = $formField->getParent()); + + $formFieldParentList = array_reverse($formFieldParentList); + + foreach ($formFieldParentList as $val) { + $formView = $formView->children[$val]; + } + + return $formView->vars; + } + + /** + * @param FormInterface $form + * @param array $tree + * @return string + * + * Tail recursive method that builds the field full name + */ + protected function buildFieldName(FormInterface $form, array &$tree = array()) + { + $config = $form->getConfig(); + $parent = $form->getParent(); + $hasParent = null !== $parent; + + if (null !== $proprietyPath = $config->getPropertyPath()) { + $name = (string)$proprietyPath; + } else { + $name = $config->getName(); + + if ($name === null) { + $name = ''; + } elseif ($name !== '' && $hasParent) { + $name = "[$name]"; + } + } + + array_unshift($tree, $name); + + if (!$hasParent) { + return implode("", $tree); + } + + return $this->buildFieldName($parent, $tree); + } + + /** + * @param $params + * @param \Smarty_Internal_Template $template + * @return mixed + * + * Counts collection entries + */ + public function formCollectionCount($params, \Smarty_Internal_Template $template) + { + /** + * Get parameters + */ + $form = $this->getInstanceFromParams($params); + $row = $this->getSymfonyFormFromParams($params, "row"); + $collection = $this->resolveCollection($this->getParam($params, "collection"), $form); + + $hash = $this->initializeCollection($form, $collection, $row); + + return $this->formCollectionCount[$hash]["total_count"]; + } + + /** + * @param BaseForm $form + * @param SymfonyForm $collection + * @param SymfonyForm $row + * @return string + * + * Initialize a collection into this class ( values stack, counting table ) + */ + protected function initializeCollection(BaseForm $form, SymfonyForm $collection, SymfonyForm $row = null) + { + $hash = $this->getFormStackHash($form, $collection); + + if (!isset($this->formCollectionStack[$hash])) { + $this->formCollectionStack[$hash] = $collection->all(); + } + + if (!isset($this->formCollectionCount[$hash])) { + $this->formCollectionCount[$hash] = [ + "count" => 0, + "limit" => 0, + "total_count" => count($this->formCollectionStack[$hash]), + ]; + } + + return $hash; + } + + /** + * @return array an array of SmartyPluginDescriptor + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor("block", "form", $this, "generateForm"), + new SmartyPluginDescriptor("block", "form_field", $this, "renderFormField"), + new SmartyPluginDescriptor("block", "form_tagged_fields", $this, "renderTaggedFormFields"), + new SmartyPluginDescriptor("function", "form_hidden_fields", $this, "renderHiddenFormField"), + new SmartyPluginDescriptor("function", "form_enctype", $this, "formEnctype"), + new SmartyPluginDescriptor("block", "form_error", $this, "formError"), + new SmartyPluginDescriptor("function", "form_field_attributes", $this, "standardFormFieldAttributes"), + new SmartyPluginDescriptor("function", "render_form_field", $this, "standardFormFieldRendering"), + new SmartyPluginDescriptor("block", "custom_render_form_field", $this, "customFormFieldRendering"), + new SmartyPluginDescriptor("block", "form_collection", $this, "renderFormCollection"), + new SmartyPluginDescriptor("block", "form_collection_field", $this, "renderFormCollectionField"), + new SmartyPluginDescriptor("function", "form_collection_count", $this, "formCollectionCount"), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Format.php b/local/modules/TheliaSmarty/Template/Plugins/Format.php new file mode 100644 index 00000000..97220fde --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Format.php @@ -0,0 +1,496 @@ + + * @author Benjamin Perche + */ +class Format extends AbstractSmartyPlugin +{ + private static $dateKeys = ["day", "month", "year"]; + private static $timeKeys = ["hour", "minute", "second"]; + + /** @var RequestStack */ + protected $requestStack; + + public function __construct(RequestStack $requestStack) + { + $this->requestStack = $requestStack; + } + + /** + * return date in expected format + * + * available parameters : + * date => DateTime object (mandatory) + * format => expected format + * output => list of default system format. Values available : + * date => date format + * time => time format + * datetime => datetime format (default) + * + * ex : + * {format_date date=$dateTimeObject format="Y-m-d H:i:s"} will output the format with specific format + * {format_date date=$dateTimeObject format="l F j" locale="fr_FR"} will output the format with specific format (see date() function) + * {format_date date=$dateTimeObject output="date"} will output the date using the default date system format + * {format_date date=$dateTimeObject} will output with the default datetime system format + * + * @param array $params + * @param null $template + * @throws \TheliaSmarty\Template\Exception\SmartyPluginException + * @return string + */ + public function formatDate($params, $template = null) + { + $date = $this->getParam($params, "date", false); + + if ($date === false) { + // Check if we have a timestamp + $timestamp = $this->getParam($params, "timestamp", false); + + if ($timestamp === false) { + // No timestamp => error + throw new SmartyPluginException("Either date or timestamp is a mandatory parameter in format_date function"); + } else { + $date = new \DateTime(); + $date->setTimestamp($timestamp); + } + } elseif (is_array($date)) { + $keys = array_keys($date); + + $isDate = $this->arrayContains(static::$dateKeys, $keys); + $isTime = $this->arrayContains(static::$timeKeys, $keys); + + // If this is not a date, fallback on today + // If this is not a time, fallback on midnight + $dateFormat = $isDate ? sprintf("%d-%d-%d", $date["year"], $date["month"], $date["day"]) : (new \DateTime())->format("Y-m-d"); + $timeFormat = $isTime ? sprintf("%d:%d:%d", $date["hour"], $date["minute"], $date["second"]) : "0:0:0"; + + $date = new \DateTime(sprintf("%s %s", $dateFormat, $timeFormat)); + } + + if (!($date instanceof \DateTime)) { + try { + $date = new \DateTime($date); + } catch (\Exception $e) { + return ""; + } + } + + $format = $this->getParam($params, "format", false); + + if ($format === false) { + $format = DateTimeFormat::getInstance($this->requestStack->getCurrentRequest())->getFormat($this->getParam($params, "output", null)); + } + + $locale = $this->getParam($params, 'locale', false); + + if (false === $locale) { + $value = $date->format($format); + } else { + $value = $this->formatDateWithLocale($date, $locale, $format); + } + + return $value; + } + + private function formatDateWithLocale(\DateTime $date, $locale, $format) + { + if (false === strpos($format, '%')) { + $formatter = new IntlDateFormatter($locale, IntlDateFormatter::FULL, IntlDateFormatter::FULL); + + $icuFormat = $this->convertDatePhpToIcu($format); + $formatter->setPattern($icuFormat); + + $localizedDate = $formatter->format($date); + } else { + // for backward compatibility + if (function_exists('setlocale')) { + // Save the current locale + $systemLocale = setlocale(LC_TIME, 0); + setlocale(LC_TIME, $locale); + $localizedDate = strftime($format, $date->getTimestamp()); + // Restore the locale + setlocale(LC_TIME, $systemLocale); + } else { + // setlocale() function not available => error + throw new SmartyPluginException("The setlocale() function is not available on your system."); + } + } + + return $localizedDate; + } + + /** + * + * display numbers in expected format + * + * available parameters : + * number => int or float number + * decimals => how many decimals format expected + * dec_point => separator for the decimal point + * thousands_sep => thousands separator + * + * ex : {format_number number="1246.12" decimals="1" dec_point="," thousands_sep=" "} will output "1 246,1" + * + * @param $params + * @param null $template + * @throws \TheliaSmarty\Template\Exception\SmartyPluginException + * @return string the expected number formatted + */ + public function formatNumber($params, $template = null) + { + $number = $this->getParam($params, "number", false); + + if ($number === false || $number === '') { + return ""; + } + + return NumberFormat::getInstance($this->requestStack->getCurrentRequest())->format( + $number, + $this->getParam($params, "decimals", null), + $this->getParam($params, "dec_point", null), + $this->getParam($params, "thousands_sep", null) + ); + } + + /** + * + * display a amount in expected format + * + * available parameters : + * number => int or float number + * decimals => how many decimals format expected + * dec_point => separator for the decimal point + * thousands_sep => thousands separator + * symbol => Currency symbol + * + * ex : {format_money number="1246.12" decimals="1" dec_point="," thousands_sep=" " symbol="€"} will output "1 246,1 €" + * + * @param $params + * @param null $template + * @throws \TheliaSmarty\Template\Exception\SmartyPluginException + * @return string the expected number formatted + */ + public function formatMoney($params, $template = null) + { + $number = $this->getParam($params, "number", false); + + if ($number === false || $number === '') { + return ""; + } + + if ($this->getParam($params, "symbol", null) === null) { + return MoneyFormat::getInstance($this->requestStack->getCurrentRequest())->formatByCurrency( + $number, + $this->getParam($params, "decimals", null), + $this->getParam($params, "dec_point", null), + $this->getParam($params, "thousands_sep", null), + $this->getParam($params, "currency_id", null) + ); + } + + return MoneyFormat::getInstance($this->requestStack->getCurrentRequest())->format( + $number, + $this->getParam($params, "decimals", null), + $this->getParam($params, "dec_point", null), + $this->getParam($params, "thousands_sep", null), + $this->getParam($params, "symbol", null) + ); + } + + + /** + * return two-dimensional arrays in string + * + * available parameters : + * values => array 2D ['key A' => ['value 1', 'value 2'], 'key B' => ['value 3', 'value 4']] + * separators => ['key value separator', 'value value separator', 'key key separator'] + * + * ex : + * {format_array_2d values=['Colors' => ['Green', 'Yellow', 'Red'], 'Material' => ['Wood']] separators=[' : ', ' / ', ' | ']} + * will output the format with specific format : "Colors : Green / Yellow / Red | Material : Wood" + * + * @param $params + * @return string + */ + public function formatTwoDimensionalArray($params) + { + $output = ''; + $values = $this->getParam($params, "values", null); + $separators = $this->getParam($params, "separators", [' : ', ' / ', ' | ']); + + if (!is_array($values)) { + return $output; + } + + foreach ($values as $key => $value) { + if ($output !== '') { + $output .= $separators[2]; + } + + $output .= $key . $separators[0]; + + if (!is_array($value)) { + $output .= $value; + continue; + } + + $output .= implode($separators[1], $value); + } + return $output; + } + + protected function arrayContains(array $expected, array $hayStack) + { + foreach ($expected as $value) { + if (!in_array($value, $hayStack)) { + return false; + } + } + + return true; + } + + /** + * This function comes from [Yii framework](http://www.yiiframework.com/) + * + * + * Converts a date format pattern from [php date() function format][] to [ICU format][]. + * + * The conversion is limited to date patterns that do not use escaped characters. + * Patterns like `jS \o\f F Y` which will result in a date like `1st of December 2014` may not be converted correctly + * because of the use of escaped characters. + * + * Pattern constructs that are not supported by the ICU format will be removed. + * + * [php date() function format]: http://php.net/manual/en/function.date.php + * [ICU format]: http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax + * + * @param string $pattern date format pattern in php date()-function format. + * @return string The converted date format pattern. + */ + protected function convertDatePhpToIcu($pattern) + { + // http://php.net/manual/en/function.date.php + return strtr( + $pattern, + [ + // Day + 'd' => 'dd', // Day of the month, 2 digits with leading zeros 01 to 31 + 'D' => 'eee', // A textual representation of a day, three letters Mon through Sun + 'j' => 'd', // Day of the month without leading zeros 1 to 31 + 'l' => 'eeee', // A full textual representation of the day of the week Sunday through Saturday + 'N' => 'e', // ISO-8601 numeric representation of the day of the week, 1 (for Monday) through 7 (for Sunday) + 'S' => '', // English ordinal suffix for the day of the month, 2 characters st, nd, rd or th. Works well with j + 'w' => '', // Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday) + 'z' => 'D', // The day of the year (starting from 0) 0 through 365 + // Week + 'W' => 'w', // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year) + // Month + 'F' => 'MMMM', // A full textual representation of a month, January through December + 'm' => 'MM', // Numeric representation of a month, with leading zeros 01 through 12 + 'M' => 'MMM', // A short textual representation of a month, three letters Jan through Dec + 'n' => 'M', // Numeric representation of a month, without leading zeros 1 through 12, not supported by ICU but we fallback to "with leading zero" + 't' => '', // Number of days in the given month 28 through 31 + // Year + 'L' => '', // Whether it's a leap year, 1 if it is a leap year, 0 otherwise. + 'o' => 'Y', // ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. + 'Y' => 'yyyy', // A full numeric representation of a year, 4 digits Examples: 1999 or 2003 + 'y' => 'yy', // A two digit representation of a year Examples: 99 or 03 + // Time + 'a' => 'a', // Lowercase Ante meridiem and Post meridiem, am or pm + 'A' => 'a', // Uppercase Ante meridiem and Post meridiem, AM or PM, not supported by ICU but we fallback to lowercase + 'B' => '', // Swatch Internet time 000 through 999 + 'g' => 'h', // 12-hour format of an hour without leading zeros 1 through 12 + 'G' => 'H', // 24-hour format of an hour without leading zeros 0 to 23h + 'h' => 'hh', // 12-hour format of an hour with leading zeros, 01 to 12 h + 'H' => 'HH', // 24-hour format of an hour with leading zeros, 00 to 23 h + 'i' => 'mm', // Minutes with leading zeros 00 to 59 + 's' => 'ss', // Seconds, with leading zeros 00 through 59 + 'u' => '', // Microseconds. Example: 654321 + // Timezone + 'e' => 'VV', // Timezone identifier. Examples: UTC, GMT, Atlantic/Azores + 'I' => '', // Whether or not the date is in daylight saving time, 1 if Daylight Saving Time, 0 otherwise. + 'O' => 'xx', // Difference to Greenwich time (GMT) in hours, Example: +0200 + 'P' => 'xxx', // Difference to Greenwich time (GMT) with colon between hours and minutes, Example: +02:00 + 'T' => 'zzz', // Timezone abbreviation, Examples: EST, MDT ... + 'Z' => '', // Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. -43200 through 50400 + // Full Date/Time + 'c' => 'yyyy-MM-dd\'T\'HH:mm:ssxxx', // ISO 8601 date, e.g. 2004-02-12T15:19:21+00:00 + 'r' => 'eee, dd MMM yyyy HH:mm:ss xx', // RFC 2822 formatted date, Example: Thu, 21 Dec 2000 16:01:07 +0200 + 'U' => '', // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) + ] + ); + } + + /** + * + * display an address in expected format + * + * available parameters : + * address => the id of the address to display + * order_address => the id of the order address to display + * from_country_id => the country id + * dec_point => separator for the decimal point + * thousands_sep => thousands separator + * symbol => Currency symbol + * + * ex : {format_money number="1246.12" decimals="1" dec_point="," thousands_sep=" " symbol="€"} will output "1 246,1 €" + * + * @param $params + * @param null $template + * @throws \TheliaSmarty\Template\Exception\SmartyPluginException + * @return string the expected number formatted + */ + public function formatAddress($params, $template = null) + { + $postal = filter_var( + $this->getParam($params, "postal", null), + FILTER_VALIDATE_BOOLEAN + ); + + $html = filter_var( + $this->getParam($params, "html", true), + FILTER_VALIDATE_BOOLEAN + ); + + $htmlTag = $this->getParam($params, "html_tag", "p"); + $originCountry = $this->getParam($params, "origin_country", null); + $locale = $this->getParam($params, "locale", $this->getSession()->getLang()->getLocale()); + + // extract html attributes + $htmlAttributes = []; + foreach ($params as $k => $v) { + if (strpos($k, 'html_') !== false && $k !== 'html_tag') { + $htmlAttributes[substr($k, 5)] = $v; + } + } + + // get address or order address + $address = null; + if (null !== $id = $this->getParam($params, "address", null)) { + if (null === $address = AddressQuery::create()->findPk($id)) { + return ''; + } + } elseif (null !== $id = $this->getParam($params, "order_address", null)) { + if (null === $address = OrderAddressQuery::create()->findPk($id)) { + return ''; + } + } else { + // try to parse arguments to build address + $address = $this->getAddressFormParams($params); + } + + if (null === $address) { + throw new SmartyPluginException( + "Either address, order_address or full list of address fields should be provided" + ); + } + + $addressFormat = AddressFormat::getInstance(); + if ($postal) { + if ($address instanceof Address) { + $formattedAddress = $addressFormat->postalLabelFormat($address, $locale, $originCountry); + } else { + $formattedAddress = $addressFormat->postalLabelFormatTheliaAddress($address, $locale, $originCountry); + } + } else { + if ($address instanceof Address) { + $formattedAddress = $addressFormat->format($address, $locale, $html, $htmlTag, $htmlAttributes); + } else { + $formattedAddress = $addressFormat->formatTheliaAddress($address, $locale, $html, $htmlTag, $htmlAttributes); + } + } + + return $formattedAddress; + } + + protected function getAddressFormParams($params) + { + // Check if there is arguments + $addressArgs = [ + 'country_code', + 'administrative_area', + 'locality', + 'dependent_locality', + 'postal_code', + 'sorting_code', + 'address_line1', + 'address_line2', + 'organization', + 'recipient', + 'locale' + ]; + $valid = false; + + $address = new Address(); + + foreach ($addressArgs as $arg) { + if (null !== $argVal = $this->getParam($params, $arg, null)) { + $valid = true; + $functionName = 'with' . Container::camelize($arg); + $address = $address->$functionName($argVal); + } + } + + if (false === $valid) { + return null; + } + + return $address; + } + + /** + * @return SmartyPluginDescriptor[] + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor("function", "format_date", $this, "formatDate"), + new SmartyPluginDescriptor("function", "format_number", $this, "formatNumber"), + new SmartyPluginDescriptor("function", "format_money", $this, "formatMoney"), + new SmartyPluginDescriptor("function", "format_array_2d", $this, "formatTwoDimensionalArray"), + new SmartyPluginDescriptor("function", "format_address", $this, "formatAddress"), + ); + } + + /** + * @return Session + */ + protected function getSession() + { + return $this->requestStack->getCurrentRequest()->getSession(); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Hook.php b/local/modules/TheliaSmarty/Template/Plugins/Hook.php new file mode 100644 index 00000000..c9edadc2 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Hook.php @@ -0,0 +1,476 @@ + + */ +class Hook extends AbstractSmartyPlugin +{ + private $dispatcher; + + /** @var Translator */ + protected $translator; + + /** @var Module */ + protected $smartyPluginModule = null; + + /** @var array */ + protected $hookResults = array(); + + /** @var array */ + protected $varstack = array(); + + /** @var bool debug */ + protected $debug = false; + + public function __construct($debug, ContainerAwareEventDispatcher $dispatcher) + { + $this->debug = $debug; + $this->dispatcher = $dispatcher; + $this->translator = $dispatcher->getContainer()->get("thelia.translator"); + $this->hookResults = array(); + } + + /** + * Generates the content of the hook + * + * {hook name="hook_code" var1="value1" var2="value2" ... } + * + * This function create an event, feed it with the custom variables passed to the function (var1, var2, ...) and + * dispatch it to the hooks that respond to it. + * + * The name of the event is `hook.{context}.{hook_code}` where : + * * context : the id of the context of the smarty render : 1: frontoffice, 2: backoffice, 3: email, 4: pdf + * * hook_code : the code of the hook + * + * The event collects all the fragments of text rendered in each modules functions that listen to this event. + * Finally, this fragments are concatenated and injected in the template + * + * @param array $params the params passed in the smarty function + * @param \TheliaSmarty\Template\SmartyParser $smarty the smarty parser + * + * @return string the contents generated by modules + */ + public function processHookFunction($params, &$smarty) + { + $hookName = $this->getParam($params, 'name'); + $module = intval($this->getParam($params, 'module', 0)); + $moduleCode = $this->getParam($params, 'modulecode', ""); + + $type = $smarty->getTemplateDefinition()->getType(); + + $event = new HookRenderEvent($hookName, $params); + + $event->setArguments($this->getArgumentsFromParams($params)); + + $eventName = sprintf('hook.%s.%s', $type, $hookName); + + // this is a hook specific to a module + if (0 === $module && "" !== $moduleCode) { + if (null !== $mod = ModuleQuery::create()->findOneByCode($moduleCode)) { + $module = $mod->getId(); + } + } + if (0 !== $module) { + $eventName .= '.' . $module; + } + + $this->getDispatcher()->dispatch($eventName, $event); + + $content = trim($event->dump()); + + if ($this->debug && $smarty->getRequest()->get('SHOW_HOOK')) { + $content = self::showHook($hookName, $params) . $content; + } + + $this->hookResults[$hookName] = $content; + + // support for compatibility with module_include + if ($type === TemplateDefinition::BACK_OFFICE) { + $content .= $this->moduleIncludeCompat($params, $smarty); + } + + return $content; + } + + /** + * Call the plugin function module_include for backward compatibility. + * + * @param array $params the params passed in the smarty function + * @param \TheliaSmarty\Template\SmartyParser $smarty the smarty parser + * + * @return string the contents generated by module_include function + */ + protected function moduleIncludeCompat($params, &$smarty) + { + $plugin = $this->getSmartyPluginModule(); + $params = array( + "location" => $this->getParam($params, 'location', null), + "module" => $this->getParam($params, 'modulecode', null), + "countvar" => $this->getParam($params, 'countvar', null) + ); + + return $plugin->theliaModule($params, $smarty); + } + + /** + * get the smarty plugin Module + * + * @return Module the smarty plugin Module + */ + protected function getSmartyPluginModule() + { + if (null === $this->smartyPluginModule) { + $this->smartyPluginModule = $this->dispatcher->getContainer()->get("smarty.plugin.module"); + } + + return $this->smartyPluginModule; + } + + protected function showHook($hookName, $params) + { + $content = '
' . $hookName; + + foreach ($params as $name => $value) { + if ($name !== 'location' && $name !== "name") { + $type = ''; + if (is_object($value)) { + $value = get_class($value); + $type = 'object'; + } elseif (is_array($value)) { + $value = implode(',', $value); + $type = 'array'; + } elseif (is_int($value)) { + $type = 'float'; + } elseif (is_int($value)) { + $type = 'int'; + } elseif (is_string($value)) { + $value = (strlen($value) > 30) ? substr($value, 0, 30) . '...' : $value; + $type = 'string'; + } + + if ($type !== '') { + $type = '' . $type . ' '; + } + + $content .= '' . $name . ' = ' . $type . $value . ''; + } + } + + return $content . '
'; + } + + /** + * Process the content of the hook block. + * + * {hookblock name="hook_code" var1="value1" var2="value2" ... } + * + * This function create an event, feed it with the custom variables passed to the function (var1, var2, ...) and + * dispatch it to the hooks that respond to it. + * + * The name of the event is `hook.{context}.{hook_code}` where : + * * context : the id of the context of the smarty render : 1: frontoffice, 2: backoffice, 3: email, 4: pdf + * * hook_code : the code of the hook + * + * The event collects all the fragments generated by modules that listen to this event and add it to a fragmentBag. + * This fragmentBag is not used directly. This is the forhook block that iterates over the fragmentBag to inject + * data in the template. + * + * @param array $params + * @param string $content + * @param \TheliaSmarty\Template\SmartyParser $smarty + * @param bool $repeat + * + * @return string the generated content + */ + public function processHookBlock($params, $content, $smarty, &$repeat) + { + $hookName = $this->getParam($params, 'name'); + $module = intval($this->getParam($params, 'module', 0)); + // explicit definition of variable that can be returned + $fields = preg_replace( + '|[^a-zA-Z0-9,\-_]|', + '', + $this->getParam($params, 'fields', '') + ); + $fields = ('' !== $fields) ? explode(",", $fields) : []; + + if (!$repeat) { + if ($this->debug && $smarty->getRequest()->get('SHOW_HOOK')) { + $content = self::showHook($hookName, $params) . $content; + } + + return $content; + } + + $type = $smarty->getTemplateDefinition()->getType(); + + $event = new HookRenderBlockEvent($hookName, $params, $fields); + + $event->setArguments($this->getArgumentsFromParams($params)); + + $eventName = sprintf('hook.%s.%s', $type, $hookName); + + // this is a hook specific to a module + if (0 !== $module) { + $eventName .= '.' . $module; + } + + $this->getDispatcher()->dispatch($eventName, $event); + + // save results so we can use it in forHook block + $this->hookResults[$hookName] = $event->get(); + } + + /** + * Process a {forhook rel="hookname"} ... {/forhook} + * + * The forhook iterates over the results return by a hookblock : + * + * {hookblock name="product.additional"} + * {forhook rel="product.additional"} + *
+ *

{$title}

+ *

{$content}

+ *
+ * {/forhook} + * {/hookblock} + * + * @param array $params + * @param string $content + * @param \TheliaSmarty\Template\SmartyParser $smarty + * @param bool $repeat + * + * @throws \InvalidArgumentException + * @return string the generated content + */ + public function processForHookBlock($params, $content, $smarty, &$repeat) + { + $rel = $this->getParam($params, 'rel'); + if (null == $rel) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'rel' parameter in forHook arguments") + ); + } + + /** @var FragmentBag $fragments */ + $fragments = null; + + // first call + if ($content === null) { + if (!array_key_exists($rel, $this->hookResults)) { + throw new \InvalidArgumentException( + $this->translator->trans("Related hook name '%name' is not defined.", ['%name' => $rel]) + ); + } + + $fragments = $this->hookResults[$rel]; + $fragments->rewind(); + + if ($fragments->isEmpty()) { + $repeat = false; + } + } else { + $fragments = $this->hookResults[$rel]; + $fragments->next(); + } + + if ($fragments->valid()) { + /** @var Fragment $fragment */ + $fragment = $fragments->current(); + + // On first iteration, save variables that may be overwritten by this hook + if (!isset($this->varstack[$rel])) { + $saved_vars = array(); + + $varlist = $fragment->getVars(); + + foreach ($varlist as $var) { + $saved_vars[$var] = $smarty->getTemplateVars($var); + } + + $this->varstack[$rel] = $saved_vars; + } + + foreach ($fragment->getVarVal() as $var => $val) { + $smarty->assign($var, $val); + } + // continue iteration + $repeat = true; + } + + // end + if (!$repeat) { + // Restore previous variables values before terminating + if (isset($this->varstack[$rel])) { + foreach ($this->varstack[$rel] as $var => $value) { + $smarty->assign($var, $value); + } + + unset($this->varstack[$rel]); + } + } + + if ($content !== null) { + if ($fragments->isEmpty()) { + $content = ""; + } + + return $content; + } + + return ''; + } + + /** + * Process {elsehook rel="hookname"} ... {/elsehook} block + * + * @param array $params hook parameters + * @param string $content hook text content + * @param \Smarty_Internal_Template $template the Smarty object + * @param boolean $repeat repeat indicator (see Smarty doc.) + * + * @return string the hook output + */ + public function elseHook( + $params, + $content, + /** @noinspection PhpUnusedParameterInspection */ $template, + &$repeat + ) { + // When encountering close tag, check if hook has results. + if ($repeat === false) { + return $this->checkEmptyHook($params) ? $content : ''; + } + + return ''; + } + + /** + * Process {ifhook rel="hookname"} ... {/ifhook} block + * + * @param array $params hook parameters + * @param string $content hook text content + * @param \Smarty_Internal_Template $template the Smarty object + * @param boolean $repeat repeat indicator (see Smarty doc.) + * + * @return string the hook output + */ + public function ifHook($params, $content, /** @noinspection PhpUnusedParameterInspection */ $template, &$repeat) + { + // When encountering close tag, check if hook has results. + if ($repeat === false) { + return $this->checkEmptyHook($params) ? '' : $content; + } + + return ''; + } + + /** + * Check if a hook has returned results. The hook should have been executed before, or an + * InvalidArgumentException is thrown + * + * @param array $params + * + * @return boolean true if the hook is empty + * @throws \InvalidArgumentException + */ + protected function checkEmptyHook($params) + { + $hookName = $this->getParam($params, 'rel'); + + if (null == $hookName) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'rel' parameter in ifhook/elsehook arguments") + ); + } + + if (!isset($this->hookResults[$hookName])) { + throw new \InvalidArgumentException( + $this->translator->trans("Related hook name '%name' is not defined.", ['%name' => $hookName]) + ); + } + + return (is_string($this->hookResults[$hookName]) && '' === $this->hookResults[$hookName] + || !is_string($this->hookResults[$hookName]) && $this->hookResults[$hookName]->isEmpty() + ); + } + + /** + * Clean the params of the params passed to the hook function or block to feed the arguments of the event + * with relevant arguments. + * + * @param $params + * + * @return array + */ + protected function getArgumentsFromParams($params) + { + $args = array(); + $excludes = array("name", "before", "separator", "after", "fields"); + + if (is_array($params)) { + foreach ($params as $key => $value) { + if (!in_array($key, $excludes)) { + $args[$key] = $value; + } + } + } + + return $args; + } + + /** + * Define the various smarty plugins handled by this class + * + * @return array an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'hook', $this, 'processHookFunction'), + new SmartyPluginDescriptor('block', 'hookblock', $this, 'processHookBlock'), + new SmartyPluginDescriptor('block', 'forhook', $this, 'processForHookBlock'), + new SmartyPluginDescriptor('block', 'elsehook', $this, 'elseHook'), + new SmartyPluginDescriptor('block', 'ifhook', $this, 'ifHook'), + ); + } + + /** + * Return the event dispatcher, + * + * @return \Symfony\Component\EventDispatcher\EventDispatcher + */ + public function getDispatcher() + { + return $this->dispatcher; + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Module.php b/local/modules/TheliaSmarty/Template/Plugins/Module.php new file mode 100644 index 00000000..b0c8123a --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Module.php @@ -0,0 +1,104 @@ +debug = $debug; + $this->requestStack = $requestStack; + } + /** + * Process theliaModule template inclusion function + * + * This function accepts two parameters: + * + * - location : this is the location in the admin template. Example: folder-edit'. The function will search for + * AdminIncludes/.html file, and fetch it as a Smarty template. + * - countvar : this is the name of a template variable where the number of found modules includes will be assigned. + * + * @param array $params + * @param \Smarty_Internal_Template $template + * @internal param \Thelia\Core\Template\Smarty\Plugins\unknown $smarty + * + * @return string + */ + public function theliaModule($params, \Smarty_Internal_Template $template) + { + $content = null; + $count = 0; + if (false !== $location = $this->getParam($params, 'location', false)) { + if ($this->debug === true && $this->requestStack->getCurrentRequest()->get('SHOW_INCLUDE')) { + echo sprintf('
%s
', $location); + } + + $moduleLimit = $this->getParam($params, 'module', null); + + $modules = ModuleQuery::getActivated(); + + /** @var \Thelia\Model\Module $module */ + foreach ($modules as $module) { + if (null !== $moduleLimit && $moduleLimit != $module->getCode()) { + continue; + } + + $file = $module->getAbsoluteAdminIncludesPath() . DS . $location . '.html'; + + if (file_exists($file)) { + $output = trim(file_get_contents($file)); + + if (! empty($output)) { + $content .= $output; + + $count++; + } + } + } + } + + if (false !== $countvarname = $this->getParam($params, 'countvar', false)) { + $template->assign($countvarname, $count); + } + + if (! empty($content)) { + return $template->fetch(sprintf("string:%s", $content)); + } + + return ""; + } + + /** + * Define the various smarty plugins hendled by this class + * + * @return an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'module_include', $this, 'theliaModule'), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Render.php b/local/modules/TheliaSmarty/Template/Plugins/Render.php new file mode 100644 index 00000000..2f7abd3d --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Render.php @@ -0,0 +1,167 @@ + + */ +class Render extends AbstractSmartyPlugin +{ + /** @var ControllerResolver */ + protected $controllerResolver; + + /** @var RequestStack */ + protected $requestStack; + + /** @var Container */ + protected $container; + + /** + * @param ControllerResolver $controllerResolver + * @param RequestStack $requestStack + * @param Container $container + */ + public function __construct(ControllerResolver $controllerResolver, RequestStack $requestStack, Container $container) + { + $this->controllerResolver = $controllerResolver; + $this->requestStack = $requestStack; + $this->container = $container; + } + + /** + * @param $params + * @return mixed|string + * @throws SmartyPluginException + */ + public function processRender($params) + { + if (null === $params["action"]) { + throw new SmartyPluginException( + "You must declare the 'action' parameter in the 'render' smarty function" + ); + } + + $request = $this->prepareRequest($params); + + $this->requestStack->push($request); + + $controller = $this->controllerResolver->getController($request); + $controllerParameters = $this->controllerResolver->getArguments($request, $controller); + + $response = call_user_func_array($controller, $controllerParameters); + + $this->requestStack->pop(); + + if ($response instanceof Response) { + return $response->getContent(); + } + + return $response; + } + + protected function prepareRequest(array $params) + { + // Get action + $action = $this->popParameter($params, "action"); + + // Then get and filter query, request and method + $query = $this->popParameter($params, "query"); + $query = $this->filterArrayStrParam($query); + $request = $this->popParameter($params, "request"); + $request = $this->filterArrayStrParam($request); + $method = strtoupper($this->popParameter($params, "method", "GET")); + + // Then build the request + $requestObject = clone $this->requestStack->getCurrentRequest(); + $requestObject->query = new ParameterBag($query); + $requestObject->request = new ParameterBag($request); + $requestObject->attributes = new ParameterBag(["_controller" => $action]); + + // Apply the method + if (!empty($request) && "GET" === $method) { + $requestObject->setMethod("POST"); + } else { + $requestObject->setMethod($method); + } + + // Then all the attribute parameters + foreach ($params as $key => $attribute) { + $requestObject->attributes->set($key, $attribute); + } + + return $requestObject; + } + + /** + * @param $param + * @return array + * + * If $param is an array, return it. + * Else parser it to translate a=b&c=d&e[]=f&g[h]=i to + * ["a"=>"b","c"=>"d","e"=>["f"],"g"=>["h"=>"i"] + */ + protected function filterArrayStrParam($param) + { + if (is_array($param)) { + return $param; + } + + parse_str($param, $param); + + if (false === $param) { + return []; + } + + return $param; + } + + /** + * @param array $params + * @param $name + * @param null $default + * @return mixed + * + * Get a parameter then unset it + */ + protected function popParameter(array $params, $name, $default = null) + { + $param = $this->getParam($params, $name, $default); + + if (array_key_exists($name, $params)) { + unset($params[$name]); + } + + return $param; + } + + /** + * @return SmartyPluginDescriptor[] an array of SmartyPluginDescriptor + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'render', $this, 'processRender'), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Security.php b/local/modules/TheliaSmarty/Template/Plugins/Security.php new file mode 100644 index 00000000..bd14bfdc --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Security.php @@ -0,0 +1,146 @@ +securityContext = $securityContext; + $this->requestStack = $requestStack; + $this->dispatcher = $dispatcher; + } + + /** + * Process security check function + * + * @param array $params + * @param \Smarty $smarty + * @return string no text is returned. + * @throws \Thelia\Core\Security\Exception\AuthenticationException + * @throws AuthenticationException + * @throws AuthorizationException + */ + public function checkAuthFunction($params, &$smarty) + { + $roles = $this->explode($this->getParam($params, 'role')); + $resources = $this->explode($this->getParam($params, 'resource')); + $modules = $this->explode($this->getParam($params, 'module')); + $accesses = $this->explode($this->getParam($params, 'access')); + + if (! $this->securityContext->isGranted($roles, $resources, $modules, $accesses)) { + if (null === $this->securityContext->checkRole($roles)) { + // The current user is not logged-in. + $ex = new AuthenticationException( + sprintf( + "User not granted for roles '%s', to access resources '%s' with %s.", + implode(',', $roles), + implode(',', $resources), + implode(',', $accesses) + ) + ); + + $loginTpl = $this->getParam($params, 'login_tpl'); + + if (null != $loginTpl) { + $ex->setLoginTemplate($loginTpl); + } + } else { + // We have a logged-in user, who do not have the proper permission. Issue an AuthorizationException. + $ex = new AuthorizationException( + sprintf( + "User not granted for roles '%s', to access resources '%s' with %s.", + implode(',', $roles), + implode(',', $resources), + implode(',', $accesses) + ) + ); + } + + throw $ex; + } + + return ''; + } + + public function checkCartNotEmptyFunction($params, &$smarty) + { + $cart = $this->getSession()->getSessionCart($this->dispatcher); + if ($cart===null || $cart->countCartItems() == 0) { + throw new OrderException('Cart must not be empty', OrderException::CART_EMPTY, array('empty' => 1)); + } + + return ""; + } + + public function checkValidDeliveryFunction($params, &$smarty) + { + $order = $this->getSession()->getOrder(); + /* Does address and module still exists ? We assume address owner can't change neither module type */ + if ($order !== null) { + $checkAddress = AddressQuery::create()->findPk($order->getChoosenDeliveryAddress()); + $checkModule = ModuleQuery::create()->findPk($order->getDeliveryModuleId()); + } else { + $checkAddress = $checkModule = null; + } + + if (null === $order || null == $checkAddress || null === $checkModule) { + throw new OrderException('Delivery must be defined', OrderException::UNDEFINED_DELIVERY, array('missing' => 1)); + } + + return ""; + } + + /** + * Define the various smarty plugins handled by this class + * + * @return array an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'check_auth', $this, 'checkAuthFunction'), + new SmartyPluginDescriptor('function', 'check_cart_not_empty', $this, 'checkCartNotEmptyFunction'), + new SmartyPluginDescriptor('function', 'check_valid_delivery', $this, 'checkValidDeliveryFunction'), + ); + } + + /** + * @return Session + */ + protected function getSession() + { + return $this->requestStack->getCurrentRequest()->getSession(); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/TheliaLoop.php b/local/modules/TheliaSmarty/Template/Plugins/TheliaLoop.php new file mode 100644 index 00000000..30abd618 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/TheliaLoop.php @@ -0,0 +1,461 @@ +container = $container; + $this->request = $container->get('request_stack')->getCurrentRequest(); + $this->dispatcher = $container->get('event_dispatcher'); + $this->securityContext = $container->get('thelia.securityContext'); + $this->translator = $container->get("thelia.translator"); + } + + /** + * @param string $loopName + * @return PropelModelPager + * @throws \InvalidArgumentException if no pagination was found for loop + */ + public static function getPagination($loopName) + { + if (array_key_exists($loopName, self::$pagination)) { + return self::$pagination[$loopName]; + } else { + throw new \InvalidArgumentException( + Translator::getInstance()->trans("No pagination currently defined for loop name '%name'", ['%name' => $loopName ]) + ); + } + } + + /** + * Process the count function: executes a loop and return the number of items found + * + * @param array $params parameters array + * @param \Smarty_Internal_Template $template + * + * @return int the item count + * @throws \InvalidArgumentException if a parameter is missing + * + */ + public function theliaCount($params, /** @noinspection PhpUnusedParameterInspection */ $template) + { + $type = $this->getParam($params, 'type'); + + if (null == $type) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'type' parameter in {count} loop arguments") + ); + } + + $loop = $this->createLoopInstance($params); + + return $loop->count(); + } + + /** + * Process {loop name="loop name" type="loop type" ... } ... {/loop} block + * + * @param array $params + * @param string $content + * @param \Smarty_Internal_Template $template + * @param boolean $repeat + * + * @throws \InvalidArgumentException + * + * @return void|string + */ + public function theliaLoop($params, $content, $template, &$repeat) + { + $name = $this->getParam($params, 'name'); + + if (null == $name) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'name' parameter in loop arguments") + ); + } + + $type = $this->getParam($params, 'type'); + + if (null == $type) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'type' parameter in loop arguments") + ); + } + + if ($content === null) { + // Check if a loop with the same name exists in the current scope, and abort if it's the case. + if (array_key_exists($name, $this->varstack)) { + throw new \InvalidArgumentException( + $this->translator->trans("A loop named '%name' already exists in the current scope.", ['%name' => $name]) + ); + } + + $loop = $this->createLoopInstance($params); + + self::$pagination[$name] = null; + + $loopResults = $loop->exec(self::$pagination[$name]); + + $loopResults->rewind(); + + $this->loopstack[$name] = $loopResults; + + // No results ? The loop is terminated, do not evaluate loop text. + if ($loopResults->isEmpty()) { + $repeat = false; + } + } else { + $loopResults = $this->loopstack[$name]; + + $loopResults->next(); + } + + if ($loopResults->valid()) { + $loopResultRow = $loopResults->current(); + + // On first iteration, save variables that may be overwritten by this loop + if (! isset($this->varstack[$name])) { + $saved_vars = array(); + + $varlist = $loopResultRow->getVars(); + + foreach ($varlist as $var) { + $saved_vars[$var] = $template->getTemplateVars($var); + } + + $this->varstack[$name] = $saved_vars; + } + + foreach ($loopResultRow->getVarVal() as $var => $val) { + $template->assign($var, $val); + } + + $repeat = true; + } + + // Loop is terminated. Cleanup. + if (! $repeat) { + // Restore previous variables values before terminating + if (isset($this->varstack[$name])) { + foreach ($this->varstack[$name] as $var => $value) { + $template->assign($var, $value); + } + + unset($this->varstack[$name]); + } + } + + if ($content !== null) { + if ($loopResults->isEmpty()) { + $content = ""; + } + + return $content; + } + + return ''; + } + + /** + * Process {elseloop rel="loopname"} ... {/elseloop} block + * + * @param array $params loop parameters + * @param string $content loop text content + * @param \Smarty_Internal_Template $template the Smarty object + * @param boolean $repeat repeat indicator (see Smarty doc.) + * @return string the loop output + */ + public function theliaElseloop($params, $content, /** @noinspection PhpUnusedParameterInspection */ $template, &$repeat) + { + //Block the smarty interpretation in the elseloop + if ($content === null) { + if (! $this->checkEmptyLoop($params)) { + $repeat = false; + + return ''; + } + } + + return $content; + } + + /** + * Process {ifloop rel="loopname"} ... {/ifloop} block + * + * @param array $params loop parameters + * @param string $content loop text content + * @param \Smarty_Internal_Template $template the Smarty object + * @param boolean $repeat repeat indicator (see Smarty doc.) + * @return string the loop output + */ + public function theliaIfLoop($params, $content, /** @noinspection PhpUnusedParameterInspection */ $template, &$repeat) + { + // When encountering close tag, check if loop has results. + if ($repeat === false) { + return $this->checkEmptyLoop($params) ? '' : $content; + } + + return ''; + } + + /** + * Process {pageloop rel="loopname"} ... {/pageloop} block + * + * @param array $params loop parameters + * @param string $content loop text content + * @param \Smarty_Internal_Template $template the Smarty object + * @param boolean $repeat repeat indicator (see Smarty doc.) + * @return string the loop output + * @throws \InvalidArgumentException + */ + public function theliaPageLoop($params, $content, $template, &$repeat) + { + $loopName = $this->getParam($params, 'rel'); + + if (null == $loopName) { + throw new \InvalidArgumentException($this->translator->trans("Missing 'rel' parameter in page loop")); + } + + // Find pagination + $pagination = self::getPagination($loopName); + + if ($pagination === null || $pagination->getNbResults() == 0) { + // No need to paginate + return ''; + } + + $startPage = intval($this->getParam($params, 'start-page', 1)); + $displayedPageCount = intval($this->getParam($params, 'limit', 10)); + + if (intval($displayedPageCount) == 0) { + $displayedPageCount = PHP_INT_MAX; + } + + $totalPageCount = $pagination->getLastPage(); + + if ($content === null) { + // The current page + $currentPage = $pagination->getPage(); + + // Get the start page. + if ($totalPageCount > $displayedPageCount) { + $startPage = $currentPage - round($displayedPageCount / 2); + + if ($startPage <= 0) { + $startPage = 1; + } + } + + // This is the iterative page number, the one we're going to increment in this loop + $iterationPage = $startPage; + + // The last displayed page number + $endPage = $startPage + $displayedPageCount - 1; + + if ($endPage > $totalPageCount) { + $endPage = $totalPageCount; + } + + // The first displayed page number + $template->assign('START', $startPage); + // The previous page number + $template->assign('PREV', $currentPage > 1 ? $currentPage-1 : $currentPage); + // The next page number + $template->assign('NEXT', $currentPage < $totalPageCount ? $currentPage+1 : $totalPageCount); + // The last displayed page number + $template->assign('END', $endPage); + // The overall last page + $template->assign('LAST', $totalPageCount); + } else { + $iterationPage = $template->getTemplateVars('PAGE'); + + $iterationPage++; + } + + if ($iterationPage <= $template->getTemplateVars('END')) { + // The iterative page number + $template->assign('PAGE', $iterationPage); + + // The overall current page number + $template->assign('CURRENT', $pagination->getPage()); + + $repeat = true; + } + + if ($content !== null) { + return $content; + } + + return ''; + } + + /** + * Check if a loop has returned results. The loop shoud have been executed before, or an + * InvalidArgumentException is thrown + * + * @param array $params + * + * @return boolean true if the loop is empty + * @throws \InvalidArgumentException + */ + protected function checkEmptyLoop($params) + { + $loopName = $this->getParam($params, 'rel'); + + if (null == $loopName) { + throw new \InvalidArgumentException( + $this->translator->trans("Missing 'rel' parameter in ifloop/elseloop arguments") + ); + } + + if (! isset($this->loopstack[$loopName])) { + throw new \InvalidArgumentException( + $this->translator->trans("Related loop name '%name'' is not defined.", ['%name' => $loopName]) + ); + } + + return $this->loopstack[$loopName]->isEmpty(); + } + + /** + * @param $smartyParams + * + * @return BaseLoop + * @throws \Thelia\Core\Template\Element\Exception\InvalidElementException + * @throws \Thelia\Core\Template\Element\Exception\ElementNotFoundException + */ + protected function createLoopInstance($smartyParams) + { + $type = strtolower($smartyParams['type']); + + if (! isset($this->loopDefinition[$type])) { + throw new ElementNotFoundException( + $this->translator->trans("Loop type '%type' is not defined.", ['%type' => $type]) + ); + } + + $class = new \ReflectionClass($this->loopDefinition[$type]); + + if ($class->isSubclassOf("Thelia\Core\Template\Element\BaseLoop") === false) { + throw new InvalidElementException( + $this->translator->trans("'%type' loop class should extends Thelia\Core\Template\Element\BaseLoop", ['%type' => $type]) + ); + } + + $loop = $class->newInstance( + $this->container + ); + + $loop->initializeArgs($smartyParams); + + return $loop; + } + + /** + * + * Injects an associative array containing information for loop execution + * + * key is loop name + * value is the class implementing/extending base loop classes + * + * ex : + * + * $loop = array( + * "product" => "Thelia\Loop\Product", + * "category" => "Thelia\Loop\Category", + * "myLoop" => "My\Own\Loop" + * ); + * + * @param array $loopDefinition + * @throws \InvalidArgumentException if loop name already exists + */ + public function setLoopList(array $loopDefinition) + { + foreach ($loopDefinition as $name => $className) { + if (array_key_exists($name, $this->loopDefinition)) { + throw new \InvalidArgumentException( + $this->translator->trans("The loop name '%name' is already defined in %className class", [ + '%name' => $name, + '%className' => $className + ]) + ); + } + + $this->loopDefinition[$name] = $className; + } + } + + /** + * Defines the various smarty plugins hendled by this class + * + * @return \TheliaSmarty\Template\SmartyPluginDescriptor[] smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + + new SmartyPluginDescriptor('function', 'count', $this, 'theliaCount'), + new SmartyPluginDescriptor('block', 'loop', $this, 'theliaLoop'), + new SmartyPluginDescriptor('block', 'elseloop', $this, 'theliaElseloop'), + new SmartyPluginDescriptor('block', 'ifloop', $this, 'theliaIfLoop'), + new SmartyPluginDescriptor('block', 'pageloop', $this, 'theliaPageLoop'), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Translation.php b/local/modules/TheliaSmarty/Template/Plugins/Translation.php new file mode 100644 index 00000000..6eb83652 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Translation.php @@ -0,0 +1,125 @@ +translator = $translator; + } + + /** + * Set the default translation domain + * + * @param array $params + * @param \Smarty_Internal_Template $smarty + * @return string + */ + public function setDefaultTranslationDomain($params, &$smarty) + { + $this->defaultTranslationDomain = $this->getParam($params, 'domain'); + } + + /** + * Set the default locale + * + * @param array $params + * @param \Smarty_Internal_Template $smarty + * @return string + */ + public function setDefaultLocale($params, &$smarty) + { + $this->defaultLocale = $this->getParam($params, 'locale'); + } + + /** + * Process translate function + * + * @param array $params + * @param \Smarty_Internal_Template $smarty + * @return string + */ + public function translate($params, &$smarty) + { + // All parameters other than 'l' and 'd' and 'js' are supposed to be variables. Build an array of var => value pairs + // and pass it to the translator + $vars = array(); + + foreach ($params as $name => $value) { + if (!in_array($name, $this->protectedParams)) { + $vars["%$name"] = $value; + } + } + + $str = $this->translator->trans( + $this->getParam($params, 'l'), + $vars, + $this->getParam($params, 'd', $this->defaultTranslationDomain), + $this->getParam($params, 'locale', $this->defaultLocale), + $this->getBoolean($this->getParam($params, 'default', true), true), + $this->getBoolean($this->getParam($params, 'fallback', true), true) + ); + + if ($this->getParam($params, 'js', 0)) { + $str = preg_replace("/(['\"])/", "\\\\$1", $str); + } + + return $str; + } + + protected function getBoolean($value, $default = false) + { + $val = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + if (null === $val) { + $val = $default; + } + + return $val; + } + + /** + * Define the various smarty plugins handled by this class + * + * @return \TheliaSmarty\Template\SmartyPluginDescriptor[] an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'intl', $this, 'translate'), + new SmartyPluginDescriptor('function', 'default_translation_domain', $this, 'setDefaultTranslationDomain'), + new SmartyPluginDescriptor('function', 'default_locale', $this, 'setDefaultLocale'), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/Type.php b/local/modules/TheliaSmarty/Template/Plugins/Type.php new file mode 100644 index 00000000..9140a13d --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/Type.php @@ -0,0 +1,47 @@ +isValid($value)) { + return ''; + } + + return $value; + } + + /** + * Define the various smarty plugins handled by this class + * + * @return an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('modifier', 'assertType', $this, 'assertTypeModifier'), + ); + } +} diff --git a/local/modules/TheliaSmarty/Template/Plugins/UrlGenerator.php b/local/modules/TheliaSmarty/Template/Plugins/UrlGenerator.php new file mode 100644 index 00000000..ff422a28 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/Plugins/UrlGenerator.php @@ -0,0 +1,363 @@ +requestStack = $requestStack; + $this->tokenProvider = $tokenProvider; + $this->container = $container; + } + + /** + * Process url generator function + * + * @param array $params + * @param \Smarty $smarty + * @return string no text is returned. + */ + public function generateUrlFunction($params, &$smarty) + { + // the path to process + $current = $this->getParam($params, 'current', false); + $path = $this->getParam($params, 'path', null); + // Do not invoke index.php in URL (get a static file in web space + $file = $this->getParam($params, 'file', null); + $routeId = $this->getParam($params, 'route_id', null); + // select default router + if ($this->getRequest()->fromAdmin()) { + $defaultRouter = 'admin'; + } elseif ($this->getRequest()->fromFront()) { + $defaultRouter = 'front'; + } else { + $defaultRouter = null; + } + $routerId = $this->getParam($params, 'router', $defaultRouter); + + if ($current) { + $path = $this->getRequest()->getPathInfo(); + unset($params["current"]); // Delete the current param, so it isn't included in the url + + // build the query variables + $params = array_merge( + $this->getRequest()->query->all(), + $params + ); + } + + if ($routeId !== null && $routerId !== null) { + $routerId = 'router.' . $routerId; + + // test if the router exists + if (!$this->container->has($routerId)) { + throw new \InvalidArgumentException( + 'The router "' . $routerId . '" not found.' + ); + } + // get url by router and id + /** @var Router $router */ + $router = $this->container->get($routerId); + + $url = $router->generate( + $routeId, + $this->getArgsFromParam($params, ['route_id', 'router']), + Router::ABSOLUTE_URL + ); + } else { + if ($file !== null) { + $path = $file; + $mode = URL::PATH_TO_FILE; + } elseif ($path !== null) { + $mode = URL::WITH_INDEX_PAGE; + } else { + throw new \InvalidArgumentException( + "Please specify either 'path', 'file' or router and route_id on parameters in {url} function." + ); + } + + $excludeParams = $this->resolvePath($params, $path, $smarty); + + $url = URL::getInstance()->absoluteUrl( + $path, + $this->getArgsFromParam($params, array_merge(['noamp', 'path', 'file', 'target'], $excludeParams)), + $mode + ); + } + return $this->applyNoAmpAndTarget($params, $url); + } + + /** + * + * find placeholders in the path and replace them by the given value + * + * @param $params + * @param $path + * @param $smarty + * @return array the placeholders found + */ + protected function resolvePath(&$params, &$path, $smarty) + { + $placeholder = []; + + foreach ($params as $key => $value) { + if (false !== strpos($path, "%$key")) { + $placeholder["%$key"] = SmartyParser::theliaEscape($value, $smarty); + unset($params[$key]); + } + } + + $path = strtr($path, $placeholder); + $keys = array_keys($placeholder); + array_walk($keys, function(&$item, $key) { + $item = str_replace('%', '', $item); + }); + + return $keys; + } + + /** + * Process view url generator function + * + * @param array $params + * @param \Smarty $smarty + * @return string no text is returned. + */ + public function generateFrontViewUrlFunction($params, &$smarty) + { + return $this->generateViewUrlFunction($params, false); + } + + /** + * Process administration view url generator function + * + * @param array $params + * @param \Smarty $smarty + * @return string no text is returned. + */ + public function generateAdminViewUrlFunction($params, &$smarty) + { + return $this->generateViewUrlFunction($params, true); + } + + + public function navigateToUrlFunction($params, &$smarty) + { + $to = $this->getParam($params, 'to', null); + + $toMethod = $this->getNavigateToMethod($to); + + $url = URL::getInstance()->absoluteUrl( + $this->$toMethod(), + $this->getArgsFromParam($params, ['noamp', 'to', 'target']), + URL::WITH_INDEX_PAGE + ); + + return $this->applyNoAmpAndTarget($params, $url); + } + + protected function generateViewUrlFunction($params, $forAdmin) + { + // the view name (without .html) + $view = $this->getParam($params, 'view'); + + $args = $this->getArgsFromParam($params, array('view', 'noamp', 'target')); + + $url = $forAdmin ? URL::getInstance()->adminViewUrl($view, $args) : URL::getInstance()->viewUrl($view, $args); + + return $this->applyNoAmpAndTarget($params, $url); + } + + /** + * Get URL parameters array from parameters. + * + * @param array $params Smarty function params + * @param array $exclude Smarty function exclude params + * @return array the parameters array (either emply, of valued) + */ + private function getArgsFromParam($params, $exclude = array()) + { + $pairs = array(); + + foreach ($params as $name => $value) { + if (in_array($name, $exclude)) { + continue; + } + + $pairs[$name] = $value; + } + + return $pairs; + } + + public function generateUrlWithToken($params, &$smarty) + { + /** + * Compute the url + */ + $url = $this->generateUrlFunction($params, $smarty); + + $urlTokenParam = $this->getParam($params, "url_param", "_token"); + + /** + * Add the token + */ + $token = $this->tokenProvider->assignToken(); + + $newUrl = URL::getInstance()->absoluteUrl( + $url, + [ + $urlTokenParam => $token + ] + ); + + return $this->applyNoAmpAndTarget($params, $newUrl); + } + + protected function applyNoAmpAndTarget($params, $url) + { + $noamp = $this->getParam($params, 'noamp', null); // Do not change & in & + $target = $this->getParam($params, 'target', null); + + if (!$noamp) { + $url = str_replace('&', '&', $url); + } + + if ($target != null) { + $url .= '#'.$target; + } + + return $url; + } + + /** + * Set the _previous_url request attribute, to define the previous URL, or + * prevent saving the current URL as the previous one. + * + * @param array $params + * @param \Smarty_Internal_Template $smarty + */ + public function setPreviousUrlFunction($params, &$smarty) + { + $ignore_current = $this->getParam($params, 'ignore_current', false); + + if ($ignore_current !== false) { + $this->getRequest()->attributes->set('_previous_url', 'dont-save'); + } else { + $this->getRequest()->attributes->set('_previous_url', $this->generateUrlFunction($params, $smarty)); + } + } + + /** + * Define the various smarty plugins handled by this class + * + * @return array an array of smarty plugin descriptors + */ + public function getPluginDescriptors() + { + return array( + new SmartyPluginDescriptor('function', 'url', $this, 'generateUrlFunction'), + new SmartyPluginDescriptor('function', 'token_url', $this, 'generateUrlWithToken'), + new SmartyPluginDescriptor('function', 'viewurl', $this, 'generateFrontViewUrlFunction'), + new SmartyPluginDescriptor('function', 'admin_viewurl', $this, 'generateAdminViewUrlFunction'), + new SmartyPluginDescriptor('function', 'navigate', $this, 'navigateToUrlFunction'), + new SmartyPluginDescriptor('function', 'set_previous_url', $this, 'setPreviousUrlFunction') + ); + } + + /** + * @return array sur le format "to_value" => "method_name" + */ + protected function getNavigateToValues() + { + return array( + "current" => "getCurrentUrl", + "previous" => "getPreviousUrl", + "index" => "getIndexUrl", + ); + } + + protected function getNavigateToMethod($to) + { + if ($to === null) { + throw new \InvalidArgumentException("Missing 'to' parameter in `navigate` substitution."); + } + + $navigateToValues = $this->getNavigateToValues(); + + if (!array_key_exists($to, $navigateToValues)) { + throw new \InvalidArgumentException( + sprintf("Incorrect value `%s` for parameter `to` in `navigate` substitution.", $to) + ); + } + + return $navigateToValues[$to]; + } + + protected function getCurrentUrl() + { + return $this->getRequest()->getUri(); + } + + protected function getPreviousUrl() + { + return URL::getInstance()->absoluteUrl($this->getSession()->getReturnToUrl()); + } + + protected function getIndexUrl() + { + return URL::getInstance()->getIndexPage(); + } + + /** + * @return Request + */ + protected function getRequest() + { + return $this->requestStack->getCurrentRequest(); + } + + /** + * @return Session + */ + protected function getSession() + { + return $this->getRequest()->getSession(); + } +} diff --git a/local/modules/TheliaSmarty/Template/SmartyHelper.php b/local/modules/TheliaSmarty/Template/SmartyHelper.php new file mode 100644 index 00000000..2bed38f8 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/SmartyHelper.php @@ -0,0 +1,178 @@ + + */ +class SmartyHelper implements ParserHelperInterface +{ + /** + * Parse a string and get all smarty function and block with theirs arguments. + * some smarty functions are not supported : if, for, ... + * + * + * + * @param string $content the template content + * @param array $functions the only functions we want to parse + * + * @return array array of functions with 2 index name and attributes an array of name, value + */ + public function getFunctionsDefinition($content, array $functions = array()) + { + $strlen = strlen($content); + + // init + $buffer = ''; + $name = ''; + $attributeName = ''; + $waitfor = ''; + + $inFunction = false; + $hasName = false; + $inAttribute = false; + $inInnerFunction = false; + + $ldelim = '{'; + $rdelim = '}'; + $skipFunctions = array("if", "for"); + $skipCharacters = array("\t", "\r", "\n"); + + $store = array(); + $attributes = array(); + + for ($pos = 0; $pos < $strlen; $pos++) { + $char = $content[$pos]; + + if (in_array($char, $skipCharacters)) { + continue; + } + + if (!$inFunction) { + if ($char === $ldelim) { + $inFunction = true; + $inInnerFunction = false; + } + continue; + } + + // get function name + if (!$hasName) { + if ($char === " " || $char === $rdelim) { + $name = $buffer; + // we catch this name ? + $hasName = $inFunction = (!in_array($name, $skipFunctions) && (0 === count($functions) || in_array($name, $functions))); + $buffer = ""; + continue; + } else { + // skip { + if (in_array($char, array("/", "$", "#", "'", "\""))) { + $inFunction = false; + } else { + $buffer .= $char; + } + continue; + } + } + + // inner Function ? + if ($char === $ldelim) { + $inInnerFunction = true; + $buffer .= $char; + continue; + } + + // end ? + if ($char === $rdelim) { + if ($inInnerFunction) { + $inInnerFunction = false; + $buffer .= $char; + } else { + if ($inAttribute) { + if ("" === $attributeName) { + $attributes[trim($buffer)] = ""; + } else { + $attributes[$attributeName] = $buffer; + } + $inAttribute = false; + } + $store[] = array( + "name" => $name, + "attributes" => $attributes + ); + $inFunction = false; + $inAttribute = false; + $inInnerFunction = false; + $hasName = false; + $name = ""; + $buffer = ""; + $waitfor = ""; + $attributes = array(); + } + continue; + } + + // attributes + if (!$inAttribute) { + if ($char !== " ") { + $inAttribute = true; + $buffer = $char; + $attributeName = ""; + } + } else { + if ("" === $attributeName) { + if (in_array($char, array(" ", "="))) { + $attributeName = trim($buffer); + if (" " === $char) { + $attributes[$attributeName] = ""; + $inAttribute = false; + } + $buffer = ""; + } else { + $buffer .= $char; + } + } else { + if ("" === $waitfor) { + if (in_array($char, array("'", "\""))) { + $waitfor = $char; + } else { + $waitfor = " "; + $buffer .= $char; + } + continue; + } + if ($inInnerFunction) { + $buffer .= $char; + } else { + // end of attribute ? + if ($char === $waitfor) { + $attributes[$attributeName] = $buffer; + $inAttribute = false; + $waitfor = ""; + } else { + $buffer .= $char; + } + } + } + } + } + + return $store; + } +} diff --git a/local/modules/TheliaSmarty/Template/SmartyParser.php b/local/modules/TheliaSmarty/Template/SmartyParser.php new file mode 100644 index 00000000..422d29b6 --- /dev/null +++ b/local/modules/TheliaSmarty/Template/SmartyParser.php @@ -0,0 +1,485 @@ + + * @author Etienne Roudeix + */ +class SmartyParser extends Smarty implements ParserInterface +{ + public $plugins = array(); + + /** @var EventDispatcherInterface */ + protected $dispatcher; + + /** @var ParserContext */ + protected $parserContext; + + /** @var TemplateHelperInterface */ + protected $templateHelper; + + /** @var RequestStack */ + protected $requestStack; + + protected $backOfficeTemplateDirectories = array(); + protected $frontOfficeTemplateDirectories = array(); + + protected $templateDirectories = array(); + + /** @var TemplateDefinition */ + protected $templateDefinition; + + /** @var int */ + protected $status = 200; + + /** + * @param RequestStack $requestStack + * @param EventDispatcherInterface $dispatcher + * @param ParserContext $parserContext + * @param TemplateHelperInterface $templateHelper + * @param string $env + * @param bool $debug + */ + public function __construct( + RequestStack $requestStack, + EventDispatcherInterface $dispatcher, + ParserContext $parserContext, + TemplateHelperInterface $templateHelper, + $env = "prod", + $debug = false + ) { + parent::__construct(); + + $this->requestStack = $requestStack; + $this->dispatcher = $dispatcher; + $this->parserContext = $parserContext; + $this->templateHelper = $templateHelper; + + // Configure basic Smarty parameters + + $compile_dir = THELIA_ROOT . 'cache'. DS . $env . DS . 'smarty'.DS.'compile'; + if (! is_dir($compile_dir)) { + @mkdir($compile_dir, 0777, true); + } + + $cache_dir = THELIA_ROOT . 'cache'. DS . $env . DS . 'smarty'.DS.'cache'; + if (! is_dir($cache_dir)) { + @mkdir($cache_dir, 0777, true); + } + + $this->setCompileDir($compile_dir); + $this->setCacheDir($cache_dir); + $this->inheritance_merge_compiled_includes = false; + + // Prevent smarty ErrorException: Notice: Undefined index bla bla bla... + $this->error_reporting = E_ALL ^ E_NOTICE; + + // The default HTTP status + $this->status = 200; + + $this->registerFilter('output', array($this, "trimWhitespaces")); + $this->registerFilter('variable', array(__CLASS__, "theliaEscape")); + } + + /** + * Return the current request or null if no request exists + * + * @return Request|null + */ + public function getRequest() + { + return $this->requestStack->getCurrentRequest(); + } + + /** + * Trim whitespaces from the HTML output, preserving required ones in pre, textarea, javascript. + * This methois uses 3 levels of trimming : + * + * - 0 : whitespaces are not trimmed, code remains as is. + * - 1 : only blank lines are trimmed, code remains indented and human-readable (the default) + * - 2 or more : all unnecessary whitespace are removed. Code is very hard to read. + * + * The trim level is defined by the configuration variable html_output_trim_level + * + * @param string $source the HTML source + * @param \Smarty_Internal_Template $template + * @return string + */ + public function trimWhitespaces($source, /** @noinspection PhpUnusedParameterInspection */ \Smarty_Internal_Template $template) + { + $compressionMode = ConfigQuery::read('html_output_trim_level', 1); + + if ($compressionMode == 0) { + return $source; + } + + $store = array(); + $_store = 0; + $_offset = 0; + + // Unify Line-Breaks to \n + $source = preg_replace("/\015\012|\015|\012/", "\n", $source); + + // capture Internet Explorer Conditional Comments + if ($compressionMode == 1) { + $expressions = array( + // remove spaces between attributes (but not in attribute values!) + '#(([a-z0-9]\s*=\s*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4', + '/(^[\n]*|[\n]+)[\s\t]*[\n]+/' => "\n" + ); + } elseif ($compressionMode >= 2) { + if (preg_match_all('##is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); + + $_offset += $_length - strlen($replace); + $_store++; + } + } + + // Strip all HTML-Comments + // yes, even the ones in + + + + + + \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/config/.htaccess b/local/modules/Tinymce/Resources/js/tinymce/filemanager/config/.htaccess new file mode 100644 index 00000000..14249c50 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/config/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/config/config.php b/local/modules/Tinymce/Resources/js/tinymce/filemanager/config/config.php new file mode 100644 index 00000000..ef7eef7e --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/config/config.php @@ -0,0 +1,349 @@ +exists($webMediaEnvPath)) { + $fileSystem->mkdir($webMediaEnvPath.DS.'upload'); + $fileSystem->mkdir($webMediaEnvPath.DS.'thumbs'); + } + } else { + if (false === $fileSystem->exists($webMediaPath)) { + $fileSystem->mkdir($webMediaPath.DS.'upload'); + $fileSystem->mkdir($webMediaPath.DS.'thumbs'); + } + } +} + +$env = getenv('THELIA_ENV') ?: 'prod'; + +if (file_exists(__DIR__.'/../../../../../../../../core/vendor/autoload.php')) { + // Symlinked with std install + require_once __DIR__.'/../../../../../../../../core/vendor/autoload.php'; +} elseif (file_exists(__DIR__.'/../../../../core/vendor/autoload.php')) { + // Hard copy with std install + require_once __DIR__.'/../../../../core/vendor/autoload.php'; +} elseif (file_exists(__DIR__.'/../../../../../../../../bootstrap.php')) { + // Symlinked with thelia-project + require_once __DIR__.'/../../../../../../../../bootstrap.php'; +} elseif (file_exists(__DIR__.'/../../../../bootstrap.php')) { + // Hard copy with thelia-project + require_once __DIR__.'/../../../../bootstrap.php'; +} + +/** @var Request $request */ +$request = Request::createFromGlobals(); + +$thelia = new Thelia($env, false); + +$thelia->boot(); + +/** @var \Symfony\Component\DependencyInjection\ContainerInterface $container */ +$container = $thelia->getContainer(); + +$eventDispatcher = $container->get('event_dispatcher'); +$container->get('thelia.translator'); +$container->get('thelia.url.manager'); +$container->set('request', $request); +$container->get('request_stack')->push($request); +$event = new \Thelia\Core\Event\SessionEvent(THELIA_CACHE_DIR.$env, false, $env); + +$eventDispatcher->dispatch(\Thelia\Core\TheliaKernelEvents::SESSION, $event); +$session = $event->getSession(); +$session->start(); +$request->setSession($session); + +/** @var \Thelia\Core\Security\SecurityContext $securityContext */ +$securityContext = $container->get('thelia.securityContext'); + +// We just check the current user has the ADMIN role. +$isGranted = $securityContext->isGranted(['ADMIN'], [], [], []); + +if (false === $isGranted) { + echo "Sorry, it seems that you're not allowed to use this function. ADMIN role is required."; + + exit; +} + +//------------------------------------------------------------------------------ +// DO NOT COPY THESE VARIABLES IN FOLDERS config.php FILES +//------------------------------------------------------------------------------ + +//********************** +//Path configuration +//********************** + +// In this configuration the media folder is located in the /web directory. + +// base url of site (without final /). if you prefer relative urls leave empty. +$base_url = rtrim(ConfigQuery::getConfiguredShopUrl(), '/'); + +// Argh, url_site is not defined ?! +if (empty($base_url)) { + // A we did not used the router to access this dialog, we cannot use the URL class. Use the good old method. + $base_url = $request->getSchemeAndHttpHost().preg_replace('!/tinymce/filemanager/dialog.php.*$!', '', $_SERVER['REQUEST_URI']); +} + +//Check for backward compatibility +if ($env !== "prod") { + // path from base_url to base of upload folder for current env (with start and final /) + $upload_dir = '/media/'.$env.'/upload/'; + + // path from base_url to base of upload folder for current env (with start and final /) + $thumbs_dir = '/media/'.$env.'/thumbs/'; + + // path to file manager folder to upload folder for current env (with final /) + $current_path = THELIA_WEB_DIR.'media'.DS.$env.DS.'upload'.DS; + + // path to file manager folder to thumbs folder for current env (with final /) + // WARNING: thumbs folder should not be inside the upload folder + $thumbs_base_path = THELIA_WEB_DIR.'media'.DS.$env.DS.'thumbs'.DS; +} else { + // path from base_url to base of upload folder (with start and final /) + $upload_dir = '/media/upload/'; + + // path from base_url to base of upload folder (with start and final /) + $thumbs_dir = '/media/thumbs/'; + + // path to file manager folder to upload folder (with final /) + $current_path = THELIA_WEB_DIR.'media'.DS.'upload'.DS; + + // path to file manager folder to thumbs folder (with final /) + // WARNING: thumbs folder should not be inside the upload folder + $thumbs_base_path = THELIA_WEB_DIR.'media'.DS.'thumbs'.DS; +} + +generateFolder($env); + +// path from base_url to filemanager folder (with start and final /) +$filemanager_dir = '/tinymce/filemanager/'; + +// Set the language to the back-office current language, if it is available +$current_locale = $request->getSession()->getLang()->getLocale(); + +if (file_exists(__DIR__.DS.'..'.DS.'lang.'.DS.$current_locale.'.php')) { + $default_language = $current_locale; +} else { + $default_language = 'en_EN'; +} + +// OPTIONAL SECURITY +// if set to true only those will access RF whose url contains the access key(akey) like: +// +// in tinymce a new parameter added: filemanager_access_key:"myPrivateKey" +// example tinymce config: +// tiny init ... +// +// external_filemanager_path:"../filemanager/", +// filemanager_title:"Filemanager" , +// filemanager_access_key:"myPrivateKey" , +// ... +define('USE_ACCESS_KEYS', false); // TRUE or FALSE + +// add access keys eg: array('myPrivateKey', 'someoneElseKey'); +// keys should only containt (a-z A-Z 0-9 \ . _ -) characters +// if you are integrating lets say to a cms for admins, i recommend making keys randomized something like this: +// $username = 'Admin'; +// $salt = 'dsflFWR9u2xQa' (a hard coded string) +// $akey = md5($username.$salt); +// DO NOT use 'key' as access key! +// Keys are CASE SENSITIVE! +$access_keys = array('myPrivateKey', 'someoneElseKey'); + +//-------------------------------------------------------------------------------------------------------- +// YOU CAN COPY AND CHANGE THESE VARIABLES INTO FOLDERS config.php FILES TO CUSTOMIZE EACH FOLDER OPTIONS +//-------------------------------------------------------------------------------------------------------- + +$MaxSizeUpload = 100; //Mb + +// SERVER OVERRIDE +if ((int) (ini_get('post_max_size')) < $MaxSizeUpload) { + $MaxSizeUpload = (int) (ini_get('post_max_size')); +} + +// $default_language = "en_EN"; //default language file name +$icon_theme = "ico"; //ico or ico_dark you can cusatomize just putting a folder inside filemanager/img +$show_folder_size = true; //Show or not show folder size in list view feature in filemanager (is possible, if there is a large folder, to greatly increase the calculations) +$show_sorting_bar = true; //Show or not show sorting feature in filemanager +$loading_bar = true; //Show or not show loading bar +$transliteration = false; //active or deactive the transliteration (mean convert all strange characters in A..Za..z0..9 characters) + +//******************************************* +//Images limit and resizing configuration +//******************************************* + +// set maximum pixel width and/or maximum pixel height for all images +// If you set a maximum width or height, oversized images are converted to those limits. Images smaller than the limit(s) are unaffected +// if you don't need a limit set both to 0 +$image_max_width = 0; +$image_max_height = 0; + +//Automatic resizing // +// If you set $image_resizing to TRUE the script converts all uploaded images exactly to image_resizing_width x image_resizing_height dimension +// If you set width or height to 0 the script automatically calculates the other dimension +// Is possible that if you upload very big images the script not work to overcome this increase the php configuration of memory and time limit +$image_resizing = false; +$image_resizing_width = 0; +$image_resizing_height = 0; + +//****************** +// Default layout setting +// +// 0 => boxes +// 1 => detailed list (1 column) +// 2 => columns list (multiple columns depending on the width of the page) +// YOU CAN ALSO PASS THIS PARAMETERS USING SESSION VAR => $_SESSION['RF']["VIEW"]= +// +//****************** +$default_view = 0; + +//set if the filename is truncated when overflow first row +$ellipsis_title_after_first_row = true; + +//************************* +//Permissions configuration +//****************** +$delete_files = true; +$create_folders = true; +$delete_folders = true; +$upload_files = true; +$rename_files = true; +$rename_folders = true; +$duplicate_files = true; +$copy_cut_files = true; // for copy/cut files +$copy_cut_dirs = true; // for copy/cut directories + + +// defines size limit for paste in MB / operation +// set 'FALSE' for no limit +$copy_cut_max_size = 100; +// defines file count limit for paste / operation +// set 'FALSE' for no limit +$copy_cut_max_count = 200; +//IF any of these limits reached, operation won't start and generate warning + +//********************** +//Allowed extensions (lowercase insert) +//********************** +$ext_img = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg'); //Images +$ext_file = array( + 'doc', + 'docx', + 'rtf', + 'pdf', + 'xls', + 'xlsx', + 'txt', + 'csv', + 'html', + 'xhtml', + 'psd', + 'sql', + 'log', + 'fla', + 'xml', + 'ade', + 'adp', + 'mdb', + 'accdb', + 'ppt', + 'pptx', + 'odt', + 'ots', + 'ott', + 'odb', + 'odg', + 'otp', + 'otg', + 'odf', + 'ods', + 'odp', + 'css', + 'ai', +); //Files +$ext_video = array('mov', 'mpeg', 'mp4', 'avi', 'mpg', 'wma', "flv", "webm"); //Video +$ext_music = array('mp3', 'm4a', 'ac3', 'aiff', 'mid', 'ogg', 'wav'); //Audio +$ext_misc = array('zip', 'rar', 'gz', 'tar', 'iso', 'dmg'); //Archives + +$ext = array_merge($ext_img, $ext_file, $ext_misc, $ext_video, $ext_music); //allowed extensions + +/****************** + * AVIARY config + *******************/ +$aviary_active = false; +$aviary_key = "dvh8qudbp6yx2bnp"; +$aviary_secret = "m6xaym5q42rpw433"; +$aviary_version = 3; +$aviary_language = 'en'; + +//The filter and sorter are managed through both javascript and php scripts because if you have a lot of +//file in a folder the javascript script can't sort all or filter all, so the filemanager switch to php script. +//The plugin automatic swich javascript to php when the current folder exceeds the below limit of files number +$file_number_limit_js = 500; + +//********************** +// Hidden files and folders +//********************** +// set the names of any folders you want hidden (eg "hidden_folder1", "hidden_folder2" ) Remember all folders with these names will be hidden (you can set any exceptions in config.php files on folders) +$hidden_folders = array(); +// set the names of any files you want hidden. Remember these names will be hidden in all folders (eg "this_document.pdf", "that_image.jpg" ) +$hidden_files = array('config.php'); + +/******************* + * JAVA upload + *******************/ +$java_upload = true; +$JAVAMaxSizeUpload = 200; //Gb + + +//************************************ +//Thumbnail for external use creation +//************************************ + + +// New image resized creation with fixed path from filemanager folder after uploading (thumbnails in fixed mode) +// If you want create images resized out of upload folder for use with external script you can choose this method, +// You can create also more than one image at a time just simply add a value in the array +// Remember than the image creation respect the folder hierarchy so if you are inside source/test/test1/ the new image will create at +// path_from_filemanager/test/test1/ +// PS if there isn't write permission in your destination folder you must set it +$fixed_image_creation = false; //activate or not the creation of one or more image resized with fixed path from filemanager folder +$fixed_path_from_filemanager = array( + '../test/', + '../test1/', +); //fixed path of the image folder from the current position on upload folder +$fixed_image_creation_name_to_prepend = array('', 'test_'); //name to prepend on filename +$fixed_image_creation_to_append = array('_test', ''); //name to appendon filename +$fixed_image_creation_width = array(300, 400); //width of image (you can leave empty if you set height) +$fixed_image_creation_height = array(200, ''); //height of image (you can leave empty if you set width) + + +// New image resized creation with relative path inside to upload folder after uploading (thumbnails in relative mode) +// With Responsive filemanager you can create automatically resized image inside the upload folder, also more than one at a time +// just simply add a value in the array +// The image creation path is always relative so if i'm inside source/test/test1 and I upload an image, the path start from here +$relative_image_creation = false; //activate or not the creation of one or more image resized with relative path from upload folder +$relative_path_from_current_pos = array( + 'thumb/', + 'thumb/', +); //relative path of the image folder from the current position on upload folder +$relative_image_creation_name_to_prepend = array('', 'test_'); //name to prepend on filename +$relative_image_creation_name_to_append = array('_test', ''); //name to append on filename +$relative_image_creation_width = array(300, 400); //width of image (you can leave empty if you set height) +$relative_image_creation_height = array(200, ''); //height of image (you can leave empty if you set width) +; diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-lightbox.min.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-lightbox.min.css new file mode 100644 index 00000000..70414368 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-lightbox.min.css @@ -0,0 +1,6 @@ +/*! +* bootstrap-lightbox.css v0.6.0 +* Copyright 2013 Jason Butz +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +.lightbox{position:relative;top:70px;z-index:1050;line-height:0;text-align:center;background-color:transparent;outline:0}.lightbox .hide{display:none}.lightbox .in{display:block}.lightbox-content{display:inline-block;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.lightbox-content .lightbox-caption{position:absolute;right:12px;bottom:11px;left:11px;padding:2%;font-size:14px;line-height:18px;color:white;text-align:center;text-shadow:0 -1px 0 #000;text-shadow:0 -1px 0 rgba(0,0,0,0.3);background:#000;background:rgba(0,0,0,0.6)}.lightbox-header .close{margin-top:-16px;margin-right:-16px;font-size:2em;color:white;opacity:.8;filter:alpha(opacity=80)}.lightbox-header .close :hover{opacity:.4;filter:alpha(opacity=40)} diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-modal.min.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-modal.min.css new file mode 100644 index 00000000..373c1b6b --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-modal.min.css @@ -0,0 +1,8 @@ +/*! + * Bootstrap Modal + * + * Copyright Jordan Schroter + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.modal-open{overflow:hidden}.modal-open.page-overflow .page-container,.modal-open.page-overflow .page-container .navbar-fixed-top,.modal-open.page-overflow .page-container .navbar-fixed-bottom,.modal-open.page-overflow .modal-scrollable{overflow-y:scroll}@media (max-width:840px){.modal-open.page-overflow .page-container .navbar-fixed-top,.modal-open.page-overflow .page-container .navbar-fixed-bottom{overflow-y:visible}}.modal-scrollable{position:fixed;top:0;bottom:0;left:0;right:0;overflow:auto}.modal{outline:0;position:absolute;margin-top:0;top:50%;overflow:visible}.modal.fade{top:-100%;-webkit-transition:opacity .3s linear,top .3s ease-out,bottom .3s ease-out,margin-top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out,bottom .3s ease-out,margin-top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out,bottom .3s ease-out,margin-top .3s ease-out;transition:opacity .3s linear,top .3s ease-out,bottom .3s ease-out,margin-top .3s ease-out}.modal.fade.in{top:50%}.modal-body{max-height:none;overflow:visible}.modal.modal-absolute{position:absolute;z-index:950}.modal .loading-mask{position:absolute;top:0;bottom:0;left:0;right:0;background:#fff;border-radius:6px}.modal-backdrop.modal-absolute{position:absolute;z-index:940}.modal-backdrop,.modal-backdrop.fade.in{opacity:.85;filter:alpha(opacity=85);background:#eee}.modal.container{width:940px;margin-left:-470px}.modal-overflow.modal{top:1%}.modal-overflow.modal.fade{top:-100%}.modal-overflow.modal.fade.in{top:1%}.modal-overflow .modal-body{overflow:auto;-webkit-overflow-scrolling:touch}@media (min-width:1200px){.modal.container{width:1170px;margin-left:-585px}}@media (max-width:840px){.modal,.modal.container,.modal.modal-overflow{top:1%;right:1%;left:1%;bottom:auto;width:auto!important;height:auto!important;margin:0!important;padding:0!important}.modal.fade.in,.modal.container.fade.in,.modal.modal-overflow.fade.in{top:1%;bottom:auto}.modal-body,.modal-overflow .modal-body{position:static;margin:0;height:auto!important;max-height:none!important;overflow:visible!important}.modal-footer,.modal-overflow .modal-footer{position:static}}.loading-spinner{position:absolute;top:50%;left:50%;margin:-12px 0 0 -12px}.animated{-webkit-animation-duration:1s;-moz-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px)}}@-moz-keyframes shake{0%,100%{-moz-transform:translateX(0)}10%,30%,50%,70%,90%{-moz-transform:translateX(-10px)}20%,40%,60%,80%{-moz-transform:translateX(10px)}}@-o-keyframes shake{0%,100%{-o-transform:translateX(0)}10%,30%,50%,70%,90%{-o-transform:translateX(-10px)}20%,40%,60%,80%{-o-transform:translateX(10px)}}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-10px)}20%,40%,60%,80%{transform:translateX(10px)}}.shake{-webkit-animation-name:shake;-moz-animation-name:shake;-o-animation-name:shake;animation-name:shake} \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-responsive.min.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..0de1c5db --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:839px) and (max-width:839px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:839px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:839px) and (max-width:839px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:839px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:839px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:840px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap.min.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap.min.css new file mode 100644 index 00000000..c10c7f41 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/dropzone.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/dropzone.css new file mode 100644 index 00000000..bb839c21 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/dropzone.css @@ -0,0 +1,410 @@ +/* The MIT License */ +.dropzone, +.dropzone *, +.dropzone-previews, +.dropzone-previews * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.dropzone { + position: relative; + border: 1px solid rgba(0,0,0,0.08); + background: rgba(0,0,0,0.02); + padding: 1em; +} +.dropzone.dz-clickable { + cursor: pointer; +} +.dropzone.dz-clickable .dz-message, +.dropzone.dz-clickable .dz-message span { + cursor: pointer; +} +.dropzone.dz-clickable * { + cursor: default; +} +.dropzone .dz-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone.dz-drag-hover { + border-color: rgba(0,0,0,0.15); + background: rgba(0,0,0,0.04); +} +.dropzone.dz-started .dz-message { + display: none; +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + background: rgba(255,255,255,0.8); + position: relative; + display: inline-block; + margin: 17px; + vertical-align: top; + border: 1px solid #acacac; + padding: 6px 6px 6px 6px; +} +.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail], +.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] { + display: none; +} +.dropzone .dz-preview .dz-details, +.dropzone-previews .dz-preview .dz-details { + width: 100px; + height: 100px; + position: relative; + background: #ebebeb; + padding: 5px; + margin-bottom: 22px; +} +.dropzone .dz-preview .dz-details .dz-filename, +.dropzone-previews .dz-preview .dz-details .dz-filename { + overflow: hidden; + height: 100%; +} +.dropzone .dz-preview .dz-details img, +.dropzone-previews .dz-preview .dz-details img { + position: absolute; + top: 0; + left: 0; + width: 100px; + height: 100px; +} +.dropzone .dz-preview .dz-details .dz-size, +.dropzone-previews .dz-preview .dz-details .dz-size { + position: absolute; + bottom: -28px; + left: 3px; + height: 28px; + line-height: 28px; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + display: block; +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + display: block; +} +.dropzone .dz-preview:hover .dz-details img, +.dropzone-previews .dz-preview:hover .dz-details img { + display: none; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark, +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + display: none; + position: absolute; + width: 40px; + height: 40px; + font-size: 30px; + text-align: center; + right: -10px; + top: -10px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + color: #8cc657; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + color: #ee162d; +} +.dropzone .dz-preview .dz-progress, +.dropzone-previews .dz-preview .dz-progress { + position: absolute; + top: 100px; + left: 6px; + right: 6px; + height: 6px; + background: #d7d7d7; + display: none; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 0%; + background-color: #8cc657; +} +.dropzone .dz-preview.dz-processing .dz-progress, +.dropzone-previews .dz-preview.dz-processing .dz-progress { + display: block; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: none; + position: absolute; + top: -5px; + left: -20px; + background: rgba(245,245,245,0.8); + padding: 8px 10px; + color: #800; + min-width: 140px; + max-width: 500px; + z-index: 500; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + display: block; +} +.dropzone { + border: 1px solid rgba(0,0,0,0.03); + min-height: 360px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: rgba(0,0,0,0.03); + padding: 23px; +} +.dropzone .dz-default.dz-message { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + /*background-image: url("../img/spritemap.png");*/ + background-repeat: no-repeat; + background-position: 0 0; + position: absolute; + width: 428px; + height: 123px; + margin-left: -214px; + margin-top: -61.5px; + top: 50%; + left: 50%; +} +@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { + .dropzone .dz-default.dz-message { + /*background-image: url("../img/spritemap@2x.png");*/ + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-default.dz-message span { + display: none; +} +.dropzone.dz-square .dz-default.dz-message { + background-position: 0 -123px; + width: 268px; + margin-left: -134px; + height: 174px; + margin-top: -87px; +} +.dropzone.dz-drag-hover .dz-message { + opacity: 0.15; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)"; + filter: alpha(opacity=15); +} +.dropzone.dz-started .dz-message { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16); + box-shadow: 1px 1px 4px rgba(0,0,0,0.16); + font-size: 14px; +} +.dropzone .dz-preview.dz-image-preview:hover .dz-details img, +.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img { + display: block; + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone .dz-preview.dz-error .dz-progress .dz-upload, +.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload { + background: #ee1e2d; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark, +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; + /*background-image: url("../img/spritemap.png");*/ + background-repeat: no-repeat; +} +@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { + .dropzone .dz-preview .dz-error-mark, + .dropzone-previews .dz-preview .dz-error-mark, + .dropzone .dz-preview .dz-success-mark, + .dropzone-previews .dz-preview .dz-success-mark { + /*background-image: url("../img/spritemap@2x.png");*/ + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-preview .dz-error-mark span, +.dropzone-previews .dz-preview .dz-error-mark span, +.dropzone .dz-preview .dz-success-mark span, +.dropzone-previews .dz-preview .dz-success-mark span { + display: none; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + background-position: -268px -123px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + background-position: -268px -163px; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + -webkit-animation: loading 0.4s linear infinite; + -moz-animation: loading 0.4s linear infinite; + -o-animation: loading 0.4s linear infinite; + -ms-animation: loading 0.4s linear infinite; + animation: loading 0.4s linear infinite; + -webkit-transition: width 0.3s ease-in-out; + -moz-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + -ms-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + -webkit-border-radius: 2px; + border-radius: 2px; + position: absolute; + top: 0; + left: 0; + width: 0%; + height: 100%; + /*background-image: url("../img/spritemap.png");*/ + background-repeat: repeat-x; + background-position: 0px -400px; +} +@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { + .dropzone .dz-preview .dz-progress .dz-upload, + .dropzone-previews .dz-preview .dz-progress .dz-upload { + /*background-image: url("../img/spritemap@2x.png");*/ + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-preview.dz-success .dz-progress, +.dropzone-previews .dz-preview.dz-success .dz-progress { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone a.dz-remove, +.dropzone-previews a.dz-remove { + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fafafa), color-stop(1, #eee)); + background-image: -webkit-linear-gradient(top, #fafafa 0, #eee 100%); + background-image: -moz-linear-gradient(top, #fafafa 0, #eee 100%); + background-image: -o-linear-gradient(top, #fafafa 0, #eee 100%); + background-image: -ms-linear-gradient(top, #fafafa 0, #eee 100%); + background-image: linear-gradient(top, #fafafa 0, #eee 100%); + -webkit-border-radius: 2px; + border-radius: 2px; + border: 1px solid #eee; + text-decoration: none; + display: block; + padding: 4px 5px; + text-align: center; + color: #aaa; + margin-top: 26px; +} +.dropzone a.dz-remove:hover, +.dropzone-previews a.dz-remove:hover { + color: #666; +} +@-moz-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-webkit-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-o-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-ms-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/dropzone.min.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/dropzone.min.css new file mode 100644 index 00000000..f9abb126 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/dropzone.min.css @@ -0,0 +1 @@ +.dropzone,.dropzone *,.dropzone-previews,.dropzone-previews *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.dropzone{position:relative;border:1px solid rgba(0,0,0,.08);background:rgba(0,0,0,.02);padding:1em}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message span{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone .dz-message{opacity:1;-ms-filter:none;filter:none}.dropzone.dz-drag-hover{border-color:rgba(0,0,0,.15);background:rgba(0,0,0,.04)}.dropzone.dz-started .dz-message{display:none}.dropzone .dz-preview,.dropzone-previews .dz-preview{background:rgba(255,255,255,.8);position:relative;display:inline-block;margin:17px;vertical-align:top;border:1px solid #acacac;padding:6px}.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail]{display:none}.dropzone .dz-preview .dz-details,.dropzone-previews .dz-preview .dz-details{width:100px;height:100px;position:relative;background:#ebebeb;padding:5px;margin-bottom:22px}.dropzone .dz-preview .dz-details .dz-filename,.dropzone-previews .dz-preview .dz-details .dz-filename{overflow:hidden;height:100%}.dropzone .dz-preview .dz-details img,.dropzone-previews .dz-preview .dz-details img{position:absolute;top:0;left:0;width:100px;height:100px}.dropzone .dz-preview .dz-details .dz-size,.dropzone-previews .dz-preview .dz-details .dz-size{position:absolute;bottom:-28px;left:3px;height:28px;line-height:28px}.dropzone .dz-preview.dz-error .dz-error-mark,.dropzone-previews .dz-preview.dz-error .dz-error-mark{display:block}.dropzone .dz-preview.dz-success .dz-success-mark,.dropzone-previews .dz-preview.dz-success .dz-success-mark{display:block}.dropzone .dz-preview:hover .dz-details img,.dropzone-previews .dz-preview:hover .dz-details img{display:none}.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark{display:none;position:absolute;width:40px;height:40px;font-size:30px;text-align:center;right:-10px;top:-10px}.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark{color:#8cc657}.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark{color:#ee162d}.dropzone .dz-preview .dz-progress,.dropzone-previews .dz-preview .dz-progress{position:absolute;top:100px;left:6px;right:6px;height:6px;background:#d7d7d7;display:none}.dropzone .dz-preview .dz-progress .dz-upload,.dropzone-previews .dz-preview .dz-progress .dz-upload{position:absolute;top:0;bottom:0;left:0;width:0;background-color:#8cc657}.dropzone .dz-preview.dz-processing .dz-progress,.dropzone-previews .dz-preview.dz-processing .dz-progress{display:block}.dropzone .dz-preview .dz-error-message,.dropzone-previews .dz-preview .dz-error-message{display:none;position:absolute;top:-5px;left:-20px;background:rgba(245,245,245,.8);padding:8px 10px;color:#800;min-width:140px;max-width:500px;z-index:500}.dropzone .dz-preview:hover.dz-error .dz-error-message,.dropzone-previews .dz-preview:hover.dz-error .dz-error-message{display:block}.dropzone{border:1px solid rgba(0,0,0,.03);min-height:360px;-webkit-border-radius:3px;border-radius:3px;background:rgba(0,0,0,.03);padding:23px}.dropzone .dz-default.dz-message{opacity:1;-ms-filter:none;filter:none;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;background-image:url(../img/spritemap.png);background-repeat:no-repeat;background-position:0 0;position:absolute;width:428px;height:123px;margin-left:-214px;margin-top:-61.5px;top:50%;left:50%}@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx){.dropzone .dz-default.dz-message{background-image:url(../img/spritemap@2x.png);-webkit-background-size:428px 406px;-moz-background-size:428px 406px;background-size:428px 406px}}.dropzone .dz-default.dz-message span{display:none}.dropzone.dz-square .dz-default.dz-message{background-position:0 -123px;width:268px;margin-left:-134px;height:174px;margin-top:-87px}.dropzone.dz-drag-hover .dz-message{opacity:.15;-ms-filter:"alpha(Opacity=15)";filter:alpha(opacity=15)}.dropzone.dz-started .dz-message{display:block;opacity:0;-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0)}.dropzone .dz-preview,.dropzone-previews .dz-preview{-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.16);box-shadow:1px 1px 4px rgba(0,0,0,.16);font-size:14px}.dropzone .dz-preview.dz-image-preview:hover .dz-details img,.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img{display:block;opacity:.1;-ms-filter:"alpha(Opacity=10)";filter:alpha(opacity=10)}.dropzone .dz-preview.dz-success .dz-success-mark,.dropzone-previews .dz-preview.dz-success .dz-success-mark{opacity:1;-ms-filter:none;filter:none}.dropzone .dz-preview.dz-error .dz-error-mark,.dropzone-previews .dz-preview.dz-error .dz-error-mark{opacity:1;-ms-filter:none;filter:none}.dropzone .dz-preview.dz-error .dz-progress .dz-upload,.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload{background:#ee1e2d}.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark,.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark{display:block;opacity:0;-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);-webkit-transition:opacity .4s ease-in-out;-moz-transition:opacity .4s ease-in-out;-o-transition:opacity .4s ease-in-out;-ms-transition:opacity .4s ease-in-out;transition:opacity .4s ease-in-out;background-image:url(../img/spritemap.png);background-repeat:no-repeat}@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx){.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark,.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark{background-image:url(../img/spritemap@2x.png);-webkit-background-size:428px 406px;-moz-background-size:428px 406px;background-size:428px 406px}}.dropzone .dz-preview .dz-error-mark span,.dropzone-previews .dz-preview .dz-error-mark span,.dropzone .dz-preview .dz-success-mark span,.dropzone-previews .dz-preview .dz-success-mark span{display:none}.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark{background-position:-268px -123px}.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark{background-position:-268px -163px}.dropzone .dz-preview .dz-progress .dz-upload,.dropzone-previews .dz-preview .dz-progress .dz-upload{-webkit-animation:loading .4s linear infinite;-moz-animation:loading .4s linear infinite;-o-animation:loading .4s linear infinite;-ms-animation:loading .4s linear infinite;animation:loading .4s linear infinite;-webkit-transition:width .3s ease-in-out;-moz-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;-ms-transition:width .3s ease-in-out;transition:width .3s ease-in-out;-webkit-border-radius:2px;border-radius:2px;position:absolute;top:0;left:0;width:0;height:100%;background-image:url(../img/spritemap.png);background-repeat:repeat-x;background-position:0 -400px}@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx){.dropzone .dz-preview .dz-progress .dz-upload,.dropzone-previews .dz-preview .dz-progress .dz-upload{background-image:url(../img/spritemap@2x.png);-webkit-background-size:428px 406px;-moz-background-size:428px 406px;background-size:428px 406px}}.dropzone .dz-preview.dz-success .dz-progress,.dropzone-previews .dz-preview.dz-success .dz-progress{display:block;opacity:0;-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);-webkit-transition:opacity .4s ease-in-out;-moz-transition:opacity .4s ease-in-out;-o-transition:opacity .4s ease-in-out;-ms-transition:opacity .4s ease-in-out;transition:opacity .4s ease-in-out}.dropzone .dz-preview .dz-error-message,.dropzone-previews .dz-preview .dz-error-message{display:block;opacity:0;-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.dropzone .dz-preview:hover.dz-error .dz-error-message,.dropzone-previews .dz-preview:hover.dz-error .dz-error-message{opacity:1;-ms-filter:none;filter:none}.dropzone a.dz-remove,.dropzone-previews a.dz-remove{background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fafafa),color-stop(1,#eee));background-image:-webkit-linear-gradient(top,#fafafa 0,#eee 100%);background-image:-moz-linear-gradient(top,#fafafa 0,#eee 100%);background-image:-o-linear-gradient(top,#fafafa 0,#eee 100%);background-image:-ms-linear-gradient(top,#fafafa 0,#eee 100%);background-image:linear-gradient(top,#fafafa 0,#eee 100%);-webkit-border-radius:2px;border-radius:2px;border:1px solid #eee;text-decoration:none;display:block;padding:4px 5px;text-align:center;color:#aaa;margin-top:26px}.dropzone a.dz-remove:hover,.dropzone-previews a.dz-remove:hover{color:#666}@-moz-keyframes loading{0%{background-position:0 -400px}100%{background-position:-7px -400px}}@-webkit-keyframes loading{0%{background-position:0 -400px}100%{background-position:-7px -400px}}@-o-keyframes loading{0%{background-position:0 -400px}100%{background-position:-7px -400px}}@-ms-keyframes loading{0%{background-position:0 -400px}100%{background-position:-7px -400px}}@keyframes loading{0%{background-position:0 -400px}100%{background-position:-7px -400px}} \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/jquery.contextMenu.min.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/jquery.contextMenu.min.css new file mode 100644 index 00000000..21d6805d --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/jquery.contextMenu.min.css @@ -0,0 +1,38 @@ +.context-menu-list{font-family:'Open Sans', sans-serif;width:200px;display:inline-block;position:absolute;list-style-type:none;border:1px solid #DDD;background:#fff;font-size:12px;margin:0;padding:5px} +.context-menu-item{background-color:#fff;position:relative;height:auto;word-wrap:break-word;-webkit-user-select:none;-moz-user-select:0;-ms-user-select:none;user-select:none;padding:5px 5px 5px 30px} +.context-menu-item:last-child{border:none} +.context-menu-separator{padding-bottom:0;border-bottom:1px solid #DDD} +.context-menu-item > label > input,.context-menu-item > label > textarea{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text} +.context-menu-item.hover{cursor:pointer;background-color:#DDD} +.context-menu-item.disabled{color:#666} +.context-menu-input.hover,.context-menu-item.disabled.hover{cursor:default;background-color:#EEE} +.context-menu-submenu:after{content:">";color:#666;position:absolute;top:0;right:3px;z-index:1} +.context-menu-item.icon{min-height:18px;vertical-align:middle;background-repeat:no-repeat;background-position:4px 5px;width:auto;display:list-item} +.context-menu-item.icon-edit{background-image:url(../img/page_white_edit.png)} +.context-menu-item.icon-cut{background-image:url(../img/cut.png)} +.context-menu-item.icon-copy{background-image:url(../img/copy.png)} +.context-menu-item.icon-rename{background-image:url(../img/rename.png)} +.context-menu-item.icon-preview{background-image:url(../img/preview.png)} +.context-menu-item.icon-dimension{background-image:url(../img/dimension.png)} +.context-menu-item.icon-date{background-image:url(../img/date.png)} +.context-menu-item.icon-label{background-image:url(../img/label.png)} +.context-menu-item.icon-size{background-image:url(../img/size.png)} +.context-menu-item.icon-download{background-image:url(../img/download.png)} +.context-menu-item.icon-paste{background-image:url(../img/page_white_paste.png)} +.context-menu-item.icon-clipboard-apply {background-image:url(../img/clipboard_apply.png)} +.context-menu-item.icon-delete{background-image:url(../img/page_white_delete.png)} +.context-menu-item.icon-add{background-image:url(../img/page_white_add.png)} +.context-menu-item.icon-quit{background-image:url(../img/door.png)} +.context-menu-item.icon-info{background-image:url(../img/info.png)} +.context-menu-item.icon-extract{background-image:url(../img/zip.png)} +.context-menu-item.icon-url{background-image:url(../img/url.png)} +.context-menu-item.icon-edit_img{background-image:url(../img/edit_img.png)} +.context-menu-item.icon-duplicate{background-image:url(../img/duplicate.png)} +.context-menu-input > label > *{vertical-align:top} +.context-menu-input > label > input[type=checkbox],.context-menu-input > label > input[type=radio]{margin-left:-17px} +.context-menu-input > label > span{margin-left:5px} +.context-menu-input > label,.context-menu-input > label > input[type=text],.context-menu-input > label > textarea,.context-menu-input > label > select{display:block;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box} +.context-menu-input > label > textarea{height:100px} +.context-menu-item > .context-menu-list{display:none;right:-5px;top:5px} +.context-menu-item.hover > .context-menu-list{display:block} +.context-menu-accesskey{text-decoration:underline} \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/style.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/style.css new file mode 100644 index 00000000..061ef75b --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/style.css @@ -0,0 +1 @@ +*,*:after,*:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html{font-family:'Open Sans',sans-serif;font-size:100%;padding:0;margin:0}body{padding-top:32px;font-weight:200;background:#ececec;overflow:-moz-scrollbars-vertical}#qLpercentage{font-family:'Open Sans',sans-serif;font-size:40px;line-height:40px;color:#bbb;font-weight:200;height:60px;-webkit-border-radius:10px;border-radius:10px;padding:10px;text-shadow:1px 1px 2px #fff;filter:dropshadow(color=#fff, offx=1, offy=1)}#qLbar{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdhN2E3YSIgc3RvcC1vcGFjaXR5PSIwLjQiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzdhN2E3YSIgc3RvcC1vcGFjaXR5PSIwLjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==);background:-moz-linear-gradient(top, rgba(122,122,122,0.4) 0, rgba(122,122,122,0.4) 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(122,122,122,0.4)), color-stop(100%, rgba(122,122,122,0.4)));background:-webkit-linear-gradient(top, rgba(122,122,122,0.4) 0, rgba(122,122,122,0.4) 100%);background:-o-linear-gradient(top, rgba(122,122,122,0.4) 0, rgba(122,122,122,0.4) 100%);background:-ms-linear-gradient(top, rgba(122,122,122,0.4) 0, rgba(122,122,122,0.4) 100%);background:linear-gradient(to bottom, rgba(122,122,122,0.4) 0, rgba(122,122,122,0.4) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#667a7a7a', endColorstr='#667a7a7a', GradientType=0);z-index:200;margin:0;overflow:hidden}[class^="rficon-"],[class*=" rficon-"]{display:inline-block;width:16px;height:16px;margin-top:1px;*margin-right:.3em;line-height:16px;vertical-align:text-top;background-position:0 0;background-repeat:no-repeat}.rficon-clipboard-apply{background-image:url(../img/clipboard_apply.png)}.rficon-clipboard-clear{background-image:url(../img/clipboard_clear.png)}.btn{-webkit-border-radius:0;border-radius:0}.container-fluid{padding-right:0 !important;margin-top:10px !important}.img-precontainer{margin:auto;width:100%;text-align:center;background:#fff;border:none}.img-container{height:91px;width:122px;padding:0;border:none;overflow:hidden;display:table-cell;text-align:center;vertical-align:middle;margin:auto}ul.breadcrumb{margin-bottom:5px;-webkit-border-radius:0;border-radius:0;padding-bottom:4px;padding-top:6px;background:#f0f0f0;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065);border-bottom:1px solid #bbb}ul.breadcrumb .pull-left i{margin-top:2px}.alert{padding:8px 35px 8px 14px;margin-bottom:2px;border:1px solid #aaa;color:#666;font-weight:200;font-size:13px;-webkit-border-radius:0;border-radius:0;background:#fff}.img-container *,.img-container-mini *{vertical-align:middle}#help{display:none}iframe{overflow:auto;-webkit-overflow-scrolling:touch}.upload-tabbable{margin-left:5px;margin-right:5px}.upload-tabbable .upload-help{font-size:11px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff;text-align:center}.upload-tabbable .nav{margin:0}.upload-tabbable .nav li a{font-size:13px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.upload-tabbable .tab-content{padding:5px;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-rigth:1px solid #ddd;background:#fff;margin-bottom:5px}input#filter-input{margin:0;width:84px;height:26px;vertical-align:bottom;margin-bottom:2px;-webkit-border-radius:0;border-radius:0;font-size:12px;font-weight:200;position:relative;left:1px}.qq-uploader .span9{margin-left:14px !important;width:690px !important}.space10{clear:both;height:10px}h4{font-size:12px;font-weight:200;margin:0;text-align:center;padding:0;margin-top:6px;line-height:18px}h3{font-size:14px;font-weight:200}.boxes{border:1px solid #ccc;word-wrap:break-word;background:#fff;-webkit-box-shadow:1px 1px 2px 0 rgba(0,0,0,0.2);box-shadow:1px 1px 2px 0 rgba(0,0,0,0.2);min-height:115px;text-align:center}.container-fluid{padding:0 10px !important}body .avpw .avpw_primary_button,body .avpw .avpw_primary_button:link,body .avpw .avpw_primary_button:visited,body .avpw .avpw_primary_button:active{background-color:#999;color:#fff;background-image:none;border:none}body .avpw .avpw_primary_button:hover{border:none;background-color:#666}.uploader{position:fixed;top:50px;left:14px;margin:auto;width:100%;z-index:9999;overflow:hidden;background:#eee;padding-top:20px;border:1px solid #ccc;display:none;-webkit-box-shadow:0 0 10px 0 rgba(1,1,1,0.5);box-shadow:0 0 10px 0 rgba(1,1,1,0.5)}.download-form{margin-bottom:25px}.grid li i{margin-left:2px;margin-right:2px;z-index:0}.box,.boxx{text-align:center;word-wrap:break-word;vertical-align:top;text-align:left;position:relative;border:none;box-shadow:none;z-index:100;padding:4px}.box .btn{width:100%;background:none;box-shadow:none;border:none;z-index:200}.navbar{margin-bottom:0;border-bottom:1px solid #bbb}.navbar .navbar-inner{border:none;min-height:35px;-webkit-border-radius:0;border-radius:0;padding-bottom:2px;margin:0;padding-right:8px;padding-left:8px}.navbar .navbar-inner .container-fluid{margin:0;margin-top:0 !important;padding:0}.navbar .navbar-inner .container-fluid .brand{display:none}.navbar .navbar-inner .container-fluid .filters span{margin-top:0;font-size:13px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}ul.sorting{position:absolute;left:-25px;top:20px;min-width:0;background:#eee}ul.sorting li a:hover{background:#aaa}.btn-group .dropdown-toggle.sorting-btn{background:none;border:none;box-shadow:none;position:relative;-webkit-box-shadow:none;top:-5px;font-size:13px}.btn-group .dropdown-toggle.sorting-btn:hover{background:none;border:none;box-shadow:none;-webkit-box-shadow:none}ul.sorting.dropdown-menu>li>a{font-size:12px;text-shadow:none}ul.sorting.dropdown-menu>li>a.ascending{background-image:url(../img/down.png);background-repeat:no-repeat;background-position:6px 8px}ul.sorting.dropdown-menu>li>a.descending{background-image:url(../img/up.png);background-repeat:no-repeat;background-position:6px 8px}.sorter-container{margin-top:5px;margin-bottom:0;-webkit-border-radius:0;border-radius:0;padding-bottom:4px;padding-top:6px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065);background-color:#f5f5f5;position:relative;border-bottom:1px solid #bbb;height:24px}.sorter-container a.sorter{color:#000}.sorter-container a.ascending{padding-left:9px;background-image:url(../img/down.png);background-repeat:no-repeat;background-position:0 3px}.sorter-container a.descending{padding-left:9px;background-image:url(../img/up.png);background-repeat:no-repeat;background-position:0 4px}.sorter-container .img-dimension,.sorter-container .file-date,.sorter-container .file-size,.sorter-container .file-extension,.sorter-container .file-name,.sorter-container .file-operations{display:block;position:absolute;top:0;z-index:100;-webkit-box-shadow:none;box-shadow:none;text-align:left;font-size:13px;margin-top:1px;color:#999}.sorter-container .file-operations{width:110px;right:0}.sorter-container .img-dimension{width:65px;right:123px}.sorter-container .file-date{width:70px;right:188px}.sorter-container .file-size{width:55px;right:258px}.sorter-container .file-extension{width:40px;right:313px}.sorter-container .file-name{width:50px;left:52px}.img-dimension,.file-date,.file-size,.file-extension,.file-name,.file-operations{font-size:12px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff;display:none}.view-controller{text-align:left}.view-controller .btn-group>.btn:first-child,.view-controller .btn-group>.btn:last-child{-webkit-border-radius:0;border-radius:0}.navbar .filters .btn{margin-bottom:2px;padding-top:2px;padding-bottom:2px;padding-left:8px;padding-right:8px;margin-top:5px}.filters .types{text-align:right}@media (max-width:780px){#view2{display:none}}@media (max-width:839px){body{padding-top:0}.filters .types{text-align:left}.navbar .navbar-inner .container-fluid .brand{display:block}.navbar .navbar-inner{padding-bottom:4px}.filters div.span3.half,.filters div.half.span6{float:none;width:100%}.container-fluid{margin:0 !important;padding:0}#qLbar{height:50px !important}}@media (min-width:400px) and (max-width:839px){.filters .row-fluid .half{width:48.61878453038674%;*width:48.56559304102504%;float:left}}.tooltip.in{z-index:10000;opacity:1;filter:alpha(opacity=1);font-weight:bold}.tooltip{font-weight:bold;z-index:10000}.grid{padding:0 0;margin:0 auto;list-style:none;-webkit-overflow-scrolling:touch}.grid li{display:inline-block;width:124px;border:none;margin:4px;margin-bottom:8px;padding:0;vertical-align:top}.grid figure{margin:0;position:relative;display:block;width:122px;margin:auto}.grid figure:hover{background:#e0e0e0 !important}.list-view1.grid li{width:100%}.list-view1.grid li figure{width:100%}.grid figcaption{text-align:center;padding:2px;padding-top:8px;color:#fff;height:30px;width:122px;margin-left:0;margin-right:0;position:absolute;top:auto;bottom:0;-webkit-box-shadow:inset 0 0 8px 0 rgba(41,41,41,0.5);box-shadow:inset 0 0 8px 0 rgba(41,41,41,0.5)}.grid figcaption a{margin:0;padding:3px}.grid figcaption h3{margin:0;padding:0;color:#fff}.grid h4{text-align:center;color:#000;padding:0;margin-bottom:4px;margin-top:4px}.grid figure .box{box-sizing:content-box}.list-view0.grid figure .box,.list-view1.grid figure .box,.list-view2.grid figure .box{max-width:100%;display:block;position:relative;overflow:hidden;z-index:1}.list-view0.grid figure .box h4.ellipsis,.list-view1.grid figure .box h4.ellipsis,.list-view2.grid figure .box h4.ellipsis{height:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.list-view0.grid figure .box h4,.list-view1.grid figure .box h4,.list-view2.grid figure .box h4{z-index:1}.list-view0.grid figure .box h4 a,.list-view1.grid figure .box h4 a,.list-view2.grid figure .box h4 a{z-index:1}.list-view0.grid .selected,.list-view1.grid .selected,.list-view2.grid .selected{-webkit-box-shadow:0 0 10px 5px rgba(0,0,0,0.25);box-shadow:0 0 10px 5px rgba(0,0,0,0.25)}.no-touch .list-view0 figure .box{z-index:1;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;transition:transform .3s}.ui-state-highlight{border:1px solid #f00}.no-touch .list-view0 figure:hover .box,.no-touch .list-view0 figure.cs-hover .box{-webkit-box-shadow:0 0 4px 0 rgba(1,1,1,0.5);box-shadow:0 0 4px 0 rgba(1,1,1,0.5);-webkit-transform:translateY(-26px);-moz-transform:translateY(-26px);-ms-transform:translateY(-26px);transform:translateY(-26px)}.list-view0 figure:hover .box.no-effect,.list-view0 figure.cs-hover .box.no-effect,.no-effect{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-moz-transform:none;-ms-transform:none;transform:none}.list-view0 .img-precontainer-mini{display:none;background:none}a,a:hover{color:#000;text-decoration:none}.back-directory .img-precontainer,.back-directory .img-precontainer-mini,.back-directory .box{background:none}form{margin:0;padding:0}.modal-body form,.modal-body input{margin:0}.modal-header h3{font-weight:300;font-size:20px}.list-view1.sorter-container{display:block}.list-view0.sorter-container,.list-view2.sorter-container{display:none}.list-view0.grid .img-precontainer .img-container img{max-width:122px !important;max-height:91px !important}.list-view0.grid .img-precontainer .img-container img.icon{width:122px;margin-top:0}.list-view0.grid .img-precontainer .filetype{position:absolute;top:0;width:120px;text-align:center;color:#fff;font-size:13px;line-height:22px}.list-view0.grid .cover{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjI1Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4yNSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);background:-moz-linear-gradient(top, rgba(255,255,255,0.25) 0, rgba(255,255,255,0.25) 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255,255,255,0.25)), color-stop(100%, rgba(255,255,255,0.25)));background:-webkit-linear-gradient(top, rgba(255,255,255,0.25) 0, rgba(255,255,255,0.25) 100%);background:-o-linear-gradient(top, rgba(255,255,255,0.25) 0, rgba(255,255,255,0.25) 100%);background:-ms-linear-gradient(top, rgba(255,255,255,0.25) 0, rgba(255,255,255,0.25) 100%);background:linear-gradient(to bottom, rgba(255,255,255,0.25) 0, rgba(255,255,255,0.25) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#40ffffff', endColorstr='#40ffffff', GradientType=0);width:122px;position:absolute;top:22px;right:0;height:69px}.list-view0.grid .box{background:#fff}.list-view0.grid .directory{background:#ddd}.list-view0.grid figure.back-directory .directory{background:#bbb}.list-view0.grid figcaption{background:#fff}.list-view1.grid li,.list-view2.grid li{margin:0}.list-view1.grid li.back figure.back-directory,.list-view2.grid li.back figure.back-directory{height:34px}.list-view1.grid li:nth-child(odd) figure,.list-view2.grid li:nth-child(odd) figure{background:#f9f9f9}.list-view1.grid li:nth-child(odd) figure.directory,.list-view2.grid li:nth-child(odd) figure.directory{background:#eaeaea}.list-view1.grid li figure,.list-view2.grid li figure{border-bottom:1px solid #ccc;background:#fff}.list-view1.grid li figure.back-directory,.list-view2.grid li figure.back-directory{background:#bbb}.list-view1.grid li figure.back-directory .box,.list-view2.grid li figure.back-directory .box{background:none}.list-view1.grid li figure.directory,.list-view2.grid li figure.directory{background:#efefef}.list-view1.grid li figure.directory box,.list-view2.grid li figure.directory box{padding:0;min-height:10px}.list-view1.grid li figure .box,.list-view2.grid li figure .box{margin-left:50px;-webkit-transition:none;-moz-transition:none;transition:none}.list-view1.grid li figure .box h4,.list-view2.grid li figure .box h4{padding-top:1px;font-size:13px;text-align:left}.list-view1.grid .img-precontainer-mini,.list-view2.grid .img-precontainer-mini{display:block;position:absolute;width:45px;height:34px;overflow:hidden;text-align:center}.list-view1.grid .img-precontainer-mini img,.list-view2.grid .img-precontainer-mini img{height:34px}.list-view1.grid .img-precontainer-mini .filetype,.list-view2.grid .img-precontainer-mini .filetype{position:absolute;top:5px;text-align:center;left:5px;padding:1px 2px;font-size:13px;line-height:22px;width:34px;height:24px;color:#fff;background:#333}.list-view1.grid .cover,.list-view2.grid .cover{display:none}.list-view1.grid .img-container-mini,.list-view2.grid .img-container-mini{width:45px;height:34px;border:none;overflow:hidden;display:table-cell;text-align:center;vertical-align:middle;margin:auto}.list-view1.grid .img-precontainer-mini.original-thumb,.list-view2.grid .img-precontainer-mini.original-thumb{padding:0}.list-view1.grid .img-precontainer-mini.original-thumb img,.list-view2.grid .img-precontainer-mini.original-thumb img{width:auto;margin:0;height:34px}.list-view1.grid .img-precontainer-mini.original-thumb img.original,.list-view2.grid .img-precontainer-mini.original-thumb img.original{width:auto;height:auto}.list-view1.grid .img-precontainer,.list-view2.grid .img-precontainer{display:none}.list-view1.grid figcaption,.list-view2.grid figcaption{background:none;width:120px;position:absolute;right:0;top:0;z-index:1;bottom:0;-webkit-box-shadow:none;box-shadow:none;text-align:right}.list-view1.grid .selected,.list-view2.grid .selected{-webkit-box-shadow:0 0 3px 2px rgba(0,0,0,0.2);box-shadow:0 0 3px 2px rgba(0,0,0,0.2)}.list-view1.grid .img-dimension,.list-view1.grid .file-date,.list-view1.grid .file-size,.list-view1.grid .file-extension{overflow:hidden;display:block;position:absolute;top:0;z-index:1;-webkit-box-shadow:none;box-shadow:none;text-align:left;margin-top:7px}.list-view1.grid .img-dimension{width:65px;right:120px}.list-view1.grid .file-date{width:70px;right:185px}.list-view1.grid .file-size{width:55px;right:255px}.list-view1.grid .file-extension{width:40px;right:310px}.list-view1.grid figure .box{padding-right:352px}.list-view2.grid figure .box{padding-right:115px}@media (max-width:610px){.list-view1.grid figure .box{padding-right:312px}.list-view1.grid figure .file-extension{display:none}.sorter-container .file-extension{display:none}}@media (max-width:565px){.list-view1.grid figure .box{padding-right:257px}.list-view1.grid figure .file-size{display:none}.sorter-container .file-size{display:none}}@media (max-width:495px){.list-view1.grid figure .box{padding-right:187px}.list-view1.grid figure .file-date{display:none}.sorter-container .file-date{display:none}}@media (max-width:430px){.list-view1.grid figure .box{padding-right:115px}.list-view1.grid figure .img-dimension{display:none}.sorter-container .img-dimension{display:none}.breadcrumb{margin-left:0;margin-right:0}}.list-view2.grid .img-precontainer-mini .filetype.pdf,.list-view1.grid .img-precontainer-mini .filetype.pdf{background:#cb0011}.list-view2.grid .img-precontainer-mini .filetype.css,.list-view1.grid .img-precontainer-mini .filetype.css{background:#d10698}.list-view2.grid .img-precontainer-mini .filetype.ai,.list-view1.grid .img-precontainer-mini .filetype.ai{background:#d6772f}.list-view2.grid .img-precontainer-mini .filetype.psd,.list-view1.grid .img-precontainer-mini .filetype.psd{background:#0960a4}.list-view2.grid .img-precontainer-mini .filetype.html,.list-view1.grid .img-precontainer-mini .filetype.html,.list-view2.grid .img-precontainer-mini .filetype.xhtml,.list-view1.grid .img-precontainer-mini .filetype.xhtml{background:#035bc4}.list-view2.grid .img-precontainer-mini .filetype.fla,.list-view1.grid .img-precontainer-mini .filetype.fla,.list-view2.grid .img-precontainer-mini .filetype.flv,.list-view1.grid .img-precontainer-mini .filetype.flv{background:#cf302e}.list-view2.grid .img-precontainer-mini .filetype.ppt,.list-view1.grid .img-precontainer-mini .filetype.ppt,.list-view2.grid .img-precontainer-mini .filetype.pptx,.list-view1.grid .img-precontainer-mini .filetype.pptx{background:#da5b00}.list-view2.grid .img-precontainer-mini .filetype.xls,.list-view1.grid .img-precontainer-mini .filetype.xls,.list-view2.grid .img-precontainer-mini .filetype.xlsx,.list-view1.grid .img-precontainer-mini .filetype.xlsx,.list-view2.grid .img-precontainer-mini .filetype.css,.list-view1.grid .img-precontainer-mini .filetype.css{background:#1a712c}.list-view2.grid .img-precontainer-mini .filetype.rts,.list-view1.grid .img-precontainer-mini .filetype.rts,.list-view2.grid .img-precontainer-mini .filetype.doc,.list-view1.grid .img-precontainer-mini .filetype.doc,.list-view2.grid .img-precontainer-mini .filetype.docx,.list-view1.grid .img-precontainer-mini .filetype.docx{background:#002093}.list-view2.grid .img-precontainer-mini .filetype.rar,.list-view1.grid .img-precontainer-mini .filetype.rar,.list-view2.grid .img-precontainer-mini .filetype.zip,.list-view1.grid .img-precontainer-mini .filetype.zip,.list-view2.grid .img-precontainer-mini .filetype.gzip,.list-view1.grid .img-precontainer-mini .filetype.gzip{background:#fe9221}.list-view2.grid .img-precontainer-mini .filetype.mp4,.list-view1.grid .img-precontainer-mini .filetype.mp4,.list-view2.grid .img-precontainer-mini .filetype.mpeg,.list-view1.grid .img-precontainer-mini .filetype.mpeg,.list-view2.grid .img-precontainer-mini .filetype.mov,.list-view1.grid .img-precontainer-mini .filetype.mov,.list-view2.grid .img-precontainer-mini .filetype.avi,.list-view1.grid .img-precontainer-mini .filetype.avi,.list-view2.grid .img-precontainer-mini .filetype.mpg,.list-view1.grid .img-precontainer-mini .filetype.mpg,.list-view2.grid .img-precontainer-mini .filetype.wma,.list-view1.grid .img-precontainer-mini .filetype.wma,.list-view2.grid .img-precontainer-mini .filetype.webm,.list-view1.grid .img-precontainer-mini .filetype.webm{background:#31231e}.list-view2.grid .img-precontainer-mini .filetype.mp3,.list-view1.grid .img-precontainer-mini .filetype.mp3,.list-view2.grid .img-precontainer-mini .filetype.m4a,.list-view1.grid .img-precontainer-mini .filetype.m4a,.list-view2.grid .img-precontainer-mini .filetype.ac3,.list-view1.grid .img-precontainer-mini .filetype.ac3,.list-view2.grid .img-precontainer-mini .filetype.aiff,.list-view1.grid .img-precontainer-mini .filetype.aiff,.list-view2.grid .img-precontainer-mini .filetype.mid,.list-view1.grid .img-precontainer-mini .filetype.mid,.list-view2.grid .img-precontainer-mini .filetype.ogg,.list-view1.grid .img-precontainer-mini .filetype.ogg,.list-view2.grid .img-precontainer-mini .filetype.wav,.list-view1.grid .img-precontainer-mini .filetype.wav{background:#9f008b}.list-view2.grid .img-precontainer-mini .filetype.odt,.list-view1.grid .img-precontainer-mini .filetype.odt,.list-view2.grid .img-precontainer-mini .filetype.ots,.list-view1.grid .img-precontainer-mini .filetype.ots,.list-view2.grid .img-precontainer-mini .filetype.ott,.list-view1.grid .img-precontainer-mini .filetype.ott,.list-view2.grid .img-precontainer-mini .filetype.odb,.list-view1.grid .img-precontainer-mini .filetype.odb,.list-view2.grid .img-precontainer-mini .filetype.odg,.list-view1.grid .img-precontainer-mini .filetype.odg,.list-view2.grid .img-precontainer-mini .filetype.otp,.list-view1.grid .img-precontainer-mini .filetype.otp,.list-view2.grid .img-precontainer-mini .filetype.otg,.list-view1.grid .img-precontainer-mini .filetype.otg,.list-view2.grid .img-precontainer-mini .filetype.odf,.list-view1.grid .img-precontainer-mini .filetype.odf,.list-view2.grid .img-precontainer-mini .filetype.ods,.list-view1.grid .img-precontainer-mini .filetype.ods,.list-view2.grid .img-precontainer-mini .filetype.odp,.list-view1.grid .img-precontainer-mini .filetype.odp{background:#367bbe}.list-view2.grid .img-precontainer-mini .filetype.jpg,.list-view1.grid .img-precontainer-mini .filetype.jpg,.list-view2.grid .img-precontainer-mini .filetype.jpeg,.list-view1.grid .img-precontainer-mini .filetype.jpeg,.list-view2.grid .img-precontainer-mini .filetype.png,.list-view1.grid .img-precontainer-mini .filetype.png,.list-view2.grid .img-precontainer-mini .filetype.bmp,.list-view1.grid .img-precontainer-mini .filetype.bmp,.list-view2.grid .img-precontainer-mini .filetype.gif,.list-view1.grid .img-precontainer-mini .filetype.gif,.list-view2.grid .img-precontainer-mini .filetype.tiff,.list-view1.grid .img-precontainer-mini .filetype.tiff,.list-view2.grid .img-precontainer-mini .filetype.svg,.list-view1.grid .img-precontainer-mini .filetype.svg{background:#cfa554}.list-view2.grid .img-precontainer-mini .filetype.txt,.list-view1.grid .img-precontainer-mini .filetype.txt,.list-view2.grid .img-precontainer-mini .filetype.sql,.list-view1.grid .img-precontainer-mini .filetype.sql,.list-view2.grid .img-precontainer-mini .filetype.xml,.list-view1.grid .img-precontainer-mini .filetype.xml,.list-view2.grid .img-precontainer-mini .filetype.log,.list-view1.grid .img-precontainer-mini .filetype.log,.list-view2.grid .img-precontainer-mini .filetype.iso,.list-view1.grid .img-precontainer-mini .filetype.iso,.list-view2.grid .img-precontainer-mini .filetype.dmg,.list-view1.grid .img-precontainer-mini .filetype.dmg{background:#cacaca}.list-view2.grid .img-precontainer-mini .filetype.ade,.list-view1.grid .img-precontainer-mini .filetype.ade,.list-view2.grid .img-precontainer-mini .filetype.adp,.list-view1.grid .img-precontainer-mini .filetype.adp,.list-view2.grid .img-precontainer-mini .filetype.mdb,.list-view1.grid .img-precontainer-mini .filetype.mdb,.list-view2.grid .img-precontainer-mini .filetype.accdb,.list-view1.grid .img-precontainer-mini .filetype.accdb{background:#b61c19} \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/style.less b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/style.less new file mode 100644 index 00000000..74d25b12 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/css/style.less @@ -0,0 +1,926 @@ +*, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } +body, html { + font-family: 'Open Sans', sans-serif; + font-size: 100%; padding: 0; margin: 0;} +body{ + padding-top: 32px; + font-weight:200; + background:#ececec; + overflow: -moz-scrollbars-vertical; +} + +#qLpercentage{ + font-family: 'Open Sans', sans-serif; + font-size: 40px; + line-height: 40px; + color:#bbbbbb; + font-weight: 200; + height: 60px; + -webkit-border-radius: 10px; + border-radius: 10px; + padding: 10px; + text-shadow: 1px 1px 2px #ffffff; + filter: dropshadow(color=#ffffff, offx=1, offy=1); +} +#qLbar{ + /* IE9 SVG, needs conditional override of 'filter' to 'none' */ + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdhN2E3YSIgc3RvcC1vcGFjaXR5PSIwLjQiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzdhN2E3YSIgc3RvcC1vcGFjaXR5PSIwLjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==); + background: -moz-linear-gradient(top, rgba(122,122,122,0.4) 0%, rgba(122,122,122,0.4) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(122,122,122,0.4)), color-stop(100%,rgba(122,122,122,0.4))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(122,122,122,0.4) 0%,rgba(122,122,122,0.4) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(122,122,122,0.4) 0%,rgba(122,122,122,0.4) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(122,122,122,0.4) 0%,rgba(122,122,122,0.4) 100%); /* IE10+ */ + background: linear-gradient(to bottom, rgba(122,122,122,0.4) 0%,rgba(122,122,122,0.4) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#667a7a7a', endColorstr='#667a7a7a',GradientType=0 ); /* IE6-8 */ + + z-index:200; + margin:0px; + overflow: hidden; +} + + +[class^="rficon-"],[class*=" rficon-"] { + display:inline-block; + width:16px; + height:16px; + margin-top:1px; + *margin-right:.3em; + line-height:16px; + vertical-align:text-top; + background-position: 0 0; + background-repeat:no-repeat +} + +.rficon-clipboard-apply { + background-image:url(../img/clipboard_apply.png); +} + +.rficon-clipboard-clear { + background-image:url(../img/clipboard_clear.png); +} + +.btn{ + -webkit-border-radius: 0px; + border-radius: 0px; +} +.container-fluid{padding-right:0 !important;margin-top:10px !important;} +.img-precontainer{ + margin: auto; + width: 100%; + text-align: center; + background: white; + border:none; +} +.img-container{ + height: 91px; + width: 122px; + padding: 0px; + border:none; + overflow: hidden; + display: table-cell; + text-align: center; + vertical-align: middle; + margin: auto; +} +ul.breadcrumb{ + margin-bottom:5px; + -webkit-border-radius: 0px; + border-radius: 0px; + padding-bottom: 4px; + padding-top: 6px; + background: #f0f0f0; + -webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.065); + -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.065); + box-shadow: 0 1px 4px rgba(0,0,0,0.065); + border-bottom: 1px solid #bbbbbb; + + .pull-left i{ margin-top:2px;} +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom:2px; + border: 1px solid #aaaaaa; + color:#666666; + font-weight: 200; + font-size: 13px; + -webkit-border-radius: 0px; + border-radius: 0px; + background: white; +} +.img-container * ,.img-container-mini * { + vertical-align: middle; +} +#help{ + display: none; +} + +/*\*//*/ +.img-container,.img-container-mini { + display: block; +} +.img-container span, .img-container-mini span { + display: inline-block; + height: 100%; + width: 1px; +} +/**/ + +iframe{ + overflow: auto; + -webkit-overflow-scrolling:touch; +} +.upload-tabbable{ + margin-left: 5px; + margin-right: 5px; + + .upload-help{ + font-size: 11px; + font-weight: 200; + color: #777; + text-shadow: 0 1px 0 #fff; + text-align: center; + } + .nav{ + margin:0px; + li a{ + font-size: 13px; + font-weight: 200; + color: #777; + text-shadow: 0 1px 0 #fff; + } + } + .tab-content{ + padding: 5px; + border-bottom: 1px solid #dddddd; + border-left: 1px solid #dddddd; + border-rigth: 1px solid #dddddd; + background: white; + margin-bottom: 5px; + } +} +input#filter-input{ + margin:0px; + width: 84px; + height: 26px; + vertical-align: bottom; + margin-bottom: 2px; + -webkit-border-radius: 0; + border-radius: 0; + font-size: 12px; + font-weight:200; + position:relative; + left:1px; +} + +.qq-uploader .span9{margin-left:14px !important;width:690px !important;} +.space10{ clear:both; height:10px; } + +h4{ font-size:12px; font-weight:200; margin: 0px; text-align: center; padding: 0px; margin-top:6px; line-height: 18px; } +h3{ font-size:14px; font-weight:200;} +.boxes{ border:1px solid #CCCCCC; word-wrap: break-word; background:white; +-webkit-box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, 0.2);box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, 0.2); min-height:115px; +text-align: center;} +.container-fluid{ padding:0px 10px !important;} + +body .avpw .avpw_primary_button, +body .avpw .avpw_primary_button:link, +body .avpw .avpw_primary_button:visited, +body .avpw .avpw_primary_button:active { + background-color: #999999; + color: #ffffff; + background-image:none; + border:none; +} + +body .avpw .avpw_primary_button:hover{ + border:none; + background-color: #666666; +} + +.uploader{ + position:fixed; + top:50px; + left:14px; + margin:auto; + width:100%; + z-index:9999; + overflow: hidden; + background:#eeeeee; + padding-top:20px; + border:1px solid #cccccc; + display:none; + -webkit-box-shadow: 0px 0px 10px 0px rgba(1, 1, 1, 0.5); + box-shadow: 0px 0px 10px 0px rgba(1, 1, 1, 0.5); +} +.download-form{ + margin-bottom:25px; +} + +.grid li i{ + margin-left:2px; + margin-right: 2px; + z-index:0; +} +.box,.boxx{ + text-align: center; + word-wrap: break-word; + vertical-align: top; + text-align: left; + position: relative; + border: none; + box-shadow: none; + z-index: 100; + padding: 4px; +} +.box .btn{ + width: 100%; + background: none; + box-shadow: none; + border:none; + z-index: 200; +} +.navbar{ + margin-bottom: 0px; + border-bottom: 1px solid #bbbbbb; + .navbar-inner{ + border: none; + min-height: 35px; + -webkit-border-radius: 0px; + border-radius: 0px; + padding-bottom: 2px; + margin: 0px; + padding-right: 8px; + padding-left: 8px; + .container-fluid{ + margin: 0px; + margin-top: 0px !important; + padding: 0px; + .brand{ + display: none; + } + .filters span{ + margin-top:0px; + font-size:13px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff; } + } + } +} + +ul.sorting{ + position: absolute; + left: -25px; + top:20px; + min-width: 0px; + background: #eeeeee; + li a:hover{ + background: #aaaaaa; + } +} +.btn-group .dropdown-toggle.sorting-btn{ + background: none; + border: none; + box-shadow: none; + position: relative; + -webkit-box-shadow:none; + top:-5px; + font-size: 13px; +} +.btn-group .dropdown-toggle.sorting-btn:hover{ + background: none; + border: none; + box-shadow: none; + -webkit-box-shadow:none; +} +ul.sorting.dropdown-menu>li>a{ + font-size: 12px; + text-shadow: none; + &.ascending{ + background-image: url(../img/down.png); + background-repeat: no-repeat; + background-position: 6px 8px; + } + &.descending{ + background-image: url(../img/up.png); + background-repeat: no-repeat; + background-position: 6px 8px; + } +} + +.sorter-container{ + a.sorter{ + color:black; + } + + a.ascending{ + padding-left:9px; + background-image: url(../img/down.png); + background-repeat: no-repeat; + background-position: 0px 3px; + } + a.descending{ + padding-left:9px; + background-image: url(../img/up.png); + background-repeat: no-repeat; + background-position: 0px 4px; + } + margin-top:5px; + margin-bottom:0px; + -webkit-border-radius: 0px; + border-radius: 0px; + padding-bottom: 4px; + padding-top: 6px; + -webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.065); + -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.065); + box-shadow: 0 1px 4px rgba(0,0,0,0.065); + background-color: #f5f5f5; + position: relative; + border-bottom: 1px solid #bbbbbb; + height: 24px; + .img-dimension,.file-date,.file-size,.file-extension,.file-name,.file-operations{ + display: block;position: absolute; + top: 0px; + z-index: 100; + -webkit-box-shadow: none; + box-shadow: none; + text-align: left; + font-size: 13px; + margin-top: 1px; + color:#999999; + } + .file-operations{ + width: 110px; + right:0px; + } + .img-dimension{ + width: 65px; + right: 123px; + } + .file-date{ + width: 70px; + right: 188px; + } + .file-size{ + width: 55px; + right: 258px; + } + + .file-extension{ + width: 40px; + right: 313px; + } + + .file-name{ + width: 50px; + left: 52px; + } +} + +.img-dimension,.file-date,.file-size,.file-extension,.file-name,.file-operations{ + font-size:12px; + font-weight:200; + color:#777;text-shadow:0 1px 0 #fff; + display: none; +} + + +.view-controller{ + text-align: left; + .btn-group>.btn:first-child,.btn-group>.btn:last-child{ + -webkit-border-radius: 0px; + border-radius: 0px; + } +} + +.navbar .filters .btn { + margin-bottom: 2px; + padding-top:2px; + padding-bottom:2px; + padding-left: 8px; + padding-right: 8px; + margin-top:5px; +} +.filters .types{ + text-align: right; +} + + +@media(max-width:780px){ + #view2{ + display: none; + } +} +@media(max-width:839px){ + body{ + padding-top: 0px; + } + .filters .types{ + text-align: left; + } + .navbar .navbar-inner .container-fluid .brand{ + display: block; + } + .navbar .navbar-inner{ + padding-bottom: 4px; + } + .filters{ + div.span3.half,div.half.span6{ + float:none; + width:100%; + + } + } + + .container-fluid{ + margin:0px !important; + padding: 0px; + } + #qLbar{ + height:50px !important; + } +} +@media(min-width:400px) and (max-width:839px){ + .filters .row-fluid .half{ + width:48.61878453038674%;*width:48.56559304102504%; float:left; + } +} +.tooltip.in{ + z-index: 10000; + opacity:1; + filter:alpha(opacity=1); + font-weight: bold; +} + +.tooltip{ + font-weight: bold; + z-index: 10000; +} + +/* GRID */ +.grid { + padding: 0px 0px; + margin: 0 auto; + list-style: none; + -webkit-overflow-scrolling: touch; +} + +.grid li { + display: inline-block; + width: 124px; + border:none; + margin: 4px; + margin-bottom:8px; + padding: 0px; + vertical-align: top; +} + +.grid figure { + margin: 0; + position: relative; + display: block; + width: 122px; + margin: auto; + + &:hover{ background: #e0e0e0 !important;} +} +.list-view1.grid li{ + width:100%; + figure{ + width:100%; + } +} + +.grid figcaption { + text-align: center; + padding: 2px; + padding-top: 8px; + color: white; + height: 30px; + width: 122px; + margin-left:0px; + margin-right: 0px; + position: absolute; + top: auto; + bottom: 0; + -webkit-box-shadow: inset 0px 0px 8px 0px rgba(41, 41, 41, 0.5); + box-shadow: inset 0px 0px 8px 0px rgba(41, 41, 41, 0.5); + + a{ + margin: 0px; + padding: 3px; + } + h3 { + margin: 0; + padding: 0; + color: #fff; + } +} + + +.grid h4{ + text-align: center; + color: black; + padding: 0px; + margin-bottom: 4px; + margin-top: 4px; +} + + +/* Individual Caption Styles */ + + +/* Caption Style 2 */ + +.grid figure .box { + box-sizing: content-box; +} + +.list-view0.grid,.list-view1.grid,.list-view2.grid{ + figure{ + .box{ + max-width: 100%; + display: block; + position: relative; + overflow: hidden; + z-index: 1; + h4.ellipsis{ + height:18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + h4{ + z-index: 1; + a{ + z-index: 1; + } + } + } + } + + .selected{ + -webkit-box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.25); + box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.25); + + //border: 1px solid #777777; + } +} + +.no-touch .list-view0 figure .box{ + z-index: 1; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + transition: transform 0.3s; +} +.ui-state-highlight{ + border:1px solid red; +} + +.no-touch .list-view0 figure:hover .box, +.no-touch .list-view0 figure.cs-hover .box { + -webkit-box-shadow: 0px 0px 4px 0px rgba(1, 1, 1, 0.5); + box-shadow: 0px 0px 4px 0px rgba(1, 1, 1, 0.5); + -webkit-transform: translateY(-26px); + -moz-transform: translateY(-26px); + -ms-transform: translateY(-26px); + transform: translateY(-26px); +} +.list-view0 figure:hover .box.no-effect, +.list-view0 figure.cs-hover .box.no-effect,.no-effect{ + + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + transform: none; +} + + +.list-view0 .img-precontainer-mini{ + display: none; + background: none; +} +a,a:hover{ + color:black; + text-decoration: none; +} + +.back-directory{ + .img-precontainer,.img-precontainer-mini,.box{ + background: none; + } +} +form{ + margin:0px; + padding: 0px; +} +.modal-body{ + form,input{ + margin:0px; + } +} + +.modal-header h3{ + font-weight: 300; + font-size: 20px; +} + +/* LIST VIEW */ +.list-view1.sorter-container{ + display: block; +} + +.list-view0.sorter-container, .list-view2.sorter-container{ + display: none; +} +.list-view0.grid{ + .img-precontainer{ + .img-container{ + + img{ + max-width:122px !important; + max-height:91px !important; + } + img.icon{ + width: 122px; + margin-top:0px; + } + } + .filetype{ + position:absolute; + top:0px; + width:120px; + text-align:center; + color:white; + font-size: 13px; + line-height: 22px; + + } + } + .cover{ +/* IE9 SVG, needs conditional override of 'filter' to 'none' */ +background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjI1Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4yNSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); +background: -moz-linear-gradient(top, rgba(255,255,255,0.25) 0%, rgba(255,255,255,0.25) 100%); /* FF3.6+ */ +background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.25)), color-stop(100%,rgba(255,255,255,0.25))); /* Chrome,Safari4+ */ +background: -webkit-linear-gradient(top, rgba(255,255,255,0.25) 0%,rgba(255,255,255,0.25) 100%); /* Chrome10+,Safari5.1+ */ +background: -o-linear-gradient(top, rgba(255,255,255,0.25) 0%,rgba(255,255,255,0.25) 100%); /* Opera 11.10+ */ +background: -ms-linear-gradient(top, rgba(255,255,255,0.25) 0%,rgba(255,255,255,0.25) 100%); /* IE10+ */ +background: linear-gradient(to bottom, rgba(255,255,255,0.25) 0%,rgba(255,255,255,0.25) 100%); /* W3C */ +filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#40ffffff', endColorstr='#40ffffff',GradientType=0 ); /* IE6-8 */ + + + width: 122px; + position:absolute; + top:22px; + right:0px; + height: 69px; + } + .box{ + background: white; + } + .directory{ + background: #dddddd; + } + figure.back-directory{ + .directory{ + background: #bbbbbb; + } + } + + figcaption{ + background:#ffffff; + } +} + +.list-view1.grid , .list-view2.grid { + li{ + margin: 0px; + &.back{ + figure.back-directory{ + height: 34px; + } + } + } + li:nth-child(odd) figure {background: #f9f9f9; } + li:nth-child(odd) figure.directory {background: #eaeaea; } + + li figure{ + border-bottom: 1px solid #cccccc; + background: white; + &.back-directory{ + background: #bbbbbb; + .box{ + background: none; + } + } + &.directory{ + background: #efefef; + box{ + padding: 0px; + min-height: 10px; + } + } + .box{ + h4{ + padding-top:1px; + font-size: 13px; + text-align: left; + } + margin-left: 50px; + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + } + .img-precontainer-mini{ + display: block; + position: absolute; + width: 45px; + height: 34px; + overflow: hidden; + text-align: center; + img{ + height: 34px; + } + .filetype{ + position:absolute; + top:5px; + text-align: center; + left:5px; + padding:1px 2px; + font-size: 13px; + line-height: 22px; + width:34px; + height: 24px; + color:white; + background: #333333; + } + } + .cover{ + display: none; + } + .img-container-mini{ + width: 45px; + height: 34px; + border:none; + overflow: hidden; + display: table-cell; + text-align: center; + vertical-align: middle; + margin: auto; + + } + .img-precontainer-mini.original-thumb{ + padding: 0px; + img{ + width: auto; + margin: 0px; + height: 34px; + } + + img.original{ + width: auto; + width: auto; + height: auto; + } + } + + .img-precontainer{ + display: none; + } + + figcaption{ + background:none; + width: 120px; + position: absolute; + right: 0px; + top: 0px; + z-index: 1; + bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + text-align: right; + + } + .selected{ + -webkit-box-shadow: 0px 0px 3px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0px 0px 3px 2px rgba(0, 0, 0, 0.2); + } +} + +.list-view1.grid{ + .img-dimension,.file-date,.file-size,.file-extension{ + overflow: hidden; + display: block;position: absolute; + top: 0px; + z-index: 1; + -webkit-box-shadow: none; + box-shadow: none; + text-align: left; + margin-top:7px; + } + .img-dimension{ + width: 65px; + right: 120px; + } + .file-date{ + width: 70px; + right: 185px; + } + .file-size{ + width: 55px; + right: 255px; + } + .file-extension{ + width: 40px; + right: 310px; + } + figure .box{ + padding-right: 352px; + } +} +.list-view2.grid{ + figure{ + .box{ + padding-right: 115px; + } + } +} + + +@media(max-width:610px){ + .list-view1.grid figure{ + .box{ + padding-right: 312px; + } + .file-extension{ + display: none; + } + } + .sorter-container .file-extension{ + display: none; + } +} + +@media(max-width:565px){ + .list-view1.grid figure{ + .box{ + padding-right: 257px; + } + .file-size{ + display: none; + } + } + .sorter-container .file-size{ + display: none; + } +} + +@media(max-width:495px){ + .list-view1.grid figure{ + .box{ + padding-right: 187px; + } + .file-date{ + display: none; + } + } + .sorter-container .file-date{ + display: none; + } +} + +@media(max-width:430px){ + .list-view1.grid figure{ + .box{ + padding-right: 115px; + } + .img-dimension{ + display: none; + } + } + .sorter-container .img-dimension{ + display: none; + } + .breadcrumb{ + margin-left:0px; + margin-right:0px; + } +} + +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.pdf{ background:#CB0011; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.css{ background:#D10698; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.ai{ background:#D6772F; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.psd{ background:#0960A4; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.html,&.xhtml{ background:#035BC4; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.fla,&.flv{ background:#CF302E; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.ppt,&.pptx{ background:#DA5B00; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.xls,&.xlsx,&.css{ background:#1A712C; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.rts,&.doc,&.docx{ background:#002093; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.rar,&.zip,&.gzip{ background:#FE9221; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.mp4,&.mpeg,&.mov,&.avi,&.mpg,&.wma,&.webm{ background:#31231E; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.mp3,&.m4a,&.ac3,&.aiff,&.mid,&.ogg,&.wav{ background:#9F008B; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.odt,&.ots,&.ott,&.odb,&.odg,&.otp,&.otg,&.odf,&.ods,&.odp{ background:#367BBE; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.jpg,&.jpeg,&.png,&.bmp,&.gif,&.tiff,&.svg{ background:#CFA554; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.txt,&.sql,&.xml,&.log,&.iso,&.dmg{ background:#CACACA; }}} +.list-view2.grid,.list-view1.grid{.img-precontainer-mini .filetype{&.ade,&.adp,&.mdb,&.accdb{ background:#B61C19; }}} diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/dialog.php b/local/modules/Tinymce/Resources/js/tinymce/filemanager/dialog.php new file mode 100644 index 00000000..75563e40 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/dialog.php @@ -0,0 +1,901 @@ +console.log('The ".$lang." language file is not readable! Falling back...');"; + } + } + +// add lang file to session for easy include + $_SESSION['RF']['language_file'] = $language_file; + require_once $language_file; + + if(!isset($_GET['type'])) $_GET['type']=0; + if(!isset($_GET['field_id'])) $_GET['field_id']=''; + + $field_id=isset($_GET['field_id']) ? fix_get_params($_GET['field_id']) : ''; + $type_param=fix_get_params($_GET['type']); + + $get_params = http_build_query(array( + 'type' => $type_param, + 'lang' => $lang, + 'popup' => $popup, + 'field_id' => $field_id, + 'akey' => (isset($_GET['akey']) && $_GET['akey'] != '' ? $_GET['akey'] : 'key'), + 'fldr' => '' + )); + ?> + + + + + + + + + Responsive FileManager + + + + + + + console.log("Error: Spritemap not found!");'; + // exit(); + } + } + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + " /> + + " /> + + + + + + + + + + + + + + + + + " /> + + + +
+
+
+
+ + +
+
+ +
+ + +
+ :
+ + + + + + + + + + +
+
+ +
+
+
+
+ +
+
+
+ +
+ + + +
+ + $file){ + if($file==".") $current_folder=array('file'=>$file); + elseif($file=="..") $prev_folder=array('file'=>$file); + elseif(is_dir($current_path.$rfm_subfolder.$subdir.$file)){ + $date=filemtime($current_path.$rfm_subfolder.$subdir. $file); + $size=foldersize($current_path.$rfm_subfolder.$subdir. $file); + $file_ext=lang_Type_dir; + $sorted[$k]=array('file'=>$file,'date'=>$date,'size'=>$size,'extension'=>$file_ext); + }else{ + $file_path=$current_path.$rfm_subfolder.$subdir.$file; + $date=filemtime($file_path); + $size=filesize($file_path); + $file_ext = substr(strrchr($file,'.'),1); + $sorted[$k]=array('file'=>$file,'date'=>$date,'size'=>$size,'extension'=>$file_ext); + } + } + + function filenameSort($x, $y) { + return $x['file'] < $y['file']; + } + function dateSort($x, $y) { + return $x['date'] < $y['date']; + } + function sizeSort($x, $y) { + return $x['size'] - $y['size']; + } + function extensionSort($x, $y) { + return $x['extension'] < $y['extension']; + } + + switch($sort_by){ + case 'name': + usort($sorted, 'filenameSort'); + break; + case 'date': + usort($sorted, 'dateSort'); + break; + case 'size': + usort($sorted, 'sizeSort'); + break; + case 'extension': + usort($sorted, 'extensionSort'); + break; + default: + break; + + } + + if($descending){ + $sorted=array_reverse($sorted); + } + + $files=array_merge(array($prev_folder),array($current_folder),$sorted); + ?> + + + + + + + + + +
+
+ +
+
There is an error! The upload folder there isn't. Check your config.php file.
+ +

+ +
+ + + + + + + + +
    " id="main-item-container"> + +
  • >
    directory" data-type=""> + "> +
    +
    + .jpg" alt="folder" /> +
    +
    +
    +
    + + .png" alt="folder" /> +
    +
    + +
    +

    +
    +
    + + + +
    +

    ">">

    +
    + + + + +
    +
    +
    +
    + " title="" data-path="" data-thumb=""> + + " title="" data-confirm="" data-path="" data-thumb=""> + + +
    + +
    +
  • + $file_array) { + $file=$file_array['file']; + + if($file == '.' || $file == '..' || is_dir($current_path.$rfm_subfolder.$subdir.$file) || in_array($file, $hidden_files) || !in_array(fix_strtolower($file_array['extension']), $ext) || ($filter!='' && strpos($file,$filter)===false)) + continue; + + $file_path=$current_path.$rfm_subfolder.$subdir.$file; + //check if file have illegal caracter + + $filename=substr($file, 0, '-' . (strlen($file_array['extension']) + 1)); + + if($file!=fix_filename($file,$transliteration)){ + $file1=fix_filename($file,$transliteration); + $file_path1=($current_path.$rfm_subfolder.$subdir.$file1); + if(file_exists($file_path1)){ + $i = 1; + $info=pathinfo($file1); + while(file_exists($current_path.$rfm_subfolder.$subdir.$info['filename'].".[".$i."].".$info['extension'])) { + $i++; + } + $file1=$info['filename'].".[".$i."].".$info['extension']; + $file_path1=($current_path.$rfm_subfolder.$subdir.$file1); + } + + $filename=substr($file1, 0, '-' . (strlen($file_array['extension']) + 1)); + rename_file($file_path,fix_filename($filename,$transliteration),$transliteration); + $file=$file1; + $file_array['extension']=fix_filename($file_array['extension'],$transliteration); + $file_path=$file_path1; + } + + $is_img=false; + $is_video=false; + $is_audio=false; + $show_original=false; + $show_original_mini=false; + $mini_src=""; + $src_thumb=""; + $src_thumb_url=""; + $extension_lower=fix_strtolower($file_array['extension']); + if(in_array($extension_lower, $ext_img)){ + $src = $base_url . $cur_dir . rawurlencode($file); + $mini_src = $src_thumb = $thumbs_path.$subdir. $file; + $src_thumb_url = $base_url . $cur_thumbs_dir.$subdir. $file; + $mini_src_url = $base_url .$thumbs_dir.$subdir. $file; + //add in thumbs folder if not exist + if(!file_exists($src_thumb)){ + try { + create_img_gd($file_path, $src_thumb, 122, 91); + new_thumbnails_creation($current_path.$rfm_subfolder.$subdir,$file_path,$file,$current_path,$relative_image_creation,$relative_path_from_current_pos,$relative_image_creation_name_to_prepend,$relative_image_creation_name_to_append,$relative_image_creation_width,$relative_image_creation_height,$fixed_image_creation,$fixed_path_from_filemanager,$fixed_image_creation_name_to_prepend,$fixed_image_creation_to_append,$fixed_image_creation_width,$fixed_image_creation_height); + } catch (Exception $e) { + $src_thumb=$mini_src=$src_thumb_url=""; + } + } + $is_img=true; + //check if is smaller than thumb + list($img_width, $img_height, $img_type, $attr)=getimagesize($file_path); + if($img_width<122 && $img_height<91){ + $src_thumb=$current_path.$rfm_subfolder.$subdir.$file; + $show_original=true; + } + + if($img_width<45 && $img_height<38){ + $mini_src=$current_path.$rfm_subfolder.$subdir.$file; + $mini_src_url= $base_url.$upload_dir.$rfm_subfolder.$subdir.$file; + $show_original_mini=true; + } + } + + $is_icon_thumb=false; + $is_icon_thumb_mini=false; + $no_thumb=false; + if($src_thumb==""){ + $no_thumb=true; + if(file_exists('img/'.$icon_theme.'/'.$extension_lower.".jpg")){ + $src_thumb ='img/'.$icon_theme.'/'.$extension_lower.".jpg"; + }else{ + $src_thumb = "img/".$icon_theme."/default.jpg"; + } + + $src_thumb_url = $base_url . $filemanager_dir . $src_thumb; + + $is_icon_thumb=true; + } + if($mini_src==""){ + $is_icon_thumb_mini=false; + } + + $class_ext=0; + if (in_array($extension_lower, $ext_video)) { + $class_ext = 4; + $is_video=true; + }elseif (in_array($extension_lower, $ext_img)) { + $class_ext = 2; + }elseif (in_array($extension_lower, $ext_music)) { + $class_ext = 5; + $is_audio=true; + }elseif (in_array($extension_lower, $ext_misc)) { + $class_ext = 3; + }else{ + $class_ext = 1; + } + if((!($_GET['type']==1 && !$is_img) && !(($_GET['type']==3 && !$is_video) && ($_GET['type']==3 && !$is_audio))) && $class_ext>0){ + ?> +
  • "> + +
    +
    +
    + + <?php echo $filename." class=" " src=""> +
    +
    +
    +
    ">
    +
    + + + <?php echo $filename." class=" " src=""> + +
    +
    + +
    + +
    +
    +

    "> +

    +
    + + + + +
    +
    +
    +
    +
    +
    + + + + + + + + " + title="" data-url="ajax_calls.php?action=media_preview&title=&file=" + href="javascript:void('');" > + + + + " title="" data-path="" data-thumb=""> + + + " title="" data-confirm="" data-path="" data-thumb=""> + + +
    +
    +
    +
  • +
+ + +
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/execute.php b/local/modules/Tinymce/Resources/js/tinymce/filemanager/execute.php new file mode 100644 index 00000000..5f924283 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/execute.php @@ -0,0 +1,280 @@ +$path) + { + if ($path!="" && $path[strlen($path)-1]!="/") $path.="/"; + + if (file_exists($info['dirname']."/".$path.$relative_image_creation_name_to_prepend[$k].$info['filename'].$relative_image_creation_name_to_append[$k].".".$info['extension'])) + { + unlink($info['dirname']."/".$path.$relative_image_creation_name_to_prepend[$k].$info['filename'].$relative_image_creation_name_to_append[$k].".".$info['extension']); + } + } + } + + if ($fixed_image_creation) + { + foreach($fixed_path_from_filemanager as $k=>$path) + { + if ($path!="" && $path[strlen($path)-1] != "/") $path.="/"; + + $base_dir=$path.substr_replace($info['dirname']."/", '', 0, strlen($current_path)); + if (file_exists($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'])) + { + unlink($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension']); + } + } + } + } + break; + case 'delete_folder': + if ($delete_folders){ + if (is_dir($path_thumb)) + { + deleteDir($path_thumb); + } + + if (is_dir($path)) + { + deleteDir($path); + if ($fixed_image_creation) + { + foreach($fixed_path_from_filemanager as $k=>$paths){ + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir=$paths.substr_replace($path, '', 0, strlen($current_path)); + if (is_dir($base_dir)) deleteDir($base_dir); + } + } + } + } + break; + case 'create_folder': + if ($create_folders) + { + create_folder(fix_path($path,$transliteration),fix_path($path_thumb,$transliteration)); + } + break; + case 'rename_folder': + if ($rename_folders){ + $name=fix_filename($name,$transliteration); + $name=str_replace('.','',$name); + + if (!empty($name)){ + if (!rename_folder($path,$name,$transliteration)) die(lang_Rename_existing_folder); + + rename_folder($path_thumb,$name,$transliteration); + if ($fixed_image_creation){ + foreach($fixed_path_from_filemanager as $k=>$paths){ + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir=$paths.substr_replace($path, '', 0, strlen($current_path)); + rename_folder($base_dir,$name,$transliteration); + } + } + } + else { + die(lang_Empty_name); + } + } + break; + case 'rename_file': + if ($rename_files){ + $name=fix_filename($name,$transliteration); + if (!empty($name)) + { + if (!rename_file($path,$name,$transliteration)) die(lang_Rename_existing_file); + + rename_file($path_thumb,$name,$transliteration); + + if ($fixed_image_creation) + { + $info=pathinfo($path); + + foreach($fixed_path_from_filemanager as $k=>$paths) + { + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir = $paths.substr_replace($info['dirname']."/", '', 0, strlen($current_path)); + if (file_exists($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'])) + { + rename_file($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'],$fixed_image_creation_name_to_prepend[$k].$name.$fixed_image_creation_to_append[$k],$transliteration); + } + } + } + } + else { + die(lang_Empty_name); + } + } + break; + case 'duplicate_file': + if ($duplicate_files) + { + $name = fix_filename($name,$transliteration); + if (!empty($name)) + { + if (!duplicate_file($path,$name)) die(lang_Rename_existing_file); + + duplicate_file($path_thumb,$name); + + if ($fixed_image_creation) + { + $info=pathinfo($path); + foreach($fixed_path_from_filemanager as $k=>$paths) + { + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.= "/"; + + $base_dir=$paths.substr_replace($info['dirname']."/", '', 0, strlen($current_path)); + + if (file_exists($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'])) + { + duplicate_file($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'],$fixed_image_creation_name_to_prepend[$k].$name.$fixed_image_creation_to_append[$k]); + } + } + } + } + else + { + die(lang_Empty_name); + } + } + break; + case 'paste_clipboard': + if ( ! isset($_SESSION['RF']['clipboard_action'], $_SESSION['RF']['clipboard']['path'], $_SESSION['RF']['clipboard']['path_thumb']) + || $_SESSION['RF']['clipboard_action'] == '' + || $_SESSION['RF']['clipboard']['path'] == '' + || $_SESSION['RF']['clipboard']['path_thumb'] == '') + { + die(); + } + + $action = $_SESSION['RF']['clipboard_action']; + $data = $_SESSION['RF']['clipboard']; + $data['path'] = $current_path.$data['path']; + $pinfo = pathinfo($data['path']); + + // user wants to paste to the same dir. nothing to do here... + if ($pinfo['dirname'] == rtrim($path, '/')) { + die(); + } + + // user wants to paste folder to it's own sub folder.. baaaah. + if (is_dir($data['path']) && strpos($path, $data['path']) !== FALSE){ + die(); + } + + // something terribly gone wrong + if ($action != 'copy' && $action != 'cut'){ + die('no action'); + } + + // check for writability + if (is_really_writable($path) === FALSE || is_really_writable($path_thumb) === FALSE){ + die($path.'--'.$path_thumb.'--'.lang_Dir_No_Write); + } + + // check if server disables copy or rename + if (is_function_callable(($action == 'copy' ? 'copy' : 'rename')) === FALSE){ + die(sprintf(lang_Function_Disabled, ($action == 'copy' ? lcfirst(lang_Copy) : lcfirst(lang_Cut)))); + } + + if ($action == 'copy') + { + rcopy($data['path'], $path); + rcopy($data['path_thumb'], $path_thumb); + } + elseif ($action == 'cut') + { + rrename($data['path'], $path); + rrename($data['path_thumb'], $path_thumb); + + // cleanup + if (is_dir($data['path']) === TRUE){ + rrename_after_cleaner($data['path']); + rrename_after_cleaner($data['path_thumb']); + } + } + + // cleanup + $_SESSION['RF']['clipboard']['path'] = NULL; + $_SESSION['RF']['clipboard']['path_thumb'] = NULL; + $_SESSION['RF']['clipboard_action'] = NULL; + + break; + default: + die('wrong action'); + } +} + +?> \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/force_download.php b/local/modules/Tinymce/Resources/js/tinymce/filemanager/force_download.php new file mode 100644 index 00000000..5edcf481 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/force_download.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/clipboard_apply.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/clipboard_apply.png new file mode 100644 index 00000000..84a0447b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/clipboard_apply.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/clipboard_clear.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/clipboard_clear.png new file mode 100644 index 00000000..4afd1bd0 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/clipboard_clear.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/copy.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/copy.png new file mode 100644 index 00000000..f037a6f3 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/copy.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/cut.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/cut.png new file mode 100644 index 00000000..b2abe89f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/cut.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/date.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/date.png new file mode 100644 index 00000000..85482c9e Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/date.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/dimension.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/dimension.png new file mode 100644 index 00000000..cb46270f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/dimension.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/door.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/door.png new file mode 100644 index 00000000..369fc46e Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/door.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/down.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/down.png new file mode 100644 index 00000000..f975a7ac Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/down.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/download.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/download.png new file mode 100644 index 00000000..bb054784 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/download.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/duplicate.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/duplicate.png new file mode 100644 index 00000000..71bfac6f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/duplicate.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/edit_img.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/edit_img.png new file mode 100644 index 00000000..658ef623 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/edit_img.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/glyphicons-halflings-white.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/glyphicons-halflings-white.png new file mode 100644 index 00000000..d62c3e7f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/glyphicons-halflings-white.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/glyphicons-halflings.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/glyphicons-halflings.png new file mode 100644 index 00000000..4fe3f723 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/glyphicons-halflings.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ac3.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ac3.jpg new file mode 100644 index 00000000..0b7fcdd8 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ac3.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/accdb.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/accdb.jpg new file mode 100644 index 00000000..d21abb8c Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/accdb.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ade.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ade.jpg new file mode 100644 index 00000000..371e0dd8 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ade.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/adp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/adp.jpg new file mode 100644 index 00000000..371e0dd8 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/adp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ai.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ai.jpg new file mode 100644 index 00000000..19447484 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ai.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/aiff.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/aiff.jpg new file mode 100644 index 00000000..774905c6 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/aiff.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/avi.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/avi.jpg new file mode 100644 index 00000000..2c57cb7f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/avi.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/bmp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/bmp.jpg new file mode 100644 index 00000000..d15216fc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/bmp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/css.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/css.jpg new file mode 100644 index 00000000..e1673b07 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/css.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/csv.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/csv.jpg new file mode 100644 index 00000000..0cf4076c Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/csv.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/default.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/default.jpg new file mode 100644 index 00000000..5d1f4235 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/default.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/dmg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/dmg.jpg new file mode 100644 index 00000000..1be5ebba Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/dmg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/doc.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/doc.jpg new file mode 100644 index 00000000..d9ebcf8a Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/doc.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/docx.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/docx.jpg new file mode 100644 index 00000000..d9ebcf8a Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/docx.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/favicon.ico b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/favicon.ico new file mode 100644 index 00000000..73837074 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/favicon.ico differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/fla.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/fla.jpg new file mode 100644 index 00000000..f7033678 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/fla.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/flv.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/flv.jpg new file mode 100644 index 00000000..6e5f8598 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/flv.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder.jpg new file mode 100644 index 00000000..d7c040dd Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder.png new file mode 100644 index 00000000..1fa946e2 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder_back.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder_back.jpg new file mode 100644 index 00000000..eeffc572 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder_back.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder_back.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder_back.png new file mode 100644 index 00000000..de3c8a65 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/folder_back.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/gif.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/gif.jpg new file mode 100644 index 00000000..d15216fc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/gif.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/gz.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/gz.jpg new file mode 100644 index 00000000..950cad38 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/gz.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/html.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/html.jpg new file mode 100644 index 00000000..b915c599 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/html.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/iso.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/iso.jpg new file mode 100644 index 00000000..7617f594 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/iso.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/jpeg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/jpeg.jpg new file mode 100644 index 00000000..fe3b5eeb Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/jpeg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/jpg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/jpg.jpg new file mode 100644 index 00000000..d15216fc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/jpg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/log.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/log.jpg new file mode 100644 index 00000000..333a8d9b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/log.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/m4a.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/m4a.jpg new file mode 100644 index 00000000..6be612be Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/m4a.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mdb.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mdb.jpg new file mode 100644 index 00000000..d21abb8c Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mdb.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mid.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mid.jpg new file mode 100644 index 00000000..ec365f14 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mid.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mov.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mov.jpg new file mode 100644 index 00000000..25db2e93 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mov.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mp3.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mp3.jpg new file mode 100644 index 00000000..2123bf12 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mp3.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mp4.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mp4.jpg new file mode 100644 index 00000000..ccb45d80 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mp4.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mpeg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mpeg.jpg new file mode 100644 index 00000000..7a861479 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mpeg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mpg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mpg.jpg new file mode 100644 index 00000000..0f1901e7 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/mpg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odb.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odb.jpg new file mode 100644 index 00000000..19efd722 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odb.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odf.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odf.jpg new file mode 100644 index 00000000..bf3af96f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odf.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odg.jpg new file mode 100644 index 00000000..19efd722 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odp.jpg new file mode 100644 index 00000000..bf3af96f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ods.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ods.jpg new file mode 100644 index 00000000..19efd722 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ods.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odt.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odt.jpg new file mode 100644 index 00000000..19efd722 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/odt.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ogg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ogg.jpg new file mode 100644 index 00000000..31050400 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ogg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/otg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/otg.jpg new file mode 100644 index 00000000..2c8f4b62 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/otg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/otp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/otp.jpg new file mode 100644 index 00000000..72ae7531 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/otp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ots.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ots.jpg new file mode 100644 index 00000000..19efd722 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ots.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ott.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ott.jpg new file mode 100644 index 00000000..19efd722 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ott.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/pdf.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/pdf.jpg new file mode 100644 index 00000000..2aa417eb Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/pdf.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/png.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/png.jpg new file mode 100644 index 00000000..d15216fc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/png.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ppt.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ppt.jpg new file mode 100644 index 00000000..967d2bb1 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/ppt.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/pptx.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/pptx.jpg new file mode 100644 index 00000000..4a0ad1a1 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/pptx.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/psd.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/psd.jpg new file mode 100644 index 00000000..9365ac49 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/psd.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/rar.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/rar.jpg new file mode 100644 index 00000000..950cad38 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/rar.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/rtf.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/rtf.jpg new file mode 100644 index 00000000..d9ebcf8a Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/rtf.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/sql.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/sql.jpg new file mode 100644 index 00000000..c0556dec Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/sql.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/svg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/svg.jpg new file mode 100644 index 00000000..d15216fc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/svg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/tar.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/tar.jpg new file mode 100644 index 00000000..15ea7810 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/tar.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/tiff.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/tiff.jpg new file mode 100644 index 00000000..679b5226 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/tiff.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/txt.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/txt.jpg new file mode 100644 index 00000000..333a8d9b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/txt.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/wav.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/wav.jpg new file mode 100644 index 00000000..31050400 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/wav.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/webm.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/webm.jpg new file mode 100644 index 00000000..2c57cb7f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/webm.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/wma.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/wma.jpg new file mode 100644 index 00000000..2c57cb7f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/wma.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xhtml.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xhtml.jpg new file mode 100644 index 00000000..466d818b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xhtml.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xls.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xls.jpg new file mode 100644 index 00000000..dc2ab5e7 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xls.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xlsx.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xlsx.jpg new file mode 100644 index 00000000..c8ac78f0 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xlsx.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xml.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xml.jpg new file mode 100644 index 00000000..aa8c4438 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/xml.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/zip.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/zip.jpg new file mode 100644 index 00000000..950cad38 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico/zip.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ac3.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ac3.jpg new file mode 100644 index 00000000..c89b43ca Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ac3.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/accdb.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/accdb.jpg new file mode 100644 index 00000000..3e670adc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/accdb.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ade.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ade.jpg new file mode 100644 index 00000000..b07e8114 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ade.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/adp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/adp.jpg new file mode 100644 index 00000000..b07e8114 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/adp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ai.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ai.jpg new file mode 100644 index 00000000..719a029f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ai.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/aiff.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/aiff.jpg new file mode 100644 index 00000000..290afdda Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/aiff.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/avi.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/avi.jpg new file mode 100644 index 00000000..128eafd8 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/avi.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/bmp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/bmp.jpg new file mode 100644 index 00000000..65598092 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/bmp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/css.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/css.jpg new file mode 100644 index 00000000..0246bfd0 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/css.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/csv.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/csv.jpg new file mode 100644 index 00000000..c7d3aef7 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/csv.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/default.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/default.jpg new file mode 100644 index 00000000..433adcfb Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/default.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/dmg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/dmg.jpg new file mode 100644 index 00000000..43179464 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/dmg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/doc.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/doc.jpg new file mode 100644 index 00000000..abb65ed3 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/doc.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/docx.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/docx.jpg new file mode 100644 index 00000000..08b04b82 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/docx.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/favicon.ico b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/favicon.ico new file mode 100644 index 00000000..73837074 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/favicon.ico differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/fla.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/fla.jpg new file mode 100644 index 00000000..e2706ec7 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/fla.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/flv.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/flv.jpg new file mode 100644 index 00000000..b35496b3 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/flv.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder.jpg new file mode 100644 index 00000000..589791c5 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder.png new file mode 100644 index 00000000..7fad79ad Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder_back.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder_back.jpg new file mode 100644 index 00000000..ddacf761 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder_back.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder_back.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder_back.png new file mode 100644 index 00000000..de3c8a65 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/folder_back.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/gif.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/gif.jpg new file mode 100644 index 00000000..65598092 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/gif.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/gz.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/gz.jpg new file mode 100644 index 00000000..bd30b1cd Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/gz.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/html.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/html.jpg new file mode 100644 index 00000000..9d7c99aa Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/html.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/iso.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/iso.jpg new file mode 100644 index 00000000..afb20c1e Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/iso.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/jpeg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/jpeg.jpg new file mode 100644 index 00000000..2df9299b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/jpeg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/jpg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/jpg.jpg new file mode 100644 index 00000000..65598092 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/jpg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/log.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/log.jpg new file mode 100644 index 00000000..5a0a8520 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/log.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/m4a.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/m4a.jpg new file mode 100644 index 00000000..4eb8340b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/m4a.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mdb.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mdb.jpg new file mode 100644 index 00000000..3e670adc Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mdb.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mid.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mid.jpg new file mode 100644 index 00000000..40516d6e Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mid.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mov.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mov.jpg new file mode 100644 index 00000000..0aa7a8a9 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mov.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mp3.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mp3.jpg new file mode 100644 index 00000000..fd661490 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mp3.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mp4.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mp4.jpg new file mode 100644 index 00000000..0b045edf Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mp4.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mpeg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mpeg.jpg new file mode 100644 index 00000000..37293c14 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mpeg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mpg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mpg.jpg new file mode 100644 index 00000000..6ca376a0 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/mpg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odb.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odb.jpg new file mode 100644 index 00000000..a59fe46f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odb.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odf.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odf.jpg new file mode 100644 index 00000000..3550401b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odf.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odg.jpg new file mode 100644 index 00000000..a59fe46f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odp.jpg new file mode 100644 index 00000000..3550401b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ods.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ods.jpg new file mode 100644 index 00000000..a59fe46f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ods.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odt.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odt.jpg new file mode 100644 index 00000000..a59fe46f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/odt.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ogg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ogg.jpg new file mode 100644 index 00000000..e93be746 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ogg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/otg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/otg.jpg new file mode 100644 index 00000000..4c596334 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/otg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/otp.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/otp.jpg new file mode 100644 index 00000000..9cc95b3b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/otp.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ots.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ots.jpg new file mode 100644 index 00000000..a59fe46f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ots.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ott.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ott.jpg new file mode 100644 index 00000000..a59fe46f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ott.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/pdf.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/pdf.jpg new file mode 100644 index 00000000..44987838 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/pdf.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/png.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/png.jpg new file mode 100644 index 00000000..65598092 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/png.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ppt.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ppt.jpg new file mode 100644 index 00000000..d0d4e281 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/ppt.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/pptx.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/pptx.jpg new file mode 100644 index 00000000..066db3fe Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/pptx.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/psd.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/psd.jpg new file mode 100644 index 00000000..37e2f1a9 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/psd.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/rar.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/rar.jpg new file mode 100644 index 00000000..d4878825 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/rar.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/rtf.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/rtf.jpg new file mode 100644 index 00000000..abb65ed3 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/rtf.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/sql.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/sql.jpg new file mode 100644 index 00000000..40128438 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/sql.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/svg.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/svg.jpg new file mode 100644 index 00000000..65598092 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/svg.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/tar.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/tar.jpg new file mode 100644 index 00000000..e875b26e Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/tar.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/tiff.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/tiff.jpg new file mode 100644 index 00000000..6648ebfe Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/tiff.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/txt.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/txt.jpg new file mode 100644 index 00000000..5a0a8520 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/txt.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/wav.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/wav.jpg new file mode 100644 index 00000000..e93be746 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/wav.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/webm.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/webm.jpg new file mode 100644 index 00000000..dab5433b Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/webm.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/wma.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/wma.jpg new file mode 100644 index 00000000..128eafd8 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/wma.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xhtml.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xhtml.jpg new file mode 100644 index 00000000..5c315043 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xhtml.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xls.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xls.jpg new file mode 100644 index 00000000..41fe930f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xls.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xlsx.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xlsx.jpg new file mode 100644 index 00000000..ed4cbbef Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xlsx.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xml.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xml.jpg new file mode 100644 index 00000000..2301744c Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/xml.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/zip.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/zip.jpg new file mode 100644 index 00000000..bd30b1cd Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/ico_dark/zip.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/info.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/info.png new file mode 100644 index 00000000..dfb3971d Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/info.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/label.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/label.png new file mode 100644 index 00000000..f5b5b200 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/label.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/loading.gif b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/loading.gif new file mode 100644 index 00000000..6fba7760 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/loading.gif differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/logo.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/logo.png new file mode 100644 index 00000000..2a9a0dea Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/logo.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_add.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_add.png new file mode 100644 index 00000000..a70de096 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_add.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_copy.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_copy.png new file mode 100644 index 00000000..a9f31a27 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_copy.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_delete.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_delete.png new file mode 100644 index 00000000..7bb3d956 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_delete.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_edit.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_edit.png new file mode 100644 index 00000000..b93e7760 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_edit.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_paste.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_paste.png new file mode 100644 index 00000000..5b2cbb3f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/page_white_paste.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/preview.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/preview.png new file mode 100644 index 00000000..07af0803 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/preview.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/processing.gif b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/processing.gif new file mode 100644 index 00000000..7c99504e Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/processing.gif differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/rename.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/rename.png new file mode 100644 index 00000000..82d9f13f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/rename.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/size.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/size.png new file mode 100644 index 00000000..abbc7448 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/size.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/sort.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/sort.png new file mode 100644 index 00000000..d741e10f Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/sort.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap@2x_en_EN.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap@2x_en_EN.png new file mode 100644 index 00000000..e877eea6 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap@2x_en_EN.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap@2x_hu_HU.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap@2x_hu_HU.png new file mode 100644 index 00000000..97e2c550 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap@2x_hu_HU.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap_en_EN.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap_en_EN.png new file mode 100644 index 00000000..9f213145 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap_en_EN.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap_hu_HU.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap_hu_HU.png new file mode 100644 index 00000000..b2ec8ee9 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/spritemap_hu_HU.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/storing_animation.gif b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/storing_animation.gif new file mode 100644 index 00000000..eca3a53c Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/storing_animation.gif differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/up.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/up.png new file mode 100644 index 00000000..d7b3925c Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/up.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/url.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/url.png new file mode 100644 index 00000000..e0db5519 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/url.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/zip.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/zip.png new file mode 100644 index 00000000..95355ce7 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/img/zip.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/include/php_image_magician.php b/local/modules/Tinymce/Resources/js/tinymce/filemanager/include/php_image_magician.php new file mode 100644 index 00000000..81e9bcd2 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/include/php_image_magician.php @@ -0,0 +1,3320 @@ + resizeImage(150, 100, 0); + # $magicianObj -> saveImage('images/car_small.jpg', 100); + # + # - See end of doc for more examples - + # + # Supported file types include: jpg, png, gif, bmp, psd (read) + # + # + # + # The following functions are taken from phpThumb() [available from + # http://phpthumb.sourceforge.net], and are used with written permission + # from James Heinrich. + # - GD2BMPstring + # - GetPixelColor + # - LittleEndian2String + # + # The following functions are from Marc Hibbins and are used with written + # permission (are also under the Attribution-ShareAlike + # [http://creativecommons.org/licenses/by-sa/3.0/] license. + # - + # + # PhpPsdReader is used with written permission from Tim de Koning. + # [http://www.kingsquare.nl/phppsdreader] + # + # + # + # Modificatoin history + # Date Initials Ver Description + # 10-05-11 J.C.O 0.0 Initial build + # 01-06-11 J.C.O 0.1.1 * Added reflections + # * Added Rounded corners + # * You can now use PNG interlacing + # * Added shadow + # * Added caption box + # * Added vintage filter + # * Added dynamic image resizing (resize on the fly) + # * minor bug fixes + # 05-06-11 J.C.O 0.1.1.1 * Fixed undefined variables + # 17-06-11 J.C.O 0.1.2 * Added image_batch_class.php class + # * Minor bug fixes + # 26-07-11 J.C.O 0.1.4 * Added support for external images + # * Can now set the crop poisition + # 03-08-11 J.C.O 0.1.5 * Added reset() method to reset resource to + # original input file. + # * Added method addTextToCaptionBox() to + # simplify adding text to a caption box. + # * Added experimental writeIPTC. (not finished) + # * Added experimental readIPTC. (not finished) + # 11-08-11 J.C.O * Added initial border presets. + # 30-08-11 J.C.O * Added 'auto' crop option to crop portrait + # images near the top. + # 08-09-11 J.C.O * Added cropImage() method to allow standalone + # cropping. + # 17-09-11 J.C.O * Added setCropFromTop() set method - set the + # percentage to crop from the top when using + # crop 'auto' option. + # * Added setTransparency() set method - allows you + # to turn transparency off (like when saving + # as a jpg). + # * Added setFillColor() set method - set the + # background color to use instead of transparency. + # 05-11-11 J.C.O 0.1.5.1 * Fixed interlacing option + # 0-07-12 J.C.O 1.0 + # + # Known issues & Limitations: + # ------------------------------- + # Not so much an issue, the image is destroyed on the deconstruct rather than + # when we have finished with it. The reason for this is that we don't know + # when we're finished with it as you can both save the image and display + # it directly to the screen (imagedestroy($this->imageResized)) + # + # Opening BMP files is slow. A test with 884 bmp files processed in a loop + # takes forever - over 5 min. This test inlcuded opening the file, then + # getting and displaying its width and height. + # + # $forceStretch: + # ------------------------------- + # On by default. + # $forceStretch can be disabled by calling method setForceStretch with false + # parameter. If disabled, if an images original size is smaller than the size + # specified by the user, the original size will be used. This is useful when + # dealing with small images. + # + # If enabled, images smaller than the size specified will be stretched to + # that size. + # + # Tips: + # ------------------------------- + # * If you're resizing a transparent png and saving it as a jpg, set + # $keepTransparency to false with: $magicianObj->setTransparency(false); + # + # FEATURES: + # * EASY TO USE + # * BMP SUPPORT (read & write) + # * PSD (photoshop) support (read) + # * RESIZE IMAGES + # - Preserve transparency (png, gif) + # - Apply sharpening (jpg) (requires PHP >= 5.1.0) + # - Set image quality (jpg, png) + # - Resize modes: + # - exact size + # - resize by width (auto height) + # - resize by height (auto width) + # - auto (automatically determine the best of the above modes to use) + # - crop - resize as best as it can then crop the rest + # - Force stretching of smaller images (upscale) + # * APPLY FILTERS + # - Convert to grey scale + # - Convert to black and white + # - Convert to sepia + # - Convert to negative + # * ROTATE IMAGES + # - Rotate using predefined "left", "right", or "180"; or any custom degree amount + # * EXTRACT EXIF DATA (requires exif module) + # - make + # - model + # - date + # - exposure + # - aperture + # - f-stop + # - iso + # - focal length + # - exposure program + # - metering mode + # - flash status + # - creator + # - copyright + # * ADD WATERMARK + # - Specify exact x, y placement + # - Or, specify using one of the 9 pre-defined placements such as "tl" + # (for top left), "m" (for middle), "br" (for bottom right) + # - also specify padding from edge amount (optional). + # - Set opacity of watermark (png). + # * ADD BORDER + # * USE HEX WHEN SPECIFYING COLORS (eg: #ffffff) + # * SAVE IMAGE OR OUTPUT TO SCREEN + # + # + # ========================================================================# + + +class imageLib +{ + + private $fileName; + private $image; + protected $imageResized; + private $widthOriginal; # Always be the original width + private $heightOriginal; + private $width; # Current width (width after resize) + private $height; + private $imageSize; + private $fileExtension; + + private $debug = true; + private $errorArray = array(); + + private $forceStretch = true; + private $aggresiveSharpening = false; + + private $transparentArray = array('.png', '.gif'); + private $keepTransparency = true; + private $fillColorArray = array('r'=>255, 'g'=>255, 'b'=>255); + + private $sharpenArray = array('jpg'); + + private $psdReaderPath; + private $filterOverlayPath; + + private $isInterlace; + + private $captionBoxPositionArray = array(); + + private $fontDir = 'fonts'; + + private $cropFromTopPercent = 10; + + +## -------------------------------------------------------- + + function __construct($fileName) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Constructor + # Param in: $fileName: File name and path. + # Param out: n/a + # Reference: + # Notes: + # + { + if (!$this->testGDInstalled()) { if ($this->debug) { throw new Exception('The GD Library is not installed.'); }else{ throw new Exception(); }}; + + $this->initialise(); + + // *** Save the image file name. Only store this incase you want to display it + $this->fileName = $fileName; + $this->fileExtension = fix_strtolower(strrchr($fileName, '.')); + + // *** Open up the file + $this->image = $this->openImage($fileName); + + + // *** Assign here so we don't modify the original + $this->imageResized = $this->image; + + // *** If file is an image + if ($this->testIsImage($this->image)) + { + // *** Get width and height + $this->width = imagesx($this->image); + $this->widthOriginal = imagesx($this->image); + $this->height = imagesy($this->image); + $this->heightOriginal = imagesy($this->image); + + + /* Added 15-09-08 + * Get the filesize using this build in method. + * Stores an array of size + * + * $this->imageSize[1] = width + * $this->imageSize[2] = height + * $this->imageSize[3] = width x height + * + */ + $this->imageSize = getimagesize($this->fileName); + + } else { + $this->errorArray[] = 'File is not an image'; + } + } + +## -------------------------------------------------------- + + private function initialise () { + + $this->psdReaderPath = dirname(__FILE__) . '/classPhpPsdReader.php'; + $this->filterOverlayPath = dirname(__FILE__) . '/filters'; + + // *** Set if image should be interlaced or not. + $this->isInterlace = false; + } + + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Resize +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + public function resizeImage($newWidth, $newHeight, $option = 0, $sharpen = false, $autoRotate = false) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Resizes the image + # Param in: $newWidth: + # $newHeight: + # $option: 0 / exact = defined size; + # 1 / portrait = keep aspect set height; + # 2 / landscape = keep aspect set width; + # 3 / auto = auto; + # 4 / crop= resize and crop; + # + # $option can also be an array containing options for + # cropping. E.G., array('crop', 'r') + # + # This array only applies to 'crop' and the 'r' refers to + # "crop right". Other value include; tl, t, tr, l, m (default), + # r, bl, b, br, or you can specify your own co-ords (which + # isn't recommended. + # + # $sharpen: true: sharpen (jpg only); + # false: don't sharpen + # Param out: n/a + # Reference: + # Notes: To clarify the $option input: + # 0 = The exact height and width dimensions you set. + # 1 = Whatever height is passed in will be the height that + # is set. The width will be calculated and set automatically + # to a the value that keeps the original aspect ratio. + # 2 = The same but based on the width. We try make the image the + # biggest size we can while stil fitting inside the box size + # 3 = Depending whether the image is landscape or portrait, this + # will automatically determine whether to resize via + # dimension 1,2 or 0 + # 4 = Will resize and then crop the image for best fit + # + # forceStretch can be applied to options 1,2,3 and 4 + # + { + + // *** We can pass in an array of options to change the crop position + $cropPos = 'm'; + if (is_array($option) && fix_strtolower($option[0]) == 'crop') { + $cropPos = $option[1]; # get the crop option + } else if (strpos($option, '-') !== false) { + // *** Or pass in a hyphen seperated option + $optionPiecesArray = explode('-', $option); + $cropPos = end($optionPiecesArray); + } + + // *** Check the option is valid + $option = $this->prepOption($option); + + // *** Make sure the file passed in is valid + if (!$this->image) { if ($this->debug) { throw new Exception('file ' . $this->getFileName() .' is missing or invalid'); }else{ throw new Exception(); }}; + + // *** Get optimal width and height - based on $option + $dimensionsArray = $this->getDimensions($newWidth, $newHeight, $option); + + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + + // *** Resample - create image canvas of x, y size + $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); + $this->keepTransparancy($optimalWidth, $optimalHeight, $this->imageResized); + imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); + + + // *** If '4', then crop too + if ($option == 4 || $option == 'crop') { + + if (($optimalWidth >= $newWidth && $optimalHeight >= $newHeight)) { + $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos); + } + } + + // *** If Rotate. + if ($autoRotate) { + + $exifData = $this->getExif(false); + if (count($exifData) > 0) { + + switch($exifData['orientation']) { + case 8: + $this->imageResized = imagerotate($this->imageResized,90,0); + break; + case 3: + $this->imageResized = imagerotate($this->imageResized,180,0); + break; + case 6: + $this->imageResized = imagerotate($this->imageResized,-90,0); + break; + } + } + } + + // *** Sharpen image (if jpg and the user wishes to do so) + if ($sharpen && in_array($this->fileExtension, $this->sharpenArray)) { + + // *** Sharpen + $this->sharpen(); + } + } + +## -------------------------------------------------------- + + public function cropImage($newWidth, $newHeight, $cropPos = 'm') + # Author: Jarrod Oberto + # Date: 08-09-11 + # Purpose: Crops the image + # Param in: $newWidth: crop with + # $newHeight: crop height + # $cropPos: Can be any of the following: + # tl, t, tr, l, m, r, bl, b, br, auto + # Or: + # a custom position such as '30x50' + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Make sure the file passed in is valid + if (!$this->image) { if ($this->debug) { throw new Exception('file ' . $this->getFileName() .' is missing or invalid'); }else{ throw new Exception(); }}; + + $this->imageResized = $this->image; + $this->crop($this->width, $this->height, $newWidth, $newHeight, $cropPos); + + } + +## -------------------------------------------------------- + + private function keepTransparancy($width, $height, $im) + # Author: Jarrod Oberto + # Date: 08-04-11 + # Purpose: Keep transparency for png and gif image + # Param in: + # Param out: n/a + # Reference: + # Notes: + # + { + // *** If PNG, perform some transparency retention actions (gif untested) + if (in_array($this->fileExtension, $this->transparentArray) && $this->keepTransparency) { + imagealphablending($im, false); + imagesavealpha($im, true); + $transparent = imagecolorallocatealpha($im, 255, 255, 255, 127); + imagefilledrectangle($im, 0, 0, $width, $height, $transparent); + } else { + $color = imagecolorallocate($im, $this->fillColorArray['r'], $this->fillColorArray['g'], $this->fillColorArray['b']); + imagefilledrectangle($im, 0, 0, $width, $height, $color); + } + } + +## -------------------------------------------------------- + + private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos) + # Author: Jarrod Oberto + # Date: 15-09-08 + # Purpose: Crops the image + # Param in: $newWidth: + # $newHeight: + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Get cropping co-ordinates + $cropArray = $this->getCropPlacing($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos); + $cropStartX = $cropArray['x']; + $cropStartY = $cropArray['y']; + + // *** Crop this bad boy + $crop = imagecreatetruecolor($newWidth , $newHeight); + $this->keepTransparancy($optimalWidth, $optimalHeight, $crop); + imagecopyresampled($crop, $this->imageResized, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight); + + $this->imageResized = $crop; + + // *** Set new width and height to our variables + $this->width = $newWidth; + $this->height = $newHeight; + + } + +## -------------------------------------------------------- + + private function getCropPlacing($optimalWidth, $optimalHeight, $newWidth, $newHeight, $pos='m') + # + # Author: Jarrod Oberto + # Date: July 11 + # Purpose: Set the cropping area. + # Params in: + # Params out: (array) the crop x and y co-ordinates. + # Notes: When specifying the exact pixel crop position (eg 10x15), be + # very careful as it's easy to crop out of the image leaving + # black borders. + # + { + $pos = fix_strtolower($pos); + + // *** If co-ords have been entered + if (strstr($pos, 'x')) { + $pos = str_replace(' ', '', $pos); + + $xyArray = explode('x', $pos); + list($cropStartX, $cropStartY) = $xyArray; + + } else { + + switch ($pos) { + case 'tl': + $cropStartX = 0; + $cropStartY = 0; + break; + + case 't': + $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); + $cropStartY = 0; + break; + + case 'tr': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = 0; + break; + + case 'l': + $cropStartX = 0; + $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 ); + break; + + case 'm': + $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); + $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 ); + break; + + case 'r': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 ); + break; + + case 'bl': + $cropStartX = 0; + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'b': + $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'br': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'auto': + // *** If image is a portrait crop from top, not center. v1.5 + if ($optimalHeight > $optimalWidth) { + $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); + $cropStartY = ($this->cropFromTopPercent /100) * $optimalHeight; + } else { + + // *** Else crop from the center + $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); + $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 ); + } + break; + + default: + // *** Default to center + $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); + $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 ); + break; + } + } + + return array('x' => $cropStartX, 'y' => $cropStartY); + } + +## -------------------------------------------------------- + + private function getDimensions($newWidth, $newHeight, $option) + # Author: Jarrod Oberto + # Date: 17-11-09 + # Purpose: Get new image dimensions based on user specificaions + # Param in: $newWidth: + # $newHeight: + # Param out: Array of new width and height values + # Reference: + # Notes: If $option = 3 then this function is call recursivly + # + # To clarify the $option input: + # 0 = The exact height and width dimensions you set. + # 1 = Whatever height is passed in will be the height that + # is set. The width will be calculated and set automatically + # to a the value that keeps the original aspect ratio. + # 2 = The same but based on the width. + # 3 = Depending whether the image is landscape or portrait, this + # will automatically determine whether to resize via + # dimension 1,2 or 0. + # 4 = Resize the image as much as possible, then crop the + # remainder. + { + + switch (strval($option)) + { + case '0': + case 'exact': + $optimalWidth = $newWidth; + $optimalHeight= $newHeight; + break; + case '1': + case 'portrait': + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '2': + case 'landscape': + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '3': + case 'auto': + $dimensionsArray = $this->getSizeByAuto($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '4': + case 'crop': + $dimensionsArray = $this->getOptimalCrop($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + } + + return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); + } + +## -------------------------------------------------------- + + private function getSizeByFixedHeight($newWidth, $newHeight) + { + // *** If forcing is off... + if (!$this->forceStretch) { + + // *** ...check if actual height is less than target height + if ($this->height < $newHeight) { + return array('optimalWidth' => $this->width, 'optimalHeight' => $this->height); + } + } + + $ratio = $this->width / $this->height; + + $newWidth = $newHeight * $ratio; + + //return $newWidth; + return array('optimalWidth' => $newWidth, 'optimalHeight' => $newHeight); + } + +## -------------------------------------------------------- + + private function getSizeByFixedWidth($newWidth, $newHeight) + { + // *** If forcing is off... + if (!$this->forceStretch) { + + // *** ...check if actual width is less than target width + if ($this->width < $newWidth) { + return array('optimalWidth' => $this->width, 'optimalHeight' => $this->height); + } + } + + $ratio = $this->height / $this->width; + + $newHeight = $newWidth * $ratio; + + //return $newHeight; + return array('optimalWidth' => $newWidth, 'optimalHeight' => $newHeight); + } + +## -------------------------------------------------------- + + private function getSizeByAuto($newWidth, $newHeight) + # Author: Jarrod Oberto + # Date: 19-08-08 + # Purpose: Depending on the height, choose to resize by 0, 1, or 2 + # Param in: The new height and new width + # Notes: + # + { + // *** If forcing is off... + if (!$this->forceStretch) { + + // *** ...check if actual size is less than target size + if ($this->width < $newWidth && $this->height < $newHeight) { + return array('optimalWidth' => $this->width, 'optimalHeight' => $this->height); + } + } + + if ($this->height < $this->width) + // *** Image to be resized is wider (landscape) + { + //$optimalWidth = $newWidth; + //$optimalHeight= $this->getSizeByFixedWidth($newWidth); + + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + elseif ($this->height > $this->width) + // *** Image to be resized is taller (portrait) + { + //$optimalWidth = $this->getSizeByFixedHeight($newHeight); + //$optimalHeight= $newHeight; + + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + // *** Image to be resizerd is a square + { + + if ($newHeight < $newWidth) { + //$optimalWidth = $newWidth; + //$optimalHeight= $this->getSizeByFixedWidth($newWidth); + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } else if ($newHeight > $newWidth) { + //$optimalWidth = $this->getSizeByFixedHeight($newHeight); + //$optimalHeight= $newHeight; + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } else { + // *** Sqaure being resized to a square + $optimalWidth = $newWidth; + $optimalHeight= $newHeight; + } + } + + return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); + } + +## -------------------------------------------------------- + + private function getOptimalCrop($newWidth, $newHeight) + # Author: Jarrod Oberto + # Date: 17-11-09 + # Purpose: Get optimal crop dimensions + # Param in: width and height as requested by user (fig 3) + # Param out: Array of optimal width and height (fig 2) + # Reference: + # Notes: The optimal width and height return are not the same as the + # same as the width and height passed in. For example: + # + # + # |-----------------| |------------| |-------| + # | | => |**| |**| => | | + # | | |**| |**| | | + # | | |------------| |-------| + # |-----------------| + # original optimal crop + # size size size + # Fig 1 2 3 + # + # 300 x 250 150 x 125 150 x 100 + # + # The optimal size is the smallest size (that is closest to the crop size) + # while retaining proportion/ratio. + # + # The crop size is the optimal size that has been cropped on one axis to + # make the image the exact size specified by the user. + # + # * represent cropped area + # + { + + // *** If forcing is off... + if (!$this->forceStretch) { + + // *** ...check if actual size is less than target size + if ($this->width < $newWidth && $this->height < $newHeight) { + return array('optimalWidth' => $this->width, 'optimalHeight' => $this->height); + } + } + + $heightRatio = $this->height / $newHeight; + $widthRatio = $this->width / $newWidth; + + if ($heightRatio < $widthRatio) { + $optimalRatio = $heightRatio; + } else { + $optimalRatio = $widthRatio; + } + + $optimalHeight = round( $this->height / $optimalRatio ); + $optimalWidth = round( $this->width / $optimalRatio ); + + return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); + } + +## -------------------------------------------------------- + + private function sharpen() + # Author: Jarrod Oberto + # Date: 08 04 2011 + # Purpose: Sharpen image + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # Credit: Incorporates Joe Lencioni (August 6, 2008) code + { + + if (version_compare(PHP_VERSION, '5.1.0') >= 0) { + + // *** + if ($this->aggresiveSharpening) { # A more aggressive sharpening solution + + $sharpenMatrix = array( array( -1, -1, -1 ), + array( -1, 16, -1 ), + array( -1, -1, -1 ) ); + $divisor = 8; + $offset = 0; + + imageconvolution($this->imageResized, $sharpenMatrix, $divisor, $offset); + } + else # More subtle and personally more desirable + { + $sharpness = $this->findSharp($this->widthOriginal, $this->width); + + $sharpenMatrix = array( + array(-1, -2, -1), + array(-2, $sharpness + 12, -2), //Lessen the effect of a filter by increasing the value in the center cell + array(-1, -2, -1) + ); + $divisor = $sharpness; // adjusts brightness + $offset = 0; + imageconvolution($this->imageResized, $sharpenMatrix, $divisor, $offset); + } + } + else + { + if ($this->debug) { throw new Exception('Sharpening required PHP 5.1.0 or greater.'); } + } + } + + ## -------------------------------------------------------- + + private function sharpen2($level) + { + $sharpenMatrix = array( + array($level, $level, $level), + array($level, (8*$level)+1, $level), //Lessen the effect of a filter by increasing the value in the center cell + array($level, $level, $level) + ); + + } + +## -------------------------------------------------------- + + private function findSharp($orig, $final) + # Author: Ryan Rud (http://adryrun.com) + # Purpose: Find optimal sharpness + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + $final = $final * (750.0 / $orig); + $a = 52; + $b = -0.27810650887573124; + $c = .00047337278106508946; + + $result = $a + $b * $final + $c * $final * $final; + + return max(round($result), 0); + } + +## -------------------------------------------------------- + + private function prepOption($option) + # Author: Jarrod Oberto + # Purpose: Prep option like change the passed in option to lowercase + # Param in: (str/int) $option: eg. 'exact', 'crop'. 0, 4 + # Param out: lowercase string + # Reference: + # Notes: + # + { + if (is_array($option)) { + if (fix_strtolower($option[0]) == 'crop' && count($option) == 2) { + return 'crop'; + } else { + throw new Exception('Crop resize option array is badly formatted.'); + } + } else if (strpos($option, 'crop') !== false) { + return 'crop'; + } + + if (is_string($option)) { + return fix_strtolower($option); + } + + return $option; + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Presets +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +# +# Preset are pre-defined templates you can apply to your image. +# +# These are inteded to be applied to thumbnail images. +# + + + public function borderPreset($preset) + { + switch ($preset) + { + + case 'simple': + $this->addBorder(7, '#fff'); + $this->addBorder(6, '#f2f1f0'); + $this->addBorder(2, '#fff'); + $this->addBorder(1, '#ccc'); + break; + default: + break; + } + + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Draw border +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addBorder($thickness = 1, $rgbArray = array(255, 255, 255)) + # Author: Jarrod Oberto + # Date: 05-05-11 + # Purpose: Add a border to the image + # Param in: + # Param out: + # Reference: + # Notes: This border is added to the INSIDE of the image + # + { + if ($this->imageResized) { + + $rgbArray = $this->formatColor($rgbArray); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + + $x1 = 0; + $y1 = 0; + $x2 = ImageSX($this->imageResized) - 1; + $y2 = ImageSY($this->imageResized) - 1; + + $rgbArray = ImageColorAllocate($this->imageResized, $r, $g, $b); + + + for($i = 0; $i < $thickness; $i++) { + ImageRectangle($this->imageResized, $x1++, $y1++, $x2--, $y2--, $rgbArray); + } + } + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Gray Scale +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function greyScale() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image greyscale + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + } + + } + + ## -------------------------------------------------------- + + public function greyScaleEnhanced() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image greyscale + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -15); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, 2); + $this->sharpen($this->width); + } + } + + ## -------------------------------------------------------- + + public function greyScaleDramatic() + # Alias of gd_filter_monopin + { + $this->gd_filter_monopin(); + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Black 'n White +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function blackAndWhite() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image black and white + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) { + + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -1000); + } + + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Negative +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function negative() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image negative + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) { + + imagefilter($this->imageResized, IMG_FILTER_NEGATE); + } + + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Sepia +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function sepia() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image sepia + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, -10); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -20); + imagefilter($this->imageResized, IMG_FILTER_COLORIZE, 60, 30, -15); + } + } + + ## -------------------------------------------------------- + + public function sepia2() + + { + if ($this->imageResized) { + + $total = imagecolorstotal( $this->imageResized ); + for ( $i = 0; $i < $total; $i++ ) { + $index = imagecolorsforindex( $this->imageResized, $i ); + $red = ( $index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189 ) / 1.351; + $green = ( $index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168 ) / 1.203; + $blue = ( $index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131 ) / 2.140; + imagecolorset( $this->imageResized, $i, $red, $green, $blue ); + } + + + } + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Vintage +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function vintage() + # Alias of gd_filter_monopin + { + $this->gd_filter_vintage(); + } + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Presets By Marc Hibbins +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + /** Apply 'Monopin' preset */ + public function gd_filter_monopin() + { + + if ($this->imageResized) { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, -15); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -15); + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'vignette', 100); + } + } + + ## -------------------------------------------------------- + + public function gd_filter_vintage() + { + if ($this->imageResized) { + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'vignette', 45); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, 20); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -35); + imagefilter($this->imageResized, IMG_FILTER_COLORIZE, 60, -10, 35); + imagefilter($this->imageResized, IMG_FILTER_SMOOTH, 7); + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'scratch', 10); + } + } + + ## -------------------------------------------------------- + + /** Apply a PNG overlay */ + private function gd_apply_overlay($im, $type, $amount) + # + # Original Author: Marc Hibbins + # License: Attribution-ShareAlike 3.0 + # Purpose: + # Params in: + # Params out: + # Notes: + # + { + $width = imagesx($im); + $height = imagesy($im); + $filter = imagecreatetruecolor($width, $height); + + imagealphablending($filter, false); + imagesavealpha($filter, true); + + $transparent = imagecolorallocatealpha($filter, 255, 255, 255, 127); + imagefilledrectangle($filter, 0, 0, $width, $height, $transparent); + + // *** Resize overlay + $overlay = $this->filterOverlayPath . '/' . $type . '.png'; + $png = imagecreatefrompng($overlay); + imagecopyresampled($filter, $png, 0, 0, 0, 0, $width, $height, imagesx($png), imagesy($png)); + + $comp = imagecreatetruecolor($width, $height); + imagecopy($comp, $im, 0, 0, 0, 0, $width, $height); + imagecopy($comp, $filter, 0, 0, 0, 0, $width, $height); + imagecopymerge($im, $comp, 0, 0, 0, 0, $width, $height, $amount); + + imagedestroy($comp); + return $im; + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Colorise +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function image_colorize($rgb) { + imageTrueColorToPalette($this->imageResized,true,256); + $numColors = imageColorsTotal($this->imageResized); + + for ($x = 0; $x < $numColors; $x++) { + list($r,$g,$b) = array_values(imageColorsForIndex($this->imageResized,$x)); + + // calculate grayscale in percent + $grayscale = ($r + $g + $b) / 3 / 0xff; + + imageColorSet($this->imageResized,$x, + $grayscale * $rgb[0], + $grayscale * $rgb[1], + $grayscale * $rgb[2] + ); + + } + + return true; + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Reflection +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addReflection($reflectionHeight = 50, $startingTransparency = 30, $inside = false, $bgColor = '#fff', $stretch=false, $divider = 0) + { + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + $im = $this->imageResized; + $li = imagecreatetruecolor($this->width, 1); + + $bgc = imagecolorallocate($li, $r, $g, $b); + imagefilledrectangle($li, 0, 0, $this->width, 1, $bgc); + + $bg = imagecreatetruecolor($this->width, $reflectionHeight); + $wh = imagecolorallocate($im, 255, 255, 255); + + $im = imagerotate($im, -180, $wh); + imagecopyresampled($bg, $im, 0, 0, 0, 0, $this->width, $this->height, $this->width, $this->height); + + $im = $bg; + + $bg = imagecreatetruecolor($this->width, $reflectionHeight); + + for ($x = 0; $x < $this->width; $x++) { + imagecopy($bg, $im, $x, 0, $this->width-$x -1, 0, 1, $reflectionHeight); + } + $im = $bg; + + $transaprencyAmount = $this->invertTransparency($startingTransparency, 100); + + + // *** Fade + if ($stretch) { + $step = 100/($reflectionHeight + $startingTransparency); + } else{ + $step = 100/$reflectionHeight; + } + for($i=0; $i<=$reflectionHeight; $i++){ + + if($startingTransparency>100) $startingTransparency = 100; + if($startingTransparency< 1) $startingTransparency = 1; + imagecopymerge($bg, $li, 0, $i, 0, 0, $this->width, 1, $startingTransparency); + $startingTransparency+=$step; + } + + // *** Apply fade + imagecopymerge($im, $li, 0, 0, 0, 0, $this->width, $divider, 100); // Divider + + + // *** width, height of reflection. + $x = imagesx($im); + $y = imagesy($im); + + + // *** Determines if the reflection should be displayed inside or outside the image + if ($inside) { + + // Create new blank image with sizes. + $final = imagecreatetruecolor($this->width, $this->height); + + imagecopymerge ($final, $this->imageResized, 0, 0, 0, $reflectionHeight, $this->width, $this->height - $reflectionHeight, 100); + imagecopymerge ($final, $im, 0, $this->height - $reflectionHeight, 0, 0, $x, $y, 100); + + } else { + + // Create new blank image with sizes. + $final = imagecreatetruecolor($this->width, $this->height + $y); + + imagecopymerge ($final, $this->imageResized, 0, 0, 0, 0, $this->width, $this->height, 100); + imagecopymerge ($final, $im, 0, $this->height, 0, 0, $x, $y, 100); + } + + $this->imageResized = $final; + + imagedestroy($li); + imagedestroy($im); + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Rotate +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function rotate($value = 90, $bgColor = 'transparent') + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Rotate image + # Param in: (mixed) $degrees: (int) number of degress to rotate image + # (str) param "left": rotate left + # (str) param "right": rotate right + # (str) param "upside": upside-down image + # Param out: + # Reference: + # Notes: The default direction of imageRotate() is counter clockwise. + # + { + if ($this->imageResized) { + + if (is_integer($value)) { + $degrees = $value; + } + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + if (isset($rgbArray['a'])) {$a = $rgbArray['a']; } + + if (is_string($value)) { + + $value = fix_strtolower($value); + + switch ($value) { + case 'left': + $degrees = 90; + break; + case 'right': + $degrees = 270; + break; + case 'upside': + $degrees = 180; + break; + default: + break; + } + + } + + // *** The default direction of imageRotate() is counter clockwise + // * This makes it clockwise + $degrees = 360 - $degrees; + + // *** Create background color + $bg = ImageColorAllocateAlpha($this->imageResized, $r, $g, $b, $a); + + // *** Fill with background + ImageFill($this->imageResized, 0, 0 , $bg); + + // *** Rotate + $this->imageResized = imagerotate($this->imageResized, $degrees, $bg); // Rotate 45 degrees and allocated the transparent colour as the one to make transparent (obviously) + + // Ensure alpha transparency + ImageSaveAlpha($this->imageResized,true); + + } + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Round corners +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function roundCorners($radius = 5, $bgColor = 'transparent') + # Author: Jarrod Oberto + # Date: 19-05-2011 + # Purpose: Create rounded corners on your image + # Param in: (int) radius = the amount of curvature + # (mixed) $bgColor = the corner background color + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Check if the user wants transparency + $isTransparent = false; + if (!is_array($bgColor)) { + if (fix_strtolower($bgColor) == 'transparent') { + $isTransparent = true; + } + } + + + // *** If we use transparency, we need to color our curved mask with a unique color + if ($isTransparent) { + $bgColor = $this->findUnusedGreen(); + } + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + if (isset($rgbArray['a'])) {$a = $rgbArray['a']; } + + + + // *** Create top-left corner mask (square) + $cornerImg = imagecreatetruecolor($radius, $radius); + //$cornerImg = imagecreate($radius, $radius); + + //imagealphablending($cornerImg, true); + //imagesavealpha($cornerImg, true); + + //imagealphablending($this->imageResized, false); + //imagesavealpha($this->imageResized, true); + + // *** Give it a color + $maskColor = imagecolorallocate($cornerImg, 0, 0, 0); + + + + // *** Replace the mask color (black) to transparent + imagecolortransparent($cornerImg, $maskColor); + + + + // *** Create the image background color + $imagebgColor = imagecolorallocate($cornerImg, $r, $g, $b); + + + + // *** Fill the corner area to the user defined color + imagefill($cornerImg, 0, 0, $imagebgColor); + + + imagefilledellipse($cornerImg, $radius, $radius, $radius * 2, $radius * 2, $maskColor ); + + + // *** Map to top left corner + imagecopymerge($this->imageResized, $cornerImg, 0, 0, 0, 0, $radius, $radius, 100); #tl + + // *** Map rounded corner to other corners by rotating and applying the mask + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, 0, $this->height - $radius, 0, 0, $radius, $radius, 100); #bl + + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, $this->width - $radius, $this->height - $radius, 0, 0, $radius, $radius, 100); #br + + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, $this->width - $radius, 0, 0, 0, $radius, $radius, 100); #tr + + + // *** If corners are to be transparent, we fill our chromakey color as transparent. + if ($isTransparent) { + //imagecolortransparent($this->imageResized, $imagebgColor); + $this->imageResized = $this->transparentImage($this->imageResized); + imagesavealpha($this->imageResized, true); + } + + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Shadow +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addShadow($shadowAngle=45, $blur=15, $bgColor='transparent') + # + # Author: Jarrod Oberto (Adapted from Pascal Naidon) + # Ref: http://www.les-stooges.org/pascal/webdesign/vignettes/index.php?la=en + # Purpose: Add a drop shadow to your image + # Params in: (int) $angle: the angle of the shadow + # (int) $blur: the blur distance + # (mixed) $bgColor: the color of the background + # Params out: + # Notes: + # + { + // *** A higher number results in a smoother shadow + define('STEPS', $blur*2); + + // *** Set the shadow distance + $shadowDistance = $blur*0.25; + + // *** Set blur width and height + $blurWidth = $blurHeight = $blur; + + + if ($shadowAngle == 0) { + $distWidth = 0; + $distHeight = 0; + } else { + $distWidth = $shadowDistance * cos(deg2rad($shadowAngle)); + $distHeight = $shadowDistance * sin(deg2rad($shadowAngle)); + } + + + // *** Convert color + if (fix_strtolower($bgColor) != 'transparent') { + $rgbArray = $this->formatColor($bgColor); + $r0 = $rgbArray['r']; + $g0 = $rgbArray['g']; + $b0 = $rgbArray['b']; + } + + + $image = $this->imageResized; + $width = $this->width; + $height = $this->height; + + + $newImage = imagecreatetruecolor($width, $height); + imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width, $height); + + + // *** RGB + $rgb = imagecreatetruecolor($width+$blurWidth,$height+$blurHeight); + $colour = imagecolorallocate($rgb, 0, 0, 0); + imagefilledrectangle($rgb, 0, 0, $width+$blurWidth, $height+$blurHeight, $colour); + $colour = imagecolorallocate($rgb, 255, 255, 255); + //imagefilledrectangle($rgb, $blurWidth*0.5-$distWidth, $blurHeight*0.5-$distHeight, $width+$blurWidth*0.5-$distWidth, $height+$blurWidth*0.5-$distHeight, $colour); + imagefilledrectangle($rgb, $blurWidth*0.5-$distWidth, $blurHeight*0.5-$distHeight, $width+$blurWidth*0.5-$distWidth, $height+$blurWidth*0.5-$distHeight, $colour); + //imagecopymerge($rgb, $newImage, 1+$blurWidth*0.5-$distWidth, 1+$blurHeight*0.5-$distHeight, 0,0, $width, $height, 100); + imagecopymerge($rgb, $newImage, $blurWidth*0.5-$distWidth, $blurHeight*0.5-$distHeight, 0,0, $width+$blurWidth, $height+$blurHeight, 100); + + + // *** Shadow (alpha) + $shadow = imagecreatetruecolor($width+$blurWidth,$height+$blurHeight); + imagealphablending($shadow, false); + $colour = imagecolorallocate($shadow, 0, 0, 0); + imagefilledrectangle($shadow, 0, 0, $width+$blurWidth, $height+$blurHeight, $colour); + + + for($i=0;$i<=STEPS;$i++) { + + $t = ((1.0*$i)/STEPS); + $intensity = 255*$t*$t; + + $colour = imagecolorallocate($shadow, $intensity, $intensity, $intensity); + $points = array( + $blurWidth*$t, $blurHeight, // Point 1 (x, y) + $blurWidth, $blurHeight*$t, // Point 2 (x, y) + $width, $blurHeight*$t, // Point 3 (x, y) + $width+$blurWidth*(1-$t), $blurHeight, // Point 4 (x, y) + $width+$blurWidth*(1-$t), $height, // Point 5 (x, y) + $width, $height+$blurHeight*(1-$t), // Point 6 (x, y) + $blurWidth, $height+$blurHeight*(1-$t), // Point 7 (x, y) + $blurWidth*$t, $height // Point 8 (x, y) + ); + imagepolygon($shadow, $points, 8, $colour); + } + + for($i=0;$i<=STEPS;$i++) { + + $t = ((1.0*$i)/STEPS); + $intensity = 255*$t*$t; + + $colour = imagecolorallocate($shadow, $intensity, $intensity, $intensity); + imagefilledarc($shadow, $blurWidth-1, $blurHeight-1, 2*(1-$t)*$blurWidth, 2*(1-$t)*$blurHeight, 180, 268, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $width, $blurHeight-1, 2*(1-$t)*$blurWidth, 2*(1-$t)*$blurHeight, 270, 358, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $width, $height, 2*(1-$t)*$blurWidth, 2*(1-$t)*$blurHeight, 0, 90, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $blurWidth-1, $height, 2*(1-$t)*$blurWidth, 2*(1-$t)*$blurHeight, 90, 180, $colour, IMG_ARC_PIE); + } + + + $colour = imagecolorallocate($shadow, 255, 255, 255); + imagefilledrectangle($shadow, $blurWidth, $blurHeight, $width, $height, $colour); + imagefilledrectangle($shadow, $blurWidth*0.5-$distWidth, $blurHeight*0.5-$distHeight, $width+$blurWidth*0.5-1-$distWidth, $height+$blurHeight*0.5-1-$distHeight, $colour); + + + // *** The magic + imagealphablending($rgb, false); + + for ($theX=0;$theX> 16) & 0xFF; + $g = ($colArray >> 8) & 0xFF; + $b = $colArray & 0xFF; + + // *** Get the alpha value for every pixel of the shadow image + $colArray = imagecolorat($shadow,$theX,$theY); + $a = $colArray & 0xFF; + $a = 127-floor($a/2); + $t = $a/128.0; + + // *** Create color + if(fix_strtolower($bgColor) == 'transparent') { + $myColour = imagecolorallocatealpha($rgb,$r,$g,$b,$a); + } else { + $myColour = imagecolorallocate($rgb,$r*(1.0-$t)+$r0*$t,$g*(1.0-$t)+$g0*$t,$b*(1.0-$t)+$b0*$t); + } + + // *** Add color to new rgb image + imagesetpixel($rgb, $theX, $theY, $myColour); + } + } + + imagealphablending($rgb, true); + imagesavealpha($rgb, true); + + $this->imageResized = $rgb; + + imagedestroy($image); + imagedestroy($newImage); + imagedestroy($shadow); + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Caption Box +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addCaptionBox($side='b', $thickness=50, $padding=0, $bgColor='#000', $transaprencyAmount=30) + # + # Author: Jarrod Oberto + # Date: 26 May 2011 + # Purpose: Add a caption box + # Params in: (str) $side: the side to add the caption box (t, r, b, or l). + # (int) $thickness: how thick you want the caption box to be. + # (mixed) $bgColor: The color of the caption box. + # (int) $transaprencyAmount: The amount of transparency to be + # applied. + # Params out: n/a + # Notes: + # + { + $side = fix_strtolower($side); + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + $positionArray = $this->calculateCaptionBoxPosition($side, $thickness, $padding); + + // *** Store incase we want to use method addTextToCaptionBox() + $this->captionBoxPositionArray = $positionArray; + + + $transaprencyAmount = $this->invertTransparency($transaprencyAmount, 127, false); + $transparent = imagecolorallocatealpha($this->imageResized, $r, $g, $b, $transaprencyAmount); + imagefilledrectangle($this->imageResized, $positionArray['x1'], $positionArray['y1'], $positionArray['x2'], $positionArray['y2'], $transparent); + } + + ## -------------------------------------------------------- + + public function addTextToCaptionBox($text, $fontColor='#fff', $fontSize = 12, $angle = 0, $font = null) + # + # Author: Jarrod Oberto + # Date: 03 Aug 11 + # Purpose: Simplify adding text to a caption box by automatically + # locating the center of the caption box + # Params in: The usually text paams (less a couple) + # Params out: n/a + # Notes: + # + { + + // *** Get the caption box measurements + if (count($this->captionBoxPositionArray) == 4) { + $x1 = $this->captionBoxPositionArray['x1']; + $x2 = $this->captionBoxPositionArray['x2']; + $y1 = $this->captionBoxPositionArray['y1']; + $y2 = $this->captionBoxPositionArray['y2']; + } else { + if ($this->debug) { throw new Exception('No caption box found.'); }else{ return false; } + } + + + // *** Get text font + $font = $this->getTextFont($font); + + // *** Get text size + $textSizeArray = $this->getTextSize($fontSize, $angle, $font, $text); + $textWidth = $textSizeArray['width']; + $textHeight = $textSizeArray['height']; + + // *** Find the width/height middle points + $boxXMiddle = (($x2 - $x1) / 2); + $boxYMiddle = (($y2 - $y1) / 2); + + // *** Box middle - half the text width/height + $xPos = ($x1 + $boxXMiddle) - ($textWidth/2); + $yPos = ($y1 + $boxYMiddle) - ($textHeight/2); + + $pos = $xPos . 'x' . $yPos; + + $this->addText($text, $pos, $padding = 0, $fontColor, $fontSize, $angle, $font); + + } + + ## -------------------------------------------------------- + + private function calculateCaptionBoxPosition($side, $thickness, $padding) + { + $positionArray = array(); + + switch ($side) { + case 't': + $positionArray['x1'] = 0; + $positionArray['y1'] = $padding; + $positionArray['x2'] = $this->width; + $positionArray['y2'] = $thickness + $padding; + break; + case 'r': + $positionArray['x1'] = $this->width - $thickness - $padding; + $positionArray['y1'] = 0; + $positionArray['x2'] = $this->width - $padding; + $positionArray['y2'] = $this->height; + break; + case 'b': + $positionArray['x1'] = 0; + $positionArray['y1'] = $this->height - $thickness - $padding; + $positionArray['x2'] = $this->width; + $positionArray['y2'] = $this->height - $padding; + break; + case 'l': + $positionArray['x1'] = $padding; + $positionArray['y1'] = 0; + $positionArray['x2'] = $thickness + $padding; + $positionArray['y2'] = $this->height; + break; + + default: + break; + } + + return $positionArray; + + } + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Get EXIF Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function getExif($debug=false) + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Get image EXIF data + # Param in: n/a + # Param out: An associate array of EXIF data + # Reference: + # Notes: + # 23 May 13 : added orientation flag -jco + # + { + + if (!$this->debug || !$debug) { $debug = false; } + + // *** Check all is good - check the EXIF library exists and the file exists, too. + if (!$this->testEXIFInstalled()) { if ($debug) { throw new Exception('The EXIF Library is not installed.'); }else{ return array(); }}; + if (!file_exists($this->fileName)) { if ($debug) { throw new Exception('Image not found.'); }else{ return array(); }}; + if ($this->fileExtension != '.jpg') { if ($debug) { throw new Exception('Metadata not supported for this image type.'); }else{ return array(); }}; + $exifData = exif_read_data($this->fileName, 'IFD0'); + + // *** Format the apperture value + $ev = $exifData['ApertureValue']; + $apPeicesArray = explode('/', $ev); + if (count($apPeicesArray) == 2) { + $apertureValue = round($apPeicesArray[0] / $apPeicesArray[1], 2, PHP_ROUND_HALF_DOWN) . ' EV'; + } else { $apertureValue = '';} + + // *** Format the focal length + $focalLength = $exifData['FocalLength']; + $flPeicesArray = explode('/', $focalLength); + if (count($flPeicesArray) == 2) { + $focalLength = $flPeicesArray[0] / $flPeicesArray[1] . '.0 mm'; + } else { $focalLength = '';} + + // *** Format fNumber + $fNumber = $exifData['FNumber']; + $fnPeicesArray = explode('/', $fNumber); + if (count($fnPeicesArray) == 2) { + $fNumber = $fnPeicesArray[0] / $fnPeicesArray[1]; + } else { $fNumber = '';} + + // *** Resolve ExposureProgram + if (isset($exifData['ExposureProgram'])) { $ep = $exifData['ExposureProgram']; } + if (isset($ep)) { $ep = $this->resolveExposureProgram($ep); } + + + // *** Resolve MeteringMode + $mm = $exifData['MeteringMode']; + $mm = $this->resolveMeteringMode($mm); + + // *** Resolve Flash + $flash = $exifData['Flash']; + $flash = $this->resolveFlash($flash); + + + if (isset($exifData['Make'])) { + $exifDataArray['make'] = $exifData['Make']; + } else { $exifDataArray['make'] = ''; } + + if (isset($exifData['Model'])) { + $exifDataArray['model'] = $exifData['Model']; + } else { $exifDataArray['model'] = ''; } + + if (isset($exifData['DateTime'])) { + $exifDataArray['date'] = $exifData['DateTime']; + } else { $exifDataArray['date'] = ''; } + + if (isset($exifData['ExposureTime'])) { + $exifDataArray['exposure time'] = $exifData['ExposureTime'] . ' sec.'; + } else { $exifDataArray['exposure time'] = ''; } + + if ($apertureValue != '') { + $exifDataArray['aperture value'] = $apertureValue; + } else { $exifDataArray['aperture value'] = ''; } + + if (isset($exifData['COMPUTED']['ApertureFNumber'])) { + $exifDataArray['f-stop'] = $exifData['COMPUTED']['ApertureFNumber']; + } else { $exifDataArray['f-stop'] = ''; } + + if (isset($exifData['FNumber'])) { + $exifDataArray['fnumber'] = $exifData['FNumber']; + } else { $exifDataArray['fnumber'] = ''; } + + if ($fNumber != '') { + $exifDataArray['fnumber value'] = $fNumber; + } else { $exifDataArray['fnumber value'] = ''; } + + if (isset($exifData['ISOSpeedRatings'])) { + $exifDataArray['iso'] = $exifData['ISOSpeedRatings']; + } else { $exifDataArray['iso'] = ''; } + + if ($focalLength != '') { + $exifDataArray['focal length'] = $focalLength; + } else { $exifDataArray['focal length'] = ''; } + + if (isset($ep)) { + $exifDataArray['exposure program'] = $ep; + } else { $exifDataArray['exposure program'] = ''; } + + if ($mm != '') { + $exifDataArray['metering mode'] = $mm; + } else { $exifDataArray['metering mode'] = ''; } + + if ($flash != '') { + $exifDataArray['flash status'] = $flash; + } else { $exifDataArray['flash status'] = ''; } + + if (isset($exifData['Artist'])) { + $exifDataArray['creator'] = $exifData['Artist'] ; + } else { $exifDataArray['creator'] = ''; } + + if (isset($exifData['Copyright'])) { + $exifDataArray['copyright'] = $exifData['Copyright']; + } else { $exifDataArray['copyright'] = ''; } + + // *** Orientation + if (isset($exifData['Orientation'])) { + $exifDataArray['orientation'] = $exifData['Orientation']; + } else { $exifDataArray['orientation'] = ''; } + + return $exifDataArray; + } + + ## -------------------------------------------------------- + + private function resolveExposureProgram($ep) + { + switch ($ep) { + case 0: + $ep = ''; + break; + case 1: + $ep = 'manual'; + break; + case 2: + $ep = 'normal program'; + break; + case 3: + $ep = 'aperture priority'; + break; + case 4: + $ep = 'shutter priority'; + break; + case 5: + $ep = 'creative program'; + break; + case 6: + $ep = 'action program'; + break; + case 7: + $ep = 'portrait mode'; + break; + case 8: + $ep = 'landscape mode'; + break; + + default: + break; + } + + return $ep; + } + + ## -------------------------------------------------------- + + private function resolveMeteringMode($mm) + { + switch ($mm) { + case 0: + $mm = 'unknown'; + break; + case 1: + $mm = 'average'; + break; + case 2: + $mm = 'center weighted average'; + break; + case 3: + $mm = 'spot'; + break; + case 4: + $mm = 'multi spot'; + break; + case 5: + $mm = 'pattern'; + break; + case 6: + $mm = 'partial'; + break; + case 255: + $mm = 'other'; + break; + + default: + break; + } + + return $mm; + } + + ## -------------------------------------------------------- + + private function resolveFlash($flash) + { + switch ($flash) { + case 0: + $flash = 'flash did not fire'; + break; + case 1: + $flash = 'flash fired'; + break; + case 5: + $flash = 'strobe return light not detected'; + break; + case 7: + $flash = 'strobe return light detected'; + break; + case 9: + $flash = 'flash fired, compulsory flash mode'; + break; + case 13: + $flash = 'flash fired, compulsory flash mode, return light not detected'; + break; + case 15: + $flash = 'flash fired, compulsory flash mode, return light detected'; + break; + case 16: + $flash = 'flash did not fire, compulsory flash mode'; + break; + case 24: + $flash = 'flash did not fire, auto mode'; + break; + case 25: + $flash = 'flash fired, auto mode'; + break; + case 29: + $flash = 'flash fired, auto mode, return light not detected'; + break; + case 31: + $flash = 'flash fired, auto mode, return light detected'; + break; + case 32: + $flash = 'no flash function'; + break; + case 65: + $flash = 'flash fired, red-eye reduction mode'; + break; + case 69: + $flash = 'flash fired, red-eye reduction mode, return light not detected'; + break; + case 71: + $flash = 'flash fired, red-eye reduction mode, return light detected'; + break; + case 73: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode'; + break; + case 77: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode, return light not detected'; + break; + case 79: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode, return light detected'; + break; + case 89: + $flash = 'flash fired, auto mode, red-eye reduction mode'; + break; + case 93: + $flash = 'flash fired, auto mode, return light not detected, red-eye reduction mode'; + break; + case 95: + $flash = 'flash fired, auto mode, return light detected, red-eye reduction mode'; + break; + + default: + break; + } + + return $flash; + + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Get IPTC Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Write IPTC Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function writeIPTCcaption($value) + # Caption + { + $this->writeIPTC(120, $value); + } + + ## -------------------------------------------------------- + + public function writeIPTCwriter($value) + { + //$this->writeIPTC(65, $value); + } + + ## -------------------------------------------------------- + + private function writeIPTC($dat, $value) + { + + # LIMIT TO JPG + + $caption_block = $this->iptc_maketag(2, $dat, $value); + $image_string = iptcembed($caption_block, $this->fileName); + file_put_contents('iptc.jpg', $image_string); + } + +## -------------------------------------------------------- + + private function iptc_maketag($rec,$dat,$val) + # Author: Thies C. Arntzen + # Purpose: Function to format the new IPTC text + # Param in: $rec: Application record. (We’re working with #2) + # $dat: Index. (120 for caption, 118 for contact. See the IPTC IIM + # specification: + # http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf + # $val: Value/data/text. Make sure this is within the length + # constraints of the IPTC IIM specification + # Ref: http://blog.peterhaza.no/working-with-image-meta-data-in-exif-and-iptc-headers-from-php/ + # http://php.net/manual/en/function.iptcembed.php + # + { + $len = strlen($val); + if ($len < 0x8000) + return chr(0x1c).chr($rec).chr($dat). + chr($len >> 8). + chr($len & 0xff). + $val; + else + return chr(0x1c).chr($rec).chr($dat). + chr(0x80).chr(0x04). + chr(($len >> 24) & 0xff). + chr(($len >> 16) & 0xff). + chr(($len >> 8 ) & 0xff). + chr(($len ) & 0xff). + $val; + } + + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Write XMP Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + //http://xmpphptoolkit.sourceforge.net/ + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Text +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addText($text, $pos = '20x20', $padding = 0, $fontColor='#fff', $fontSize = 12, $angle = 0, $font = null) + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Add text to an image + # Param in: + # Param out: + # Reference: http://php.net/manual/en/function.imagettftext.php + # Notes: Make sure you supply the font. + # + { + + // *** Convert color + $rgbArray = $this->formatColor($fontColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + // *** Get text font + $font = $this->getTextFont($font); + + // *** Get text size + $textSizeArray = $this->getTextSize($fontSize, $angle, $font, $text); + $textWidth = $textSizeArray['width']; + $textHeight = $textSizeArray['height']; + + // *** Find co-ords to place text + $posArray = $this->calculatePosition($pos, $padding, $textWidth, $textHeight, false); + $x = $posArray['width']; + $y = $posArray['height']; + + $fontColor = imagecolorallocate($this->imageResized, $r, $g, $b); + + // *** Add text + imagettftext($this->imageResized, $fontSize, $angle, $x, $y, $fontColor, $font, $text); + } + + ## -------------------------------------------------------- + + private function getTextFont($font) + { + // *** Font path (shou + $fontPath = dirname(__FILE__) . '/' . $this->fontDir; + + + // *** The below is/may be needed depending on your version (see ref) + putenv('GDFONTPATH=' . realpath('.')); + + // *** Check if the passed in font exsits... + if ($font == null || !file_exists($font)) { + + // *** ...If not, default to this font. + $font = $fontPath . '/arimo.ttf'; + + // *** Check our default font exists... + if (!file_exists($font)) { + + // *** If not, return false + if ($this->debug) { throw new Exception('Font not found'); }else{ return false; } + } + } + + return $font; + + } + + ## -------------------------------------------------------- + + private function getTextSize($fontSize, $angle, $font, $text) + { + + // *** Define box (so we can get the width) + $box = @imageTTFBbox($fontSize, $angle, $font, $text); + + // *** Get width of text from dimensions + $textWidth = abs($box[4] - $box[0]); + + // *** Get height of text from dimensions (should also be same as $fontSize) + $textHeight = abs($box[5] - $box[1]); + + return array('height' => $textHeight, 'width' => $textWidth); + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Watermark +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addWatermark($watermarkImage, $pos, $padding = 0, $opacity = 0) + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Add watermark image + # Param in: (str) $watermark: The watermark image + # (str) $pos: Could be a pre-determined position such as: + # tl = top left, + # t = top (middle), + # tr = top right, + # l = left, + # m = middle, + # r = right, + # bl = bottom left, + # b = bottom (middle), + # br = bottom right + # Or, it could be a co-ordinate position such as: 50x100 + # + # (int) $padding: If using a pre-determined position you can + # adjust the padding from the edges by passing an amount + # in pixels. If using co-ordinates, this value is ignored. + # Param out: + # Reference: http://www.php.net/manual/en/image.examples-watermark.php + # Notes: Based on example in reference. + # + # + { + + // Load the stamp and the photo to apply the watermark to + $stamp = $this->openImage ($watermarkImage); # stamp + $im = $this->imageResized; # photo + + // *** Get stamps width and height + $sx = imagesx($stamp); + $sy = imagesy($stamp); + + // *** Find co-ords to place image + $posArray = $this->calculatePosition($pos, $padding, $sx, $sy); + $x = $posArray['width']; + $y = $posArray['height']; + + // *** Set watermark opacity + if (fix_strtolower(strrchr($watermarkImage, '.')) == '.png') { + + $opacity = $this->invertTransparency($opacity, 100); + $this->filterOpacity($stamp, $opacity); + } + + // Copy the watermark image onto our photo + imagecopy($im, $stamp, $x, $y, 0, 0, imagesx($stamp), imagesy($stamp)); + + } + + ## -------------------------------------------------------- + + private function calculatePosition($pos, $padding, $assetWidth, $assetHeight, $upperLeft = true) + # + # Author: Jarrod Oberto + # Date: 08-05-11 + # Purpose: Calculate the x, y pixel cordinates of the asset to place + # Params in: (str) $pos: Either something like: "tl", "l", "br" or an + # exact position like: "100x50" + # (int) $padding: The amount of padding from the edge. Only + # used for the predefined $pos. + # (int) $assetWidth: The width of the asset to add to the image + # (int) $assetHeight: The height of the asset to add to the image + # (bol) $upperLeft: if true, the asset will be positioned based + # on the upper left x, y coords. If false, it means you're + # using the lower left as the basepoint and this will + # convert it to the upper left position + # Params out: + # NOTE: this is done from the UPPER left corner!! But will convert lower + # left basepoints to upper left if $upperleft is set to false + # + # + { + $pos = fix_strtolower($pos); + + // *** If co-ords have been entered + if (strstr($pos, 'x')) { + $pos = str_replace(' ', '', $pos); + + $xyArray = explode('x', $pos); + list($width, $height) = $xyArray; + + } else { + + switch ($pos) { + case 'tl': + $width = 0 + $padding; + $height = 0 + $padding; + break; + + case 't': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = 0 + $padding; + break; + + case 'tr': + $width = $this->width - $assetWidth - $padding; + $height = 0 + $padding;; + break; + + case 'l': + $width = 0 + $padding; + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'm': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'r': + $width = $this->width - $assetWidth - $padding; + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'bl': + $width = 0 + $padding; + $height = $this->height - $assetHeight - $padding; + break; + + case 'b': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = $this->height - $assetHeight - $padding; + break; + + case 'br': + $width = $this->width - $assetWidth - $padding; + $height = $this->height - $assetHeight - $padding; + break; + + default: + $width = 0; + $height = 0; + break; + } + } + + if (!$upperLeft) { + $height = $height + $assetHeight; + } + + return array('width' => $width, 'height' => $height); + } + + + ## -------------------------------------------------------- + + private function filterOpacity(&$img, $opacity = 75) + # + # Author: aiden dot mail at freemail dot hu + # Author date: 29-03-08 08:16 + # Date added: 08-05-11 + # Purpose: Change opacity of image + # Params in: $img: Image resource id + # (int) $opacity: the opacity amount: 0-100, 100 being not opaque. + # Params out: (bool) true on success, else false + # Ref: http://www.php.net/manual/en/function.imagefilter.php#82162 + # Notes: png only + # + { + + if (!isset($opacity)) { + return false; + } + + if ($opacity == 100) { + return true; + } + + $opacity /= 100; + + //get image width and height + $w = imagesx($img); + $h = imagesy($img); + + //turn alpha blending off + imagealphablending($img, false); + + //find the most opaque pixel in the image (the one with the smallest alpha value) + $minalpha = 127; + for ($x = 0; $x < $w; $x++) + for ($y = 0; $y < $h; $y++) { + $alpha = ( imagecolorat($img, $x, $y) >> 24 ) & 0xFF; + if ($alpha < $minalpha) { + $minalpha = $alpha; + } + } + + //loop through image pixels and modify alpha for each + for ($x = 0; $x < $w; $x++) { + for ($y = 0; $y < $h; $y++) { + //get current alpha value (represents the TANSPARENCY!) + $colorxy = imagecolorat($img, $x, $y); + $alpha = ( $colorxy >> 24 ) & 0xFF; + //calculate new alpha + if ($minalpha !== 127) { + $alpha = 127 + 127 * $opacity * ( $alpha - 127 ) / ( 127 - $minalpha ); + } else { + $alpha += 127 * $opacity; + } + //get the color index with new alpha + $alphacolorxy = imagecolorallocatealpha($img, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha); + //set pixel with the new color + opacity + if (!imagesetpixel($img, $x, $y, $alphacolorxy)) { + + return false; + } + } + } + + return true; + } + +## -------------------------------------------------------- + + private function openImage($file) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: + # Param in: + # Param out: n/a + # Reference: + # Notes: + # + { + + if (!file_exists($file) && !$this->checkStringStartsWith('http://', $file)) { if ($this->debug) { throw new Exception('Image not found.'); }else{ throw new Exception(); }}; + + // *** Get extension + $extension = strrchr($file, '.'); + $extension = fix_strtolower($extension); + switch($extension) + { + case '.jpg': + case '.jpeg': + $img = @imagecreatefromjpeg($file); + break; + case '.gif': + $img = @imagecreatefromgif($file); + break; + case '.png': + $img = @imagecreatefrompng($file); + break; + case '.bmp': + $img = @$this->imagecreatefrombmp($file); + break; + case '.psd': + $img = @$this->imagecreatefrompsd($file); + break; + + + // ... etc + + default: + $img = false; + break; + } + + return $img; + } + +## -------------------------------------------------------- + + public function reset() + # + # Author: Jarrod Oberto + # Date: 30-08-11 + # Purpose: Reset the resource (allow further editing) + # Params in: + # Params out: + # Notes: + # + { + $this->__construct($this->fileName); + } + +## -------------------------------------------------------- + + public function saveImage($savePath, $imageQuality="100") + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Saves the image + # Param in: $savePath: Where to save the image including filename: + # $imageQuality: image quality you want the image saved at 0-100 + # Param out: n/a + # Reference: + # Notes: * gif doesn't have a quality parameter + # * jpg has a quality setting 0-100 (100 being the best) + # * png has a quality setting 0-9 (0 being the best) + # + # * bmp files have no native support for bmp files. We use a + # third party class to save as bmp. + { + + // *** Perform a check or two. + if (!is_resource($this->imageResized)) { if ($this->debug) { throw new Exception('saveImage: This is not a resource.'); }else{ throw new Exception(); }} + $fileInfoArray = pathInfo($savePath); + clearstatcache(); + if (!is_writable($fileInfoArray['dirname'])) { if ($this->debug) { throw new Exception('The path is not writable. Please check your permissions.'); }else{ throw new Exception(); }} + + // *** Get extension + $extension = strrchr($savePath, '.'); + $extension = fix_strtolower($extension); + + $error = ''; + + switch($extension) + { + case '.jpg': + case '.jpeg': + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_JPG) { + imagejpeg($this->imageResized, $savePath, $imageQuality); + } else { $error = 'jpg'; } + break; + + case '.gif': + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_GIF) { + imagegif($this->imageResized, $savePath); + } else { $error = 'gif'; } + break; + + case '.png': + // *** Scale quality from 0-100 to 0-9 + $scaleQuality = round(($imageQuality/100) * 9); + + // *** Invert qualit setting as 0 is best, not 9 + $invertScaleQuality = 9 - $scaleQuality; + + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_PNG) { + imagepng($this->imageResized, $savePath, $invertScaleQuality); + } else { $error = 'png'; } + break; + + case '.bmp': + file_put_contents($savePath, $this->GD2BMPstring($this->imageResized)); + break; + + + // ... etc + + default: + // *** No extension - No save. + $this->errorArray[] = 'This file type (' . $extension . ') is not supported. File not saved.'; + break; + } + + //imagedestroy($this->imageResized); + + // *** Display error if a file type is not supported. + if ($error != '') { + $this->errorArray[] = $error . ' support is NOT enabled. File not saved.'; + } + } + +## -------------------------------------------------------- + + public function displayImage($fileType = 'jpg', $imageQuality="100") + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Display images directly to the browser + # Param in: The image type you want to display + # Param out: + # Reference: + # Notes: + # + { + + if (!is_resource($this->imageResized)) { if ($this->debug) { throw new Exception('saveImage: This is not a resource.'); }else{ throw new Exception(); }} + + switch($fileType) + { + case 'jpg': + case 'jpeg': + header('Content-type: image/jpeg'); + imagejpeg($this->imageResized, '', $imageQuality); + break; + case 'gif': + header('Content-type: image/gif'); + imagegif($this->imageResized); + break; + case 'png': + header('Content-type: image/png'); + + // *** Scale quality from 0-100 to 0-9 + $scaleQuality = round(($imageQuality/100) * 9); + + // *** Invert qualit setting as 0 is best, not 9 + $invertScaleQuality = 9 - $scaleQuality; + + imagepng($this->imageResized, '', $invertScaleQuality); + break; + case 'bmp': + echo 'bmp file format is not supported.'; + break; + + // ... etc + + default: + // *** No extension - No save. + break; + } + + + //imagedestroy($this->imageResized); + } + +## -------------------------------------------------------- + + public function setTransparency($bool) + # Sep 2011 + { + $this->keepTransparency = $bool; + } + +## -------------------------------------------------------- + + public function setFillColor($value) + # Sep 2011 + # Param in: (mixed) $value: (array) Could be an array of RGB + # (str) Could be hex #ffffff or #fff, fff, ffffff + # + # If the keepTransparency is set to false, then no transparency is to be used. + # This is ideal when you want to save as jpg. + # + # this method allows you to set the background color to use instead of + # transparency. + # + { + $colorArray = $this->formatColor($value); + $this->fillColorArray = $colorArray; + } + +## -------------------------------------------------------- + + public function setCropFromTop($value) + # Sep 2011 + { + $this->cropFromTopPercent = $value; + } + +## -------------------------------------------------------- + + public function testGDInstalled() + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test to see if GD is installed + # Param in: n/a + # Param out: (bool) True is gd extension loaded otherwise false + # Reference: + # Notes: + # + { + if(extension_loaded('gd') && function_exists('gd_info')) + { + $gdInstalled = true; + } + else + { + $gdInstalled = false; + } + + return $gdInstalled; + } + +## -------------------------------------------------------- + + public function testEXIFInstalled() + # Author: Jarrod Oberto + # Date: 08-05-11 + # Purpose: Test to see if EXIF is installed + # Param in: n/a + # Param out: (bool) True is exif extension loaded otherwise false + # Reference: + # Notes: + # + { + if(extension_loaded('exif')) + { + $exifInstalled = true; + } + else + { + $exifInstalled = false; + } + + return $exifInstalled; + } + +## -------------------------------------------------------- + + public function testIsImage($image) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test if file is an image + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + if ($image) + { + $fileIsImage = true; + } + else + { + $fileIsImage = false; + } + + return $fileIsImage; + } + +## -------------------------------------------------------- + + public function testFunct() + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test Function + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + echo $this->height; + } + +## -------------------------------------------------------- + + public function setForceStretch($value) + # Author: Jarrod Oberto + # Date: 23-12-10 + # Purpose: + # Param in: (bool) $value + # Param out: n/a + # Reference: + # Notes: + # + { + $this->forceStretch = $value; + } + +## -------------------------------------------------------- + + public function setFile($fileName) + # Author: Jarrod Oberto + # Date: 28-02-08 + # Purpose: + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + self::__construct($fileName); + } + +## -------------------------------------------------------- + + public function getFileName() + # Author: Jarrod Oberto + # Date: 10-09-08 + # Purpose: + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + return $this->fileName; + } + +## -------------------------------------------------------- + + public function getHeight() + { + return $this->height; + } + +## -------------------------------------------------------- + + public function getWidth() + { + return $this->width; + } + +## -------------------------------------------------------- + + public function getOriginalHeight() + { + return $this->heightOriginal; + } + +## -------------------------------------------------------- + + public function getOriginalWidth() + { + return $this->widthOriginal; + } + +## -------------------------------------------------------- + + public function getErrors() + # Author: Jarrod Oberto + # Date: 19-11-09 + # Purpose: Returns the error array + # Param in: n/a + # Param out: Array of errors + # Reference: + # Notes: + # + { + return $this->errorArray; + } + +## -------------------------------------------------------- + + private function checkInterlaceImage($isEnabled) + # jpg will use progressive (they don't use interace) + { + if ($isEnabled) { + imageinterlace($this->imageResized, $isEnabled); + } + } + +## -------------------------------------------------------- + + protected function formatColor($value) + # Author: Jarrod Oberto + # Date: 09-05-11 + # Purpose: Determine color method passed in and return color as RGB + # Param in: (mixed) $value: (array) Could be an array of RGB + # (str) Could be hex #ffffff or #fff, fff, ffffff + # Param out: + # Reference: + # Notes: + # + { + $rgbArray = array(); + + // *** If it's an array it should be R, G, B + if (is_array($value)) { + + if (key($value) == 0 && count($value) == 3) { + + $rgbArray['r'] = $value[0]; + $rgbArray['g'] = $value[1]; + $rgbArray['b'] = $value[2]; + + } else { + $rgbArray = $value; + } + } else if (fix_strtolower($value) == 'transparent') { + + $rgbArray = array( + 'r' => 255, + 'g' => 255, + 'b' => 255, + 'a' => 127 + ); + + } else { + + // *** ...Else it should be hex. Let's make it RGB + $rgbArray = $this -> hex2dec($value); + } + + return $rgbArray; + } + + ## -------------------------------------------------------- + + function hex2dec($hex) + # Purpose: Convert #hex color to RGB + { + $color = str_replace('#', '', $hex); + + if (strlen($color) == 3) { + $color = $color . $color; + } + + $rgb = array( + 'r' => hexdec(substr($color, 0, 2)), + 'g' => hexdec(substr($color, 2, 2)), + 'b' => hexdec(substr($color, 4, 2)), + 'a' => 0 + ); + return $rgb; + } + + ## -------------------------------------------------------- + + private function createImageColor ($colorArray) + { + $r = $colorArray['r']; + $g = $colorArray['g']; + $b = $colorArray['b']; + + return imagecolorallocate($this->imageResized, $r, $g, $b); + } + + ## -------------------------------------------------------- + + private function testColorExists($colorArray) + { + $r = $colorArray['r']; + $g = $colorArray['g']; + $b = $colorArray['b']; + + if (imagecolorexact($this->imageResized, $r, $g, $b) == -1) { + return false; + } else { + return true; + } + } + + ## -------------------------------------------------------- + + private function findUnusedGreen() + # Purpose: We find a green color suitable to use like green-screen effect. + # Therefore, the color must not exist in the image. + { + $green = 255; + + do { + + $greenChroma = array(0, $green, 0); + $colorArray = $this->formatColor($greenChroma); + $match = $this->testColorExists($colorArray); + $green--; + + } while ($match == false && $green > 0); + + // *** If no match, just bite the bullet and use green value of 255 + if (!$match) { + $greenChroma = array(0, $green, 0); + } + + return $greenChroma; + } + + ## -------------------------------------------------------- + + private function findUnusedBlue() + # Purpose: We find a green color suitable to use like green-screen effect. + # Therefore, the color must not exist in the image. + { + $blue = 255; + + do { + + $blueChroma = array(0, 0, $blue); + $colorArray = $this->formatColor($blueChroma); + $match = $this->testColorExists($colorArray); + $blue--; + + } while ($match == false && $blue > 0); + + // *** If no match, just bite the bullet and use blue value of 255 + if (!$match) { + $blueChroma = array(0, 0, $blue); + } + + return $blueChroma; + } + + ## -------------------------------------------------------- + + private function invertTransparency($value, $originalMax, $invert=true) + # Purpose: This does two things: + # 1) Convert the range from 0-127 to 0-100 + # 2) Inverts value to 100 is not transparent while 0 is fully + # transparent (like Photoshop) + { + // *** Test max range + if ($value > $originalMax) { + $value = $originalMax; + } + + // *** Test min range + if ($value < 0) { + $value = 0; + } + + if ($invert) { + return $originalMax - (($value/100) * $originalMax); + } else { + return ($value/100) * $originalMax; + } + } + + ## -------------------------------------------------------- + + private function transparentImage($src) + { + // *** making images with white bg transparent + $r1 = 0; + $g1 = 255; + $b1 = 0; + for ($x = 0; $x < imagesx($src); ++$x) { + for ($y = 0; $y < imagesy($src); ++$y) { + $color = imagecolorat($src, $x, $y); + $r = ($color >> 16) & 0xFF; + $g = ($color >> 8) & 0xFF; + $b = $color & 0xFF; + for ($i = 0; $i < 270; $i++) { + //if ($r . $g . $b == ($r1 + $i) . ($g1 + $i) . ($b1 + $i)) { + if ($r == 0 && $g == 255 && $b == 0) { + //if ($g == 255) { + $trans_colour = imagecolorallocatealpha($src, 0, 0, 0, 127); + imagefill($src, $x, $y, $trans_colour); + } + } + } + } + + return $src; + } + + ## -------------------------------------------------------- + + function checkStringStartsWith($needle, $haystack) + # Check if a string starts with a specific pattern + { + return (substr($haystack, 0, strlen($needle))==$needle); + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + BMP SUPPORT (SAVING) - James Heinrich +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function GD2BMPstring(&$gd_image) + # Author: James Heinrich + # Purpose: Save file as type bmp + # Param in: The image canvas (passed as ref) + # Param out: + # Reference: + # Notes: This code was stripped out of two external files + # (phpthumb.bmp.php,phpthumb.functions.php) and added below to + # avoid dependancies. + # + { + $imageX = ImageSX($gd_image); + $imageY = ImageSY($gd_image); + + $BMP = ''; + for ($y = ($imageY - 1); $y >= 0; $y--) { + $thisline = ''; + for ($x = 0; $x < $imageX; $x++) { + $argb = $this->GetPixelColor($gd_image, $x, $y); + $thisline .= chr($argb['blue']).chr($argb['green']).chr($argb['red']); + } + while (strlen($thisline) % 4) { + $thisline .= "\x00"; + } + $BMP .= $thisline; + } + + $bmpSize = strlen($BMP) + 14 + 40; + // BITMAPFILEHEADER [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp + $BITMAPFILEHEADER = 'BM'; // WORD bfType; + $BITMAPFILEHEADER .= $this->LittleEndian2String($bmpSize, 4); // DWORD bfSize; + $BITMAPFILEHEADER .= $this->LittleEndian2String( 0, 2); // WORD bfReserved1; + $BITMAPFILEHEADER .= $this->LittleEndian2String( 0, 2); // WORD bfReserved2; + $BITMAPFILEHEADER .= $this->LittleEndian2String( 54, 4); // DWORD bfOffBits; + + // BITMAPINFOHEADER - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp + $BITMAPINFOHEADER = $this->LittleEndian2String( 40, 4); // DWORD biSize; + $BITMAPINFOHEADER .= $this->LittleEndian2String( $imageX, 4); // LONG biWidth; + $BITMAPINFOHEADER .= $this->LittleEndian2String( $imageY, 4); // LONG biHeight; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 1, 2); // WORD biPlanes; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 24, 2); // WORD biBitCount; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 0, 4); // DWORD biCompression; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 0, 4); // DWORD biSizeImage; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 2835, 4); // LONG biXPelsPerMeter; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 2835, 4); // LONG biYPelsPerMeter; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 0, 4); // DWORD biClrUsed; + $BITMAPINFOHEADER .= $this->LittleEndian2String( 0, 4); // DWORD biClrImportant; + + return $BITMAPFILEHEADER.$BITMAPINFOHEADER.$BMP; + } + +## -------------------------------------------------------- + + private function GetPixelColor(&$img, $x, $y) + # Author: James Heinrich + # Purpose: + # Param in: + # Param out: + # Reference: + # Notes: + # + { + if (!is_resource($img)) { + return false; + } + return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y)); + } + +## -------------------------------------------------------- + + private function LittleEndian2String($number, $minbytes=1) + # Author: James Heinrich + # Purpose: BMP SUPPORT (SAVING) + # Param in: + # Param out: + # Reference: + # Notes: + # + { + $intstring = ''; + while ($number > 0) { + $intstring = $intstring.chr($number & 255); + $number >>= 8; + } + return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + BMP SUPPORT (READING) +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function ImageCreateFromBMP($filename) + # Author: DHKold + # Date: The 15th of June 2005 + # Version: 2.0B + # Purpose: To create an image from a BMP file. + # Param in: BMP file to open. + # Param out: Return a resource like the other ImageCreateFrom functions + # Reference: http://us3.php.net/manual/en/function.imagecreate.php#53879 + # Bug fix: Author: domelca at terra dot es + # Date: 06 March 2008 + # Fix: Correct 16bit BMP support + # Notes: + # + { + + //Ouverture du fichier en mode binaire + if (! $f1 = fopen($filename,"rb")) return FALSE; + + //1 : Chargement des ent�tes FICHIER + $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14)); + if ($FILE['file_type'] != 19778) return FALSE; + + //2 : Chargement des ent�tes BMP + $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'. + '/Vcompression/Vsize_bitmap/Vhoriz_resolution'. + '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40)); + $BMP['colors'] = pow(2,$BMP['bits_per_pixel']); + + if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset']; + + $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8; + $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']); + $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4); + $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4); + $BMP['decal'] = 4-(4*$BMP['decal']); + + if ($BMP['decal'] == 4) $BMP['decal'] = 0; + + //3 : Chargement des couleurs de la palette + $PALETTE = array(); + if ($BMP['colors'] < 16777216) + { + $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4)); + } + + //4 : Cr�ation de l'image + $IMG = fread($f1,$BMP['size_bitmap']); + $VIDE = chr(0); + + $res = imagecreatetruecolor($BMP['width'],$BMP['height']); + $P = 0; + $Y = $BMP['height']-1; + while ($Y >= 0) + { + $X=0; + while ($X < $BMP['width']) + { + if ($BMP['bits_per_pixel'] == 24) + $COLOR = unpack("V",substr($IMG,$P,3).$VIDE); + elseif ($BMP['bits_per_pixel'] == 16) + { + + /* + * BMP 16bit fix + * ================= + * + * Ref: http://us3.php.net/manual/en/function.imagecreate.php#81604 + * + * Notes: + * "don't work with bmp 16 bits_per_pixel. change pixel + * generator for this." + * + */ + + // *** Original code (don't work) + //$COLOR = unpack("n",substr($IMG,$P,2)); + //$COLOR[1] = $PALETTE[$COLOR[1]+1]; + + $COLOR = unpack("v",substr($IMG,$P,2)); + $blue = ($COLOR[1] & 0x001f) << 3; + $green = ($COLOR[1] & 0x07e0) >> 3; + $red = ($COLOR[1] & 0xf800) >> 8; + $COLOR[1] = $red * 65536 + $green * 256 + $blue; + + } + elseif ($BMP['bits_per_pixel'] == 8) + { + $COLOR = unpack("n",$VIDE.substr($IMG,$P,1)); + $COLOR[1] = $PALETTE[$COLOR[1]+1]; + } + elseif ($BMP['bits_per_pixel'] == 4) + { + $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1)); + if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F); + $COLOR[1] = $PALETTE[$COLOR[1]+1]; + } + elseif ($BMP['bits_per_pixel'] == 1) + { + $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1)); + if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7; + elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6; + elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5; + elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4; + elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3; + elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2; + elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1; + elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1); + $COLOR[1] = $PALETTE[$COLOR[1]+1]; + } + else + return FALSE; + + imagesetpixel($res,$X,$Y,$COLOR[1]); + $X++; + $P += $BMP['bytes_per_pixel']; + } + + $Y--; + $P+=$BMP['decal']; + } + //Fermeture du fichier + fclose($f1); + + return $res; + } + + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + PSD SUPPORT (READING) +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function imagecreatefrompsd($fileName) + # Author: Tim de Koning + # Version: 1.3 + # Purpose: To create an image from a PSD file. + # Param in: PSD file to open. + # Param out: Return a resource like the other ImageCreateFrom functions + # Reference: http://www.kingsquare.nl/phppsdreader + # Notes: + # + { + if (file_exists($this->psdReaderPath)) { + + + include_once($this->psdReaderPath); + + $psdReader = new PhpPsdReader($fileName); + + if (isset($psdReader->infoArray['error'])) return ''; + else return $psdReader->getImage(); + } else { + return false; + } + } + +## -------------------------------------------------------- + + public function __destruct() { + if (is_resource($this->imageResized)) { + imagedestroy($this->imageResized); + } + } + +## -------------------------------------------------------- + +} + + + + +/* + * Example with some API calls (outdated): + * + * + * =============================== + * Compulsary + * =============================== + * + * include("classes/resize_class.php"); + * + * // *** Initialise object + * $magicianObj = new resize('images/cars/large/a.jpg'); + * + * // *** Turn off stretching (optional) + * $magicianObj -> setForceStretch(false); + * + * // *** Resize object + * $magicianObj -> resizeImage(150, 100, 0); + * + * =============================== + * Image options - can run none, one, or all. + * =============================== + * + * // *** Add watermark + * $magicianObj -> addWatermark('stamp.png'); + * + * // *** Add text + * $magicianObj -> addText('testing...'); + * + * =============================== + * Output options - can run one, or the other, or both. + * =============================== + * + * // *** Save image to disk + * $magicianObj -> saveImage('images/cars/large/b.jpg', 100); + * + * // *** Or output to screen (params in can be jpg, gif, png) + * $magicianObj -> displayImage('png'); + * + * =============================== + * Return options - return errors. nice for debuggin. + * =============================== + * + * // *** Return error array + * $errorArray = $magicianObj -> getErrors(); + * + * + * =============================== + * Cleanup options - not really neccessary, but good practice + * =============================== + * + * // *** Free used memory + * $magicianObj -> __destruct(); + */ +?> \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/include/utils.php b/local/modules/Tinymce/Resources/js/tinymce/filemanager/include/utils.php new file mode 100644 index 00000000..73819a48 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/include/utils.php @@ -0,0 +1,486 @@ + resizeImage($newwidth, $newheight, 'crop'); + $magicianObj -> saveImage($imgthumb,80); + return true; + } + return false; +} + +function create_img($imgfile, $imgthumb, $newwidth, $newheight="") { + if(image_check_memory_usage($imgfile,$newwidth,$newheight)){ + require_once('php_image_magician.php'); + $magicianObj = new imageLib($imgfile); + $magicianObj -> resizeImage($newwidth, $newheight, 'auto'); + $magicianObj -> saveImage($imgthumb,80); + return true; + }else{ + return false; + } +} + +function makeSize($size) { + $units = array('B','KB','MB','GB','TB'); + $u = 0; + while ( (round($size / 1024) > 0) && ($u < 4) ) { + $size = $size / 1024; + $u++; + } + return (number_format($size, 0) . " " . $units[$u]); +} + +function foldersize($path) { + $total_size = 0; + $files = scandir($path); + $cleanPath = rtrim($path, '/'). '/'; + + foreach($files as $t) { + if ($t != "." && $t != "..") { + $currentFile = $cleanPath . $t; + if (is_dir($currentFile)) { + $size = foldersize($currentFile); + $total_size += $size; + } + else { + $size = filesize($currentFile); + $total_size += $size; + } + } + } + + return $total_size; +} + +function filescount($path) { + $total_count = 0; + $files = scandir($path); + $cleanPath = rtrim($path, '/'). '/'; + + foreach($files as $t) { + if ($t != "." && $t != "..") { + $currentFile = $cleanPath . $t; + if (is_dir($currentFile)) { + $size = filescount($currentFile); + $total_count += $size; + } + else { + $total_count += 1; + } + } + } + + return $total_count; +} + +function create_folder($path=false,$path_thumbs=false){ + $oldumask = umask(0); + if ($path && !file_exists($path)) + mkdir($path, 0777, true); // or even 01777 so you get the sticky bit set + if($path_thumbs && !file_exists($path_thumbs)) + mkdir($path_thumbs, 0777, true) or die("$path_thumbs cannot be found"); // or even 01777 so you get the sticky bit set + umask($oldumask); +} + +function check_files_extensions_on_path($path,$ext){ + if(!is_dir($path)){ + $fileinfo = pathinfo($path); + if(!in_array(mb_strtolower($fileinfo['extension']),$ext)) + unlink($path); + }else{ + $files = scandir($path); + foreach($files as $file){ + check_files_extensions_on_path(trim($path,'/')."/".$file,$ext); + } + } +} + +function check_files_extensions_on_phar( $phar, &$files, $basepath, $ext ) { + foreach( $phar as $file ) + { + if( $file->isFile() ) + { + if(in_array(mb_strtolower($file->getExtension()),$ext)) + { + $files[] = $basepath.$file->getFileName( ); + } + } + else if( $file->isDir() ) + { + $iterator = new DirectoryIterator( $file ); + check_files_extensions_on_phar($iterator, $files, $basepath.$file->getFileName().'/', $ext); + } + } +} + +function fix_get_params($str){ + return strip_tags(preg_replace( "/[^a-zA-Z0-9\.\[\]_| -]/", '', $str)); +} + +function fix_filename($str,$transliteration){ + if($transliteration){ + if( function_exists( 'transliterator_transliterate' ) ) + { + $str = transliterator_transliterate( 'Accents-Any', $str ); + } + else + { + $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); + } + + $str = preg_replace( "/[^a-zA-Z0-9\.\[\]_| -]/", '', $str ); + } + + $str=str_replace(array('"',"'","/","\\"),"",$str); + $str=strip_tags($str); + + // Empty or incorrectly transliterated filename. + // Here is a point: a good file UNKNOWN_LANGUAGE.jpg could become .jpg in previous code. + // So we add that default 'file' name to fix that issue. + if( strpos( $str, '.' ) === 0 ) + { + $str = 'file'.$str; + } + + return trim( $str ); +} + +function fix_dirname($str){ + return str_replace('~',' ',dirname(str_replace(' ','~',$str))); +} + +function fix_strtoupper($str){ + if( function_exists( 'mb_strtoupper' ) ) + return mb_strtoupper($str); + else + return strtoupper($str); +} + + +function fix_strtolower($str){ + if( function_exists( 'mb_strtoupper' ) ) + return mb_strtolower($str); + else + return strtolower($str); +} + +function fix_path($path,$transliteration){ + $info=pathinfo($path); + $tmp_path = $info['dirname']; + $str=fix_filename($info['filename'],$transliteration); + if($tmp_path!="") + return $tmp_path.DIRECTORY_SEPARATOR.$str; + else + return $str; +} + +function base_url(){ + return sprintf( + "%s://%s", + isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', + $_SERVER['HTTP_HOST'] + ); +} + +function config_loading($current_path,$fld){ + if(file_exists($current_path.$fld.".config")){ + require_once($current_path.$fld.".config"); + return true; + } + echo "!!!!".$parent=fix_dirname($fld); + if($parent!="." && !empty($parent)){ + config_loading($current_path,$parent); + } + + return false; +} + + +function image_check_memory_usage($img, $max_breedte, $max_hoogte){ + if(file_exists($img)){ + $K64 = 65536; // number of bytes in 64K + $memory_usage = memory_get_usage(); + $memory_limit = abs(intval(str_replace('M','',ini_get('memory_limit'))*1024*1024)); + $image_properties = getimagesize($img); + $image_width = $image_properties[0]; + $image_height = $image_properties[1]; + $image_bits = $image_properties['bits']; + $image_memory_usage = $K64 + ($image_width * $image_height * ($image_bits ) * 2); + $thumb_memory_usage = $K64 + ($max_breedte * $max_hoogte * ($image_bits ) * 2); + $memory_needed = intval($memory_usage + $image_memory_usage + $thumb_memory_usage); + + if($memory_needed > $memory_limit){ + ini_set('memory_limit',(intval($memory_needed/1024/1024)+5) . 'M'); + if(ini_get('memory_limit') == (intval($memory_needed/1024/1024)+5) . 'M'){ + return true; + }else{ + return false; + } + }else{ + return true; + } + }else{ + return false; + } +} + +function endsWith($haystack, $needle) +{ + return $needle === "" || substr($haystack, -strlen($needle)) === $needle; +} + +function new_thumbnails_creation($targetPath,$targetFile,$name,$current_path,$relative_image_creation,$relative_path_from_current_pos,$relative_image_creation_name_to_prepend,$relative_image_creation_name_to_append,$relative_image_creation_width,$relative_image_creation_height,$fixed_image_creation,$fixed_path_from_filemanager,$fixed_image_creation_name_to_prepend,$fixed_image_creation_to_append,$fixed_image_creation_width,$fixed_image_creation_height){ + //create relative thumbs + $all_ok=true; + if($relative_image_creation){ + foreach($relative_path_from_current_pos as $k=>$path){ + if($path!="" && $path[strlen($path)-1]!="/") $path.="/"; + if (!file_exists($targetPath.$path)) create_folder($targetPath.$path,false); + $info=pathinfo($name); + if(!endsWith($targetPath,$path)) + if(!create_img($targetFile, $targetPath.$path.$relative_image_creation_name_to_prepend[$k].$info['filename'].$relative_image_creation_name_to_append[$k].".".$info['extension'], $relative_image_creation_width[$k], $relative_image_creation_height[$k])) + $all_ok=false; + } + } + + //create fixed thumbs + if($fixed_image_creation){ + foreach($fixed_path_from_filemanager as $k=>$path){ + if($path!="" && $path[strlen($path)-1]!="/") $path.="/"; + $base_dir=$path.substr_replace($targetPath, '', 0, strlen($current_path)); + if (!file_exists($base_dir)) create_folder($base_dir,false); + $info=pathinfo($name); + if(!create_img($targetFile, $base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'], $fixed_image_creation_width[$k], $fixed_image_creation_height[$k])) + $all_ok=false; + } + } + return $all_ok; +} + + +// Get a remote file, using whichever mechanism is enabled +function get_file_by_url($url) { + if (ini_get('allow_url_fopen')) { + return file_get_contents($url); + } + if (!function_exists('curl_version')) { + return false; + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_URL, $url); + + $data = curl_exec($ch); + curl_close($ch); + + return $data; +} + +// test for dir/file writability properly +function is_really_writable($dir){ + $dir = rtrim($dir, '/'); + // linux, safe off + if (DIRECTORY_SEPARATOR == '/' && @ini_get("safe_mode") == FALSE){ + return is_writable($dir); + } + + // Windows, safe ON. (have to write a file :S) + if (is_dir($dir)){ + $dir = $dir.'/'.md5(mt_rand(1,1000).mt_rand(1,1000)); + + if (($fp = @fopen($dir, 'ab')) === FALSE){ + return FALSE; + } + + fclose($fp); + @chmod($dir, 0777); + @unlink($dir); + return TRUE; + } + elseif ( ! is_file($dir) || ($fp = @fopen($dir, 'ab')) === FALSE){ + return FALSE; + } + + fclose($fp); + return TRUE; +} + +/** + * Check if a function is callable. + * Some servers disable copy,rename etc. + * + * Returns TRUE if callable and everything is OK + * Otherwise returns FALSE + */ +function is_function_callable($name){ + if (function_exists($name) === FALSE) return FALSE; + $disabled = explode(',', ini_get('disable_functions')); + return !in_array($name, $disabled); +} + +// recursivly copies everything +function rcopy($source, $destination, $is_rec = FALSE) { + if (is_dir($source)) { + if ($is_rec === FALSE){ + $pinfo = pathinfo($source); + $destination = rtrim($destination, '/').DIRECTORY_SEPARATOR.$pinfo['basename']; + } + if (is_dir($destination) === FALSE){ + mkdir($destination, 0777, true); + } + + $files = scandir($source); + foreach ($files as $file){ + if ($file != "." && $file != "..") { + rcopy($source.DIRECTORY_SEPARATOR.$file, rtrim($destination, '/').DIRECTORY_SEPARATOR.$file, TRUE); + } + } + } + else { + if (file_exists($source)){ + if (is_dir($destination) === TRUE){ + $pinfo = pathinfo($source); + $dest2 = rtrim($destination, '/').DIRECTORY_SEPARATOR.$pinfo['basename']; + } + else { + $dest2 = $destination; + } + + copy($source, $dest2); + } + } +} + +// recursivly renames everything +// I know copy and rename could be done with just one function +// but i split the 2 because sometimes rename fails on windows +// Need more feedback from users and refactor if needed +function rrename($source, $destination, $is_rec = FALSE) { + if (is_dir($source)) { + if ($is_rec === FALSE){ + $pinfo = pathinfo($source); + $destination = rtrim($destination, '/').DIRECTORY_SEPARATOR.$pinfo['basename']; + } + if (is_dir($destination) === FALSE){ + mkdir($destination, 0777, true); + } + + $files = scandir($source); + foreach ($files as $file){ + if ($file != "." && $file != "..") { + rrename($source.DIRECTORY_SEPARATOR.$file, rtrim($destination, '/').DIRECTORY_SEPARATOR.$file, TRUE); + } + } + } + else { + if (file_exists($source)){ + if (is_dir($destination) === TRUE){ + $pinfo = pathinfo($source); + $dest2 = rtrim($destination, '/').DIRECTORY_SEPARATOR.$pinfo['basename']; + } + else { + $dest2 = $destination; + } + + rename($source, $dest2); + } + } +} + +// On windows rename leaves folders sometime +// This will clear leftover folders +// After more feedback will merge it with rrename +function rrename_after_cleaner($source) { + $files = scandir($source); + + foreach ($files as $file) { + if ($file != "." && $file != "..") { + if (is_dir($source.DIRECTORY_SEPARATOR.$file)){ + rrename_after_cleaner($source.DIRECTORY_SEPARATOR.$file); + } + else { + unlink($source.DIRECTORY_SEPARATOR.$file); + } + } + } + + return rmdir($source); +} + +function debugger($input, $trace = FALSE, $halt = FALSE){ + ob_start(); + + echo "
----- DEBUG DUMP -----"; + echo "
";
+    var_dump($input);
+    echo "
"; + + if ($trace){ + $debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + + echo "
-----STACK TRACE-----"; + echo "
";
+        var_dump($debug);
+        echo "
"; + } + + echo ""; + echo "---------------------------
"; + + $ret = ob_get_contents(); + ob_end_clean(); + + echo $ret; + + if ($halt == TRUE){ + exit(); + } +} + +?> \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/Jplayer.swf b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/Jplayer.swf new file mode 100644 index 00000000..85c0ba38 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/Jplayer.swf differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/add-on/jplayer.playlist.min.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/add-on/jplayer.playlist.min.js new file mode 100644 index 00000000..138ccfa5 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/add-on/jplayer.playlist.min.js @@ -0,0 +1,34 @@ +/* + * Playlist Object for the jPlayer Plugin + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Dual licensed under the MIT and GPL licenses. + * - http://www.opensource.org/licenses/mit-license.php + * - http://www.gnu.org/copyleft/gpl.html + * + * Author: Mark J Panaghiston + * Version: 2.3.0 + * Date: 20th April 2013 + * + * Requires: + * - jQuery 1.7.0+ + * - jPlayer 2.3.0+ + */ +(function(b,f){jPlayerPlaylist=function(a,c,d){var e=this;this.current=0;this.removing=this.shuffled=this.loop=!1;this.cssSelector=b.extend({},this._cssSelector,a);this.options=b.extend(!0,{keyBindings:{next:{key:39,fn:function(){e.next()}},previous:{key:37,fn:function(){e.previous()}}}},this._options,d);this.playlist=[];this.original=[];this._initPlaylist(c);this.cssSelector.title=this.cssSelector.cssSelectorAncestor+" .jp-title";this.cssSelector.playlist=this.cssSelector.cssSelectorAncestor+" .jp-playlist"; +this.cssSelector.next=this.cssSelector.cssSelectorAncestor+" .jp-next";this.cssSelector.previous=this.cssSelector.cssSelectorAncestor+" .jp-previous";this.cssSelector.shuffle=this.cssSelector.cssSelectorAncestor+" .jp-shuffle";this.cssSelector.shuffleOff=this.cssSelector.cssSelectorAncestor+" .jp-shuffle-off";this.options.cssSelectorAncestor=this.cssSelector.cssSelectorAncestor;this.options.repeat=function(a){e.loop=a.jPlayer.options.loop};b(this.cssSelector.jPlayer).bind(b.jPlayer.event.ready,function(){e._init()}); +b(this.cssSelector.jPlayer).bind(b.jPlayer.event.ended,function(){e.next()});b(this.cssSelector.jPlayer).bind(b.jPlayer.event.play,function(){b(this).jPlayer("pauseOthers")});b(this.cssSelector.jPlayer).bind(b.jPlayer.event.resize,function(a){a.jPlayer.options.fullScreen?b(e.cssSelector.title).show():b(e.cssSelector.title).hide()});b(this.cssSelector.previous).click(function(){e.previous();b(this).blur();return!1});b(this.cssSelector.next).click(function(){e.next();b(this).blur();return!1});b(this.cssSelector.shuffle).click(function(){e.shuffle(!0); +return!1});b(this.cssSelector.shuffleOff).click(function(){e.shuffle(!1);return!1}).hide();this.options.fullScreen||b(this.cssSelector.title).hide();b(this.cssSelector.playlist+" ul").empty();this._createItemHandlers();b(this.cssSelector.jPlayer).jPlayer(this.options)};jPlayerPlaylist.prototype={_cssSelector:{jPlayer:"#jquery_jplayer_1",cssSelectorAncestor:"#jp_container_1"},_options:{playlistOptions:{autoPlay:!1,loopOnPrevious:!1,shuffleOnLoop:!0,enableRemoveControls:!1,displayTime:"slow",addTime:"fast", +removeTime:"fast",shuffleTime:"slow",itemClass:"jp-playlist-item",freeGroupClass:"jp-free-media",freeItemClass:"jp-playlist-item-free",removeItemClass:"jp-playlist-item-remove"}},option:function(a,b){if(b===f)return this.options.playlistOptions[a];this.options.playlistOptions[a]=b;switch(a){case "enableRemoveControls":this._updateControls();break;case "itemClass":case "freeGroupClass":case "freeItemClass":case "removeItemClass":this._refresh(!0),this._createItemHandlers()}return this},_init:function(){var a= +this;this._refresh(function(){a.options.playlistOptions.autoPlay?a.play(a.current):a.select(a.current)})},_initPlaylist:function(a){this.current=0;this.removing=this.shuffled=!1;this.original=b.extend(!0,[],a);this._originalPlaylist()},_originalPlaylist:function(){var a=this;this.playlist=[];b.each(this.original,function(b){a.playlist[b]=a.original[b]})},_refresh:function(a){var c=this;if(a&&!b.isFunction(a))b(this.cssSelector.playlist+" ul").empty(),b.each(this.playlist,function(a){b(c.cssSelector.playlist+ +" ul").append(c._createListItem(c.playlist[a]))}),this._updateControls();else{var d=b(this.cssSelector.playlist+" ul").children().length?this.options.playlistOptions.displayTime:0;b(this.cssSelector.playlist+" ul").slideUp(d,function(){var d=b(this);b(this).empty();b.each(c.playlist,function(a){d.append(c._createListItem(c.playlist[a]))});c._updateControls();b.isFunction(a)&&a();c.playlist.length?b(this).slideDown(c.options.playlistOptions.displayTime):b(this).show()})}},_createListItem:function(a){var c= +this,d="
  • ",d=d+("×");if(a.free){var e=!0,d=d+("(");b.each(a,function(a,f){b.jPlayer.prototype.format[a]&&(e?e=!1:d+=" | ",d+=""+a+"")});d+=")"}d+=""+a.title+(a.artist? +" ":"")+"";return d+="
  • "},_createItemHandlers:function(){var a=this;b(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.itemClass).on("click","a."+this.options.playlistOptions.itemClass,function(){var c=b(this).parent().parent().index();a.current!==c?a.play(c):b(a.cssSelector.jPlayer).jPlayer("play");b(this).blur();return!1});b(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.freeItemClass).on("click", +"a."+this.options.playlistOptions.freeItemClass,function(){b(this).parent().parent().find("."+a.options.playlistOptions.itemClass).click();b(this).blur();return!1});b(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.removeItemClass).on("click","a."+this.options.playlistOptions.removeItemClass,function(){var c=b(this).parent().parent().index();a.remove(c);b(this).blur();return!1})},_updateControls:function(){this.options.playlistOptions.enableRemoveControls?b(this.cssSelector.playlist+ +" ."+this.options.playlistOptions.removeItemClass).show():b(this.cssSelector.playlist+" ."+this.options.playlistOptions.removeItemClass).hide();this.shuffled?(b(this.cssSelector.shuffleOff).show(),b(this.cssSelector.shuffle).hide()):(b(this.cssSelector.shuffleOff).hide(),b(this.cssSelector.shuffle).show())},_highlight:function(a){this.playlist.length&&a!==f&&(b(this.cssSelector.playlist+" .jp-playlist-current").removeClass("jp-playlist-current"),b(this.cssSelector.playlist+" li:nth-child("+(a+1)+ +")").addClass("jp-playlist-current").find(".jp-playlist-item").addClass("jp-playlist-current"),b(this.cssSelector.title+" li").html(this.playlist[a].title+(this.playlist[a].artist?" ":"")))},setPlaylist:function(a){this._initPlaylist(a);this._init()},add:function(a,c){b(this.cssSelector.playlist+" ul").append(this._createListItem(a)).find("li:last-child").hide().slideDown(this.options.playlistOptions.addTime);this._updateControls();this.original.push(a); +this.playlist.push(a);c?this.play(this.playlist.length-1):1===this.original.length&&this.select(0)},remove:function(a){var c=this;if(a===f)return this._initPlaylist([]),this._refresh(function(){b(c.cssSelector.jPlayer).jPlayer("clearMedia")}),!0;if(this.removing)return!1;a=0>a?c.original.length+a:a;0<=a&&aa?this.original.length+a:a;0<=a&&aa?this.original.length+a:a;0<=a&&a' + (config.visible ? "Hide" : "Show") + ' jPlayer Inspector

    ' + + '
    ' + + '
    ' + + '
    ' + + '

    jPlayer events that have occurred over the past 1 second:' + + '
    (Backgrounds: Never occurred Occurred before Occurred Multiple occurrences reset)

    '; + + // MJP: Would use the next 3 lines for ease, but the events are just slapped on the page. + // $.each($.jPlayer.event, function(eventName,eventType) { + // structure += '
    ' + eventName + '
    '; + // }); + + var eventStyle = "float:left;margin:0 5px 5px 0;padding:0 5px;border:1px dotted #000;"; + // MJP: Doing it longhand so order and layout easier to control. + structure += + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    '; + + // MJP: Would like a check here in case we missed an event. + + // MJP: Check fails, since it is not on the page yet. +/* $.each($.jPlayer.event, function(eventName,eventType) { + if($("#" + config.eventId[eventType])[0] === undefined) { + structure += '
    ' + eventName + '
    '; + } + }); +*/ + structure += + '
    ' + + '

    Update jPlayer Inspector

    ' + + '
    ' + + '
    '; + $(this).html(structure); + + config.windowJq = $("#" + config.windowId); + config.statusJq = $("#" + config.statusId); + config.configJq = $("#" + config.configId); + config.toggleJq = $("#" + config.toggleId); + config.eventResetJq = $("#" + config.eventResetId); + config.updateJq = $("#" + config.updateId); + + $.each($.jPlayer.event, function(eventName,eventType) { + config.eventJq[eventType] = $("#" + config.eventId[eventType]); + config.eventJq[eventType].text(eventName + " (" + config.eventOccurrence[eventType] + ")"); // Sets the text to the event name and (0); + + config.jPlayer.bind(eventType + ".jPlayerInspector", function(e) { + config.eventOccurrence[e.type]++; + if(config.eventOccurrence[e.type] > 1) { + config.eventJq[e.type].css("background-color","#ff9"); + } else { + config.eventJq[e.type].css("background-color","#9f9"); + } + config.eventJq[e.type].text(eventName + " (" + config.eventOccurrence[e.type] + ")"); + // The timer to handle the color + clearTimeout(config.eventTimeout[e.type]); + config.eventTimeout[e.type] = setTimeout(function() { + config.eventJq[e.type].css("background-color","#fff"); + }, 1000); + // The timer to handle the occurences. + setTimeout(function() { + config.eventOccurrence[e.type]--; + config.eventJq[e.type].text(eventName + " (" + config.eventOccurrence[e.type] + ")"); + }, 1000); + if(config.visible) { // Update the status, if inspector open. + $this.jPlayerInspector("updateStatus"); + } + }); + }); + + config.jPlayer.bind($.jPlayer.event.ready + ".jPlayerInspector", function(e) { + $this.jPlayerInspector("updateConfig"); + }); + + config.toggleJq.click(function() { + if(config.visible) { + $(this).text("Show"); + config.windowJq.hide(); + config.statusJq.empty(); + config.configJq.empty(); + } else { + $(this).text("Hide"); + config.windowJq.show(); + config.updateJq.click(); + } + config.visible = !config.visible; + $(this).blur(); + return false; + }); + + config.eventResetJq.click(function() { + $.each($.jPlayer.event, function(eventName,eventType) { + config.eventJq[eventType].css("background-color","#eee"); + }); + $(this).blur(); + return false; + }); + + config.updateJq.click(function() { + $this.jPlayerInspector("updateStatus"); + $this.jPlayerInspector("updateConfig"); + return false; + }); + + if(!config.visible) { + config.windowJq.hide(); + } else { + // config.updateJq.click(); + } + + $.jPlayerInspector.i++; + + return this; + }, + destroy: function() { + $(this).data("jPlayerInspector") && $(this).data("jPlayerInspector").jPlayer.unbind(".jPlayerInspector"); + $(this).empty(); + }, + updateConfig: function() { // This displays information about jPlayer's configuration in inspector + + var jPlayerInfo = "

    This jPlayer instance is running in your browser where:
    " + + for(i = 0; i < $(this).data("jPlayerInspector").jPlayer.data("jPlayer").solutions.length; i++) { + var solution = $(this).data("jPlayerInspector").jPlayer.data("jPlayer").solutions[i]; + jPlayerInfo += " jPlayer's " + solution + " solution is"; + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].used) { + jPlayerInfo += " being used and will support:"; + for(format in $(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].support) { + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].support[format]) { + jPlayerInfo += " " + format; + } + } + jPlayerInfo += "
    "; + } else { + jPlayerInfo += " not required
    "; + } + } + jPlayerInfo += "

    "; + + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.active) { + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active) { + jPlayerInfo += "Problem with jPlayer since both HTML5 and Flash are active."; + } else { + jPlayerInfo += "The HTML5 is active."; + } + } else { + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active) { + jPlayerInfo += "The Flash is active."; + } else { + jPlayerInfo += "No solution is currently active. jPlayer needs a setMedia()."; + } + } + jPlayerInfo += "

    "; + + var formatType = $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.formatType; + jPlayerInfo += "

    status.formatType = '" + formatType + "'
    "; + if(formatType) { + jPlayerInfo += "Browser canPlay('" + $.jPlayer.prototype.format[formatType].codec + "')"; + } else { + jPlayerInfo += "

    "; + } + + jPlayerInfo += "

    status.src = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.src + "'

    "; + + jPlayerInfo += "

    status.media = {
    "; + for(prop in $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media) { + jPlayerInfo += " " + prop + ": " + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media[prop] + "
    "; // Some are strings + } + jPlayerInfo += "};

    " + + jPlayerInfo += "

    "; + jPlayerInfo += "status.videoWidth = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.videoWidth + "'"; + jPlayerInfo += " | status.videoHeight = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.videoHeight + "'"; + jPlayerInfo += "
    status.width = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.width + "'"; + jPlayerInfo += " | status.height = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.height + "'"; + jPlayerInfo += "

    "; + + + "

    Raw browser test for HTML5 support. Should equal a function if HTML5 is available.
    "; + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.audio.available) { + jPlayerInfo += "htmlElement.audio.canPlayType = " + (typeof $(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.audio.canPlayType) +"
    " + } + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.video.available) { + jPlayerInfo += "htmlElement.video.canPlayType = " + (typeof $(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.video.canPlayType) +""; + } + jPlayerInfo += "

    "; + + jPlayerInfo += "

    This instance is using the constructor options:
    " + + "$('#" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").internal.self.id + "').jPlayer({
    " + + + " swfPath: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "swfPath") + "',
    " + + + " solution: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "solution") + "',
    " + + + " supplied: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "supplied") + "',
    " + + + " preload: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "preload") + "',
    " + + + " volume: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "volume") + ",
    " + + + " muted: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "muted") + ",
    " + + + " backgroundColor: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "backgroundColor") + "',
    " + + + " cssSelectorAncestor: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelectorAncestor") + "',
    " + + + " cssSelector: {"; + + var cssSelector = $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelector"); + for(prop in cssSelector) { + + // jPlayerInfo += "
      " + prop + ": '" + cssSelector[prop] + "'," // This works too of course, but want to use option method for deep keys. + jPlayerInfo += "
      " + prop + ": '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelector." + prop) + "'," + } + + jPlayerInfo = jPlayerInfo.slice(0, -1); // Because the sloppy comma was bugging me. + + jPlayerInfo += "
     },
    " + + + " errorAlerts: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "errorAlerts") + ",
    " + + + " warningAlerts: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "warningAlerts") + "
    " + + + "});

    "; + $(this).data("jPlayerInspector").configJq.html(jPlayerInfo); + return this; + }, + updateStatus: function() { // This displays information about jPlayer's status in the inspector + $(this).data("jPlayerInspector").statusJq.html( + "

    jPlayer is " + + ($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.paused ? "paused" : "playing") + + " at time: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentTime*10)/10 + "s." + + " (d: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.duration*10)/10 + "s" + + ", sp: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.seekPercent) + "%" + + ", cpr: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentRelative) + "%" + + ", cpa: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentAbsolute) + "%)

    " + ); + return this; + } + }; + $.fn.jPlayerInspector = function( method ) { + // Method calling logic + if ( methods[method] ) { + return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.jPlayerInspector' ); + } + }; +})(jQuery); diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/jquery.jplayer.min.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/jquery.jplayer.min.js new file mode 100644 index 00000000..ecd3ab51 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/jquery.jplayer.min.js @@ -0,0 +1,107 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Version: 2.4.0 + * Date: 5th June 2013 + */ + +(function(b,f){"function"===typeof define&&define.amd?define(["jquery"],f):b.jQuery?f(b.jQuery):f(b.Zepto)})(this,function(b,f){b.fn.jPlayer=function(a){var c="string"===typeof a,d=Array.prototype.slice.call(arguments,1),e=this;a=!c&&d.length?b.extend.apply(null,[!0,a].concat(d)):a;if(c&&"_"===a.charAt(0))return e;c?this.each(function(){var c=b(this).data("jPlayer"),h=c&&b.isFunction(c[a])?c[a].apply(c,d):c;if(h!==c&&h!==f)return e=h,!1}):this.each(function(){var c=b(this).data("jPlayer");c?c.option(a|| +{}):b(this).data("jPlayer",new b.jPlayer(a,this))});return e};b.jPlayer=function(a,c){if(arguments.length){this.element=b(c);this.options=b.extend(!0,{},this.options,a);var d=this;this.element.bind("remove.jPlayer",function(){d.destroy()});this._init()}};"function"!==typeof b.fn.stop&&(b.fn.stop=function(){});b.jPlayer.emulateMethods="load play pause";b.jPlayer.emulateStatus="src readyState networkState currentTime duration paused ended playbackRate";b.jPlayer.emulateOptions="muted volume";b.jPlayer.reservedEvent= +"ready flashreset resize repeat error warning";b.jPlayer.event={};b.each("ready flashreset resize repeat click error warning loadstart progress suspend abort emptied stalled play pause loadedmetadata loadeddata waiting playing canplay canplaythrough seeking seeked timeupdate ended ratechange durationchange volumechange".split(" "),function(){b.jPlayer.event[this]="jPlayer_"+this});b.jPlayer.htmlEvent="loadstart abort emptied stalled loadedmetadata loadeddata canplay canplaythrough ratechange".split(" "); +b.jPlayer.pause=function(){b.each(b.jPlayer.prototype.instances,function(a,c){c.data("jPlayer").status.srcSet&&c.jPlayer("pause")})};b.jPlayer.timeFormat={showHour:!1,showMin:!0,showSec:!0,padHour:!1,padMin:!0,padSec:!0,sepHour:":",sepMin:":",sepSec:""};var l=function(){this.init()};l.prototype={init:function(){this.options={timeFormat:b.jPlayer.timeFormat}},time:function(a){var c=new Date(1E3*(a&&"number"===typeof a?a:0)),b=c.getUTCHours();a=this.options.timeFormat.showHour?c.getUTCMinutes():c.getUTCMinutes()+ +60*b;c=this.options.timeFormat.showMin?c.getUTCSeconds():c.getUTCSeconds()+60*a;b=this.options.timeFormat.padHour&&10>b?"0"+b:b;a=this.options.timeFormat.padMin&&10>a?"0"+a:a;c=this.options.timeFormat.padSec&&10>c?"0"+c:c;b=""+(this.options.timeFormat.showHour?b+this.options.timeFormat.sepHour:"");b+=this.options.timeFormat.showMin?a+this.options.timeFormat.sepMin:"";return b+=this.options.timeFormat.showSec?c+this.options.timeFormat.sepSec:""}};var m=new l;b.jPlayer.convertTime=function(a){return m.time(a)}; +b.jPlayer.uaBrowser=function(a){a=a.toLowerCase();var b=/(opera)(?:.*version)?[ \/]([\w.]+)/,d=/(msie) ([\w.]+)/,e=/(mozilla)(?:.*? rv:([\w.]+))?/;a=/(webkit)[ \/]([\w.]+)/.exec(a)||b.exec(a)||d.exec(a)||0>a.indexOf("compatible")&&e.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}};b.jPlayer.uaPlatform=function(a){var b=a.toLowerCase(),d=/(android)/,e=/(mobile)/;a=/(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/.exec(b)||[];b=/(ipad|playbook)/.exec(b)||!e.exec(b)&&d.exec(b)|| +[];a[1]&&(a[1]=a[1].replace(/\s/g,"_"));return{platform:a[1]||"",tablet:b[1]||""}};b.jPlayer.browser={};b.jPlayer.platform={};var j=b.jPlayer.uaBrowser(navigator.userAgent);j.browser&&(b.jPlayer.browser[j.browser]=!0,b.jPlayer.browser.version=j.version);j=b.jPlayer.uaPlatform(navigator.userAgent);j.platform&&(b.jPlayer.platform[j.platform]=!0,b.jPlayer.platform.mobile=!j.tablet,b.jPlayer.platform.tablet=!!j.tablet);b.jPlayer.getDocMode=function(){var a;b.jPlayer.browser.msie&&(document.documentMode? +a=document.documentMode:(a=5,document.compatMode&&"CSS1Compat"===document.compatMode&&(a=7)));return a};b.jPlayer.browser.documentMode=b.jPlayer.getDocMode();b.jPlayer.nativeFeatures={init:function(){var a=document,b=a.createElement("video"),d={w3c:"fullscreenEnabled fullscreenElement requestFullscreen exitFullscreen fullscreenchange fullscreenerror".split(" "),moz:"mozFullScreenEnabled mozFullScreenElement mozRequestFullScreen mozCancelFullScreen mozfullscreenchange mozfullscreenerror".split(" "), +webkit:" webkitCurrentFullScreenElement webkitRequestFullScreen webkitCancelFullScreen webkitfullscreenchange ".split(" "),webkitVideo:"webkitSupportsFullscreen webkitDisplayingFullscreen webkitEnterFullscreen webkitExitFullscreen ".split(" ")},e=["w3c","moz","webkit","webkitVideo"],g,h;this.fullscreen=b={support:{w3c:!!a[d.w3c[0]],moz:!!a[d.moz[0]],webkit:"function"===typeof a[d.webkit[3]],webkitVideo:"function"===typeof b[d.webkitVideo[2]]},used:{}};g=0;for(h=e.length;g','','','',''];c=document.createElement(''); +for(var e=0;e=a&&(b=!0);return b},_validString:function(a){return a&&"string"===typeof a},_limitValue:function(a,b,d){return ad?d:a},_urlNotSetError:function(a){this._error({type:b.jPlayer.error.URL_NOT_SET,context:a,message:b.jPlayer.errorMsg.URL_NOT_SET,hint:b.jPlayer.errorHint.URL_NOT_SET})},_flashError:function(a){var c;c=this.internal.ready?"FLASH_DISABLED":"FLASH";this._error({type:b.jPlayer.error[c],context:this.internal.flash.swf, +message:b.jPlayer.errorMsg[c]+a.message,hint:b.jPlayer.errorHint[c]});this.internal.flash.jq.css({width:"1px",height:"1px"})},_error:function(a){this._trigger(b.jPlayer.event.error,a);this.options.errorAlerts&&this._alert("Error!"+(a.message?"\n\n"+a.message:"")+(a.hint?"\n\n"+a.hint:"")+"\n\nContext: "+a.context)},_warning:function(a){this._trigger(b.jPlayer.event.warning,f,a);this.options.warningAlerts&&this._alert("Warning!"+(a.message?"\n\n"+a.message:"")+(a.hint?"\n\n"+a.hint:"")+"\n\nContext: "+ +a.context)},_alert:function(a){alert("jPlayer "+this.version.script+" : id='"+this.internal.self.id+"' : "+a)},_emulateHtmlBridge:function(){var a=this;b.each(b.jPlayer.emulateMethods.split(/\s+/g),function(b,d){a.internal.domNode[d]=function(b){a[d](b)}});b.each(b.jPlayer.event,function(c,d){var e=!0;b.each(b.jPlayer.reservedEvent.split(/\s+/g),function(a,b){if(b===c)return e=!1});e&&a.element.bind(d+".jPlayer.jPlayerHtml",function(){a._emulateHtmlUpdate();var b=document.createEvent("Event");b.initEvent(c, +!1,!0);a.internal.domNode.dispatchEvent(b)})})},_emulateHtmlUpdate:function(){var a=this;b.each(b.jPlayer.emulateStatus.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.status[d]});b.each(b.jPlayer.emulateOptions.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.options[d]})},_destroyHtmlBridge:function(){var a=this;this.element.unbind(".jPlayerHtml");b.each((b.jPlayer.emulateMethods+" "+b.jPlayer.emulateStatus+" "+b.jPlayer.emulateOptions).split(/\s+/g),function(b,d){delete a.internal.domNode[d]})}}; +b.jPlayer.error={FLASH:"e_flash",FLASH_DISABLED:"e_flash_disabled",NO_SOLUTION:"e_no_solution",NO_SUPPORT:"e_no_support",URL:"e_url",URL_NOT_SET:"e_url_not_set",VERSION:"e_version"};b.jPlayer.errorMsg={FLASH:"jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",FLASH_DISABLED:"jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ",NO_SOLUTION:"No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.", +NO_SUPPORT:"It is not possible to play any media format provided in setMedia() on this browser using your current options.",URL:"Media URL could not be loaded.",URL_NOT_SET:"Attempt to issue media playback commands, while no media url is set.",VERSION:"jPlayer "+b.jPlayer.prototype.version.script+" needs Jplayer.swf version "+b.jPlayer.prototype.version.needFlash+" but found "};b.jPlayer.errorHint={FLASH:"Check your swfPath option and that Jplayer.swf is there.",FLASH_DISABLED:"Check that you have not display:none; the jPlayer entity or any ancestor.", +NO_SOLUTION:"Review the jPlayer options: support and supplied.",NO_SUPPORT:"Video or audio formats defined in the supplied option are missing.",URL:"Check media URL is valid.",URL_NOT_SET:"Use setMedia() to set the media URL.",VERSION:"Update jPlayer files."};b.jPlayer.warning={CSS_SELECTOR_COUNT:"e_css_selector_count",CSS_SELECTOR_METHOD:"e_css_selector_method",CSS_SELECTOR_STRING:"e_css_selector_string",OPTION_KEY:"e_option_key"};b.jPlayer.warningMsg={CSS_SELECTOR_COUNT:"The number of css selectors found did not equal one: ", +CSS_SELECTOR_METHOD:"The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",CSS_SELECTOR_STRING:"The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",OPTION_KEY:"The option requested in jPlayer('option') is undefined."};b.jPlayer.warningHint={CSS_SELECTOR_COUNT:"Check your css selector and the ancestor.",CSS_SELECTOR_METHOD:"Check your method name.",CSS_SELECTOR_STRING:"Check your css selector is a string.",OPTION_KEY:"Check your option name."}}); \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/popcorn/popcorn.jplayer.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/popcorn/popcorn.jplayer.js new file mode 100644 index 00000000..fb57ac60 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/popcorn/popcorn.jplayer.js @@ -0,0 +1,558 @@ +/* + * jPlayer Player Plugin for Popcorn JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Version: 1.1.1 + * Date: 5th June 2013 + * + * For Popcorn Version: 1.3 + * For jPlayer Version: 2.4.0 + * Requires: jQuery 1.3.2+ + * Note: jQuery dependancy cannot be removed since jPlayer 2 is a jQuery plugin. Use of jQuery will be kept to a minimum. + */ + +/* Code verified using http://www.jshint.com/ */ +/*jshint asi:false, bitwise:false, boss:false, browser:true, curly:false, debug:false, eqeqeq:true, eqnull:false, evil:false, forin:false, immed:false, jquery:true, laxbreak:false, newcap:true, noarg:true, noempty:true, nonew:true, onevar:false, passfail:false, plusplus:false, regexp:false, undef:true, sub:false, strict:false, white:false, smarttabs:true */ +/*global Popcorn:false, console:false */ + +(function(Popcorn) { + + var JQUERY_SCRIPT = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js', // Used if jQuery not already present. + JPLAYER_SCRIPT = 'http://www.jplayer.org/2.4.0/js/jquery.jplayer.min.js', // Used if jPlayer not already present. + JPLAYER_SWFPATH = 'http://www.jplayer.org/2.4.0/js/Jplayer.swf', // Used if not specified in jPlayer options via SRC Object. + SOLUTION = 'html,flash', // The default solution option. + DEBUG = false, // Decided to leave the debugging option and console output in for the time being. Overhead is trivial. + jQueryDownloading = false, // Flag to stop multiple instances from each pulling in jQuery, thus corrupting it. + jPlayerDownloading = false, // Flag to stop multiple instances from each pulling in jPlayer, thus corrupting it. + format = { // Duplicate of jPlayer 2.4.0 object, to avoid always requiring jQuery and jPlayer to be loaded before performing the _canPlayType() test. + mp3: { + codec: 'audio/mpeg; codecs="mp3"', + flashCanPlay: true, + media: 'audio' + }, + m4a: { // AAC / MP4 + codec: 'audio/mp4; codecs="mp4a.40.2"', + flashCanPlay: true, + media: 'audio' + }, + oga: { // OGG + codec: 'audio/ogg; codecs="vorbis"', + flashCanPlay: false, + media: 'audio' + }, + wav: { // PCM + codec: 'audio/wav; codecs="1"', + flashCanPlay: false, + media: 'audio' + }, + webma: { // WEBM + codec: 'audio/webm; codecs="vorbis"', + flashCanPlay: false, + media: 'audio' + }, + fla: { // FLV / F4A + codec: 'audio/x-flv', + flashCanPlay: true, + media: 'audio' + }, + rtmpa: { // RTMP AUDIO + codec: 'audio/rtmp; codecs="rtmp"', + flashCanPlay: true, + media: 'audio' + }, + m4v: { // H.264 / MP4 + codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"', + flashCanPlay: true, + media: 'video' + }, + ogv: { // OGG + codec: 'video/ogg; codecs="theora, vorbis"', + flashCanPlay: false, + media: 'video' + }, + webmv: { // WEBM + codec: 'video/webm; codecs="vorbis, vp8"', + flashCanPlay: false, + media: 'video' + }, + flv: { // FLV / F4V + codec: 'video/x-flv', + flashCanPlay: true, + media: 'video' + }, + rtmpv: { // RTMP VIDEO + codec: 'video/rtmp; codecs="rtmp"', + flashCanPlay: true, + media: 'video' + } + }, + isObject = function(val) { // Basic check for Object + if(val && typeof val === 'object' && val.hasOwnProperty) { + return true; + } else { + return false; + } + }, + getMediaType = function(url) { // Function to gleam the media type from the URL + var mediaType = false; + if(/\.mp3$/i.test(url)) { + mediaType = 'mp3'; + } else if(/\.mp4$/i.test(url) || /\.m4v$/i.test(url)) { + mediaType = 'm4v'; + } else if(/\.m4a$/i.test(url)) { + mediaType = 'm4a'; + } else if(/\.ogg$/i.test(url) || /\.oga$/i.test(url)) { + mediaType = 'oga'; + } else if(/\.ogv$/i.test(url)) { + mediaType = 'ogv'; + } else if(/\.webm$/i.test(url)) { + mediaType = 'webmv'; + } + return mediaType; + }, + getSupplied = function(url) { // Function to generate a supplied option from an src object. ie., When supplied not specified. + var supplied = '', + separator = ''; + if(isObject(url)) { + // Generate supplied option from object's properties. Non-format properties would be ignored by jPlayer. Order is unpredictable. + for(var prop in url) { + if(url.hasOwnProperty(prop)) { + supplied += separator + prop; + separator = ','; + } + } + } + if(DEBUG) console.log('getSupplied(): Generated: supplied = "' + supplied + '"'); + return supplied; + }; + + Popcorn.player( 'jplayer', { + _canPlayType: function( containerType, url ) { + // url : Either a String or an Object structured similar a jPlayer media object. ie., As used by setMedia in jPlayer. + // The url object may also contain a solution and supplied property. + + // Define the src object structure here! + + var cType = containerType.toLowerCase(), + srcObj = { + media:{}, + options:{} + }, + rVal = false, // Only a boolean false means it is not supported. + mediaType; + + if(cType !== 'video' && cType !== 'audio') { + + if(typeof url === 'string') { + // Check it starts with http, so the URL is absolute... Well, it is not a perfect check. + if(/^http.*/i.test(url)) { + mediaType = getMediaType(url); + if(mediaType) { + srcObj.media[mediaType] = url; + srcObj.options.solution = SOLUTION; + srcObj.options.supplied = mediaType; + } + } + } else { + srcObj = url; // Assume the url is an src object. + } + + // Check for Object and appropriate minimum data structure. + if(isObject(srcObj) && isObject(srcObj.media)) { + + if(!isObject(srcObj.options)) { + srcObj.options = {}; + } + + if(!srcObj.options.solution) { + srcObj.options.solution = SOLUTION; + } + + if(!srcObj.options.supplied) { + srcObj.options.supplied = getSupplied(srcObj.media); + } + + // Figure out how jPlayer will play it. + // This may not work properly when both audio and video is supplied. ie., A media player. But it should return truethy and jPlayer can figure it out. + + var solution = srcObj.options.solution.toLowerCase().split(","), // Create the solution array, with prority based on the order of the solution string. + supplied = srcObj.options.supplied.toLowerCase().split(","); // Create the supplied formats array, with prority based on the order of the supplied formats string. + + for(var sol = 0; sol < solution.length; sol++) { + + var solutionType = solution[sol].replace(/^\s+|\s+$/g, ""), //trim + checkingHtml = solutionType === 'html', + checkingFlash = solutionType === 'flash', + mediaElem; + + for(var fmt = 0; fmt < supplied.length; fmt++) { + mediaType = supplied[fmt].replace(/^\s+|\s+$/g, ""); //trim + if(format[mediaType]) { // Check format is valid. + + // Create an HTML5 media element for the type of media. + if(!mediaElem && checkingHtml) { + mediaElem = document.createElement(format[mediaType].media); + } + // See if the HTML5 media element can play the MIME / Codec type. + // Flash also returns the object if the format is playable, so it is truethy, but that html property is false. + // This assumes Flash is available, but that should be dealt with by jPlayer if that happens. + var htmlCanPlay = !!(mediaElem && mediaElem.canPlayType && mediaElem.canPlayType(format[mediaType].codec)), + htmlWillPlay = htmlCanPlay && checkingHtml, + flashWillPlay = format[mediaType].flashCanPlay && checkingFlash; + // The first one found will match what jPlayer uses. + if(htmlWillPlay || flashWillPlay) { + rVal = { + html: htmlWillPlay, + type: mediaType + }; + sol = solution.length; // Exit solution loop + fmt = supplied.length; // Exit supplied loop + } + } + } + } + } + } + return rVal; + }, + // _setup: function( options ) { // Warning: options is deprecated. + _setup: function() { + var media = this, + myPlayer, // The jQuery selector of the jPlayer element. Usually a
    + jPlayerObj, // The jPlayer data instance. For performance and DRY code. + mediaType = 'unknown', + jpMedia = {}, + jpOptions = {}, + ready = false, // Used during init to override the annoying duration dependance in the track event padding during Popcorn's isReady(). ie., We is ready after loadeddata and duration can then be set real value at leisure. + duration = 0, // For the durationchange event with both HTML5 and Flash solutions. Used with 'ready' to keep control during the Popcorn isReady() via loadeddata event. (Duration=0 is bad.) + durationchangeId = null, // A timeout ID used with delayed durationchange event. (Because of the duration=NaN fudge to avoid Popcorn track event corruption.) + canplaythrough = false, + error = null, // The MediaError object. + + dispatchDurationChange = function() { + if(ready) { + if(DEBUG) console.log('Dispatched event : durationchange : ' + duration); + media.dispatchEvent('durationchange'); + } else { + if(DEBUG) console.log('DELAYED EVENT (!ready) : durationchange : ' + duration); + clearTimeout(durationchangeId); // Stop multiple triggers causing multiple timeouts running in parallel. + durationchangeId = setTimeout(dispatchDurationChange, 250); + } + }, + + jPlayerFlashEventsPatch = function() { + + /* Events already supported by jPlayer Flash: + * loadstart + * loadedmetadata (M4A, M4V) + * progress + * play + * pause + * seeking + * seeked + * timeupdate + * ended + * volumechange + * error <- See the custom handler in jPlayerInit() + */ + + /* Events patched: + * loadeddata + * durationchange + * canplaythrough + * playing + */ + + /* Events NOT patched: + * suspend + * abort + * emptied + * stalled + * loadedmetadata (MP3) + * waiting + * canplay + * ratechange + */ + + // Triggering patched events through the jPlayer Object so the events are homogeneous. ie., The contain the event.jPlayer data structure. + + var checkDuration = function(event) { + if(event.jPlayer.status.duration !== duration) { + duration = event.jPlayer.status.duration; + dispatchDurationChange(); + } + }, + + checkCanPlayThrough = function(event) { + if(!canplaythrough && event.jPlayer.status.seekPercent === 100) { + canplaythrough = true; + setTimeout(function() { + if(DEBUG) console.log('Trigger : canplaythrough'); + jPlayerObj._trigger($.jPlayer.event.canplaythrough); + }, 0); + } + }; + + myPlayer.bind($.jPlayer.event.loadstart, function() { + setTimeout(function() { + if(DEBUG) console.log('Trigger : loadeddata'); + jPlayerObj._trigger($.jPlayer.event.loadeddata); + }, 0); + }) + .bind($.jPlayer.event.progress, function(event) { + checkDuration(event); + checkCanPlayThrough(event); + }) + .bind($.jPlayer.event.timeupdate, function(event) { + checkDuration(event); + checkCanPlayThrough(event); + }) + .bind($.jPlayer.event.play, function() { + setTimeout(function() { + if(DEBUG) console.log('Trigger : playing'); + jPlayerObj._trigger($.jPlayer.event.playing); + }, 0); + }); + + if(DEBUG) console.log('Created CUSTOM event handlers for FLASH'); + }, + + jPlayerInit = function() { + (function($) { + + myPlayer = $('#' + media.id); + + if(typeof media.src === 'string') { + mediaType = getMediaType(media.src); + jpMedia[mediaType] = media.src; + jpOptions.supplied = mediaType; + jpOptions.solution = SOLUTION; + } else if(isObject(media.src)) { + jpMedia = isObject(media.src.media) ? media.src.media : {}; + jpOptions = isObject(media.src.options) ? media.src.options : {}; + jpOptions.solution = jpOptions.solution || SOLUTION; + jpOptions.supplied = jpOptions.supplied || getSupplied(media.src.media); + } + + // Allow the swfPath to be set to local server. ie., If the jPlayer Plugin is local and already on the page, then you can also use the local SWF. + jpOptions.swfPath = jpOptions.swfPath || JPLAYER_SWFPATH; + + myPlayer.bind($.jPlayer.event.ready, function(event) { + if(event.jPlayer.flash.used) { + jPlayerFlashEventsPatch(); + } + // Set the media andd load it, so that the Flash solution behaves similar to HTML5 solution. + // This also allows the loadstart event to be used to know jPlayer is ready. + $(this).jPlayer('setMedia', jpMedia).jPlayer('load'); + }); + + // Do not auto-bubble the reserved events, nor the loadeddata and durationchange event, since the duration must be carefully handled when loadeddata event occurs. + // See the duration property code for more details. (Ranting.) + + var reservedEvents = $.jPlayer.reservedEvent + ' loadeddata durationchange', + reservedEvent = reservedEvents.split(/\s+/g); + + // Generate event handlers for all the standard HTML5 media events. (Except durationchange) + + var bindEvent = function(name) { + myPlayer.bind($.jPlayer.event[name], function(event) { + if(DEBUG) console.log('Dispatched event: ' + name + (event && event.jPlayer ? ' (' + event.jPlayer.status.currentTime + 's)' : '')); // Must be after dispatch for some reason on Firefox/Opera + media.dispatchEvent(name); + }); + if(DEBUG) console.log('Created event handler for: ' + name); + }; + + for(var eventName in $.jPlayer.event) { + if($.jPlayer.event.hasOwnProperty(eventName)) { + var nativeEvent = true; + for(var iRes in reservedEvent) { + if(reservedEvent.hasOwnProperty(iRes)) { + if(reservedEvent[iRes] === eventName) { + nativeEvent = false; + break; + } + } + } + if(nativeEvent) { + bindEvent(eventName); + } else { + if(DEBUG) console.log('Skipped auto event handler creation for: ' + eventName); + } + } + } + + myPlayer.bind($.jPlayer.event.loadeddata, function(event) { + if(DEBUG) console.log('Dispatched event: loadeddata' + (event && event.jPlayer ? ' (' + event.jPlayer.status.currentTime + 's)' : '')); + media.dispatchEvent('loadeddata'); + ready = true; + }); + if(DEBUG) console.log('Created CUSTOM event handler for: loadeddata'); + + myPlayer.bind($.jPlayer.event.durationchange, function(event) { + duration = event.jPlayer.status.duration; + dispatchDurationChange(); + }); + if(DEBUG) console.log('Created CUSTOM event handler for: durationchange'); + + // The error event is a special case. Plus jPlayer error event assumes it is a broken URL. (It could also be a decoder error... Or aborted or a Network error.) + myPlayer.bind($.jPlayer.event.error, function(event) { + // Not sure how to handle the error situation. Popcorn does not appear to have the error or error.code property documented here: http://popcornjs.org/popcorn-docs/media-methods/ + // If any error event happens, then something has gone pear shaped. + + error = event.jPlayer.error; // Saving object pointer, not a copy of the object. Possible garbage collection issue... But the player is dead anyway, so don't care. + + if(error.type === $.jPlayer.error.URL) { + error.code = 4; // MEDIA_ERR_SRC_NOT_SUPPORTED since jPlayer makes this assumption. It is the most common error, then the decode error. Never seen either of the other 2 error types occur. + } else { + error.code = 0; // It was a jPlayer error, not an HTML5 media error. + } + + if(DEBUG) console.log('Dispatched event: error'); + if(DEBUG) console.dir(error); + media.dispatchEvent('error'); + }); + if(DEBUG) console.log('Created CUSTOM event handler for: error'); + + Popcorn.player.defineProperty( media, 'error', { + set: function() { + // Read-only property + return error; + }, + get: function() { + return error; + } + }); + + Popcorn.player.defineProperty( media, 'currentTime', { + set: function( val ) { + if(jPlayerObj.status.paused) { + myPlayer.jPlayer('pause', val); + } else { + myPlayer.jPlayer('play', val); + } + return val; + }, + get: function() { + return jPlayerObj.status.currentTime; + } + }); + + /* The joy of duration and the loadeddata event isReady() handler + * The duration is assumed to be a NaN or a valid duration. + * jPlayer uses zero instead of a NaN and this screws up the Popcorn track event start/end arrays padding. + * This line here: + * videoDurationPlus = duration != duration ? Number.MAX_VALUE : duration + 1; + * Not sure why it is not simply: + * videoDurationPlus = Number.MAX_VALUE; // Who cares if the padding is close to the real duration? + * So if you trigger loadeddata before the duration is correct, the track event padding is screwed up. (It pads the start, not the end... Well, duration+1 = 0+1 = 1s) + * That line makes the MP3 Flash fallback difficult to setup. The whole MP3 will need to load before the duration is known. + * Planning on using a NaN for duration until a >0 value is found... Except with MP3, where seekPercent must be 100% before setting the duration. + * Why not just use a NaN during init... And then correct the duration later? + */ + + Popcorn.player.defineProperty( media, 'duration', { + set: function() { + // Read-only property + if(ready) { + return duration; + } else { + return NaN; + } + }, + get: function() { + if(ready) { + return duration; // Popcorn has initialized, we can now use duration zero or whatever without fear. + } else { + return NaN; // Keep the duration a NaN until after loadeddata event has occurred. Otherwise Popcorn track event padding is corrupted. + } + } + }); + + Popcorn.player.defineProperty( media, 'muted', { + set: function( val ) { + myPlayer.jPlayer('mute', val); + return jPlayerObj.options.muted; + }, + get: function() { + return jPlayerObj.options.muted; + } + }); + + Popcorn.player.defineProperty( media, 'volume', { + set: function( val ) { + myPlayer.jPlayer('volume', val); + return jPlayerObj.options.volume; + }, + get: function() { + return jPlayerObj.options.volume; + } + }); + + Popcorn.player.defineProperty( media, 'paused', { + set: function() { + // Read-only property + return jPlayerObj.status.paused; + }, + get: function() { + return jPlayerObj.status.paused; + } + }); + + media.play = function() { + myPlayer.jPlayer('play'); + }; + media.pause = function() { + myPlayer.jPlayer('pause'); + }; + + myPlayer.jPlayer(jpOptions); // Instance jPlayer. Note that the options should not have a ready event defined... Kill it by default? + jPlayerObj = myPlayer.data('jPlayer'); + + }(jQuery)); + }, + + jPlayerCheck = function() { + if (!jQuery.jPlayer) { + if (!jPlayerDownloading) { + jPlayerDownloading = true; + Popcorn.getScript(JPLAYER_SCRIPT, function() { + jPlayerDownloading = false; + jPlayerInit(); + }); + } else { + setTimeout(jPlayerCheck, 250); + } + } else { + jPlayerInit(); + } + }, + + jQueryCheck = function() { + if (!window.jQuery) { + if (!jQueryDownloading) { + jQueryDownloading = true; + Popcorn.getScript(JQUERY_SCRIPT, function() { + jQueryDownloading = false; + jPlayerCheck(); + }); + } else { + setTimeout(jQueryCheck, 250); + } + } else { + jPlayerCheck(); + } + }; + + jQueryCheck(); + }, + _teardown: function() { + jQuery('#' + this.id).jPlayer('destroy'); + } + }); + +}(Popcorn)); \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.css b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.css new file mode 100644 index 00000000..f71520d6 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.css @@ -0,0 +1,640 @@ +/* + * Skin for jPlayer Plugin (jQuery JavaScript Library) + * http://www.jplayer.org + * + * Skin Name: Blue Monday + * + * Copyright (c) 2010-2012 Happyworm Ltd + * Dual licensed under the MIT and GPL licenses. + * - http://www.opensource.org/licenses/mit-license.php + * - http://www.gnu.org/copyleft/gpl.html + * + * Author: Silvia Benvenuti + * Skin Version: 4.3 (jPlayer 2.2.0) + * Date: 19th November 2012 + */ + +div.jp-audio, +div.jp-audio-stream, +div.jp-video { + + /* Edit the font-size to counteract inherited font sizing. + * Eg. 1.25em = 1 / 0.8em + */ + + font-size:1.25em; /* 1.25em for testing in site pages */ /* No parent CSS that can effect the size in the demos ZIP */ + + font-family:Verdana, Arial, sans-serif; + line-height:1.6; + color: #666; + border:1px solid #cccccc; + background-color:#eee; +} +div.jp-audio { + width:420px; +} +div.jp-audio-stream { + width:182px; +} +div.jp-video-270p { + width:480px; +} +div.jp-video-360p { + width:640px; +} +div.jp-video-full { + /* Rules for IE6 (full-screen) */ + width:480px; + height:270px; + /* Rules for IE7 (full-screen) - Otherwise the relative container causes other page items that are not position:static (default) to appear over the video/gui. */ + position:static !important; position:relative; +} + +/* The z-index rule is defined in this manner to enable Popcorn plugins that add overlays to video area. EG. Subtitles. */ +div.jp-video-full div div { + z-index:1000; +} + +div.jp-video-full div.jp-jplayer { + top: 0; + left: 0; + position: fixed !important; position: relative; /* Rules for IE6 (full-screen) */ + overflow: hidden; +} + +div.jp-video-full div.jp-gui { + position: fixed !important; position: static; /* Rules for IE6 (full-screen) */ + top: 0; + left: 0; + width:100%; + height:100%; + z-index:1001; /* 1 layer above the others. */ +} + +div.jp-video-full div.jp-interface { + position: absolute !important; position: relative; /* Rules for IE6 (full-screen) */ + bottom: 0; + left: 0; +} + +div.jp-interface { + position: relative; + background-color:#eee; + width:100%; +} + +div.jp-audio div.jp-type-single div.jp-interface { + height:80px; +} +div.jp-audio div.jp-type-playlist div.jp-interface { + height:80px; +} + +div.jp-audio-stream div.jp-type-single div.jp-interface { + height:80px; +} + +div.jp-video div.jp-interface { + border-top:1px solid #aaaaaa; +} + +/* @group CONTROLS */ + +div.jp-controls-holder { + clear: both; + width:440px; + margin:0 auto; + position: relative; + overflow:hidden; + top:-8px; /* This negative value depends on the size of the text in jp-currentTime and jp-duration */ +} + +div.jp-interface ul.jp-controls { + list-style-type:none; + margin:0; + padding: 0; + overflow:hidden; +} + +div.jp-audio ul.jp-controls { + width: 380px; + padding:20px 20px 0 20px; +} + +div.jp-audio-stream ul.jp-controls { + width: 142px; + padding:20px 20px 0 20px; +} + +div.jp-video div.jp-type-single ul.jp-controls { + width: 78px; + margin-left: 200px; +} + +div.jp-video div.jp-type-playlist ul.jp-controls { + width: 134px; + margin-left: 172px; +} +div.jp-video ul.jp-controls, +div.jp-interface ul.jp-controls li { + display:inline; + float: left; +} + +div.jp-interface ul.jp-controls a { + display:block; + overflow:hidden; + text-indent:-9999px; +} +a.jp-play, +a.jp-pause { + width:40px; + height:40px; +} + +a.jp-play { + background: url("jplayer.blue.monday.jpg") 0 0 no-repeat; +} +a.jp-play:hover { + background: url("jplayer.blue.monday.jpg") -41px 0 no-repeat; +} +a.jp-pause { + background: url("jplayer.blue.monday.jpg") 0 -42px no-repeat; + display: none; +} +a.jp-pause:hover { + background: url("jplayer.blue.monday.jpg") -41px -42px no-repeat; +} + +a.jp-stop, a.jp-previous, a.jp-next { + width:28px; + height:28px; + margin-top:6px; +} + +a.jp-stop { + background: url("jplayer.blue.monday.jpg") 0 -83px no-repeat; + margin-left:10px; +} + +a.jp-stop:hover { + background: url("jplayer.blue.monday.jpg") -29px -83px no-repeat; +} + +a.jp-previous { + background: url("jplayer.blue.monday.jpg") 0 -112px no-repeat; +} +a.jp-previous:hover { + background: url("jplayer.blue.monday.jpg") -29px -112px no-repeat; +} + +a.jp-next { + background: url("jplayer.blue.monday.jpg") 0 -141px no-repeat; +} +a.jp-next:hover { + background: url("jplayer.blue.monday.jpg") -29px -141px no-repeat; +} + +/* @end */ + +/* @group progress bar */ + +div.jp-progress { + overflow:hidden; + background-color: #ddd; +} +div.jp-audio div.jp-progress { + position: absolute; + top:32px; + height:15px; +} +div.jp-audio div.jp-type-single div.jp-progress { + left:110px; + width:186px; +} +div.jp-audio div.jp-type-playlist div.jp-progress { + left:166px; + width:130px; +} +div.jp-video div.jp-progress { + top:0px; + left:0px; + width:100%; + height:10px; +} +div.jp-seek-bar { + background: url("jplayer.blue.monday.jpg") 0 -202px repeat-x; + width:0px; + height:100%; + cursor: pointer; +} +div.jp-play-bar { + background: url("jplayer.blue.monday.jpg") 0 -218px repeat-x ; + width:0px; + height:100%; +} + +/* The seeking class is added/removed inside jPlayer */ +div.jp-seeking-bg { + background: url("jplayer.blue.monday.seeking.gif"); +} + +/* @end */ + +/* @group volume controls */ + + +a.jp-mute, +a.jp-unmute, +a.jp-volume-max { + width:18px; + height:15px; + margin-top:12px; +} + +div.jp-audio div.jp-type-single a.jp-mute, +div.jp-audio div.jp-type-single a.jp-unmute { + margin-left: 210px; +} +div.jp-audio div.jp-type-playlist a.jp-mute, +div.jp-audio div.jp-type-playlist a.jp-unmute { + margin-left: 154px; +} + +div.jp-audio-stream div.jp-type-single a.jp-mute, +div.jp-audio-stream div.jp-type-single a.jp-unmute { + margin-left:10px; +} + +div.jp-audio a.jp-volume-max, +div.jp-audio-stream a.jp-volume-max { + margin-left: 56px; +} + +div.jp-video a.jp-mute, +div.jp-video a.jp-unmute, +div.jp-video a.jp-volume-max { + position: absolute; + top:12px; + margin-top:0; +} + +div.jp-video a.jp-mute, +div.jp-video a.jp-unmute { + left: 50px; +} + +div.jp-video a.jp-volume-max { + left: 134px; +} + +a.jp-mute { + background: url("jplayer.blue.monday.jpg") 0 -170px no-repeat; +} +a.jp-mute:hover { + background: url("jplayer.blue.monday.jpg") -19px -170px no-repeat; +} +a.jp-unmute { + background: url("jplayer.blue.monday.jpg") -60px -170px no-repeat; + display: none; +} +a.jp-unmute:hover { + background: url("jplayer.blue.monday.jpg") -79px -170px no-repeat; +} +a.jp-volume-max { + background: url("jplayer.blue.monday.jpg") 0 -186px no-repeat; +} +a.jp-volume-max:hover { + background: url("jplayer.blue.monday.jpg") -19px -186px no-repeat; +} + +div.jp-volume-bar { + position: absolute; + overflow:hidden; + background: url("jplayer.blue.monday.jpg") 0 -250px repeat-x; + width:46px; + height:5px; + cursor: pointer; +} +div.jp-audio div.jp-volume-bar { + top:37px; + left:330px; +} +div.jp-audio-stream div.jp-volume-bar { + top:37px; + left:92px; +} +div.jp-video div.jp-volume-bar { + top:17px; + left:72px; +} +div.jp-volume-bar-value { + background: url("jplayer.blue.monday.jpg") 0 -256px repeat-x; + width:0px; + height:5px; +} + +/* @end */ + +/* @group current time and duration */ + +div.jp-audio div.jp-time-holder { + position:absolute; + top:50px; +} +div.jp-audio div.jp-type-single div.jp-time-holder { + left:110px; + width:186px; +} +div.jp-audio div.jp-type-playlist div.jp-time-holder { + left:166px; + width:130px; +} + +div.jp-current-time, +div.jp-duration { + width:60px; + font-size:.64em; + font-style:oblique; +} +div.jp-current-time { + float: left; + display:inline; +} +div.jp-duration { + float: right; + display:inline; + text-align: right; +} + +div.jp-video div.jp-current-time { + margin-left:20px; +} +div.jp-video div.jp-duration { + margin-right:20px; +} + +/* @end */ + +/* @group playlist */ + +div.jp-title { + font-weight:bold; + text-align:center; +} + +div.jp-title, +div.jp-playlist { + width:100%; + background-color:#ccc; + border-top:1px solid #cccccc; +} +div.jp-type-single div.jp-title, +div.jp-type-playlist div.jp-title, +div.jp-type-single div.jp-playlist { + border-top:none; +} +div.jp-title ul, +div.jp-playlist ul { + list-style-type:none; + margin:0; + padding:0 20px; + font-size:.72em; +} + +div.jp-title li { + padding:5px 0; + font-weight:bold; +} +div.jp-playlist li { + padding:5px 0 4px 20px; + border-bottom:1px solid #eee; +} + +div.jp-playlist li div { + display:inline; +} + +/* Note that the first-child (IE6) and last-child (IE6/7/8) selectors do not work on IE */ + +div.jp-type-playlist div.jp-playlist li:last-child { + padding:5px 0 5px 20px; + border-bottom:none; +} +div.jp-type-playlist div.jp-playlist li.jp-playlist-current { + list-style-type:square; + list-style-position:inside; + padding-left:7px; +} +div.jp-type-playlist div.jp-playlist a { + color: #333; + text-decoration: none; +} +div.jp-type-playlist div.jp-playlist a:hover { + color:#0d88c1; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-current { + color:#0d88c1; +} + +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove { + float:right; + display:inline; + text-align:right; + margin-right:10px; + font-weight:bold; + color:#666; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove:hover { + color:#0d88c1; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media { + float:right; + display:inline; + text-align:right; + margin-right:10px; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media a{ + color:#666; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media a:hover{ + color:#0d88c1; +} +span.jp-artist { + font-size:.8em; + color:#666; +} + +/* @end */ + +div.jp-video-play { + width:100%; + overflow:hidden; /* Important for nested negative margins to work in modern browsers */ + cursor:pointer; + background-color:rgba(0,0,0,0); /* Makes IE9 work with the active area over the whole video area. IE6/7/8 only have the button as active area. */ +} +div.jp-video-270p div.jp-video-play { + margin-top:-270px; + height:270px; +} +div.jp-video-360p div.jp-video-play { + margin-top:-360px; + height:360px; +} +div.jp-video-full div.jp-video-play { + height:100%; +} +a.jp-video-play-icon { + position:relative; + display:block; + width: 112px; + height: 100px; + + margin-left:-56px; + margin-top:-50px; + left:50%; + top:50%; + + background: url("jplayer.blue.monday.video.play.png") 0 0 no-repeat; + text-indent:-9999px; +} +div.jp-video-play:hover a.jp-video-play-icon { + background: url("jplayer.blue.monday.video.play.png") 0 -100px no-repeat; +} + + + + + +div.jp-jplayer audio, +div.jp-jplayer { + width:0px; + height:0px; +} + +div.jp-jplayer { + background-color: #000000; +} + + + + + +/* @group TOGGLES */ + +/* The audio toggles are nested inside jp-time-holder */ + +ul.jp-toggles { + list-style-type:none; + padding:0; + margin:0 auto; + overflow:hidden; +} + +div.jp-audio .jp-type-single ul.jp-toggles { + width:25px; +} +div.jp-audio .jp-type-playlist ul.jp-toggles { + width:55px; + margin: 0; + position: absolute; + left: 325px; + top: 50px; +} + +div.jp-video ul.jp-toggles { + margin-top:10px; + width:100px; +} + +ul.jp-toggles li { + display:block; + float:right; +} + +ul.jp-toggles li a { + display:block; + width:25px; + height:18px; + text-indent:-9999px; + line-height:100%; /* need this for IE6 */ +} + +a.jp-full-screen { + background: url("jplayer.blue.monday.jpg") 0 -310px no-repeat; + margin-left: 20px; +} + +a.jp-full-screen:hover { + background: url("jplayer.blue.monday.jpg") -30px -310px no-repeat; +} + +a.jp-restore-screen { + background: url("jplayer.blue.monday.jpg") -60px -310px no-repeat; + margin-left: 20px; +} + +a.jp-restore-screen:hover { + background: url("jplayer.blue.monday.jpg") -90px -310px no-repeat; +} + +a.jp-repeat { + background: url("jplayer.blue.monday.jpg") 0 -290px no-repeat; +} + +a.jp-repeat:hover { + background: url("jplayer.blue.monday.jpg") -30px -290px no-repeat; +} + +a.jp-repeat-off { + background: url("jplayer.blue.monday.jpg") -60px -290px no-repeat; +} + +a.jp-repeat-off:hover { + background: url("jplayer.blue.monday.jpg") -90px -290px no-repeat; +} + +a.jp-shuffle { + background: url("jplayer.blue.monday.jpg") 0 -270px no-repeat; + margin-left: 5px; +} + +a.jp-shuffle:hover { + background: url("jplayer.blue.monday.jpg") -30px -270px no-repeat; +} + +a.jp-shuffle-off { + background: url("jplayer.blue.monday.jpg") -60px -270px no-repeat; + margin-left: 5px; +} + +a.jp-shuffle-off:hover { + background: url("jplayer.blue.monday.jpg") -90px -270px no-repeat; +} + + +/* @end */ + +/* @group NO SOLUTION error feedback */ + +.jp-no-solution { + padding:5px; + font-size:.8em; + background-color:#eee; + border:2px solid #cccccc; + color:#000; + display:none; +} + +.jp-no-solution a { + color:#000; +} + +.jp-no-solution span { + font-size:1em; + display:block; + text-align:center; + font-weight:bold; +} + +/* @end */ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.jpg b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.jpg new file mode 100644 index 00000000..52fdc1aa Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.jpg differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.seeking.gif b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.seeking.gif new file mode 100644 index 00000000..dbd2105a Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.seeking.gif differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.video.play.png b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.video.play.png new file mode 100644 index 00000000..8e97df01 Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/jplayer.blue.monday.video.play.png differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/spirites_blue.monday_2011.pxm b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/spirites_blue.monday_2011.pxm new file mode 100644 index 00000000..e3adcabf Binary files /dev/null and b/local/modules/Tinymce/Resources/js/tinymce/filemanager/jPlayer/skin/blue.monday/spirites_blue.monday_2011.pxm differ diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootbox.min.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootbox.min.js new file mode 100644 index 00000000..3503860e --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootbox.min.js @@ -0,0 +1,6 @@ +/** + * bootbox.js v3.3.0 + * + * http://bootboxjs.com/license.txt + */ +var bootbox=window.bootbox||function(a,b){function c(a,b){return"undefined"==typeof b&&(b=d),"string"==typeof m[b][a]?m[b][a]:b!=e?c(a,e):a}var d="en",e="en",f=!0,g="static",h="javascript:;",i="",j={},k={},l={};l.setLocale=function(a){for(var b in m)if(b==a)return d=a,void 0;throw new Error("Invalid locale: "+a)},l.addLocale=function(a,b){"undefined"==typeof m[a]&&(m[a]={});for(var c in b)m[a][c]=b[c]},l.setIcons=function(a){k=a,("object"!=typeof k||null===k)&&(k={})},l.setBtnClasses=function(a){j=a,("object"!=typeof j||null===j)&&(j={})},l.alert=function(){var a="",b=c("OK"),d=null;switch(arguments.length){case 1:a=arguments[0];break;case 2:a=arguments[0],"function"==typeof arguments[1]?d=arguments[1]:b=arguments[1];break;case 3:a=arguments[0],b=arguments[1],d=arguments[2];break;default:throw new Error("Incorrect number of arguments: expected 1-3")}return l.dialog(a,{label:b,icon:k.OK,"class":j.OK,callback:d},{onEscape:d||!0})},l.confirm=function(){var a="",b=c("CANCEL"),d=c("CONFIRM"),e=null;switch(arguments.length){case 1:a=arguments[0];break;case 2:a=arguments[0],"function"==typeof arguments[1]?e=arguments[1]:b=arguments[1];break;case 3:a=arguments[0],b=arguments[1],"function"==typeof arguments[2]?e=arguments[2]:d=arguments[2];break;case 4:a=arguments[0],b=arguments[1],d=arguments[2],e=arguments[3];break;default:throw new Error("Incorrect number of arguments: expected 1-4")}var f=function(){return"function"==typeof e?e(!1):void 0},g=function(){return"function"==typeof e?e(!0):void 0};return l.dialog(a,[{label:b,icon:k.CANCEL,"class":j.CANCEL,callback:f},{label:d,icon:k.CONFIRM,"class":j.CONFIRM,callback:g}],{onEscape:f})},l.prompt=function(){var a="",d=c("CANCEL"),e=c("CONFIRM"),f=null,g="";switch(arguments.length){case 1:a=arguments[0];break;case 2:a=arguments[0],"function"==typeof arguments[1]?f=arguments[1]:d=arguments[1];break;case 3:a=arguments[0],d=arguments[1],"function"==typeof arguments[2]?f=arguments[2]:e=arguments[2];break;case 4:a=arguments[0],d=arguments[1],e=arguments[2],f=arguments[3];break;case 5:a=arguments[0],d=arguments[1],e=arguments[2],f=arguments[3],g=arguments[4];break;default:throw new Error("Incorrect number of arguments: expected 1-5")}var h=a,i=b("
    ");i.append("");var m=function(){return"function"==typeof f?f(null):void 0},n=function(){return"function"==typeof f?f(i.find("input[type=text]").val()):void 0},o=l.dialog(i,[{label:d,icon:k.CANCEL,"class":j.CANCEL,callback:m},{label:e,icon:k.CONFIRM,"class":j.CONFIRM,callback:n}],{header:h,show:!1,onEscape:m});return o.on("shown",function(){i.find("input[type=text]").focus(),i.on("submit",function(a){a.preventDefault(),o.find(".btn-inverse").click()})}),o.modal("show"),o},l.dialog=function(c,d,e){function j(){var a=null;"function"==typeof e.onEscape&&(a=e.onEscape()),a!==!1&&x.modal("hide")}var k="",l=[];e||(e={}),"undefined"==typeof d?d=[]:"undefined"==typeof d.length&&(d=[d]);for(var m=d.length;m--;){var n=null,o=null,p=null,q="",r=null;if("undefined"==typeof d[m].label&&"undefined"==typeof d[m]["class"]&&"undefined"==typeof d[m].callback){var s=0,t=null;for(var u in d[m])if(t=u,++s>1)break;1==s&&"function"==typeof d[m][u]&&(d[m].label=t,d[m].callback=d[m][u])}"function"==typeof d[m].callback&&(r=d[m].callback),d[m]["class"]?p=d[m]["class"]:m==d.length-1&&d.length<=2&&(p="btn-inverse"),d[m].link!==!0&&(p="btn "+p),n=d[m].label?d[m].label:"Option "+(m+1),d[m].icon&&(q=" "),o=d[m].href?d[m].href:h,k=""+q+n+""+k,l[m]=r}var v=["");var x=b(v.join("\n")),y="undefined"==typeof e.animate?f:e.animate;y&&x.addClass("fade");var z="undefined"==typeof e.classes?i:e.classes;return z&&x.addClass(z),x.find(".modal-body").html(c),x.on("keyup.dismiss.modal",function(a){27===a.which&&e.onEscape&&j("escape")}),x.on("click","a.close",function(a){a.preventDefault(),j("close")}),x.on("shown",function(){x.find("a.btn-inverse:first").focus()}),x.on("hidden",function(a){a.target===this&&x.remove()}),x.on("click",".modal-footer a",function(a){var c=b(this).data("handler"),e=l[c],f=null;("undefined"==typeof c||"undefined"==typeof d[c].href)&&(a.preventDefault(),"function"==typeof e&&(f=e(a)),f!==!1&&x.modal("hide"))}),b("body").append(x),x.modal({backdrop:"undefined"==typeof e.backdrop?g:e.backdrop,keyboard:!1,show:!1}),x.on("show",function(){b(a).off("focusin.modal")}),("undefined"==typeof e.show||e.show===!0)&&x.modal("show"),x},l.modal=function(){var a,c,d,e={onEscape:null,keyboard:!0,backdrop:g};switch(arguments.length){case 1:a=arguments[0];break;case 2:a=arguments[0],"object"==typeof arguments[1]?d=arguments[1]:c=arguments[1];break;case 3:a=arguments[0],c=arguments[1],d=arguments[2];break;default:throw new Error("Incorrect number of arguments: expected 1-3")}return e.header=c,d="object"==typeof d?b.extend(e,d):e,l.dialog(a,[],d)},l.hideAll=function(){b(".bootbox").modal("hide")},l.animate=function(a){f=a},l.backdrop=function(a){g=a},l.classes=function(a){i=a};var m={br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return l}(document,window.jQuery);window.bootbox=bootbox; \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-lightbox.min.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-lightbox.min.js new file mode 100644 index 00000000..3b299fa4 --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-lightbox.min.js @@ -0,0 +1 @@ +!function(e){"use strict";var t=function(t,n){this.options=n;this.$element=e(t).delegate('[data-dismiss="lightbox"]',"click.dismiss.lightbox",e.proxy(this.hide,this));this.options.remote&&this.$element.find(".lightbox-body").load(this.options.remote)};t.prototype=e.extend({},e.fn.modal.Constructor.prototype);t.prototype.constructor=t;t.prototype.enforceFocus=function(){var t=this;e(document).on("focusin.lightbox",function(e){if(t.$element[0]!==e.target&&!t.$element.has(e.target).length){t.$element.focus()}})};t.prototype.show=function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=true;this.escape();this.preloadSize(function(){t.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");if(!t.$element.parent().length){t.$element.appendTo(document.body)}hide_animation();t.$element.show();if(n){t.$element[0].offsetWidth}t.$element.addClass("in").attr("aria-hidden",false);t.enforceFocus();n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})})};t.prototype.hide=function(t){t&&t.preventDefault();var n=this;t=e.Event("hide");this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=false;this.escape();e(document).off("focusin.lightbox");this.$element.removeClass("in").attr("aria-hidden",true);e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()};t.prototype.escape=function(){var e=this;if(this.isShown&&this.options.keyboard){this.$element.on("keyup.dismiss.lightbox",function(t){t.which==27&&e.hide()})}else if(!this.isShown){this.$element.off("keyup.dismiss.lightbox")}};t.prototype.preloadSize=function(t){var n=e.Callbacks();if(t)n.add(t);var r=this;var i,s,o,u,a,f,l,c,h,p;i=e(window).height();s=e(window).width();o=parseInt(r.$element.find(".lightbox-content").css("padding-top"),10);u=parseInt(r.$element.find(".lightbox-content").css("padding-bottom"),10);a=parseInt(r.$element.find(".lightbox-content").css("padding-left"),10);f=parseInt(r.$element.find(".lightbox-content").css("padding-right"),10);l=r.$element.find(".lightbox-content").find("img:first");c=new Image;c.onload=function(){if(c.width+a+f>=s){h=c.width;p=c.height;c.width=s-a-f;c.height=p/h*c.width}if(c.height+o+u>=i){h=c.width;p=c.height;c.height=i-o-u;c.width=h/p*c.height}r.$element.css({position:"fixed",width:c.width+a+f,height:c.height+o+u,top:i/2-(c.height+o+u)/2,left:"50%","margin-left":-1*(c.width+a+f)/2});r.$element.find(".lightbox-content").css({width:c.width,height:c.height});n.fire()};c.src=l.attr("src")};var n=e.fn.lightbox;e.fn.lightbox=function(n){return this.each(function(){var r=e(this);var i=r.data("lightbox");var s=e.extend({},e.fn.lightbox.defaults,r.data(),typeof n=="object"&&n);if(!i)r.data("lightbox",i=new t(this,s));if(typeof n=="string")i[n]();else if(s.show)i.show()})};e.fn.lightbox.defaults={backdrop:true,keyboard:true,show:true};e.fn.lightbox.Constructor=t;e.fn.lightbox.noConflict=function(){e.fn.lightbox=n;return this};e(document).on("click.lightbox.data-api",'[data-toggle="lightbox"]',function(t){var n=e(this);var r=n.attr("href");var i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,""));var s=i.data("lightbox")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault();i.lightbox(s).one("hide",function(){n.focus()})})}(window.jQuery) \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-modal.min.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-modal.min.js new file mode 100644 index 00000000..78ec172c --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-modal.min.js @@ -0,0 +1 @@ +!function(e){"use strict";var t=function(e,t){this.init(e,t)};t.prototype={constructor:t,init:function(t,n){this.options=n;this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this));this.options.remote&&this.$element.find(".modal-body").load(this.options.remote);var r=typeof this.options.manager==="function"?this.options.manager.call(this):this.options.manager;r=r.appendModal?r:e(r).modalmanager().data("modalmanager");r.appendModal(this)},toggle:function(){return this[!this.isShown?"show":"hide"]()},show:function(){var t=e.Event("show");if(this.isShown)return;this.$element.trigger(t);if(t.isDefaultPrevented())return;this.escape();this.tab();this.options.loading&&this.loading()},hide:function(t){t&&t.preventDefault();t=e.Event("hide");this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return this.isShown=false;this.isShown=false;this.escape();this.tab();this.isLoading&&this.loading();e(document).off("focusin.modal");this.$element.removeClass("in").removeClass("animated").removeClass(this.options.attentionAnimation).removeClass("modal-overflow").attr("aria-hidden",true);e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},layout:function(){var t=this.options.height?"height":"max-height",n=this.options.height||this.options.maxHeight;if(this.options.width){this.$element.css("width",this.options.width);var r=this;this.$element.css("margin-left",function(){if(/%/ig.test(r.options.width)){return-(parseInt(r.options.width)/2)+"%"}else{return-(e(this).width()/2)+"px"}})}else{this.$element.css("width","");this.$element.css("margin-left","")}this.$element.find(".modal-body").css("overflow","").css(t,"");if(n){this.$element.find(".modal-body").css("overflow","auto").css(t,n)}var i=e(window).height()-10e(this).data("tabindex")?r=e(this):i=e(this)}});r[0]!==e(this)[0]?r.focus():i.focus();n.preventDefault()}})}else if(!this.isShown){this.$element.off("keydown.tabindex.modal")}},escape:function(){var e=this;if(this.isShown&&this.options.keyboard){if(!this.$element.attr("tabindex"))this.$element.attr("tabindex",-1);this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()})}else if(!this.isShown){this.$element.off("keyup.dismiss.modal")}},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end);t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n);t.hideModal()})},hideModal:function(){var e=this.options.height?"height":"max-height";var t=this.options.height||this.options.maxHeight;if(t){this.$element.find(".modal-body").css("overflow","").css(e,"")}this.$element.hide().trigger("hidden")},removeLoading:function(){this.$loading.remove();this.$loading=null;this.isLoading=false},loading:function(t){t=t||function(){};var n=this.$element.hasClass("fade")?"fade":"";if(!this.isLoading){var r=e.support.transition&&n;this.$loading=e('
    ').append(this.options.spinner).appendTo(this.$element);if(r)this.$loading[0].offsetWidth;this.$loading.addClass("in");this.isLoading=true;r?this.$loading.one(e.support.transition.end,t):t()}else if(this.isLoading&&this.$loading){this.$loading.removeClass("in");var i=this;e.support.transition&&this.$element.hasClass("fade")?this.$loading.one(e.support.transition.end,function(){i.removeLoading()}):i.removeLoading()}else if(t){t(this.isLoading)}},focus:function(){var e=this.$element.find(this.options.focusOn);e=e.length?e:this.$element;e.focus()},attention:function(){if(this.options.attentionAnimation){this.$element.removeClass("animated").removeClass(this.options.attentionAnimation);var e=this;setTimeout(function(){e.$element.addClass("animated").addClass(e.options.attentionAnimation)},0)}this.focus()},destroy:function(){var t=e.Event("destroy");this.$element.trigger(t);if(t.isDefaultPrevented())return;this.teardown()},teardown:function(){if(!this.$parent.length){this.$element.remove();this.$element=null;return}if(this.$parent!==this.$element.parent()){this.$element.appendTo(this.$parent)}this.$element.off(".modal");this.$element.removeData("modal");this.$element.removeClass("in").attr("aria-hidden",true)}};e.fn.modal=function(n,r){return this.each(function(){var i=e(this),s=i.data("modal"),o=e.extend({},e.fn.modal.defaults,i.data(),typeof n=="object"&&n);if(!s)i.data("modal",s=new t(this,o));if(typeof n=="string")s[n].apply(s,[].concat(r));else if(o.show)s.show()})};e.fn.modal.defaults={keyboard:true,backdrop:true,loading:false,show:true,width:null,height:null,maxHeight:null,modalOverflow:false,consumeTab:true,focusOn:null,replace:false,resize:false,attentionAnimation:"shake",manager:"body",spinner:'
    '};e.fn.modal.Constructor=t;e(function(){e(document).off("click.modal").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault();i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery) \ No newline at end of file diff --git a/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-modalmanager.min.js b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-modalmanager.min.js new file mode 100644 index 00000000..81f557ad --- /dev/null +++ b/local/modules/Tinymce/Resources/js/tinymce/filemanager/js/bootstrap-modalmanager.min.js @@ -0,0 +1 @@ +!function(e){"use strict";function r(e){return function(t){if(this===t.target){return e.apply(this,arguments)}}}var t=function(e,t){this.init(e,t)};t.prototype={constructor:t,init:function(t,n){this.$element=e(t);this.options=e.extend({},e.fn.modalmanager.defaults,this.$element.data(),typeof n=="object"&&n);this.stack=[];this.backdropCount=0;if(this.options.resize){var r,i=this;e(window).on("resize.modal",function(){r&&clearTimeout(r);r=setTimeout(function(){for(var e=0;e').appendTo(this.$element)}else{n=this.$backdropHandle;n.off(".modalmanager");this.$backdropHandle=null;this.isLoading&&this.removeSpinner()}return n},removeContainer:function(e){e.$container.remove();e.$container=null},createContainer:function(t){var i;i=e(' +
    +
    + \ No newline at end of file diff --git a/local/modules/Tinymce/templates/backOffice/default/tinymce_init.tpl b/local/modules/Tinymce/templates/backOffice/default/tinymce_init.tpl new file mode 100644 index 00000000..6db9acb9 --- /dev/null +++ b/local/modules/Tinymce/templates/backOffice/default/tinymce_init.tpl @@ -0,0 +1,119 @@ + + + diff --git a/local/modules/VirtualProductControl/Config/config.xml b/local/modules/VirtualProductControl/Config/config.xml new file mode 100644 index 00000000..689f7901 --- /dev/null +++ b/local/modules/VirtualProductControl/Config/config.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/local/modules/VirtualProductControl/Config/module.xml b/local/modules/VirtualProductControl/Config/module.xml new file mode 100644 index 00000000..fe89191d --- /dev/null +++ b/local/modules/VirtualProductControl/Config/module.xml @@ -0,0 +1,20 @@ + + + VirtualProductControl\VirtualProductControl + + Virtual Product Controller + Check if a virtual product delivery module is enabled if at least one product is virtual + + + Contrôle de produit virtuel + Vérifie qu'un module de livraison pour produit virtuel soit activé si des produits virtuels existent + + 2.3.1 + + Manuel Raynaud + manu@raynaud.io + + classic + 2.2.0 + alpha + diff --git a/local/modules/VirtualProductControl/Hook/VirtualProductHook.php b/local/modules/VirtualProductControl/Hook/VirtualProductHook.php new file mode 100644 index 00000000..8ded689a --- /dev/null +++ b/local/modules/VirtualProductControl/Hook/VirtualProductHook.php @@ -0,0 +1,62 @@ + + */ +class VirtualProductHook extends BaseHook +{ + /** + * @var SecurityContext + */ + protected $securityContext; + + public function __construct(SecurityContext $securityContext) + { + $this->securityContext = $securityContext; + } + + public function onMainBeforeContent(HookRenderEvent $event) + { + if ($this->securityContext->isGranted( + ["ADMIN"], + [AdminResources::PRODUCT], + [], + [AccessManager::VIEW] + )) { + $products = ProductQuery::create() + ->filterByVirtual(1) + ->filterByVisible(1) + ->count(); + + if ($products > 0) { + $deliveryModule = ModuleQuery::create()->retrieveVirtualProductDelivery(); + + if (false === $deliveryModule) { + $event->add($this->render('virtual-delivery-warning.html')); + } + } + } + } +} diff --git a/local/modules/VirtualProductControl/I18n/backOffice/default/de_DE.php b/local/modules/VirtualProductControl/I18n/backOffice/default/de_DE.php new file mode 100644 index 00000000..aaa4698a --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/backOffice/default/de_DE.php @@ -0,0 +1,5 @@ + 'Mindestens ein virtuelles Produkt ist verfügbar, aber kein Liefermodul für virtuellen Produkte ist aktiviert', +]; diff --git a/local/modules/VirtualProductControl/I18n/backOffice/default/en_US.php b/local/modules/VirtualProductControl/I18n/backOffice/default/en_US.php new file mode 100644 index 00000000..2b71ceb9 --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/backOffice/default/en_US.php @@ -0,0 +1,5 @@ + 'At least one virtual product is online but no virtual product delivery module enabled', +); diff --git a/local/modules/VirtualProductControl/I18n/backOffice/default/fr_FR.php b/local/modules/VirtualProductControl/I18n/backOffice/default/fr_FR.php new file mode 100644 index 00000000..b04c5963 --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/backOffice/default/fr_FR.php @@ -0,0 +1,5 @@ + 'Au moins un produit virtuel est en vente mais aucun module de livraison pour produit virtuel n\'est activé', +]; diff --git a/local/modules/VirtualProductControl/I18n/backOffice/default/it_IT.php b/local/modules/VirtualProductControl/I18n/backOffice/default/it_IT.php new file mode 100644 index 00000000..1a42252f --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/backOffice/default/it_IT.php @@ -0,0 +1,5 @@ + 'Almeno un prodotto virtuale è online, ma nessun modulo di consegna del prodotto virtuale è abilitato', +]; diff --git a/local/modules/VirtualProductControl/I18n/backOffice/default/tr_TR.php b/local/modules/VirtualProductControl/I18n/backOffice/default/tr_TR.php new file mode 100644 index 00000000..b2fd7a5e --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/backOffice/default/tr_TR.php @@ -0,0 +1,5 @@ + 'En az bir sanal ürün hiç sanal ürün teslim modülü etkin yayında', +]; diff --git a/local/modules/VirtualProductControl/I18n/de_DE.php b/local/modules/VirtualProductControl/I18n/de_DE.php new file mode 100644 index 00000000..aaa4698a --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/de_DE.php @@ -0,0 +1,5 @@ + 'Mindestens ein virtuelles Produkt ist verfügbar, aber kein Liefermodul für virtuellen Produkte ist aktiviert', +]; diff --git a/local/modules/VirtualProductControl/I18n/en_US.php b/local/modules/VirtualProductControl/I18n/en_US.php new file mode 100644 index 00000000..ecd80759 --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/en_US.php @@ -0,0 +1,4 @@ + 'At least one virtual product is online but no virtual product delivery module enabled', +); diff --git a/local/modules/VirtualProductControl/I18n/fr_FR.php b/local/modules/VirtualProductControl/I18n/fr_FR.php new file mode 100644 index 00000000..b04c5963 --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/fr_FR.php @@ -0,0 +1,5 @@ + 'Au moins un produit virtuel est en vente mais aucun module de livraison pour produit virtuel n\'est activé', +]; diff --git a/local/modules/VirtualProductControl/I18n/it_IT.php b/local/modules/VirtualProductControl/I18n/it_IT.php new file mode 100644 index 00000000..1a42252f --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/it_IT.php @@ -0,0 +1,5 @@ + 'Almeno un prodotto virtuale è online, ma nessun modulo di consegna del prodotto virtuale è abilitato', +]; diff --git a/local/modules/VirtualProductControl/I18n/tr_TR.php b/local/modules/VirtualProductControl/I18n/tr_TR.php new file mode 100644 index 00000000..b2fd7a5e --- /dev/null +++ b/local/modules/VirtualProductControl/I18n/tr_TR.php @@ -0,0 +1,5 @@ + 'En az bir sanal ürün hiç sanal ürün teslim modülü etkin yayında', +]; diff --git a/local/modules/VirtualProductControl/LICENSE.txt b/local/modules/VirtualProductControl/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/VirtualProductControl/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/VirtualProductControl/VirtualProductControl.php b/local/modules/VirtualProductControl/VirtualProductControl.php new file mode 100644 index 00000000..e3211039 --- /dev/null +++ b/local/modules/VirtualProductControl/VirtualProductControl.php @@ -0,0 +1,20 @@ + +
    + +
    + \ No newline at end of file diff --git a/local/modules/VirtualProductDelivery/Config/config.xml b/local/modules/VirtualProductDelivery/Config/config.xml new file mode 100644 index 00000000..1b16d36c --- /dev/null +++ b/local/modules/VirtualProductDelivery/Config/config.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/modules/VirtualProductDelivery/Config/module.xml b/local/modules/VirtualProductDelivery/Config/module.xml new file mode 100644 index 00000000..d89f383e --- /dev/null +++ b/local/modules/VirtualProductDelivery/Config/module.xml @@ -0,0 +1,24 @@ + + + VirtualProductDelivery\VirtualProductDelivery + + Virtual Products Delivery + + + Livraison Produits Virtuels + + + en_US + fr_FR + + 2.3.1 + + Julien Chanséaume + jchanseaume@openstudio.fr + + delivery + 2.2.0 + alpha + diff --git a/local/modules/VirtualProductDelivery/EventListeners/SendMail.php b/local/modules/VirtualProductDelivery/EventListeners/SendMail.php new file mode 100644 index 00000000..2eea49e5 --- /dev/null +++ b/local/modules/VirtualProductDelivery/EventListeners/SendMail.php @@ -0,0 +1,122 @@ + + */ +class SendMail implements EventSubscriberInterface +{ + /** @var MailerFactory */ + protected $mailer; + + /** @var EventDispatcherInterface */ + protected $eventDispatcher; + + public function __construct(MailerFactory $mailer, EventDispatcherInterface $eventDispatcher) + { + $this->mailer = $mailer; + $this->eventDispatcher = $eventDispatcher; + } + + public function updateStatus(OrderEvent $event) + { + $order = $event->getOrder(); + + if ($order->hasVirtualProduct() && $order->isPaid(true)) { + $this->eventDispatcher->dispatch( + VirtualProductDeliveryEvents::ORDER_VIRTUAL_FILES_AVAILABLE, + $event + ); + } + } + + /** + * Send email to notify customer that files for virtual products are available + * + * @param OrderEvent $event + * @throws \Exception + */ + public function sendEmail(OrderEvent $event) + { + $order = $event->getOrder(); + + // Be sure that we have a document to download + $virtualProductCount = OrderProductQuery::create() + ->filterByOrderId($order->getId()) + ->filterByVirtual(true) + ->filterByVirtualDocument(null, Criteria::NOT_EQUAL) + ->count(); + + if ($virtualProductCount > 0) { + $customer = $order->getCustomer(); + + $this->mailer->sendEmailToCustomer( + 'mail_virtualproduct', + $customer, + [ + 'customer_id' => $customer->getId(), + 'order_id' => $order->getId(), + 'order_ref' => $order->getRef(), + 'order_date' => $order->getCreatedAt(), + 'update_date' => $order->getUpdatedAt() + ] + ); + } else { + Tlog::getInstance()->warning( + "Virtual product download message not sent to customer: there's nothing to downnload" + ); + } + } + + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return array( + TheliaEvents::ORDER_UPDATE_STATUS => array("updateStatus", 128), + VirtualProductDeliveryEvents::ORDER_VIRTUAL_FILES_AVAILABLE => array("sendEmail", 128) + ); + } +} diff --git a/local/modules/VirtualProductDelivery/EventListeners/VirtualProductEvents.php b/local/modules/VirtualProductDelivery/EventListeners/VirtualProductEvents.php new file mode 100644 index 00000000..8b398ea6 --- /dev/null +++ b/local/modules/VirtualProductDelivery/EventListeners/VirtualProductEvents.php @@ -0,0 +1,119 @@ + + */ +class VirtualProductEvents implements EventSubscriberInterface +{ + + public function handleOrder(VirtualProductOrderHandleEvent $event) + { + $documentId = MetaDataQuery::getVal( + 'virtual', + MetaDataModel::PSE_KEY, + $event->getPseId() + ); + + if (null !== $documentId) { + $productDocument = ProductDocumentQuery::create()->findPk($documentId); + if (null !== $productDocument) { + $event->setPath($productDocument->getFile()); + } + } + + } + + public function download(VirtualProductOrderDownloadResponseEvent $event) + { + $orderProduct = $event->getOrderProduct(); + + if ($orderProduct->getVirtualDocument()) { + $baseSourceFilePath = ConfigQuery::read('documents_library_path'); + if ($baseSourceFilePath === null) { + $baseSourceFilePath = THELIA_LOCAL_DIR . 'media' . DS . 'documents'; + } else { + $baseSourceFilePath = THELIA_ROOT . $baseSourceFilePath; + } + + // try to get the file + $path = $baseSourceFilePath . DS . 'product' . DS . $orderProduct->getVirtualDocument(); + + if (!is_file($path) || !is_readable($path)) { + throw new \ErrorException( + Translator::getInstance()->trans( + "The file [%file] does not exist", + [ + "%file" => $orderProduct->getId() + ], + VirtualProductDelivery::MESSAGE_DOMAIN + ) + ); + } + + $response = new BinaryFileResponse($path); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); + $event->setResponse($response); + + } + } + + + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return [ + TheliaEvents::VIRTUAL_PRODUCT_ORDER_HANDLE => ['handleOrder', 128], + TheliaEvents::VIRTUAL_PRODUCT_ORDER_DOWNLOAD_RESPONSE => ['download', 128] + ]; + } +} diff --git a/local/modules/VirtualProductDelivery/Events/VirtualProductDeliveryEvents.php b/local/modules/VirtualProductDelivery/Events/VirtualProductDeliveryEvents.php new file mode 100644 index 00000000..4850aa69 --- /dev/null +++ b/local/modules/VirtualProductDelivery/Events/VirtualProductDeliveryEvents.php @@ -0,0 +1,26 @@ + + */ +class VirtualProductDeliveryEvents extends ActionEvent +{ + const ORDER_VIRTUAL_FILES_AVAILABLE = 'virtual_product_delivery.virtual_files_available'; +} diff --git a/local/modules/VirtualProductDelivery/Hook/HookManager.php b/local/modules/VirtualProductDelivery/Hook/HookManager.php new file mode 100644 index 00000000..8dab669f --- /dev/null +++ b/local/modules/VirtualProductDelivery/Hook/HookManager.php @@ -0,0 +1,39 @@ + + */ +class HookManager extends BaseHook +{ + public function onAccountOrderAfterProducts(HookRenderEvent $event) + { + $orderId = $event->getArgument('order'); + + if (null !== $orderId) { + $render = $this->render( + 'account-order-after-products.html', + [ + "order_id" => $orderId + ] + ); + $event->add($render); + } + } +} diff --git a/local/modules/VirtualProductDelivery/I18n/de_DE.php b/local/modules/VirtualProductDelivery/I18n/de_DE.php new file mode 100644 index 00000000..774ee9be --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/de_DE.php @@ -0,0 +1,8 @@ + 'Bestellung {$order_ref} validiert. Laden Sie Ihre Dateien herunter.', + 'The file [%file] does not exist' => 'Die Datei [%file] existiert nicht', + 'This module cannot be used on the current cart.' => 'Dieses Modul kann nicht für diesen Warenkorb benutzt werden. ', + 'Virtual product download message' => 'Virtuelles Produkt Herunterladung Nachricht', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/email/default/en_US.php b/local/modules/VirtualProductDelivery/I18n/email/default/en_US.php new file mode 100644 index 00000000..6f40b67a --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/email/default/en_US.php @@ -0,0 +1,10 @@ + 'Best Regards.', + 'Feel free to contact us for any further information.' => 'Feel free to contact us for any further information.', + 'Products:' => 'Products:', + 'You have to be logged in to your account to download this files.' => 'You have to be logged in to your account to download this files.', + 'Your order %ref has been validated. You can download your files.' => 'Your order %ref has been validated. You can download your files.', + 'have to be logged in to your account to download this files.' => 'have to be logged in to your account to download this files.', +); diff --git a/local/modules/VirtualProductDelivery/I18n/email/default/fr_FR.php b/local/modules/VirtualProductDelivery/I18n/email/default/fr_FR.php new file mode 100644 index 00000000..4a751a8f --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/email/default/fr_FR.php @@ -0,0 +1,10 @@ + 'Cordialement', + 'Feel free to contact us for any further information.' => 'N\'hésitez pas à nous contacter pour toute information complémentaire.', + 'Products:' => 'Articles à télécharger:', + 'You have to be logged in to your account to download this files.' => 'Vous devez être connecté à votre compte pour pouvoir télécharger le fichier.', + 'Your order %ref has been validated. You can download your files.' => 'Votre commande %ref a été validé. Vous pouvez désormais télécharger vos fichiers.', + 'have to be logged in to your account to download this files.' => 'Vous devez être connecté à votre compte pour pouvoir télécharger les fichiers.', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/email/default/it_IT.php b/local/modules/VirtualProductDelivery/I18n/email/default/it_IT.php new file mode 100644 index 00000000..97ea8be1 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/email/default/it_IT.php @@ -0,0 +1,10 @@ + 'Distinti saluti.', + 'Feel free to contact us for any further information.' => 'Non esitate a contattarci per qualsiasi ulteriore informazione.', + 'Products:' => 'Prodotti:', + 'You have to be logged in to your account to download this files.' => 'Devi essere loggato al tuo account per poter scaricare questi file.', + 'Your order %ref has been validated. You can download your files.' => 'Il vostro ordine %ref è stato convalidato. È possibile scaricare i file.', + 'have to be logged in to your account to download this files.' => 'devi essere loggato al tuo account per poter scaricare questi file.', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/email/default/tr_TR.php b/local/modules/VirtualProductDelivery/I18n/email/default/tr_TR.php new file mode 100644 index 00000000..f814b8fe --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/email/default/tr_TR.php @@ -0,0 +1,10 @@ + 'Saygılarımızla,.', + 'Feel free to contact us for any further information.' => 'Daha fazla bilgi için bizimle temas kurmaktan çekinmeyin.', + 'Products:' => 'ürün:', + 'You have to be logged in to your account to download this files.' => 'Bu dosyaları karşıdan yüklemek için hesabınıza oturum açmış olmanız gerekir.', + 'Your order %ref has been validated. You can download your files.' => 'Sipariş %ref doğrulandı. Sen-ebilmek download senin eğe.', + 'have to be logged in to your account to download this files.' => 'Bu dosyaları karşıdan yüklemek için hesabınıza oturum açmış olmanız gerekir.', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/en_US.php b/local/modules/VirtualProductDelivery/I18n/en_US.php new file mode 100644 index 00000000..f197297f --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/en_US.php @@ -0,0 +1,8 @@ + 'Order {$order_ref} validated. Download your files.', + 'The file [%file] does not exist' => 'The file [%file] does not exist', + 'This module cannot be used on the current cart.' => 'This module cannot be used on the current cart.', + 'Virtual product download message' => 'Virtual product download message', +); diff --git a/local/modules/VirtualProductDelivery/I18n/fr_FR.php b/local/modules/VirtualProductDelivery/I18n/fr_FR.php new file mode 100644 index 00000000..4d258b83 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/fr_FR.php @@ -0,0 +1,8 @@ + 'Commande {$order_ref} validée. Téléchargez vos fichiers.', + 'The file [%file] does not exist' => 'le fichier [%file] n\'existe pas', + 'This module cannot be used on the current cart.' => 'Ce module ne peut pas être utilisé avec le panier actuel.', + 'Virtual product download message' => 'Message pour le téléchargement des produits virtuels', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/frontOffice/default/de_DE.php b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/de_DE.php new file mode 100644 index 00000000..07fa0462 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/de_DE.php @@ -0,0 +1,9 @@ + 'Lieferadresse', + 'Download' => 'Herunterladen', + 'File' => 'Datei', + 'List of downloadable files' => 'Liste der herunterladbaren Dateien', + 'No delivery address for this delivery method' => 'Keine Lieferadresse für diese Liefermethode', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/frontOffice/default/en_US.php b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/en_US.php new file mode 100644 index 00000000..8d11f5e0 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/en_US.php @@ -0,0 +1,9 @@ + 'Delivery address', + 'Download' => 'Download', + 'File' => 'File', + 'List of downloadable files' => 'List of downloadable files', + 'No delivery address for this delivery method' => 'No delivery address for this delivery method', +); diff --git a/local/modules/VirtualProductDelivery/I18n/frontOffice/default/fr_FR.php b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/fr_FR.php new file mode 100644 index 00000000..d12b648f --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/fr_FR.php @@ -0,0 +1,9 @@ + 'Adresse de livraison', + 'Download' => 'Télécharger', + 'File' => 'Fichier', + 'List of downloadable files' => 'Liste des fichiers téléchargeables', + 'No delivery address for this delivery method' => 'L\'adresse de livraison n\'est pas nécessaire pour cette méthode de livraison', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/frontOffice/default/it_IT.php b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/it_IT.php new file mode 100644 index 00000000..7abc77b8 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/it_IT.php @@ -0,0 +1,8 @@ + 'Indirizzo di consegna', + 'File' => 'File', + 'List of downloadable files' => 'Elenco dei file scaricabili', + 'No delivery address for this delivery method' => 'Nessun indirizzo di consegna per questo metodo di consegna', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/frontOffice/default/tr_TR.php b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/tr_TR.php new file mode 100644 index 00000000..040103d3 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/frontOffice/default/tr_TR.php @@ -0,0 +1,9 @@ + 'Teslimat adresi', + 'Download' => 'İndir', + 'File' => 'Dosya', + 'List of downloadable files' => 'İndirilebilir dosyalar', + 'No delivery address for this delivery method' => 'Bu teslim yöntemi için hiçbir teslimat adresi', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/it_IT.php b/local/modules/VirtualProductDelivery/I18n/it_IT.php new file mode 100644 index 00000000..b286eca2 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/it_IT.php @@ -0,0 +1,7 @@ + 'Ordine {$order_ref} convalidato. Scarica i tuoi file.', + 'The file [%file] does not exist' => 'Il file [%file] non esiste', + 'This module cannot be used on the current cart.' => 'Questo modulo non può essere utilizzato sul carrello attuale.', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/pdf/default/de_DE.php b/local/modules/VirtualProductDelivery/I18n/pdf/default/de_DE.php new file mode 100644 index 00000000..c3097e65 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/pdf/default/de_DE.php @@ -0,0 +1,5 @@ + 'Keine Lieferadresse für diese Liefermethode', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/pdf/default/en_US.php b/local/modules/VirtualProductDelivery/I18n/pdf/default/en_US.php new file mode 100644 index 00000000..205aa3f4 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/pdf/default/en_US.php @@ -0,0 +1,5 @@ + 'No delivery address for this delivery method', +); diff --git a/local/modules/VirtualProductDelivery/I18n/pdf/default/fr_FR.php b/local/modules/VirtualProductDelivery/I18n/pdf/default/fr_FR.php new file mode 100644 index 00000000..b2088c85 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/pdf/default/fr_FR.php @@ -0,0 +1,5 @@ + 'L\'adresse de livraison n\'est pas nécessaire pour cette méthode de livraison', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/pdf/default/it_IT.php b/local/modules/VirtualProductDelivery/I18n/pdf/default/it_IT.php new file mode 100644 index 00000000..c36c7201 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/pdf/default/it_IT.php @@ -0,0 +1,5 @@ + 'Nessun indirizzo di consegna per questo metodo di consegna', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/pdf/default/tr_TR.php b/local/modules/VirtualProductDelivery/I18n/pdf/default/tr_TR.php new file mode 100644 index 00000000..bbef2c98 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/pdf/default/tr_TR.php @@ -0,0 +1,5 @@ + 'Bu teslim yöntemi için hiçbir teslimat adresi', +]; diff --git a/local/modules/VirtualProductDelivery/I18n/tr_TR.php b/local/modules/VirtualProductDelivery/I18n/tr_TR.php new file mode 100644 index 00000000..978854a2 --- /dev/null +++ b/local/modules/VirtualProductDelivery/I18n/tr_TR.php @@ -0,0 +1,8 @@ + 'Doğrulanmış {$order_ref} sipariş. Download senin eğe.', + 'The file [%file] does not exist' => '[%file] dosyası yok', + 'This module cannot be used on the current cart.' => 'Bu modül geçerli arabaya kullanılamaz.', + 'Virtual product download message' => 'Sanal ürün indir mesaj', +]; diff --git a/local/modules/VirtualProductDelivery/LICENSE.txt b/local/modules/VirtualProductDelivery/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/local/modules/VirtualProductDelivery/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/local/modules/VirtualProductDelivery/VirtualProductDelivery.php b/local/modules/VirtualProductDelivery/VirtualProductDelivery.php new file mode 100644 index 00000000..7568fd5a --- /dev/null +++ b/local/modules/VirtualProductDelivery/VirtualProductDelivery.php @@ -0,0 +1,105 @@ +getRequest()->getSession()->getSessionCart($this->getDispatcher())->isVirtual(); + } + + public function getPostage(Country $country) + { + if (!$this->isValidDelivery($country)) { + throw new DeliveryException( + $this->trans("This module cannot be used on the current cart.") + ); + } + + return 0.0; + } + + /** + * This module manages virtual product delivery + * + * @return bool + */ + public function handleVirtualProductDelivery() + { + return true; + } + + + public function postActivation(ConnectionInterface $con = null) + { + // create new message + if (null === MessageQuery::create()->findOneByName('mail_virtualproduct')) { + $message = new Message(); + $message + ->setName('mail_virtualproduct') + ->setHtmlTemplateFileName('virtual-product-download.html') + ->setHtmlLayoutFileName('') + ->setTextTemplateFileName('virtual-product-download.txt') + ->setTextLayoutFileName('') + ->setSecured(0); + + $languages = LangQuery::create()->find(); + + foreach ($languages as $language) { + $locale = $language->getLocale(); + + $message->setLocale($locale); + + $message->setSubject( + $this->trans('Order {$order_ref} validated. Download your files.', [], $locale) + ); + $message->setTitle( + $this->trans('Virtual product download message', [], $locale) + ); + } + + $message->save(); + } + } + + protected function trans($id, $parameters = [], $locale = null) + { + if (null === $this->translator) { + $this->translator = Translator::getInstance(); + } + + return $this->translator->trans($id, $parameters, self::MESSAGE_DOMAIN, $locale); + } +} diff --git a/local/modules/VirtualProductDelivery/composer.json b/local/modules/VirtualProductDelivery/composer.json new file mode 100644 index 00000000..77460d83 --- /dev/null +++ b/local/modules/VirtualProductDelivery/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/virtual-product-delivery-module", + "license": "LGPL-3.0+", + "type": "thelia-module", + "require": { + "thelia/installer": "~1.1" + }, + "extra": { + "installer-name": "VirtualProductDelivery" + } +} diff --git a/local/modules/VirtualProductDelivery/templates/email/default/virtual-product-download.html b/local/modules/VirtualProductDelivery/templates/email/default/virtual-product-download.html new file mode 100644 index 00000000..f7069b3b --- /dev/null +++ b/local/modules/VirtualProductDelivery/templates/email/default/virtual-product-download.html @@ -0,0 +1,29 @@ +{default_translation_domain domain="virtualproductdelivery.email.default"} +{default_locale locale={$locale}} + +{loop name="order.invoice" type="order" id=$order_id customer="*" limit="1" backend_context="1"} +

    + {intl l="Your order %ref has been validated. You can download your files." ref={$REF}}

    + +

    {intl l="Products:"}

    + +
      + {loop type="order_product" name="order-products" order=$ID virtual="1" backend_context="1"} +
    • + {$TITLE} : {url path="/account/download/$ID"} + {ifloop rel="combinations"} +
      + {loop type="order_product_attribute_combination" name="combinations" order_product=$ID} + {$ATTRIBUTE_TITLE} - {$ATTRIBUTE_AVAILABILITY_TITLE} + {/loop} + {/ifloop} +
    • + {/loop} +
    +{/loop} + +

    {intl l="You have to be logged in to your account to download this files."}

    + +

    {intl l="Feel free to contact us for any further information."}

    + +

    {intl l="Best Regards."}

    \ No newline at end of file diff --git a/local/modules/VirtualProductDelivery/templates/email/default/virtual-product-download.txt b/local/modules/VirtualProductDelivery/templates/email/default/virtual-product-download.txt new file mode 100644 index 00000000..9fc5592b --- /dev/null +++ b/local/modules/VirtualProductDelivery/templates/email/default/virtual-product-download.txt @@ -0,0 +1,26 @@ +{default_translation_domain domain="virtualproductdelivery.email.default"} +{default_locale locale={$locale}} + +{loop name="order.invoice" type="order" id=$order_id customer="*" limit="1" backend_context="1"} + +{intl l="Your order %ref has been validated. You can download your files." ref={$REF}} + +---------------------------------------------------------------------- +{intl l="Products:"} +---------------------------------------------------------------------- +{loop type="order_product" name="order-products" order=$ID virtual="1" backend_context="1"} +{$TITLE} : {url path="/account/download/$ID"} +{ifloop rel="combinations"} +{loop type="order_product_attribute_combination" name="combinations" order_product=$ID} +{$ATTRIBUTE_TITLE} - {$ATTRIBUTE_AVAILABILITY_TITLE} +{/loop} +{/ifloop} +---------------------------------------------------------------------- +{/loop} +{/loop} + +{intl l="You have to be logged in to your account to download this files."} + +{intl l="Feel free to contact us for any further information."} + +{intl l="Best Regards."} \ No newline at end of file diff --git a/local/modules/VirtualProductDelivery/templates/frontOffice/default/account-order-after-products.html b/local/modules/VirtualProductDelivery/templates/frontOffice/default/account-order-after-products.html new file mode 100644 index 00000000..c4384e7a --- /dev/null +++ b/local/modules/VirtualProductDelivery/templates/frontOffice/default/account-order-after-products.html @@ -0,0 +1,24 @@ +{loop type="order" name="virtual.order" id="$order_id" limit="1"} +{if $STATUS >=2 && $VIRTUAL} + + + + + + + + + {loop name="virtual.order.products" type="order_product" virtual="1" order={$ID}} + + + + + {/loop} + +
    {intl l="File" d='virtualproductdelivery.fo.default'}{intl l="Download" d='virtualproductdelivery.fo.default'}
    {$TITLE} + + {intl l="Download" d='virtualproductdelivery.fo.default'} + +
    +{/if} +{/loop} diff --git a/local/modules/VirtualProductDelivery/templates/frontOffice/default/delivery-address.html b/local/modules/VirtualProductDelivery/templates/frontOffice/default/delivery-address.html new file mode 100644 index 00000000..ceb1e750 --- /dev/null +++ b/local/modules/VirtualProductDelivery/templates/frontOffice/default/delivery-address.html @@ -0,0 +1,6 @@ +
    +
    {intl l="Delivery address" d="virtualproductdelivery.fo.default"}
    +
    + {intl l="No delivery address for this delivery method" d="virtualproductdelivery.fo.default"} +
    +
    \ No newline at end of file diff --git a/local/modules/VirtualProductDelivery/templates/pdf/default/delivery-address.html b/local/modules/VirtualProductDelivery/templates/pdf/default/delivery-address.html new file mode 100644 index 00000000..6a5a1f92 --- /dev/null +++ b/local/modules/VirtualProductDelivery/templates/pdf/default/delivery-address.html @@ -0,0 +1,3 @@ +

    + {intl l="No delivery address for this delivery method" d="virtualproductdelivery.pdf.default"} +

    \ No newline at end of file diff --git a/local/session/.gitkeep b/local/session/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/local/session/sess_626cc7572424060af857bf8311580d33 b/local/session/sess_626cc7572424060af857bf8311580d33 new file mode 100644 index 00000000..eec9c433 Binary files /dev/null and b/local/session/sess_626cc7572424060af857bf8311580d33 differ diff --git a/local/session/sess_81bdd48462de3f578ed871eb68abf9e8 b/local/session/sess_81bdd48462de3f578ed871eb68abf9e8 new file mode 100644 index 00000000..6db0d823 Binary files /dev/null and b/local/session/sess_81bdd48462de3f578ed871eb68abf9e8 differ diff --git a/local/session/sess_96c93632e3be69033eceddd59f82e85d b/local/session/sess_96c93632e3be69033eceddd59f82e85d new file mode 100644 index 00000000..e7212ae5 Binary files /dev/null and b/local/session/sess_96c93632e3be69033eceddd59f82e85d differ diff --git a/local/session/sess_e8a67c24b94967afecc41de529bb0a0b b/local/session/sess_e8a67c24b94967afecc41de529bb0a0b new file mode 100644 index 00000000..a44c5951 Binary files /dev/null and b/local/session/sess_e8a67c24b94967afecc41de529bb0a0b differ diff --git a/php-cs b/php-cs new file mode 100644 index 00000000..a7928901 --- /dev/null +++ b/php-cs @@ -0,0 +1,26 @@ +#!/bin/bash + +php-cs-fixer fix core/lib/Thelia/Action/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Command/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Condition/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Config/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Controller/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Core/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Coupon/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Exception/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Files/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Form/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/ImportExport/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Install/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Log/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Mailer/ --level=psr2 +find core/lib/Thelia/Model/ -maxdepth 1 -name *.php -exec php-cs-fixer fix '{}' --level=psr2 \; +php-cs-fixer fix core/lib/Thelia/Model/Breadcrumb --level=psr2 +php-cs-fixer fix core/lib/Thelia/Model/Exception --level=psr2 +php-cs-fixer fix core/lib/Thelia/Model/Tools --level=psr2 +php-cs-fixer fix core/lib/Thelia/Module/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Rewriting/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/TaxEngine/ --level=psr2 +php-cs-fixer fix tests/phpunit/Thelia/Tests/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Tools/ --level=psr2 +php-cs-fixer fix core/lib/Thelia/Type/ --level=psr2 \ No newline at end of file diff --git a/php-cs.bat b/php-cs.bat new file mode 100644 index 00000000..f58558fb --- /dev/null +++ b/php-cs.bat @@ -0,0 +1,27 @@ +@echo off +echo Running php-cs-fixer... +call php-cs-fixer fix core\lib\Thelia\Action --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Command --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Condition --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Config --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Controller --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Core --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Coupon --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Exception --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Files --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Form --level=psr2 +call php-cs-fixer fix core\lib\Thelia\ImportExport --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Install --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Log --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Mailer --level=psr2 +for %%F in (core\lib\Thelia\Model\*.php) DO call php-cs-fixer fix %%F --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Model\Breadcrumb --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Model\Exception --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Model\Tools --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Module --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Rewriting --level=psr2 +call php-cs-fixer fix core\lib\Thelia\TaxEngine --level=psr2 +call php-cs-fixer fix tests\phpunit\Thelia\Tests --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Tools --level=psr2 +call php-cs-fixer fix core\lib\Thelia\Type --level=psr2 +echo Done. \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..f7a3fe22 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,28 @@ + + + + + + tests/phpunit/Thelia/Tests + local/modules/*/Tests + + + + + core/lib + + core/lib/Thelia/Model/map + core/lib/Thelia/Model/om + core/lib/Thelia/Tests + + + + diff --git a/reset_install.bat b/reset_install.bat new file mode 100644 index 00000000..48534b51 --- /dev/null +++ b/reset_install.bat @@ -0,0 +1,53 @@ +echo off +REM @author Guillaume MOREL +REM v0.1 + +echo [WARN] This script will reset this Thelia2 install, all data will be cleared. +pause + +if exist local\config\database.yml ( + + echo [INFO] Clearing caches + php Thelia cache:clear + + echo [INFO] Self-updating Composer + composer self-update + + echo [INFO] Downloading vendors + composer install --prefer-dist --optimize-autoloader + + cd local\config\ + + echo [INFO] Building Models file + ..\..\bin\propel build -v --output-dir=../../core/lib/ --enable-identifier-quoting + + echo [INFO] Building SQL CREATE file + ..\..\bin\propel sql:build -v --output-dir=..\..\setup + + echo [INFO] Reloading Thelia2 database + cd ..\.. + del setup\sqldb.map + php Thelia thelia:dev:reloadDB + + echo [INFO] Installing fixtures + php setup\faker.php + + echo [INFO] Clearing caches + php Thelia cache:clear + + echo [INFO] Adding admin + php Thelia admin:create --login_name thelia2 --password thelia2 --last_name thelia2 --first_name thelia2 --email thelia2@example.com + + echo [INFO] Admin user thelia2 with password thelia2 and email admin@example.com successfully created. + + echo [INFO] Activating Delivery Module + php Thelia module:activate Colissimo + + echo [INFO] Activating Payment Module + php Thelia module:activate Cheque + + echo [SUCCESS] Reset done +) +) else ( + echo [FAILED] Please add your database informations in local\config\database.yml and start this script again. +) diff --git a/reset_install.sh b/reset_install.sh new file mode 100644 index 00000000..610f403e --- /dev/null +++ b/reset_install.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# @author Guillaume MOREL +# v0.2 + +echo -e "\033[47m\033[1;31m\n[WARNING] This script will reset this Thelia2 install\nPress ENTER to continue or ^C to cancel\033[0m" + +read test + +echo -e "\n\033[01;34m[INFO] Clearing caches\033[00m\n" +php Thelia cache:clear + +echo -e "\n\033[01;34m[INFO] Self-updating Composer\033[00m\n" +composer self-update + +echo -e "\n\033[01;34m[INFO] Downloading vendors\033[00m\n" +composer install --prefer-dist --optimize-autoloader + +cd local/config/ + +echo -e "\n\033[01;34m[INFO] Building Models file\033[00m\n" +../../bin/propel build -v --output-dir=../../core/lib/ --enable-identifier-quoting + +echo -e "\n\033[01;34m[INFO] Building SQL CREATE file\033[00m\n" +../../bin/propel sql:build -v --output-dir=../../setup/ + +echo -e "\n\033[01;34m[INFO] Reloading Thelia2 database\033[00m\n" +cd ../.. +rm setup/sqldb.map +php Thelia thelia:dev:reloadDB + +echo -e "\n\033[01;34m[INFO] Installing fixtures\033[00m\n" +php setup/faker.php + +echo -e "\n\033[01;34m[INFO] Adding admin\033[00m\n" +php Thelia admin:create --login_name thelia2 --password thelia2 --last_name thelia2 --first_name thelia2 --email thelia2@example.com + +echo -e "\n\033[01;34m[INFO] Clearing caches\033[00m\n" +php Thelia cache:clear + +echo -e "\n\033[01;34m[INFO] Activating Delivery Module(s)\033[00m\n" +php Thelia module:activate Colissimo + +echo -e "\n\033[01;34m[INFO] Activating Payment Module(s)\033[00m\n" +php Thelia module:activate Cheque + +echo -e "\n\033[00;32m[SUCCESS] Reset done\033[00m\n" diff --git a/run-tests.sh b/run-tests.sh new file mode 100644 index 00000000..ae46948a --- /dev/null +++ b/run-tests.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# -------------------------------------------------------------- +# This script is started by Travis to perform all Thelia 2 tests +# -------------------------------------------------------------- + +# will exit with non-zero error code if any of the command fails +set -e + +echo "backup DB" +mysqldump -h $DB_HOST -u $DB_USER thelia >../thelia.sql + +echo "phpunit" +./bin/phpunit + +echo "restore DB" +mysql -h $DB_HOST -u $DB_USER thelia <../thelia.sql + +echo "deactivate modules only needed by phpunit tests" +php Thelia module:refresh +php Thelia module:deactivate HookTest + +echo "Clearing cache" +php Thelia cache:clear --env=prod +rm -rf local/session/sess_* + +echo "CasperJS" +cd ../casperjs +export DISPLAY=:99.0 + +echo "Front tests" +./bin/casperjs test ../thelia/tests/functionnal/casperjs/exe/front/ --pre=../thelia/tests/functionnal/casperjs/conf/local.js --verbose --thelia2_base_url="http://localhost:8000/index.php/" --thelia2_screenshot_path="../thelia/tests/functionnal/casperjs/screenshot/" --thelia2_screenshot_disabled + +echo "Back tests" +./bin/casperjs test ../thelia/tests/functionnal/casperjs/exe/back/ --pre=../thelia/tests/functionnal/casperjs/conf/local.js --thelia2_base_url="http://localhost:8000/index_dev.php/" --thelia2_screenshot_path="../thelia/tests/functionnal/casperjs/screenshot/" --thelia2_screenshot_disabled diff --git a/setup/.gitkeep b/setup/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/setup/.htaccess b/setup/.htaccess new file mode 100644 index 00000000..ff2beb84 --- /dev/null +++ b/setup/.htaccess @@ -0,0 +1,2 @@ +order deny,allow +deny from all diff --git a/setup/I18n/ar_SA.php b/setup/I18n/ar_SA.php new file mode 100644 index 00000000..e713c0a9 --- /dev/null +++ b/setup/I18n/ar_SA.php @@ -0,0 +1,14 @@ + 'عنوان', + 'Advanced configuration' => 'التكوين المتقدم', + 'Category' => 'الفئة', + 'Configuration' => 'لوحة التحكم', + 'Coupon' => 'قسيمة خصم', + 'Customer' => 'العميل', + 'Folder' => 'مجلّد', + 'Hooks' => 'روابط', + 'New York' => 'نيويورك', + 'Search' => 'بحث', +]; diff --git a/setup/I18n/cs_CZ.php b/setup/I18n/cs_CZ.php new file mode 100644 index 00000000..7644134b --- /dev/null +++ b/setup/I18n/cs_CZ.php @@ -0,0 +1,9 @@ + 'Adresa', + 'Category' => 'Kategorie', + 'Content' => 'Obsah', + 'New York' => 'New York', + 'Search' => 'Vyhledávání', +]; diff --git a/setup/I18n/de_DE.php b/setup/I18n/de_DE.php new file mode 100644 index 00000000..2bb4c361 --- /dev/null +++ b/setup/I18n/de_DE.php @@ -0,0 +1,1032 @@ + 'Ablaufzeit in Sekunden des Cookies "Remember me" für die Administratoren', + '"Remember me" cookie expiration time, in seconds, for customer users' => 'Ablaufzeit in Sekunden des Cookies "Remember me" für die Kunden', + '"Remember me" cookie name for administration users' => 'Name des Cookies "Remember me" für die Administratoren', + '"Remember me" cookie name for customer users' => 'Name des Cookies "Remember me" für die Kunden', + '72h delivery' => '72Std Lieferung ', + 'A {config key="store_name"} account has been created for you' => 'Ein Konto {config key="store_name"} wurde für Sie erstellt.', + 'API Configuration' => 'API-Konfiguration', + 'Address' => 'Adresse', + 'Address creation - CSS stylesheet' => 'Adresse Erstellung - CSS-Stylesheet', + 'Address creation - after javascript include' => 'Adresse Erstellung - nach der Integration von Javascript', + 'Address creation - after javascript initialisation' => 'Adresse Erstellung - nach der Initialisierung von Javascript', + 'Address creation - at the bottom' => 'Adresse Erstellung - unten', + 'Address creation - at the bottom of the form' => 'Adresse Erstellung - unten im Formular', + 'Address creation - at the top' => 'Adresse Erstellung - oben', + 'Address creation - at the top of the form' => 'Adresse Erstellung - oben im Formular', + 'Address update - CSS stylesheet' => 'Adresseänderung - CSS-Stylesheet', + 'Address update - after javascript include' => 'Adresseänderung - nach der Integration von Javascript', + 'Address update - after javascript initialisation' => 'Adresseänderung - nach der Initialisierung von Javascript', + 'Address update - at the bottom' => 'Adresseänderung - unten', + 'Address update - at the bottom of the form' => 'Adresseänderung - unten im Formular', + 'Address update - at the top' => 'Adresseänderung - oben', + 'Address update - at the top of the form' => 'Adressänderung - oben im Formular', + 'Admin layout - After the main content' => 'Admin layout - Nach dem Hauptinhalt', + 'Administatros list' => 'Administratorenliste', + 'Administration profiles management' => 'Administration-Profilverwaltung', + 'Administrator - create form' => 'Administrator - Erstellungsformular', + 'Administrator - delete form' => 'Administrator - Löschungsformular', + 'Administrator - update form' => 'Administrator - Änderungsformular', + 'Administrator list' => 'Administratorenliste', + 'Administrators - JavaScript' => 'Administratoren - JavaScript', + 'Administrators - at the top' => 'Administratoren - oben', + 'Administrators - bottom' => 'Administratoren - unten', + 'Administrators - header' => 'Administratoren - Header', + 'Administrators - row' => 'Administratoren - Zeile', + 'Advanced Configuration' => 'Erweiterte Konfiguration', + 'Advanced Configuration - Javascript' => 'Erweiterte Konfiguration - JavaScript', + 'Advanced configuration' => 'Erweiterte Konfiguration', + 'Afghanistan' => 'Afghanistan', + 'Albania' => 'Albanien', + 'Algeria' => 'Algerien', + 'All Products - CSS stylesheet' => 'Alle Produkte - CSS-Stylesheet', + 'All Products - after javascript include' => 'Alle Produkte - nach der Integration von Javascript', + 'All Products - after javascript initialisation' => 'Alle Produkte - nach der Initialisierung von Javascript', + 'All Products - at the bottom' => 'Alle Produkte - unten', + 'All Products - at the top' => 'Alle Produkte - oben', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Den Kunden erlauben ihre E-Mail-Adresse zu ändern. 1 für Ja, 0 für Nein', + 'Allow negative product stock (1) or not (0)' => 'Negativen Lagerbestand erlauben (1) oder nicht (0)', + 'Allow negative product stock (1) or not (0, default)' => 'Negativen Lagerbestand erlauben (1) oder nicht (0)(Standartwert 0)', + 'Allow slash ended uri' => 'URI mit Slash beendet erlauben', + 'An image carousel on your home page' => 'Ein Bilder-Karussel auf Ihre Startseite', + 'Andorra' => 'Andorra', + 'Angola' => 'Angola', + 'Antigua and Barbuda' => 'Antigua und Barbuda', + 'Api page - at bottom' => 'API Seite - unten', + 'Api page - at top' => 'API Seite - oben', + 'Api page - in deletion form' => 'API Seite - Löschungsformular', + 'Argentina' => 'Argentinien', + 'Armenia' => 'Armenien', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Den Kunden fragen, ihre E-Mail-Adresse zu bestätigen. 1 für Jan, 0 für Nein', + 'Attribut - Edit JavaScript' => 'Deklination - JavaScript Änderung', + 'Attribut - add to all form' => 'Deklination - zu allen hinzufügen Formular', + 'Attribut - create form' => 'Deklination - Erstellungsformular', + 'Attribut - delete form' => 'Deklination - Löschungsformular', + 'Attribut - id delete form' => 'Deklination - ID Löschungsformular', + 'Attribut - remove to all form' => 'Deklination - multipel Löschungsformular', + 'Attribute edit - bottom' => 'Deklination Bearbeitung - unten', + 'Attribute edit - top' => 'Deklination Bearbeitung - oben', + 'Attribute value - create form' => 'Deklinationsangabe - Erstellungsformular', + 'Attributes - JavaScript' => 'Deklinationen - JavaScript', + 'Attributes - at the top' => 'Deklinationen - oben', + 'Attributes - bottom' => 'Deklinationen - unten', + 'Attributes - table header' => 'Deklinationen - Tabellenkopf', + 'Attributes - table row' => 'Deklinationen - Tabellenzeile', + 'Attributes value - table header' => 'Deklinationenangaben - Tabellenkopf', + 'Attributes value - table row' => 'Deklinationenangaben - Tabellenzeile', + 'Australia' => 'Australien', + 'Austria' => 'Österreich', + 'Azerbaijan' => 'Aserbaidschan', + 'Back-office export management' => 'Exporten-Verwaltung', + 'Back-office home page' => 'Back-Office Startseite', + 'Back-office search function' => 'Back-Office Suchfunktion', + 'Bahamas' => 'Bahamas', + 'Bahrain' => 'Bahrein', + 'Bangladesh' => 'Bangladesch', + 'Barbados' => 'Barbados', + 'Base URL of the shop (e.g. http://www.yourshopdomain.com)' => 'Shops Basis-URL (zum Beispiel http://www.yourshopdomain.com)', + 'Belarus' => 'Weißrussland', + 'Belgium' => 'Belgien', + 'Belize' => 'Belize', + 'Benin' => 'Bénin', + 'Bhutan' => 'Bhutan', + 'Bielorussia' => 'Weißrussland', + 'Bolivia' => 'Bolivien', + 'Bosnia and Herzegovina' => 'Bosnien Herzegovina', + 'Botswana' => 'Botswana', + 'Brand - Edit JavaScript' => 'Marke - JavaScript Änderung', + 'Brand - JavaScript' => 'Marke - JavaScript', + 'Brand - Tab' => 'Marke - Tab', + 'Brand - content' => 'Marke - Inhalt', + 'Brand - create form' => 'Marke - Erstellungsformular', + 'Brand - delete form' => 'Marke - Löschungsformular', + 'Brand edit - bottom' => 'Marke Bearbeitung - unten', + 'Brand edit - right column bottom' => 'Marke bearbeiten - Rechte Spalte unten', + 'Brand edit - right column top' => 'Marke bearbeiten - Rechte Spalte oben', + 'Brand edit - top' => 'Marke Bearbeitung - oben', + 'Brand edit page - in the form' => 'Brand edit Seite - im Formular', + 'Brands - at the top' => 'Marken - oben', + 'Brands - bottom' => 'Marken - unten', + 'Brands - table header' => 'Marken - Tabellenkopf', + 'Brands - table row' => 'Marken - Tabellzeilen', + 'Brands management' => 'Marken-Verwaltung', + 'Brands page - CSS stylesheet' => 'Marken Seite - CSS-Stylesheet', + 'Brands page - after javascript include' => 'Marken Seite - Nach der Integration von Javascript', + 'Brands page - after the main content area' => 'Marken Seite - Nach dem Hauptinhalt Bereich', + 'Brands page - at the bottom' => 'Marken Seite - unten', + 'Brands page - at the bottom of the main area' => 'Marken Seite - unten des Hauptbereichs', + 'Brands page - at the bottom of the sidebar' => 'Marken Seite - unten der Sidebar', + 'Brands page - at the top' => 'Marken Seite - oben', + 'Brands page - at the top of the main area' => 'Marken Seite - oben des Hauptbereichs', + 'Brands page - at the top of the sidebar' => 'Marken Seite - oben der Sidebar', + 'Brands page - before the main content area' => 'Marken Seite - vor dem Hauptinhaltsbereich', + 'Brands page - javascript initialization' => 'Marken Seite - Javascript Initialisation', + 'Brands page - the body of the sidebar' => 'Marken Seite - Sidebars Body', + 'Brazil' => 'Brasilien', + 'Brunei' => 'Brunei', + 'Bulgaria' => 'Bulgarien', + 'Burkina' => 'Burkina Faso', + 'Burma' => 'Birma', + 'Burundi' => 'Burundi', + 'Cambodia' => 'Kambodscha', + 'Cameroon' => 'Kamerun', + 'Canceled' => 'Storniert', + 'Cape Verde' => 'Kap Verde', + 'Cart - CSS stylesheet' => 'Warenkorb - CSS-Stylesheet', + 'Cart - after javascript include' => 'Warenkorb - Nach Integration von JavaScript', + 'Cart - at the bottom' => 'Warenkorb - unten', + 'Cart - at the top' => 'Warenkorb - oben ', + 'Cart - javascript initialization' => 'Warenkorb - Initialisierung von Javascript', + 'Cart block' => 'Warenkorb Block', + 'Categories - JavaScript' => 'Kategorien - JavaScript', + 'Categories - at the bottom of the catalog' => 'Kategorien - unten an dem Katalog', + 'Categories - at the top' => 'Kategorien - oben', + 'Categories - bottom' => 'Kategorien - unten', + 'Categories - caption' => 'Kategorien - Bildunterschrift', + 'Categories - header' => 'Kategorien - Kopfzeile', + 'Categories - row' => 'Kategorien - Zeile', + 'Category' => 'Kategorie', + 'Category - Edit JavaScript' => 'Kategorie - JavaScript Änderung', + 'Category - Tab' => 'Kategorie - Tab', + 'Category - content' => 'Kategorie - Inhalt', + 'Category - contents table header' => 'Kategorie - Inhalts Tabellenkopf', + 'Category - contents table row' => 'Kategorie - Inhalts Tabellenzeile', + 'Category - create form' => 'Kategorie - Erstellungsformular', + 'Category - delete form' => 'Kategorie - Löschungsformular', + 'Category configuration' => 'Kategorie-Konfiguration', + 'Category edit - bottom' => 'Kategorie Bearbeitung - unten', + 'Category edit - top' => 'Kategorie Bearbeitung - oben', + 'Category page - CSS stylesheet' => 'Kategorieseite - CSS-Stylesheet', + 'Category page - after javascript include' => 'Kategorieseite - Nach Integration von JavaScript', + 'Category page - after javascript initialisation' => 'Kategorieseite - nach der Initialisierung von Javascript', + 'Category page - after the main content area' => 'Kategorieseite - nach dem Hauptinhaltsbereich', + 'Category page - at the bottom' => 'Kategorieseite - unten', + 'Category page - at the bottom of the main area' => 'Kategorieseite - unten an dem Hauptbereich', + 'Category page - at the bottom of the sidebar' => 'Kategorieseite - unten an der Sidebar', + 'Category page - at the top' => 'Kategorieseite - oben', + 'Category page - at the top of the main area' => 'Kategorieseite - oben an dem Hauptbereich', + 'Category page - at the top of the sidebar' => 'Kategorieseite - oben an der Sidebar', + 'Category page - before the main content area' => 'Kategorieseite - vor dem Hauptinhaltsbereich', + 'Category page - the body of the sidebar' => 'Kategorieseite - Sidebars Body', + 'Central African Republic' => 'Zentralafrikanische Republik', + 'Chad' => 'Tschad', + 'Change password - CSS stylesheet' => 'Passwort Änderung - CSS-Stylesheet', + 'Change password - after javascript include' => 'Passwort Änderung - Nach Integration von JavaScript', + 'Change password - after javascript initialisation' => 'Passwort Änderung - nach der Initialisierung von Javascript', + 'Change password - at the bottom' => 'Passwort Änderung - unten', + 'Change password - at the top' => 'Passwort Änderung - oben', + 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity' => 'Verfügbaren Lagerbestand prüfen (1) oder ignorieren (0) beim Anzeigen und Änderung der bestellte Menge', + 'Check if a virtual product delivery module is enabled if at least one product is virtual' => 'Prüfen ob ein Liefermodul für virtuellen Produkte aktiviert ist, wenn es mindestens ein virtuelles Produkt gibt', + 'Chile' => 'Chile', + 'China' => 'China', + 'Client edit - bottom' => 'Kunde Bearbeitung - unten', + 'Client edit - top' => 'Kunde Bearbeitung - oben', + 'Colombia' => 'Kolumbien', + 'Comoros' => 'Komoren', + 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)' => 'Template Assets automatisch bei Codeänderungen kompilieren? (1 = ja, 0 = nein)', + 'Configuration' => 'Einstellungen', + 'Configuration - JavaScript' => 'Konfiguration - JavaScript', + 'Configuration - at the bottom of the catalog' => 'Konfiguration - unten an dem katalog', + 'Configuration - at the bottom of the shipping area' => 'Konfiguration - unten an der Lieferzone', + 'Configuration - at the bottom of the system area' => 'Konfiguration - unten an dem Systembereich', + 'Configuration - at the top' => 'Konfiguration - oben', + 'Configuration - at the top of the catalog area' => 'Konfiguration - oben an dem Katalogsbereich', + 'Configuration - at the top of the shipping area' => 'Konfiguration - oben an der Lieferzone', + 'Configuration - at the top of the system area' => 'Konfiguration - oben an dem Systembereich', + 'Configuration - bottom' => 'Konfiguration - unten', + 'Configuration / Administrator' => 'Konfiguration / Administrator', + 'Configuration / Area' => 'Konfiguration / Zone', + 'Configuration / Attribute' => 'Konfiguration / Deklination', + 'Configuration / Cache' => 'Konfiguration / Cache', + 'Configuration / Country' => 'Konfiguration / Land', + 'Configuration / Currency' => 'Konfiguration / Währung', + 'Configuration / Feature' => 'Konfiguration / Charakteristik', + 'Configuration / Language' => 'Konfiguration / Sprache', + 'Configuration / Mailing-system' => 'Konfiguration / Mailing-System', + 'Configuration / Message' => 'Konfiguration / Nachricht', + 'Configuration / Module' => 'Konfiguration / Modul', + 'Configuration / Profile' => 'Konfiguration / Profil', + 'Configuration / Shipping-zone' => 'Konfiguration / Lieferzone', + 'Configuration / System Log' => 'Konfiguration / Logs System', + 'Configuration / Tax' => 'Konfiguration / Tax', + 'Configuration / Template' => 'Konfiguration / Template', + 'Configuration variables' => 'Konfigurations Variablen', + 'Congo' => 'Kongo', + 'Contact block' => 'Kontakt-Block', + 'Contact page - CSS stylesheet' => 'Kontaktseite - CSS-Stylesheet', + 'Contact page - after javascript include' => 'Kontaktseite - Nach Integration von JavaScript', + 'Contact page - after javascript initialisation' => 'Kontaktseite - nach der Initialisierung von Javascript', + 'Contact page - at the bottom' => 'Kontaktseite - unten', + 'Contact page - at the bottom of the form' => 'Kontaktseite - unten an dem Formular', + 'Contact page - at the top' => 'Kontaktseite - oben', + 'Contact page - at the top of the form' => 'Kontaktseite - oben an dem Formular', + 'Contact page - if successful response' => 'Kontaktseite - wenn erfolgreich', + 'Content' => 'Inhalt', + 'Content - Edit JavaScript' => 'Inhalt - JavaScript Änderung', + 'Content - Tab' => 'Inhalt - Tab', + 'Content - content' => 'Inhalt - Inhalt', + 'Content - create form' => 'Inhalt - Erstellungsformular', + 'Content - delete form' => 'Inhalt - Löschungsformular', + 'Content edit - bottom' => 'Inhalt Bearbeitung - unten', + 'Content edit - right column bottom' => 'Inhalt bearbeiten - Rechte Spalte unten', + 'Content edit - right column top' => 'Inhalt bearbeiten - Rechte Spalte oben', + 'Content edit - top' => 'Inhalt Bearbeitung - oben', + 'Content page - CSS stylesheet' => 'Inhaltseite - CSS-Stylesheet', + 'Content page - after javascript include' => 'Inhaltseite - Nach Integration von JavaScript', + 'Content page - after javascript initialisation' => 'Inhaltseite - nach der Initialisierung von Javascript', + 'Content page - after the main content area' => 'Inhaltseite - nach dem Hauptinhaltsbereich', + 'Content page - at the bottom' => 'Inhaltseite - unten', + 'Content page - at the bottom of the main area' => 'Inhaltseite - unten an dem Hauptbereich', + 'Content page - at the bottom of the sidebar' => 'Inhaltseite - unten an der Sidebar', + 'Content page - at the top' => 'Inhaltseite - oben', + 'Content page - at the top of the main area' => 'Inhaltseite - oben an dem Hauptbereich', + 'Content page - at the top of the sidebar' => 'Inhaltseite - oben an der Sidebar', + 'Content page - before the main content area' => 'Inhaltseite- vor dem Hauptinhaltsbereich', + 'Content page - the body of the sidebar' => 'Inhaltseite - Sidebars Body', + 'Contents - caption' => 'Inhalte - Bildunterschrift', + 'Contents - header' => 'Inhalte - Kopfzeile', + 'Contents - row' => 'Inhalte - Zeile', + 'Cook Islands' => 'Cookinseln', + 'Costa Rica' => 'Costa Rica', + 'Countries - JavaScript' => 'Länder - JavaScript', + 'Countries - at the top' => 'Länder - oben', + 'Countries - bottom' => 'Länder - unten', + 'Countries - table header' => 'Länder - Tabellenkopf', + 'Countries - table row' => 'Länder - Tabellenzeile', + 'Country - Edit JavaScript' => 'Land - JavaScript Änderung', + 'Country - create form' => 'Land - Erstellungsformular', + 'Country - delete form' => 'Land - Löschungsformular', + 'Country edit - bottom' => 'Währung Bearbeitung - unten', + 'Country edit - top' => 'Währung Bearbeitung - oben', + 'Coupon' => 'Gutschein', + 'Coupon - at the top' => 'Gutschein - oben', + 'Coupon - bottom' => 'Gutschein - unten', + 'Coupon - create JavaScript' => 'Gutschein - JavaScript erstellen', + 'Coupon - list JavaScript' => 'Gutschein - JavaScript den Listen', + 'Coupon - list caption' => 'Gutschein - Bildunterschrift', + 'Coupon - table header' => 'Gutschein - Tabellenkopf', + 'Coupon - table row' => 'Gutschein - Tabellenzeile', + 'Coupon - update JavaScript' => 'Gutschein - JavaScript Änderung', + 'Coupon page - in deletion form' => 'Gutschein-Seite - Löschungsformular', + 'Croatia' => 'Kroatien', + 'Cuba' => 'Kuba', + 'Curency selection page - CSS stylesheet' => 'Währungswahl-Seite - CSS-Stylesheet', + 'Curency selection page - after javascript include' => 'Währungswahl-Seite - Nach Integration von JavaScript', + 'Curency selection page - after javascript initialisation' => 'Währungswahl-Seite - nach der Initialisierung von Javascript', + 'Curency selection page - at the bottom' => 'Währungswahl-Seite - unten', + 'Curency selection page - at the top' => 'Währungswahl-Seite - oben', + 'Currencies - JavaScript' => 'Währungen - JavaScript', + 'Currencies - at the top' => 'Währungen - oben', + 'Currencies - bottom' => 'Währungen - unten', + 'Currencies - table header' => 'Währungen - Tabellenkopf', + 'Currencies - table row' => 'Währungen - Tabellenzeile', + 'Currency - Edit JavaScript' => 'Währung - JavaScript Änderung', + 'Currency - create form' => 'Währung - Erstellungsformular', + 'Currency - delete form' => 'Währung - Löschungsformular', + 'Currency block' => 'Währungensblock', + 'Currency edit - bottom' => 'Währung Bearbeitung - unten', + 'Currency edit - top' => 'Währung Bearbeitung - oben', + 'Customer' => 'Kunde', + 'Customer - Edit' => 'Kunde - Modification', + 'Customer - Edit JavaScript' => 'Kunde - JavaScript Änderung', + 'Customer - address create form' => 'Kunde - Adresse-Erstellungsformular', + 'Customer - address delete form' => 'Kunde - Adresse-Löschungsformular', + 'Customer - address update form' => 'Kunde - Adresse-Änderungsformular', + 'Customer - at the top' => 'Kunde - oben', + 'Customer - bottom' => 'Kunde - unten', + 'Customer - create form' => 'Kunde - Erstellungsformular', + 'Customer - delete form' => 'Kunde - Löschungsformular', + 'Customer - order table header' => 'Kunde - Bestellungs-Tabellenkopf', + 'Customer - order table row' => 'Kunde - Bestellungs-Tabellenzeile', + 'Customer account - additional information' => 'Kundenkonto - Erweitere Informationen', + 'Customer account block' => 'Kundenkonto-Block', + 'Customer title' => 'Kunde-Andere', + 'Customers - JavaScript' => 'Kunden - JavaScript', + 'Customers - caption' => 'Kunden - Bildunterschrift', + 'Customers - header' => 'Kunden - Tabellenkopf', + 'Customers - row' => 'Kunden - Zeile', + 'Cyprus' => 'Zypern', + 'Czech Republic' => 'Tschechische Republik', + 'Danish krone' => 'Dänische Kronen', + 'Dashboard - at the top' => 'Dashboard - oben', + 'Dashboard - bottom' => 'Dashboard - unten', + 'Dashboard - middle' => 'Dashboard - in der Mitte', + 'Data import / export' => 'Importation / Exportation von Daten', + 'Default available stock when check-available-stock is set to 0.' => 'Standart verfügbaren Bestand wenn check-available-stock gleich 0.', + 'Default lang without translation' => 'Standartsprache ohne Übersetzung', + 'Delivery - After delivery module' => 'Lieferung - Nach dem Liefermodul', + 'Delivery - CSS' => 'Lieferung - CSS', + 'Delivery - additional product information' => 'Lieferung - Weitere Produktinformationen', + 'Delivery - after addresse area' => 'Lieferung - Nach dem Adresse-Bereich', + 'Delivery - after the information area' => 'Lieferung - Nach dem Informationsbereich', + 'Delivery - after the order summary' => 'Lieferung - Nach der Zusammenfassung der Bestellung', + 'Delivery - at the bottom of information area' => 'Lieferung - unten an dem Informationsbereich', + 'Delivery - at the bottom of the footer' => 'Lieferung - unten an dem Footer', + 'Delivery - at the top of the footer' => 'Lieferung - oben an dem Footer', + 'Delivery - delivery address' => 'Lieferung - Lieferadresse', + 'Delivery - imprint' => 'Lieferung - Impressum', + 'Delivery - in the header' => 'Lieferung - im Header', + 'Delivery choice - CSS stylesheet' => 'Lieferwahl - CSS-Stylesheet', + 'Delivery choice - after javascript include' => 'Lieferwahl - Nach Integration von JavaScript', + 'Delivery choice - after javascript initialisation' => 'Lieferwahl - nach der Initialisierung von Javascript', + 'Delivery choice - at the bottom' => 'Lieferwahl - unten', + 'Delivery choice - at the bottom of the form' => 'Lieferwahl - unten an dem Formular', + 'Delivery choice - at the top' => 'Lieferwahl - oben', + 'Delivery choice - at the top of the form' => 'Lieferwahl - oben an dem Formular', + 'Delivery choice - extra area' => 'Lieferwahl - Erweiteren Bereich', + 'Delivery choice - javascript' => 'Lieferwahl - Javascript', + 'Delivery zone - Edit JavaScript' => 'Lieferzone - JavaScript Änderung', + 'Delivery zone - JavaScript' => 'Lieferzone - JavaScript', + 'Delivery zone - at the top' => 'Lieferzone - oben', + 'Delivery zone - bottom' => 'Lieferzone - unten', + 'Delivery zone - table header' => 'Lieferzone - Tabellenkopf', + 'Delivery zone - table row' => 'Lieferzone - Tabellenzeile', + 'Denmark' => 'Dänemark', + 'Display and process prices with (0) or without (1) taxes.' => 'Anzeigt und verwendet Preise mit (0) oder ohne (1) Taxen', + 'Djibouti' => 'Djibuti', + 'Document - Edit JavaScript' => 'Dokument - JavaScript Änderung', + 'Document edit - bottom' => 'Dokument Bearbeitung - unten', + 'Document edit - top' => 'Dokument Bearbeitung - oben', + 'Dollar' => 'Dollar', + 'Dollar (CAD)' => 'Dollar (CAD)', + 'Dominica' => 'Dominikanische Republik', + 'Dominican Republic' => 'Dominikanische Republik', + 'Ecuador' => 'Ecuador', + 'Egypt' => 'Ägypten', + 'El Salvador' => 'El Salvador', + 'Email html - layout - CSS' => 'E-Mail html - Layout - CSS', + 'Email html - layout - footer' => 'E-Mail html - Layout - Fußzeile', + 'Email html - order confirmation - after address' => 'E-Mail html - Bestellbestätigung - nach Adresse', + 'Email html - order confirmation - after products' => 'E-Mail html - Bestellbestätigung - nach Produkten', + 'Email html - order confirmation - before address' => 'E-Mail html - Bestellbestätigung - vor Adresse', + 'Email html - order confirmation - before products' => 'E-Mail html - Bestellbestätigung - vor Produkten', + 'Enable (1) or disable (0) URL rewriting' => 'Aktivieren (1) oder deaktivieren (0) URL Überschreibung', + 'Equatorial Guinea' => 'Äquatorialguinea', + 'Eritrea' => 'Eritrea', + 'Estonia' => 'Estland', + 'Ethiopia' => 'Äthiopien', + 'Euro' => 'Euro', + 'Export - JavaScript' => 'Export - JavaScript', + 'Export - table header' => 'Export - Tabellenkopf', + 'Export - table row' => 'Export - Tabellenzeile', + 'Export modal or page - bottom' => 'Export modal or page - unten', + 'Export modal or page - top' => 'Export modal or page - oben', + 'Exports - JavaScript' => 'Exporte - JavaScript', + 'Exports - at the bottom of a category' => 'Exporte - unten einer Kategorie', + 'Exports - at the bottom of column 1' => 'Exporte - unten der Spalte 1', + 'Exports - at the top' => 'Exporte - oben', + 'Feature - Edit JavaScript' => 'Karakteristik - JavaScript Änderung', + 'Feature - Value create form' => 'Karakteristik - Angabe-Erstellungsformular', + 'Feature - add to all form' => 'Karakteristik - zu allen hinzufügen Formular', + 'Feature - create form' => 'Karakteristik - Erstellungsformular', + 'Feature - delete form' => 'Karakteristik - Löschungsformular', + 'Feature - remove to all form' => 'Karakteristik - multipel Löschungsformular', + 'Feature edit - bottom' => 'Charakteristik Bearbeitung - unten', + 'Feature edit - top' => 'Charakteristik Bearbeitung - oben', + 'Features - JavaScript' => 'Karakteristiken - JavaScript', + 'Features - at the top' => 'Karakteristiken - oben', + 'Features - bottom' => 'Karakteristiken - unten', + 'Features - table header' => 'Karakteristiken - Tabellenkopf', + 'Features - table row' => 'Karakteristiken - Tabellenzeile', + 'Features value - table header' => 'Karakteristiken-Angaben - Tabellenkopf', + 'Features value - table row' => 'Karakteristiken-Angaben - Tabellenzeile', + 'Fiji' => 'Fiji', + 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)' => 'Name der Seite 404 (unauffindbar) in dem aktuellen Modell (mit der Dateinamenerweiterung 404.html zum Beispiel)', + 'Filename of the error page' => 'Dateiname der Fehlerseite', + 'Finland' => 'Finnland', + 'Folder' => 'Ordner', + 'Folder - Edit JavaScript' => 'Ordner - JavaScript Änderung', + 'Folder - JavaScript' => 'Ordner - JavaScript', + 'Folder - Tab' => 'Ordner - Tab', + 'Folder - at the top' => 'Ordner - oben', + 'Folder - bottom' => 'Ordner - unten', + 'Folder - caption' => 'Ordner - Bildunterschrift', + 'Folder - content' => 'Ordner - Inhalt', + 'Folder - create form' => 'Ordner - Erstellungsformular', + 'Folder - delete form' => 'Ordner - Löschungsformular', + 'Folder - header' => 'Ordner - Header', + 'Folder - row' => 'Ordner - Zeile', + 'Folder edit - bottom' => 'Ordner Bearbeitung - unten', + 'Folder edit - right column bottom' => 'Ordner bearbeiten - Rechte Spalte unten', + 'Folder edit - right column top' => 'Ordner bearbeiten - Rechte Spalte oben', + 'Folder edit - top' => 'Ordner Bearbeitung - oben', + 'Folder page - CSS stylesheet' => 'Ordnerseite - CSS-Stylesheet', + 'Folder page - after javascript include' => 'Ordnerseite - Nach Integration von JavaScript', + 'Folder page - after javascript initialisation' => 'Ordnerseite - nach der Initialisierung von Javascript', + 'Folder page - after the main content area' => 'Ordnerseite - nach dem Hauptinhaltsbereich', + 'Folder page - at the bottom' => 'Ordnerseite - unten', + 'Folder page - at the bottom of the main area' => 'Ordnerseite - unten an dem Hauptbereich', + 'Folder page - at the top' => 'Ordnerseite - oben', + 'Folder page - at the top of the main area' => 'Ordnerseite - oben an dem Hauptbereich', + 'Folder page - before the main content area' => 'Ordnerseite - vor dem Hauptinhaltsbereich', + 'France metropolitan' => 'Frankreich', + 'French 10% VAT' => '10% Französische MwSt.', + 'French 20% VAT' => '20% Französische MwSt.', + 'French Southern Territories' => 'Französische Süd- und Antarktisgebiete', + 'Front office integration' => 'Front office Modul ', + 'Gabon' => 'Gabun', + 'Gambia' => 'Gambie', + 'Georgia' => 'Georgien', + 'Germany' => 'Deutschland', + 'Ghana' => 'Ghana', + 'Google Analytics block' => 'Google Analytics Block', + 'Greece' => 'Griechenland', + 'Grenada' => 'Grenada', + 'Guadeloupe' => 'Guadeloupe', + 'Guatemala' => 'Guatemala', + 'Guinea' => 'Guinea', + 'Guinea-Bissau' => 'Guinea-Bissau', + 'Guyana' => 'Guyana', + 'Guyane Française' => 'Französisch-Guayana', + 'HTML layout - CSS stylesheet' => 'HTML Struktur - CSS-Stylesheet', + 'HTML layout - after javascript include' => 'HTML Struktur - Nach Integration von JavaScript', + 'HTML layout - after the main content area' => 'HTML Struktur - nach dem Hauptinhaltsbereich', + 'HTML layout - after the opening of the body tag' => 'HTML Struktur - nach der Eröffnung des Body-Tag', + 'HTML layout - after the opening of the head tag' => 'HTML Struktur - nach der Eröffnung des Head-Tag', + 'HTML layout - at the bottom of the header' => 'HTML Struktur - unten an dem Header', + 'HTML layout - at the top of the footer' => 'HTML Struktur - oben an dem Footer', + 'HTML layout - at the top of the header' => 'HTML Struktur - oben an dem Header', + 'HTML layout - before the end body tag' => 'HTML Struktur - vor dem Ende des Body-Tag', + 'HTML layout - before the end of the head tag' => 'HTML Struktur - vor dem Ende des Head-Tag', + 'HTML layout - before the main content area' => 'HTML Struktur - vor dem Hauptinhaltsbereich', + 'HTML layout - bottom of the footer' => 'HTML Struktur - unten an dem Footer', + 'HTML layout - footer body' => 'HTML Struktur - Footer Body', + 'HTML layout - javascript initialization' => 'HTML Struktur - Initialisierung von Javascript', + 'HTML layout - primary navigation' => 'HTML Struktur - Hauptnavigation', + 'HTML layout - secondary navigation' => 'HTML Struktur - Sekundärenavigation', + 'Haiti' => 'Haiti', + 'Home - JavaScript' => 'Accueil - JavaScript', + 'Home - at the top' => 'Accueil - oben', + 'Home - block' => 'Accueil - Block', + 'Home - bottom' => 'Accueil - unten', + 'Home page - CSS stylesheet' => 'Startseite - CSS-Stylesheet', + 'Home page - after javascript include' => 'Startseite - Nach Integration von JavaScript', + 'Home page - after javascript initialisation' => 'Startseite - nach der Initialisierung von Javascript', + 'Home page - main area' => 'Startseite - Hauptbereich', + 'Honduras' => 'Honduras', + 'Hong Kong' => 'Hong Kong', + 'Hook - Edit JavaScript' => 'Hook - JavaScript Änderung', + 'Hook - create form' => 'Hook - Erstellungsformular', + 'Hook - delete form' => 'Hook - Löschungsformular', + 'Hook edit - bottom' => 'Hook Bearbeitung - unten', + 'Hook edit - top' => 'Hook Bearbeitung - oben', + 'Hook positions' => 'Hook Positionen', + 'Hooks' => 'Andockpunkte', + 'Hooks - JavaScript' => 'Hooks - JavaScript', + 'Hooks - at the top' => 'Hooks - oben', + 'Hooks - bottom' => 'Hooks - unten', + 'Hooks - table header' => 'Hooks - Tabellenkopf', + 'Hooks - table row' => 'Hooks - Tabellenzeile', + 'Hooks management' => 'Hooks Verwendung', + 'How document files are delivered in the web space (symlink or copy)' => 'Wie werden Dokumentdateien im Webspace (Symlink oder Kopie) ausgeliefert', + 'How original (full resolution) images are delivered in the web space (symlink or copy)' => 'Wie werden die Originalbilder (volle Auflösung) im Webspace ausgeliefert (symlink or copy)', + 'Hungary' => 'Ungarn', + 'Iceland' => 'Island', + 'Image - Edit JavaScript' => 'Bild - JavaScript Änderung', + 'Image edit - bottom' => 'Bild Bearbeitung - unten', + 'Image edit - top' => 'Bild Bearbeitung - oben', + 'Import - table header' => 'Import - Tabellenkopf', + 'Import - table row' => 'Import - Tabellenzeile', + 'India' => 'Indien', + 'Indonesia' => 'Indonesien', + 'Invoice - After delivery module' => 'Rechnung - Nach dem Liefermodul', + 'Invoice - After payment module' => 'Rechnung - Nach dem Zahlungsmodul', + 'Invoice - CSS' => 'Rechnung - CSS', + 'Invoice - additional product information' => 'Rechnung - Weitere Produktinformationen', + 'Invoice - after addresse area' => 'Rechnung - nach dem Adressebereich', + 'Invoice - after product listing' => 'Rechnung - nach der Produktliste', + 'Invoice - after the information area' => 'Rechnung - nach dem Informationsbereich', + 'Invoice - after the order summary' => 'Rechnung - nach der Bestellungs-Zusammenfassung', + 'Invoice - at the bottom of information area' => 'Rechnung - unten an dem Informationsbereich', + 'Invoice - at the bottom of the footer' => 'Rechnung - unten an dem Footer', + 'Invoice - at the top of the footer' => 'Rechnung - oben an dem Footer', + 'Invoice - delivery address' => 'Rechnung - Bestellungsadresse', + 'Invoice - imprint' => 'Rechnung - Impressum', + 'Invoice - in the header' => 'Rechnung - im Header', + 'Invoice choice - CSS stylesheet' => 'Bezahlungsmethode - CSS-Stylesheet', + 'Invoice choice - after javascript include' => 'Bezahlungsmethode - Nach Integration von JavaScript', + 'Invoice choice - after javascript initialisation' => 'Bezahlungsmethode - nach der Initialisierung von Javascript', + 'Invoice choice - at the bottom' => 'Bezahlungsmethode - unten', + 'Invoice choice - at the top' => 'Bezahlungsmethode - oben', + 'Invoice choice - delivery address' => 'Bezahlungsmethode - Lieferadresse', + 'Invoice choice - extra payment zone' => 'Bezahlungsmethode - extra payment zone', + 'Iran' => 'Iran', + 'Iraq' => 'Irak', + 'Ireland' => 'Irland', + 'Israel' => 'Israel', + 'Italy' => 'Italien', + 'Ivory Coast' => 'Elfenbeinküste', + 'Jamaica' => 'Jamaika', + 'Japan' => 'Japan', + 'Jordan' => 'Jordanien', + 'Kazakhstan' => 'Kasachstan', + 'Kenya' => 'Kenia', + 'Kiribati' => 'Kiribati', + 'Kuwait' => 'Kuwait', + 'Kyrgyzstan' => 'Kirgisistan', + 'Language - create form' => 'Sprache - Erstellungsformular', + 'Languages - JavaScript' => 'Sprachen - JavaScript', + 'Languages - at the top' => 'Sprachen - oben', + 'Languages - bottom' => 'Sprachen - unten', + 'Languages - delete form' => 'Sprachen - Löschungsformular', + 'Languages block' => 'Sprachen Block', + 'Laos' => 'Laos', + 'Latvia' => 'Lettland', + 'Layout - Before the main content' => 'Layout - vor dem Hauptinhaltsbereich', + 'Layout - CSS' => 'Layout - CSS', + 'Layout - JavaScript' => 'Layout - JavaScript', + 'Layout - after footer' => 'Layout - nach dem Footer', + 'Layout - after top bar' => 'Layout - nach der Titelleiste', + 'Layout - after top menu' => 'Layout - nach dem Top Menü', + 'Layout - at the bottom of the top bar' => 'Layout - unten an der Titelleiste', + 'Layout - at the top of the top bar' => 'Layout - oben an der Titelleiste', + 'Layout - before footer' => 'Layout - vor dem Footer', + 'Layout - before top menu' => 'Layout - vor dem Top Menü', + 'Layout - before topbar' => 'Layout - vor der Titelleiste', + 'Layout - in footer' => 'Layout - Im Footer', + 'Layout - in the menu catalog' => 'Layout - im Katalogs-Menü', + 'Layout - in the menu configuration' => 'Layout - im konfigurations-Menü', + 'Layout - in the menu customers' => 'Layout - im Kundes-Menü', + 'Layout - in the menu folders' => 'Layout - im Ordners-Menü', + 'Layout - in the menu modules' => 'Layout - im Moduls-Menü', + 'Layout - in the menu orders' => 'Layout - im Bestellungsmenü', + 'Layout - in the menu tools' => 'Layout - im Tools-Menü', + 'Layout - in top menu items' => 'Layout - in Top-Menü Elementen', + 'Layout - inside top bar' => 'Layout - in der Titelleiste', + 'Leave the default configuration of session' => 'Die Session Standartkonfiguration lassen', + 'Lebanon' => 'Libanon', + 'Lesotho' => 'Lesotho', + 'Liberia' => 'Liberia', + 'Libya' => 'Libyen', + 'Liechtenstein' => 'Liechtenstein', + 'Life time of the cart cookie in the customer browser, in seconds' => 'Dauer der Warenkorb-Cookie in dem Kunden-Browser, in Sekunden', + 'Life time of the session cookie in the customer browser, in seconds' => 'Dauer der Session-Cookie in dem Kunden-Browser, in Sekunden', + 'Links block' => 'Links Block', + 'Lithuania' => 'Litauen', + 'Logging system configuration' => 'Logs System Konfiguration', + 'Login page - CSS stylesheet' => 'Anmeldeseite - CSS-Stylesheet', + 'Login page - after javascript include' => 'Anmeldeseite - Nach Integration von JavaScript', + 'Login page - after javascript initialisation' => 'Anmeldeseite - nach der Initialisierung von Javascript', + 'Login page - at the bottom' => 'Anmeldeseite - unten', + 'Login page - at the bottom of the form' => 'Anmeldeseite - unten an dem Formular', + 'Login page - at the bottom of the main area' => 'Anmeldeseite - unten an dem Hauptbereich', + 'Login page - at the top' => 'Anmeldeseite - oben', + 'Login page - at the top of the form' => 'Anmeldeseite - oben im Formular', + 'Login page - at the top of the main area' => 'Anmeldeseite - oben an dem Hauptbereich', + 'Logs - JavaScript' => 'Protokolle - JavaScript', + 'Logs - at the top' => 'Logs - oben', + 'Logs - bottom' => 'Logs - unten', + 'Lost password - CSS stylesheet' => 'Passwort verloren - CSS-Stylesheet', + 'Lost password - after javascript include' => 'Passwort verloren - Nach Integration von JavaScript', + 'Lost password - at the bottom' => 'Passwort verloren - unten', + 'Lost password - at the bottom of the form' => 'Passwort verloren - unten an dem Formular', + 'Lost password - at the top' => 'Passwort verloren - oben', + 'Lost password - at the top of the form' => 'Passwort verloren - oben im Formular', + 'Lost password - javascript initialization' => 'Passwort verloren - Initialisierung von Javascript', + 'Luxembourg' => 'Luxemburg', + 'Macedonia' => 'Mazedonien', + 'Madagascar' => 'Madagaskar', + 'Mail sent to the customer when its account is created by an administrator in the back-office' => 'Mail an den Kunden geschickt, wenn sein Konto von einem Administrator im Back-Office erstellt wird', + 'Mail sent to the customer when its password or email is changed in the back-office' => 'Mail an den Kunden geschickt, wenn sein Passwort oder E-Mail von einem Administrator im Back-Office geändert werden', + 'Mailing system - JavaScript' => 'E-Mail Sendung - JavaScript', + 'Mailing system - at the top' => 'E-Mail Sendung - oben', + 'Mailing system - bottom' => 'E-Mail Sendung - unten', + 'Malawi' => 'Malawi', + 'Malaysia' => 'Malaysien', + 'Maldives' => 'Malediven', + 'Mali' => 'Mali', + 'Malta' => 'Malta', + 'Marshall Islands' => 'Marshallinseln', + 'Martinique' => 'Martinique', + 'Mauritania' => 'Mauretanien', + 'Mauritius' => 'Mauritius', + 'Mayotte' => 'Mayotte', + 'Message - Edit JavaScript' => 'Nachricht - JavaScript Änderung', + 'Message - create form' => 'Nachricht - Erstellungsformular', + 'Message - delete form' => 'Nachricht - Löschungsformular', + 'Message edit - bottom' => 'Nachricht Bearbeitung - unten', + 'Message edit - top' => 'Nachricht Bearbeitung - oben', + 'Message sent to the shop owner when a new order is placed' => 'Gesendete Nachricht wenn eine neue Bestellung erteilt wird.', + 'Messages - JavaScript' => 'Nachrichten - JavaScript', + 'Messages - at the top' => 'Nachrichten - oben', + 'Messages - bottom' => 'Nachrichten - unten', + 'Messages - table header' => 'Nachrichten - Tabellenkopf', + 'Messages - table row' => 'Nachrichten - Tabellenzeile', + 'Mexico' => 'Mexiko', + 'Micronesia' => 'Mikronesien', + 'Mini cart' => 'Mini-Warenkorb', + 'Miss' => 'Fräulein', + 'Miss_short' => 'Fr.', + 'Misses' => 'Frau', + 'Mister' => 'Herr', + 'Module - Edit JavaScript' => 'Modul - JavaScript Änderung', + 'Module - configuration' => 'Modul - Konfiguration', + 'Module - configuration JavaScript' => 'Modul - JavaScript Konfiguration', + 'Module edit - bottom' => 'Modul Bearbeitung - unten', + 'Module edit - top' => 'Modul Bearbeitung - oben', + 'Module hook - Edit JavaScript' => 'Modul Hook - JavaScript Änderung', + 'Module hook - JavaScript' => 'Modul Hook - JavaScript', + 'Module hook - create form' => 'Modul Hook - Erstellungsformular', + 'Module hook - delete form' => 'Modul Hook - Löschungsformular', + 'Module hook edit - bottom' => 'Modul-Hook Bearbeitung - unten', + 'Module hook edit - top' => 'Modul-Hook Bearbeitung - oben', + 'Modules - JavaScript' => 'Modulen - JavaScript', + 'Modules - at the top' => 'Modulen - oben', + 'Modules - bottom' => 'Modulen - unten', + 'Modules - table header' => 'Modulen - Tabellenkopf', + 'Modules - table row' => 'Modulen - Tabellenzeile', + 'Modules maagement' => 'Modul Verwendung', + 'Modules management' => 'Modul Verwendung', + 'Moldova' => 'Moldau', + 'Monaco' => 'Monaco', + 'Mongolia' => 'Mongolei', + 'Morocco' => 'Marokko', + 'Mozambique' => 'Mosambik', + 'Mr.' => 'Hr.', + 'Mrs' => 'Fr.', + 'Name of the active PDF template' => 'Name der aktiven PDF Template', + 'Name of the active back-office template' => 'Name der aktiven Back Office Template', + 'Name of the active front-office template' => 'Name der aktiven Front Office Template', + 'Name of the active mailing template' => 'Name der aktiven E-Mail Template', + 'Name of the cart cookie' => 'Name der Warenkorb-Cookie', + 'Name of the delivery view in the current PDF template (without extension)' => 'Name der Lieferung Sicht in der aktuellen PDF-Vorlage (ohne Erweiterung)', + 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)' => 'Name des Grafik-Treibers, der von der Imagine-Bibliothek verwendet wird (siehe https://imagine.readthedocs.org)', + 'Name of the invoice view in the current PDF template (without extension)' => 'Name der Rechnungsansicht in der aktuellen PDF-Vorlage (ohne Erweiterung)', + 'Name of the template view returned when an obsolete (or inactive) product URL is invoked' => 'Name des Templates zurückgegeben, wenn eine veraltete (oder inaktive) Produkt-URL aufgerufen wird', + 'Name the cart cookie' => 'Name der Warenkorb-Cookie', + 'Namibia' => 'Namibia', + 'Nauru' => 'Nauru', + 'Navigation block' => 'Menü Block', + 'Nepal' => 'Nepal', + 'Netherlands' => 'Niederlande', + 'New Products block' => 'Neue Produkte Block', + 'New York' => 'New York', + 'New Zealand' => 'Neuseeland', + 'New order {$order_ref} placed on {config key="store_name"}' => 'Neue Bestellung {$order_ref} für {config key="store_name"}', + 'Newsletter block' => 'Newsletter Block', + 'Newsletter page - CSS stylesheet' => 'Newletter-Seite - CSS-Stylesheet', + 'Newsletter page - after javascript include' => 'Newletter-Seite - Nach Integration von JavaScript', + 'Newsletter page - after javascript initialisation' => 'Newletter-Seite - nach der Initialisierung von Javascript', + 'Newsletter page - at the bottom' => 'Newletter-Seite - unten', + 'Newsletter page - at the top' => 'Newletter-Seite - oben', + 'Nicaragua' => 'Nicaragua', + 'Niger' => 'Niger', + 'Nigeria' => 'Nigeria', + 'Niue' => 'Niue', + 'North Korea' => 'Nordkorea', + 'Norway' => 'Norwegen', + 'Not paid' => 'Nicht bezahlt', + 'Nouvelle-Calédonie' => 'Neu-Kaledonien', + 'Oman' => 'Oman', + 'Order' => 'Bestellung', + 'Order - After closing product row' => 'Bestellung - Nach Sperrung der Produkt Zeile', + 'Order - After product list' => 'Bestellung - Nach der Produktliste', + 'Order - Before product list' => 'Bestellung - Vor der Produktliste', + 'Order - Before starting product row' => 'Bestellung - Vor der Öffnung der Produktzeile', + 'Order - Edit JavaScript' => 'Bestellung - JavaScript Änderung', + 'Order - Tab' => 'Bestellung - Tab', + 'Order - bill bottom' => 'Bestellung - Rechnung unten', + 'Order - bill top' => 'Bestellung - Rechnung oben', + 'Order - cart bottom' => 'Bestellung - Warenkorb unten', + 'Order - cart top' => 'Bestellung - Warenkorb oben', + 'Order - content' => 'Bestellung - Inhalt', + 'Order - customer information bottom' => 'Bestellung - Kunde Informationen unten', + 'Order - delivery module bottom' => 'Bestellung - Liefermodul unten', + 'Order - payment module bottom' => 'Bestellung - Zahlungsmodul unten', + 'Order - product list' => 'Bestellung - Produktliste', + 'Order - table header' => 'Bestellung - Tabellenkopf', + 'Order - table row' => 'Bestellung - Tabellenzeile', + 'Order confirmation - after the order summary' => 'Bestellbestätigung - nach den Bestellungszusammenfassungen', + 'Order confirmation sent to the customer' => 'Bestellbestätigung den Kunden gesendet', + 'Order details - CSS stylesheet' => 'Bestellungsdetails - CSS-Stylesheet', + 'Order details - additional delivery information' => 'Bestellungsdetails - weitere Informationen für den Versand', + 'Order details - additional information' => 'Bestellungsdetails - weitere Informationen', + 'Order details - additional invoice information' => 'Bestellungsdetails - weitere Informationen für die Rechnung', + 'Order details - additional product information' => 'Bestellungsdetails - weitere Informationen für ein Produkt', + 'Order details - after addresses' => 'Bestellungsdetails - Nach den Adressen', + 'Order details - after global information' => 'Bestellungsdetails - nach den allgemeinen Informationen', + 'Order details - after javascript include' => 'Bestellungsdetails - nach Integration von JavaScript', + 'Order details - after product' => 'Bestelldaten - nach einem Produkt', + 'Order details - after products' => 'Bestellungsdetails - nach den Produkten', + 'Order details - after products list' => 'Bestellungsdetails - nach der Produktliste', + 'Order details - at the bottom' => 'Bestellungsdetails - unten', + 'Order details - at the top' => 'Bestellungsdetails - oben', + 'Order details - before products list' => 'Bestellungsdetails - vor der Produktliste', + 'Order details - delivery address' => 'Bestellungsdetails - Lieferadresse', + 'Order details - invoice address' => 'Bestellungsdetails - Rechnungsadresse', + 'Order details - javascript initialization' => 'Bestellungsdetails - Initialisierung von Javascript', + 'Order edit - bottom' => 'Bestellung Bearbeitung - unten', + 'Order edit - delivery address' => 'Bestellungs-Änderung - Lieferadresse', + 'Order edit - displayed after product information' => 'Bestellungs Bearbeitung - unter die Produktdaten', + 'Order edit - order product table header' => 'Bestellung bearbeiten - Produkttabelle Header', + 'Order edit - order product table row' => 'Bestellung bearbeiten - Produkttabelle Zeile', + 'Order edit - top' => 'Bestellung Bearbeitung - oben', + 'Order failed - CSS stylesheet' => 'Fehlschlag der Bestellung - CSS-Stylesheet', + 'Order failed - after javascript include' => 'Fehlschlag der Bestellung - Nach Integration von JavaScript', + 'Order failed - after javascript initialisation' => 'Fehlschlag der Bestellung - nach der Initialisierung von Javascript', + 'Order failed - at the bottom' => 'Fehlschlag der Bestellung - unten', + 'Order failed - at the top' => 'Fehlschlag der Bestellung - oben', + 'Orders - JavaScript' => 'Bestellungen - JavaScript', + 'Orders - at the top' => 'Bestellungen - oben', + 'Orders - bottom' => 'Bestellungen - unten', + 'Orders - table header' => 'Bestellungen - Tabellenkopf', + 'Orders - table row' => 'Bestellungen - Tabellenzeile', + 'Page 404 - CSS stylesheet' => 'Seite nicht gefunden - CSS-Stylesheet', + 'Page 404 - after javascript include' => 'Seite nicht gefunden - Nach Integration von JavaScript', + 'Page 404 - after javascript initialisation' => 'Seite nicht gefunden - nach der Initialisierung von Javascript', + 'Page 404 - content area' => 'Seite nicht gefunden - Inhalts-Bereich', + 'Paid' => 'Bezahlt', + 'Pakistan' => 'Pakistan', + 'Panama' => 'Panama', + 'Papua Nueva Guinea' => 'Papua-Neuguinea', + 'Paraguay' => 'Paraguay', + 'Path to the directory where documents are stored' => 'Pfad zu dem Verzeichnis, in dem Dokumente gespeichert sind', + 'Path to the directory where images are stored' => 'Pfad zu dem Verzeichnis, in dem Bilder gespeichert sind', + 'Pay by cheque' => 'Per Cheque bezahlen', + 'Payment failed - CSS stylesheet' => 'Bezahlungs-Fehlschlagen - CSS-Stylesheet', + 'Payment failed - after javascript include' => 'Bezahlungs-Fehlschlagen - Nach Integration von JavaScript', + 'Payment failed - javascript initialization' => 'Bezahlungs-Fehlschlagen - Initialisierung von Javascript', + 'Payment gateway - CSS stylesheet' => 'Zahlung-Gateway - CSS-Stylesheet', + 'Payment gateway - after javascript include' => 'Zahlung-Gateway - Nach Integration von JavaScript', + 'Payment gateway - after javascript initialisation' => 'Zahlung-Gateway - nach der Initialisierung von Javascript', + 'Payment gateway - javascript' => 'Zahlung-Gateway - Javascript', + 'Payment gateway - main area' => 'Zahlung-Gateway - Hauptbereich', + 'Peru' => 'Peru', + 'Philippines' => 'Philippinen', + 'Placed order - CSS stylesheet' => 'Erteilten Auftrag - CSS-Stylesheet', + 'Placed order - after javascript include' => 'Erteilten Auftrag - nach Integration von JavaScript', + 'Placed order - after javascript initialisation' => 'Erteilten Auftrag - nach der Initialisierung von Javascript', + 'Placed order - main area' => 'Erteilten Auftrag - Hauptbereich', + 'Poland' => 'Polen', + 'Polynésie française' => 'Französisch-Polynesien', + 'Portugal' => 'Portugal', + 'Processing' => 'Bearbeitung', + 'Product' => 'Produkt', + 'Product - Edit JavaScript' => 'Produkt - JavaScript Änderung', + 'Product - Tab' => 'Produkt - Tab', + 'Product - accessories table header' => 'Produkt - Zubehör Tabellenkopf', + 'Product - accessories table row' => 'Produkt - Zubehör Tabellenzeile', + 'Product - after combinations' => 'Produkt - nach den Kombinationen', + 'Product - at the bottom of a product combination' => 'Produkt - unten einer Produkt-Kombination', + 'Product - attributes table header' => 'Produkt - Deklination Tabellenkopf', + 'Product - attributes table row' => 'Produkt - Deklination Tabellenzeile', + 'Product - before combinations' => 'Produkt - vor den Kombinationen', + 'Product - categories table header' => 'Produkt - Kategorien Tabellenkopf', + 'Product - categories table row' => 'Produkt - Kategorien Tabellenzeile', + 'Product - combination delete form' => 'Produkt - Kombinations-Löschungsformular', + 'Product - combinations list caption' => 'Produkt - Kombinationsliste-Bildunterschrift', + 'Product - content' => 'Produkt - Inhalt', + 'Product - contents table header' => 'Produkt - Inhalte Tabellenkopf', + 'Product - contents table row' => 'Produkt - Inhalte Tabellenzeile', + 'Product - create form' => 'Produkt - Erstellungsformular', + 'Product - delete form' => 'Produkt - Löschungsformular', + 'Product - details pricing form' => 'Produkt - Preisedetails Formular', + 'Product - details promotion form' => 'Produkt - Sonderangebotdetails Formular', + 'Product - features table row' => 'Produkt - Charakteristiken Tabellenzeile', + 'Product - features-table-header' => 'Produkt - Charakteristiken Tabellenkopf', + 'Product - folders table header' => 'Produkt - Ordner Tabellenkopf', + 'Product - folders table row' => 'Produkt - Ordner Tabellenzeile', + 'Product - stock edit form' => 'Produkt - Bestandänderung Formular', + 'Product edit - bottom' => 'Produkt Bearbeitung - unten', + 'Product edit - top' => 'Produkt Bearbeitung - oben', + 'Product loop - at the bottom' => 'Produkt-Loop - unten', + 'Product loop - at the top' => 'Produkt-Loop - oben', + 'Product page - CSS stylesheet' => 'Produktseite - CSS-Stylesheet', + 'Product page - On the bottom of the form' => 'Produktseite - unten an dem Formular', + 'Product page - On the top of the form' => 'Produktseite - oben im Formular', + 'Product page - additional information' => 'Produktseite - erweitere Informationen', + 'Product page - after javascript include' => 'Produktseite - Nach Integration von JavaScript', + 'Product page - after javascript initialisation' => 'Produktseite - nach der Initialisierung von Javascript', + 'Product page - at the bottom' => 'Produktseite - unten', + 'Product page - at the bottom of the detail area' => 'Produktseite - unten dem Details-Bereich', + 'Product page - at the top' => 'Produktseite - oben', + 'Product page - at the top of the detail' => 'Produktseite - oben dem Details-Bereich', + 'Product page - photo gallery' => 'Produktseite - Bilder-Gallerie', + 'Products - caption' => 'Produkte - Bildunterschrift', + 'Products - header' => 'Produkte - Header', + 'Products - row' => 'Produkte - Zeile', + 'Products offer block' => 'Sonderangebot-Block', + 'Profile - Edit JavaScript' => 'Profil - JavaScript Änderung', + 'Profile - create form' => 'Profil - Erstellungsformular', + 'Profile - delete form' => 'Profil - Löschungsformular', + 'Profile - table header' => 'Profil - Tabellenkopf', + 'Profile - table row' => 'Profil - Tabellenzeile', + 'Profile edit - bottom' => 'Profil Bearbeitung - unten', + 'Profile edit - top' => 'Profil Bearbeitung - oben', + 'Profiles - JavaScript' => 'Profile - JavaScript', + 'Profiles - at the top' => 'Profile - oben', + 'Profiles - bottom' => 'Profile - unten', + 'Qatar' => 'Katar', + 'Refunded' => 'Zrückerstattet', + 'Register - CSS stylesheet' => 'Konto-Erstellung - CSS-Stylesheet', + 'Register - after javascript include' => 'Konto-Erstellung - Nach Integration von JavaScript', + 'Register - after javascript initialisation' => 'Konto-Erstellung - nach der Initialisierung von Javascript', + 'Register - at the bottom' => 'Konto-Erstellung - unten', + 'Register - at the bottom of the form' => 'Konto-Erstellung - unten an dem Formular', + 'Register - at the top' => 'Konto-Erstellung - oben', + 'Register - at the top of the form' => 'Konto-Erstellung - oben im Formular', + 'Romania' => 'Rumänien', + 'Russia' => 'Russland', + 'Rwanda' => 'Ruanda', + 'Réunion(La)' => 'La Réunion', + 'Saint Barthélemy' => 'Saint-Barthélemy', + 'Saint Kitts and Nevis' => 'St. Kitts und Nevis', + 'Saint Lucia' => 'St. Lucia', + 'Saint Martin (French part)' => 'Saint-Martin (franz. Teil)', + 'Saint Vincent and the Grenadines' => 'St. Vincent und die Grenadinen', + 'Sale - create form' => 'Sonderangebot - Erstellungsformular', + 'Sale - delete form' => 'Sonderangebot - Löschungsformular', + 'Sale edit - bottom' => 'Sonderangebot Bearbeitung - unten', + 'Sale edit - top' => 'Sonderangebot Bearbeitung - oben', + 'Sale edit page - javascript last call block' => 'Sonderangebot Änderungsseite - javascript last call block', + 'Sales - JavaScript' => 'Sonderangebote - JavaScript', + 'Sales - at the bottom' => 'Sonderangebote - unten', + 'Sales - at the top' => 'Sonderangebote - oben', + 'Sales - table header' => 'Sonderangebote - Tabellenkopf', + 'Sales - table row' => 'Sonderangebote - Tabellenzeile', + 'Sales management' => 'Sonderangebotsmanagement', + 'San Marino' => 'Saint-Marin', + 'Sao Tome and Principe' => 'São Tomé und Príncipe', + 'Saudi Arabia' => 'Saudi-Arabien', + 'Search' => 'Suchen', + 'Search - JavaScript' => 'Suche - JavaScript', + 'Search - at the top' => 'Suche - oben', + 'Search - bottom' => 'Suche - unten', + 'Search block' => 'Suche-Block', + 'Search page - CSS stylesheet' => 'Suche-Seite - CSS-Stylesheet', + 'Search page - after javascript include' => 'Suche-Seite - Nach Integration von JavaScript', + 'Search page - after javascript initialisation' => 'Suche-Seite - nach der Initialisierung von Javascript', + 'Secret key for form CSRF token' => 'Geheimer Schlüssel für Formular CSRF-token', + 'Senegal' => 'Senegal', + 'Sent' => 'Gesendet', + 'Seychelles' => 'Seychellen', + 'Shipping configuration' => 'Lieferungskonfiguration', + 'Shipping configuration - Edit' => 'Versandkonfiguration - Änderung', + 'Shipping configuration - Edit JavaScript' => 'Versandkonfiguration - JavaScript Änderung', + 'Shipping configuration - JavaScript' => 'Versandkonfiguration - JavaScript', + 'Shipping configuration - at the top' => 'Versandkonfiguration - oben', + 'Shipping configuration - bottom' => 'Versandkonfiguration - unten', + 'Shipping configuration - country delete form' => 'Versandkonfiguration - Länder Löschungsfomular', + 'Shipping configuration - create form' => 'Versandkonfiguration - Erstellungsformular', + 'Shipping configuration - delete form' => 'Versandkonfiguration - Löschungsformular', + 'Shipping configuration - table header' => 'Versandkonfiguration - Tabellenkopf', + 'Shipping configuration - table row' => 'Versandkonfiguration - Tabellenzeile', + 'Shipping configuration edit - bottom' => 'Lieferzone Bearbeitung - unten', + 'Shipping configuration edit - top' => 'Lieferzone Bearbeitung - oben', + 'Shipping zones edit - bottom' => 'Transporteur Lieferzonen Bearbeitung - unten', + 'Shipping zones edit - top' => 'Transporteur Lieferzonen Bearbeitung - oben', + 'Show error message instead of a white page on a server error' => 'Fehlermeldung zeigen anstatt einer weißen Seite im Falle eines eines Serverfehlers', + 'Sierra Leone' => 'Sierra Leone', + 'Singapore' => 'Singapur', + 'Sitemap - at the bottom' => 'Sitemap - unten', + 'Slovakia' => 'Slowakei', + 'Slovenia' => 'Slowenien', + 'Smarty template engine integration' => 'Smarty Template Engine Integration', + 'Social Networks block' => 'Social Networks Block', + 'Solomon Islands' => 'Salomon-Inseln', + 'Somalia' => 'Somalia', + 'South Africa' => 'Südafrika', + 'South Korea' => 'Südkorea', + 'Spain' => 'Spanien', + 'Sri Lanka' => 'Sri Lanka', + 'St Pierre et Miquelon' => 'Saint-Pierre und Miquelon', + 'Store Information - JavaScript' => 'Shop Informationen - JavaScript', + 'Store information configuration' => 'Shop Informationen', + 'Sudan' => 'Sudan', + 'Suriname' => 'Suriname', + 'Swaziland' => 'Swaziland', + 'Sweden' => 'Schweden', + 'Switzerland' => 'Schweiz', + 'Syria' => 'Syrien', + 'System - logs JavaScript' => 'System - JavaScript Logs', + 'Tab SEO - bottom' => 'SEO Tab - unten', + 'Tab SEO - top' => 'SEO Tab - oben', + 'Tab SEO - update form' => 'Registerkarte SEO - Update-Formular', + 'Tab document - bottom' => 'Dokument Tab - unten', + 'Tab document - top' => 'Dokument Tab - oben', + 'Tab image - bottom' => 'Bild Tab - unten', + 'Tab image - top' => 'Bild Tab - oben', + 'Tajikistan' => 'Tadschikistan', + 'Tanzania' => 'Tansania', + 'Tax - Edit JavaScript' => 'Taxe - JavaScript Änderung', + 'Tax - create form' => 'Taxe - Erstellungsformular', + 'Tax - delete form' => 'Taxe - Löschungsformular', + 'Tax edit - bottom' => 'Taxe Bearbeitung - unten', + 'Tax edit - top' => 'Taxe Bearbeitung - oben', + 'Tax rule edit - bottom' => 'Taxregel Bearbeitung - unten', + 'Tax rule edit - top' => 'Taxregel Bearbeitung - oben', + 'Tax rules configuration' => 'Taxeregelung-Konfiguration', + 'Taxes - update form' => 'Taxes - Änderungs-Formular', + 'Taxes rules - JavaScript' => 'Taxeregeln - JavaScript', + 'Taxes rules - at the top' => 'Taxeregeln - oben', + 'Taxes rules - bottom' => 'Taxeregeln - unten', + 'Template - Edit JavaScript' => 'Template - JavaScript Änderung', + 'Template - attributes table header' => 'Template - Tabellenkopf attributs', + 'Template - attributes table row' => 'Template - Tabellenzeile attributs', + 'Template - create form' => 'Template - Erstellungsformular', + 'Template - delete form' => 'Template - Löschungsformular', + 'Template - features table row' => 'Template - Charakteristiken Tabellenzeile', + 'Template - features-table-header' => 'Template - Charakteristiken Tabellenkopf', + 'Template edit - bottom' => 'Template Bearbeitung - unten', + 'Template edit - top' => 'Template Bearbeitung - oben', + 'Templates - JavaScript' => 'Templates - JavaScript', + 'Templates - at the top' => 'Templates - oben', + 'Templates - bottom' => 'Templates - unten', + 'Templates - table header' => 'Templates - Tabellenkopf', + 'Templates - table row' => 'Templates - Tabellenzeile', + 'Thailand' => 'Thailand', + 'The ID of the \'Terms & Conditions\' content.' => 'Ihr \'Allgemeine Geschäftsbedingungen \' ID.', + 'The ID of the folder containing your information pages : terms, imprint, ...' => 'Die ID des Ordners mit Ihren Informations-Seiten: AGB, Impressum, ...', + 'The Vatican' => 'der Vatikan', + 'The default quality (in %) of the generated images' => 'Die Standardqualität (in%) der erzeugten Bilder', + 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country' => 'Der Pfad (relativ zu der Standard-Backoffice-Vorlage) zu dem verwendetes Bild wenn kein Flagge-Bild für ein Land gefunden werden kann', + 'The path to the document cache directory in the web space' => 'Der Pfad zum Dokument-Cache-Verzeichnis in dem Web-Space', + 'The path to the image cache directory in the web space' => 'Der Pfad zum Bild-Cache-Verzeichnis in dem Web-Space', + 'TinyMCE WYSIWYG editor' => 'TinyMCE WYSIWYG Editor', + 'Togo' => 'Togo', + 'Tonga' => 'Tonga', + 'Tools - JavaScript' => 'Tools - JavaScript', + 'Tools - at the bottom of column 1' => 'Tools - unten der Spalte 1', + 'Tools - at the top' => 'Tools - oben', + 'Tools - at the top of the column' => 'Tools - oben der Spalte', + 'Tools - bottom' => 'Tools - unten', + 'Tools panel' => 'Tools', + 'Translations' => 'Übersetzungen', + 'Translations - JavaScript' => 'Übersetzungen - JavaScript', + 'Trinidad and Tobago' => 'Trinidad und Tobago', + 'Tunisia' => 'Tunesien', + 'Turkey' => 'Türkei', + 'Turkmenistan' => 'Turkménistan', + 'Tuvalu' => 'Tuvalu', + 'UK Pound' => 'Britische Pfund', + 'Uganda' => 'Uganda', + 'Ukraine' => 'Ukraine', + 'United Arab Emirates' => 'Vereinigte Arabische Emirate', + 'United Kingdom' => 'Vereinigtes Königreich', + 'United States Dollar' => 'US Dollar', + 'Update customer account - CSS stylesheet' => 'Kundenkonto Änderung - CSS-Stylesheet', + 'Update customer account - after javascript include' => 'Kundenkonto Änderung - Nach Integration von JavaScript', + 'Update customer account - after javascript initialisation' => 'Kundenkonto Änderung - nach der Initialisierung von Javascript', + 'Update customer account - at the bottom' => 'Kundenkonto Änderung - unten', + 'Update customer account - at the bottom of the form' => 'Kundenkonto Änderung - unten an dem Formular', + 'Update customer account - at the top' => 'Kundenkonto Änderung - oben', + 'Update customer account - at the top of the form' => 'Kundenkonto Änderung - oben im Formular', + 'Uruguay' => 'Uruguay', + 'Use a persistent cookie to keep track of customer cart' => 'Ein dauerhaftes Cookie verwenden, um den Kundes-Warenkorb zu merken', + 'Uzbekistan' => 'Usbekistan', + 'Vanuatu' => 'Vanuatu', + 'Variable - Edit JavaScript' => 'Variable - JavaScript Änderung', + 'Variable - create form' => 'Variable - Erstellungsformular', + 'Variable - delete form' => 'Variable - Löschungsformular', + 'Variable edit - bottom' => 'Variable Bearbeitung - unten', + 'Variable edit - top' => 'Variable Bearbeitung - oben', + 'Variables - JavaScript' => 'Variablen - JavaScript', + 'Variables - at the top' => 'Variablen - oben', + 'Variables - bottom' => 'Variablen - unten', + 'Variables - table header' => 'Variablen - Tabellenkopf', + 'Variables - table row' => 'Variablen - Tabellenzeile', + 'Venezuela' => 'Venezuela', + 'Vietnam' => 'Vietnam', + 'View administration logs' => 'Administration Logs ansehen', + 'Virtual Product Controller' => 'Steuerung für virtuelle Produkte', + 'Wallis-et-Futuna' => 'Wallis und Futuna', + 'Western Samoa' => 'West-Samoa', + 'Where the WYSIWYG editor is required' => 'Überall wo WYSIWYG editor ist nötig', + 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)' => 'Whitespace trim Ebene des generierten HTML-Codes (0 = aus, 1 = Mittel, 2 = Maximum)', + 'Yemen' => 'Jemen', + 'You can now login at' => 'Sie können Ihnen anmelden bei', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'Sie haben Ihr Passwort vergessen br />\r\nBitte ändern Sie das Passwort nach Ihre erste Anmeldung', + 'You have lost your password
    \r\nYour new password is' => 'Sie haben Ihr Passwort vergessen
    \r\nIhr neues Passwort ist ', + 'Your account information on {config key="store_name"} has been changed.' => 'Ihre Konto-Zugriff für {config key="store_name"} wurde geändert', + 'Your new passord is : {$password}' => 'Ihr neues Passwort ist : {$password}', + 'Your new password' => 'Ihr neues Passwort', + 'Your new password for {config key="store_name"}' => 'Ihr neues Passwort für {config key="store_name"}', + 'Your order {$order_ref} at {config key="store_name"}' => 'Ihre Bestellung {$order_ref} bei {config key="store_name"}', + 'Zaire' => 'Zaire', + 'Zambia' => 'Sambia', + 'Zimbabwe' => 'Zimbabwe', + 'Zone - delete form' => 'Zone - Löschungsformular', + '[Firewall/Bruteforce] Number of allowed attemps' => '[Firewall/Bruteforce] Anzahl der erlaubten Versuche', + '[Firewall/Bruteforce] Time to wait between X attempts' => '[Firewall/Bruteforce] Wartezeit zwischen X Versuche', + '[Firewall] Activate the firewall' => '[Firewall] Firewall aktivieren', + '[Firewall] Number of allowed attemps' => '[Firewall] Anzahl der erlaubten Versuche', + '[Firewall] Time to wait between X attempts' => '[Firewall] Wartezeit zwischen X Versuche', + 'changing password email for' => 'Passwort Änderung für', + 'customer account - CSS stylesheet' => 'Kundenkonto - CSS-Stylesheet', + 'customer account - after javascript include' => 'Kundenkonto - Nach Integration von JavaScript', + 'customer account - after javascript initialisation' => 'Kundenkonto - nach der Initialisierung von Javascript', + 'customer account - at the bottom' => 'Kundenkonto - unten', + 'customer account - at the top' => 'Kundenkonto - oben', + 'export of newsletter subscribers' => 'Export für die Newsletter Angemeldeten', + 'language selection page - CSS stylesheet' => 'Sprachwahl Seite - CSS-Stylesheet', + 'language selection page - after javascript include' => 'Sprachwahl Seite - Nach Integration von JavaScript', + 'language selection page - after javascript initialisation' => 'Sprachwahl Seite - nach der Initialisierung von Javascript', + 'language selection page - at the bottom' => 'Sprachwahl Seite - unten', + 'language selection page - at the top' => 'Sprachwahl Seite - oben', + 'tax rule - Edit JavaScript' => 'Taxregel - JavaScript Änderung', + 'tax rule - create form' => 'Taxregel - Erstellungsformular', + 'tax rule - delete form' => 'Taxregel - Löschungsformular', + 'tinymce wysiwyg editor' => 'Tinymce Wysiwyg Editor', +]; diff --git a/setup/I18n/el_GR.php b/setup/I18n/el_GR.php new file mode 100644 index 00000000..f766ef2a --- /dev/null +++ b/setup/I18n/el_GR.php @@ -0,0 +1,7 @@ + 'Διεύθυνση', + 'New York' => 'Νέα Υόρκη', + 'Search' => 'Αναζήτηση', +]; diff --git a/setup/I18n/en_US.php b/setup/I18n/en_US.php new file mode 100644 index 00000000..b7260997 --- /dev/null +++ b/setup/I18n/en_US.php @@ -0,0 +1,1450 @@ + '"Remember me" cookie expiration time, in seconds, for administration users', + '"Remember me" cookie expiration time, in seconds, for customer users' => '"Remember me" cookie expiration time, in seconds, for customer users', + '"Remember me" cookie name for administration users' => '"Remember me" cookie name for administration users', + '"Remember me" cookie name for customer users' => '"Remember me" cookie name for customer users', + '72h delivery' => '72h delivery', + 'A {config key="store_name"} account has been created for you' => 'A {config key="store_name"} account has been created for you', + 'API Configuration' => 'API Configuration', + 'Aceh' => 'Aceh', + 'Address' => 'Address', + 'Address creation - CSS stylesheet' => 'Address creation - CSS stylesheet', + 'Address creation - after javascript include' => 'Address creation - after javascript include', + 'Address creation - after javascript initialisation' => 'Address creation - after javascript initialisation', + 'Address creation - at the bottom' => 'Address creation - at the bottom', + 'Address creation - at the bottom of the form' => 'Address creation - at the bottom of the form', + 'Address creation - at the top' => 'Address creation - at the top', + 'Address creation - at the top of the form' => 'Address creation - at the top of the form', + 'Address update - CSS stylesheet' => 'Address update - CSS stylesheet', + 'Address update - after javascript include' => 'Address update - after javascript include', + 'Address update - after javascript initialisation' => 'Address update - after javascript initialisation', + 'Address update - at the bottom' => 'Address update - at the bottom', + 'Address update - at the bottom of the form' => 'Address update - at the bottom of the form', + 'Address update - at the top' => 'Address update - at the top', + 'Address update - at the top of the form' => 'Address update - at the top of the form', + 'Admin layout - After the main content' => 'Admin layout - After the main content', + 'Administatros list' => 'Administatros list', + 'Administration profiles management' => 'Administration profiles management', + 'Administrator - create form' => 'Administrator - create form', + 'Administrator - delete form' => 'Administrator - delete form', + 'Administrator - update form' => 'Administrator - update form', + 'Administrator list' => 'Administrator list', + 'Administrators - JavaScript' => 'Administrators - JavaScript', + 'Administrators - at the top' => 'Administrators - at the top', + 'Administrators - bottom' => 'Administrators - bottom', + 'Administrators - header' => 'Administrators - header', + 'Administrators - row' => 'Administrators - row', + 'Advanced Configuration' => 'Advanced Configuration', + 'Advanced Configuration - Javascript' => 'Advanced Configuration - Javascript', + 'Advanced configuration' => 'Advanced configuration', + 'Afghanistan' => 'Afghanistan', + 'Agrigento' => 'Agrigento', + 'Aguascalientes' => 'Aguascalientes', + 'Aichi' => 'Aichi', + 'Akita' => 'Akita', + 'Alabama' => 'Alabama', + 'Alaska' => 'Alaska', + 'Albania' => 'Albania', + 'Alberta' => 'Alberta', + 'Alessandria' => 'Alessandria', + 'Algeria' => 'Algeria', + 'All Products - CSS stylesheet' => 'All Products - CSS stylesheet', + 'All Products - after javascript include' => 'All Products - after javascript include', + 'All Products - after javascript initialisation' => 'All Products - after javascript initialisation', + 'All Products - at the bottom' => 'All Products - at the bottom', + 'All Products - at the top' => 'All Products - at the top', + 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)' => 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Allow customers to change their email. 1 for yes, 0 for no', + 'Allow negative product stock (1) or not (0)' => 'Allow negative product stock (1) or not (0)', + 'Allow negative product stock (1) or not (0, default)' => 'Allow negative product stock (1) or not (0, default)', + 'Allow slash ended uri' => 'Allow slash ended uri', + 'An image carousel on your home page' => 'An image carousel on your home page', + 'Ancona' => 'Ancona', + 'Andorra' => 'Andorra', + 'Angola' => 'Angola', + 'Antigua and Barbuda' => 'Antigua and Barbuda', + 'Aomori' => 'Aomori', + 'Aosta' => 'Aosta', + 'Api page - at bottom' => 'Api page - at bottom', + 'Api page - at top' => 'Api page - at top', + 'Api page - in deletion form' => 'Api page - in deletion form', + 'Arezzo' => 'Arezzo', + 'Argentina' => 'Argentina', + 'Arizona' => 'Arizona', + 'Arkansas' => 'Arkansas', + 'Armenia' => 'Armenia', + 'Ascoli Piceno' => 'Ascoli Piceno', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Ask the customers to confirm their email, 1 for yes, 0 for no', + 'Asti' => 'Asti', + 'Attribut - Edit JavaScript' => 'Attribut - Edit JavaScript', + 'Attribut - add to all form' => 'Attribut - add to all form', + 'Attribut - create form' => 'Attribut - create form', + 'Attribut - delete form' => 'Attribut - delete form', + 'Attribut - id delete form' => 'Attribut - id delete form', + 'Attribut - remove to all form' => 'Attribut - remove to all form', + 'Attribute edit - bottom' => 'Attribute edit - bottom', + 'Attribute edit - top' => 'Attribute edit - top', + 'Attribute value - create form' => 'Attribute value - create form', + 'Attributes - JavaScript' => 'Attributes - JavaScript', + 'Attributes - at the top' => 'Attributes - at the top', + 'Attributes - bottom' => 'Attributes - bottom', + 'Attributes - table header' => 'Attributes - table header', + 'Attributes - table row' => 'Attributes - table row', + 'Attributes value - table header' => 'Attributes value - table header', + 'Attributes value - table row' => 'Attributes value - table row', + 'Australia' => 'Australia', + 'Austria' => 'Austria', + 'Avellino' => 'Avellino', + 'Azerbaijan' => 'Azerbaijan', + 'Back-office export management' => 'Back-office export management', + 'Back-office home page' => 'Back-office home page', + 'Back-office search function' => 'Back-office search function', + 'Bahamas' => 'Bahamas', + 'Bahrain' => 'Bahrain', + 'Baht' => 'Baht', + 'Baja California' => 'Baja California', + 'Baja California Sur' => 'Baja California Sur', + 'Bali' => 'Bali', + 'Bangka' => 'Bangka', + 'Bangladesh' => 'Bangladesh', + 'Banten' => 'Banten', + 'Barbados' => 'Barbados', + 'Bari' => 'Bari', + 'Barletta-Andria-Trani' => 'Barletta-Andria-Trani', + 'Base URL of the shop (e.g. http://www.yourshopdomain.com)' => 'Base URL of the shop (e.g. http://www.yourshopdomain.com)', + 'Belarus' => 'Belarus', + 'Belarusian ruble' => 'Belarusian ruble', + 'Belgium' => 'Belgium', + 'Belize' => 'Belize', + 'Belluno' => 'Belluno', + 'Benevento' => 'Benevento', + 'Bengkulu' => 'Bengkulu', + 'Benin' => 'Benin', + 'Bergamo' => 'Bergamo', + 'Bhutan' => 'Bhutan', + 'Biella' => 'Biella', + 'Bielorussia' => 'Bielorussia', + 'Bolivia' => 'Bolivia', + 'Boliviano' => 'Boliviano', + 'Bologna' => 'Bologna', + 'Bolzano' => 'Bolzano', + 'Bolívar fuerte' => 'Bolívar fuerte', + 'Bosnia and Herzegovina' => 'Bosnia and Herzegovina', + 'Botswana' => 'Botswana', + 'Brand - Edit JavaScript' => 'Brand - Edit JavaScript', + 'Brand - JavaScript' => 'Brand - JavaScript', + 'Brand - Tab' => 'Brand - Tab', + 'Brand - content' => 'Brand - content', + 'Brand - create form' => 'Brand - create form', + 'Brand - delete form' => 'Brand - delete form', + 'Brand edit - bottom' => 'Brand edit - bottom', + 'Brand edit - right column bottom' => 'Brand edit - right column bottom', + 'Brand edit - right column top' => 'Brand edit - right column top', + 'Brand edit - top' => 'Brand edit - top', + 'Brand edit page - in the form' => 'Brand edit page - in the form', + 'Brands - at the top' => 'Brands - at the top', + 'Brands - bottom' => 'Brands - bottom', + 'Brands - table header' => 'Brands - table header', + 'Brands - table row' => 'Brands - table row', + 'Brands management' => 'Brands management', + 'Brands page - CSS stylesheet' => 'Brands page - CSS stylesheet', + 'Brands page - after javascript include' => 'Brands page - after javascript include', + 'Brands page - after the main content area' => 'Brands page - after the main content area', + 'Brands page - at the bottom' => 'Brands page - at the bottom', + 'Brands page - at the bottom of the main area' => 'Brands page - at the bottom of the main area', + 'Brands page - at the bottom of the sidebar' => 'Brands page - at the bottom of the sidebar', + 'Brands page - at the top' => 'Brands page - at the top', + 'Brands page - at the top of the main area' => 'Brands page - at the top of the main area', + 'Brands page - at the top of the sidebar' => 'Brands page - at the top of the sidebar', + 'Brands page - before the main content area' => 'Brands page - before the main content area', + 'Brands page - javascript initialization' => 'Brands page - javascript initialization', + 'Brands page - the body of the sidebar' => 'Brands page - the body of the sidebar', + 'Brazil' => 'Brazil', + 'Brescia' => 'Brescia', + 'Brindisi' => 'Brindisi', + 'British Columbia' => 'British Columbia', + 'Brunei' => 'Brunei', + 'Buenos Aires' => 'Buenos Aires', + 'Bulgaria' => 'Bulgaria', + 'Burkina' => 'Burkina', + 'Burma' => 'Burma', + 'Burundi' => 'Burundi', + 'Cagliari' => 'Cagliari', + 'California' => 'California', + 'Caltanissetta' => 'Caltanissetta', + 'Cambodia' => 'Cambodia', + 'Cameroon' => 'Cameroon', + 'Campeche' => 'Campeche', + 'Campobasso' => 'Campobasso', + 'Canada' => 'Canada', + 'Canceled' => 'Canceled', + 'Cape Verde' => 'Cape Verde', + 'Carbonia-Iglesias' => 'Carbonia-Iglesias', + 'Cart - CSS stylesheet' => 'Cart - CSS stylesheet', + 'Cart - after javascript include' => 'Cart - after javascript include', + 'Cart - at the bottom' => 'Cart - at the bottom', + 'Cart - at the top' => 'Cart - at the top', + 'Cart - javascript initialization' => 'Cart - javascript initialization', + 'Cart block' => 'Cart block', + 'Caserta' => 'Caserta', + 'Catamarca' => 'Catamarca', + 'Catania' => 'Catania', + 'Catanzaro' => 'Catanzaro', + 'Categories - JavaScript' => 'Categories - JavaScript', + 'Categories - at the bottom of the catalog' => 'Categories - at the bottom of the catalog', + 'Categories - at the top' => 'Categories - at the top', + 'Categories - bottom' => 'Categories - bottom', + 'Categories - caption' => 'Categories - caption', + 'Categories - header' => 'Categories - header', + 'Categories - row' => 'Categories - row', + 'Category' => 'Category', + 'Category - Edit JavaScript' => 'Category - Edit JavaScript', + 'Category - Tab' => 'Category - Tab', + 'Category - content' => 'Category - content', + 'Category - contents table header' => 'Category - contents table header', + 'Category - contents table row' => 'Category - contents table row', + 'Category - create form' => 'Category - create form', + 'Category - delete form' => 'Category - delete form', + 'Category configuration' => 'Category configuration', + 'Category edit - bottom' => 'Category edit - bottom', + 'Category edit - right column bottom' => 'Category edit - right column bottom', + 'Category edit - right column top' => 'Category edit - right column top', + 'Category edit - top' => 'Category edit - top', + 'Category page - CSS stylesheet' => 'Category page - CSS stylesheet', + 'Category page - after javascript include' => 'Category page - after javascript include', + 'Category page - after javascript initialisation' => 'Category page - after javascript initialisation', + 'Category page - after the main content area' => 'Category page - after the main content area', + 'Category page - at the bottom' => 'Category page - at the bottom', + 'Category page - at the bottom of the main area' => 'Category page - at the bottom of the main area', + 'Category page - at the bottom of the sidebar' => 'Category page - at the bottom of the sidebar', + 'Category page - at the top' => 'Category page - at the top', + 'Category page - at the top of the main area' => 'Category page - at the top of the main area', + 'Category page - at the top of the sidebar' => 'Category page - at the top of the sidebar', + 'Category page - before the main content area' => 'Category page - before the main content area', + 'Category page - the body of the sidebar' => 'Category page - the body of the sidebar', + 'Central African Republic' => 'Central African Republic', + 'Central Java' => 'Central Java', + 'Central Kalimantan' => 'Central Kalimantan', + 'Central Sulawesi' => 'Central Sulawesi', + 'Chaco' => 'Chaco', + 'Chad' => 'Chad', + 'Change password - CSS stylesheet' => 'Change password - CSS stylesheet', + 'Change password - after javascript include' => 'Change password - after javascript include', + 'Change password - after javascript initialisation' => 'Change password - after javascript initialisation', + 'Change password - at the bottom' => 'Change password - at the bottom', + 'Change password - at the top' => 'Change password - at the top', + 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity' => 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity', + 'Check if a virtual product delivery module is enabled if at least one product is virtual' => 'Check if a virtual product delivery module is enabled if at least one product is virtual', + 'Chiapas' => 'Chiapas', + 'Chiba' => 'Chiba', + 'Chieti' => 'Chieti', + 'Chihuahua' => 'Chihuahua', + 'Chile' => 'Chile', + 'China' => 'China', + 'Chubut' => 'Chubut', + 'Ciudad de Buenos Aires' => 'Ciudad de Buenos Aires', + 'Client edit - bottom' => 'Client edit - bottom', + 'Client edit - top' => 'Client edit - top', + 'Coahuila' => 'Coahuila', + 'Coat of arms of East Java' => 'Coat of arms of East Java', + 'Colima' => 'Colima', + 'Colombia' => 'Colombia', + 'Colorado' => 'Colorado', + 'Colón' => 'Colón', + 'Como' => 'Como', + 'Comoros' => 'Comoros', + 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)' => 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)', + 'Configuration' => 'Configuration', + 'Configuration - JavaScript' => 'Configuration - JavaScript', + 'Configuration - at the bottom of the catalog' => 'Configuration - at the bottom of the catalog', + 'Configuration - at the bottom of the shipping area' => 'Configuration - at the bottom of the shipping area', + 'Configuration - at the bottom of the system area' => 'Configuration - at the bottom of the system area', + 'Configuration - at the top' => 'Configuration - at the top', + 'Configuration - at the top of the catalog area' => 'Configuration - at the top of the catalog area', + 'Configuration - at the top of the shipping area' => 'Configuration - at the top of the shipping area', + 'Configuration - at the top of the system area' => 'Configuration - at the top of the system area', + 'Configuration - bottom' => 'Configuration - bottom', + 'Configuration / Administrator' => 'Configuration / Administrator', + 'Configuration / Area' => 'Configuration / Area', + 'Configuration / Attribute' => 'Configuration / Attribute', + 'Configuration / Cache' => 'Configuration / Cache', + 'Configuration / Country' => 'Configuration / Country', + 'Configuration / Currency' => 'Configuration / Currency', + 'Configuration / Feature' => 'Configuration / Feature', + 'Configuration / Language' => 'Configuration / Language', + 'Configuration / Mailing-system' => 'Configuration / Mailing-system', + 'Configuration / Message' => 'Configuration / Message', + 'Configuration / Module' => 'Configuration / Module', + 'Configuration / Profile' => 'Configuration / Profile', + 'Configuration / Shipping-zone' => 'Configuration / Shipping-zone', + 'Configuration / System Log' => 'Configuration / System Log', + 'Configuration / Tax' => 'Configuration / Tax', + 'Configuration / Template' => 'Configuration / Template', + 'Configuration variables' => 'Configuration variables', + 'Congo' => 'Congo', + 'Connecticut' => 'Connecticut', + 'Contact block' => 'Contact block', + 'Contact page - CSS stylesheet' => 'Contact page - CSS stylesheet', + 'Contact page - after javascript include' => 'Contact page - after javascript include', + 'Contact page - after javascript initialisation' => 'Contact page - after javascript initialisation', + 'Contact page - at the bottom' => 'Contact page - at the bottom', + 'Contact page - at the bottom of the form' => 'Contact page - at the bottom of the form', + 'Contact page - at the top' => 'Contact page - at the top', + 'Contact page - at the top of the form' => 'Contact page - at the top of the form', + 'Contact page - if successful response' => 'Contact page - if successful response', + 'Content' => 'Content', + 'Content - Edit JavaScript' => 'Content - Edit JavaScript', + 'Content - Tab' => 'Content - Tab', + 'Content - content' => 'Content - content', + 'Content - create form' => 'Content - create form', + 'Content - delete form' => 'Content - delete form', + 'Content edit - bottom' => 'Content edit - bottom', + 'Content edit - right column bottom' => 'Content edit - right column bottom', + 'Content edit - right column top' => 'Content edit - right column top', + 'Content edit - top' => 'Content edit - top', + 'Content page - CSS stylesheet' => 'Content page - CSS stylesheet', + 'Content page - after javascript include' => 'Content page - after javascript include', + 'Content page - after javascript initialisation' => 'Content page - after javascript initialisation', + 'Content page - after the main content area' => 'Content page - after the main content area', + 'Content page - at the bottom' => 'Content page - at the bottom', + 'Content page - at the bottom of the main area' => 'Content page - at the bottom of the main area', + 'Content page - at the bottom of the sidebar' => 'Content page - at the bottom of the sidebar', + 'Content page - at the top' => 'Content page - at the top', + 'Content page - at the top of the main area' => 'Content page - at the top of the main area', + 'Content page - at the top of the sidebar' => 'Content page - at the top of the sidebar', + 'Content page - before the main content area' => 'Content page - before the main content area', + 'Content page - the body of the sidebar' => 'Content page - the body of the sidebar', + 'Contents - caption' => 'Contents - caption', + 'Contents - header' => 'Contents - header', + 'Contents - row' => 'Contents - row', + 'Cook Islands' => 'Cook Islands', + 'Corrientes' => 'Corrientes', + 'Cosenza' => 'Cosenza', + 'Costa Rica' => 'Costa Rica', + 'Countries - JavaScript' => 'Countries - JavaScript', + 'Countries - at the top' => 'Countries - at the top', + 'Countries - bottom' => 'Countries - bottom', + 'Countries - table header' => 'Countries - table header', + 'Countries - table row' => 'Countries - table row', + 'Country - Edit JavaScript' => 'Country - Edit JavaScript', + 'Country - create form' => 'Country - create form', + 'Country - delete form' => 'Country - delete form', + 'Country edit - bottom' => 'Country edit - bottom', + 'Country edit - top' => 'Country edit - top', + 'Coupon' => 'Coupon', + 'Coupon - at the top' => 'Coupon - at the top', + 'Coupon - bottom' => 'Coupon - bottom', + 'Coupon - create JavaScript' => 'Coupon - create JavaScript', + 'Coupon - list JavaScript' => 'Coupon - list JavaScript', + 'Coupon - list caption' => 'Coupon - list caption', + 'Coupon - table header' => 'Coupon - table header', + 'Coupon - table row' => 'Coupon - table row', + 'Coupon - update JavaScript' => 'Coupon - update JavaScript', + 'Coupon page - in deletion form' => 'Coupon page - in deletion form', + 'Cremona' => 'Cremona', + 'Croatia' => 'Croatia', + 'Croatian Kuna' => 'Croatian Kuna', + 'Crotone' => 'Crotone', + 'Cuba' => 'Cuba', + 'Cuneo' => 'Cuneo', + 'Curency selection page - CSS stylesheet' => 'Curency selection page - CSS stylesheet', + 'Curency selection page - after javascript include' => 'Curency selection page - after javascript include', + 'Curency selection page - after javascript initialisation' => 'Curency selection page - after javascript initialisation', + 'Curency selection page - at the bottom' => 'Curency selection page - at the bottom', + 'Curency selection page - at the top' => 'Curency selection page - at the top', + 'Currencies - JavaScript' => 'Currencies - JavaScript', + 'Currencies - at the top' => 'Currencies - at the top', + 'Currencies - bottom' => 'Currencies - bottom', + 'Currencies - table header' => 'Currencies - table header', + 'Currencies - table row' => 'Currencies - table row', + 'Currency - Edit JavaScript' => 'Currency - Edit JavaScript', + 'Currency - create form' => 'Currency - create form', + 'Currency - delete form' => 'Currency - delete form', + 'Currency block' => 'Currency block', + 'Currency edit - bottom' => 'Currency edit - bottom', + 'Currency edit - top' => 'Currency edit - top', + 'Customer' => 'Customer', + 'Customer - Edit' => 'Customer - Edit', + 'Customer - Edit JavaScript' => 'Customer - Edit JavaScript', + 'Customer - address create form' => 'Customer - address create form', + 'Customer - address delete form' => 'Customer - address delete form', + 'Customer - address update form' => 'Customer - address update form', + 'Customer - at the top' => 'Customer - at the top', + 'Customer - bottom' => 'Customer - bottom', + 'Customer - create form' => 'Customer - create form', + 'Customer - delete form' => 'Customer - delete form', + 'Customer - order table header' => 'Customer - order table header', + 'Customer - order table row' => 'Customer - order table row', + 'Customer account - additional information' => 'Customer account - additional information', + 'Customer account block' => 'Customer account block', + 'Customer title' => 'Customer title', + 'Customers - JavaScript' => 'Customers - JavaScript', + 'Customers - caption' => 'Customers - caption', + 'Customers - header' => 'Customers - header', + 'Customers - row' => 'Customers - row', + 'Cyprus' => 'Cyprus', + 'Czech Republic' => 'Czech Republic', + 'Czech koruna' => 'Czech koruna', + 'Córdoba' => 'Córdoba', + 'Danish krone' => 'Danish krone', + 'Dashboard - at the top' => 'Dashboard - at the top', + 'Dashboard - bottom' => 'Dashboard - bottom', + 'Dashboard - middle' => 'Dashboard - middle', + 'Data import / export' => 'Data import / export', + 'Default available stock when check-available-stock is set to 0.' => 'Default available stock when check-available-stock is set to 0.', + 'Default lang without translation' => 'Default lang without translation', + 'Delaware' => 'Delaware', + 'Delivery - After delivery module' => 'Delivery - After delivery module', + 'Delivery - CSS' => 'Delivery - CSS', + 'Delivery - additional product information' => 'Delivery - additional product information', + 'Delivery - after addresse area' => 'Delivery - after addresse area', + 'Delivery - after the information area' => 'Delivery - after the information area', + 'Delivery - after the order summary' => 'Delivery - after the order summary', + 'Delivery - at the bottom of information area' => 'Delivery - at the bottom of information area', + 'Delivery - at the bottom of the footer' => 'Delivery - at the bottom of the footer', + 'Delivery - at the top of the footer' => 'Delivery - at the top of the footer', + 'Delivery - delivery address' => 'Delivery - delivery address', + 'Delivery - imprint' => 'Delivery - imprint', + 'Delivery - in the header' => 'Delivery - in the header', + 'Delivery choice - CSS stylesheet' => 'Delivery choice - CSS stylesheet', + 'Delivery choice - after javascript include' => 'Delivery choice - after javascript include', + 'Delivery choice - after javascript initialisation' => 'Delivery choice - after javascript initialisation', + 'Delivery choice - at the bottom' => 'Delivery choice - at the bottom', + 'Delivery choice - at the bottom of the form' => 'Delivery choice - at the bottom of the form', + 'Delivery choice - at the top' => 'Delivery choice - at the top', + 'Delivery choice - at the top of the form' => 'Delivery choice - at the top of the form', + 'Delivery choice - extra area' => 'Delivery choice - extra area', + 'Delivery choice - javascript' => 'Delivery choice - javascript', + 'Delivery zone - Edit JavaScript' => 'Delivery zone - Edit JavaScript', + 'Delivery zone - JavaScript' => 'Delivery zone - JavaScript', + 'Delivery zone - at the top' => 'Delivery zone - at the top', + 'Delivery zone - bottom' => 'Delivery zone - bottom', + 'Delivery zone - table header' => 'Delivery zone - table header', + 'Delivery zone - table row' => 'Delivery zone - table row', + 'Denmark' => 'Denmark', + 'Dinar' => 'Dinar', + 'Display and process prices with (0) or without (1) taxes.' => 'Display and process prices with (0) or without (1) taxes.', + 'Displays the default blocks on the homepage of the administration' => 'Displays the default blocks on the homepage of the administration', + 'District of Columbia' => 'District of Columbia', + 'Distrito Federal' => 'Distrito Federal', + 'Djibouti' => 'Djibouti', + 'Document - Edit JavaScript' => 'Document - Edit JavaScript', + 'Document edit - bottom' => 'Document edit - bottom', + 'Document edit - top' => 'Document edit - top', + 'Dollar' => 'Dollar', + 'Dollar (CAD)' => 'Dollar (CAD)', + 'Dominica' => 'Dominica', + 'Dominican Republic' => 'Dominican Republic', + 'Durango' => 'Durango', + 'East Nusa Tenggara' => 'East Nusa Tenggara', + 'East kalimantan' => 'East kalimantan', + 'Ecuador' => 'Ecuador', + 'Egypt' => 'Egypt', + 'Ehime' => 'Ehime', + 'El Salvador' => 'El Salvador', + 'Email html - layout - CSS' => 'Email html - layout - CSS', + 'Email html - layout - footer' => 'Email html - layout - footer', + 'Email html - order confirmation - after address' => 'Email html - order confirmation - after address', + 'Email html - order confirmation - after products' => 'Email html - order confirmation - after products', + 'Email html - order confirmation - before address' => 'Email html - order confirmation - before address', + 'Email html - order confirmation - before products' => 'Email html - order confirmation - before products', + 'Email html - order confirmation - delivery address' => 'Email html - order confirmation - delivery address', + 'Email html - order confirmation - footer' => 'Email html - order confirmation - footer', + 'Email html - order confirmation - order product' => 'Email html - order confirmation - order product', + 'Email html - order notification - after address' => 'Email html - order notification - after address', + 'Email html - order notification - after products' => 'Email html - order notification - after products', + 'Email html - order notification - before address' => 'Email html - order notification - before address', + 'Email html - order notification - before products' => 'Email html - order notification - before products', + 'Email html - order notification - delivery address' => 'Email html - order notification - delivery address', + 'Email html - order notification - order product' => 'Email html - order notification - order product', + 'Email txt - order confirmation - after address' => 'Email txt - order confirmation - after address', + 'Email txt - order confirmation - after products' => 'Email txt - order confirmation - after products', + 'Email txt - order confirmation - before address' => 'Email txt - order confirmation - before address', + 'Email txt - order confirmation - before products' => 'Email txt - order confirmation - before products', + 'Email txt - order confirmation - delivery address' => 'Email txt - order confirmation - delivery address', + 'Email txt - order confirmation - order product' => 'Email txt - order confirmation - order product', + 'Email txt - order notification - after address' => 'Email txt - order notification - after address', + 'Email txt - order notification - after products' => 'Email txt - order notification - after products', + 'Email txt - order notification - before address' => 'Email txt - order notification - before address', + 'Email txt - order notification - before products' => 'Email txt - order notification - before products', + 'Email txt - order notification - delivery address' => 'Email txt - order notification - delivery address', + 'Email txt - order notification - order product' => 'Email txt - order notification - order product', + 'Enable (1) or disable (0) URL rewriting' => 'Enable (1) or disable (0) URL rewriting', + 'Enna' => 'Enna', + 'Entre Ríos' => 'Entre Ríos', + 'Equatorial Guinea' => 'Equatorial Guinea', + 'Eritrea' => 'Eritrea', + 'Estado de México' => 'Estado de México', + 'Estonia' => 'Estonia', + 'Ethiopia' => 'Ethiopia', + 'Euro' => 'Euro', + 'Export - JavaScript' => 'Export - JavaScript', + 'Export - table header' => 'Export - table header', + 'Export - table row' => 'Export - table row', + 'Export modal or page - bottom' => 'Export modal or page - bottom', + 'Export modal or page - top' => 'Export modal or page - top', + 'Exports - JavaScript' => 'Exports - JavaScript', + 'Exports - at the bottom of a category' => 'Exports - at the bottom of a category', + 'Exports - at the bottom of column 1' => 'Exports - at the bottom of column 1', + 'Exports - at the top' => 'Exports - at the top', + 'Feature - Edit JavaScript' => 'Feature - Edit JavaScript', + 'Feature - Value create form' => 'Feature - Value create form', + 'Feature - add to all form' => 'Feature - add to all form', + 'Feature - create form' => 'Feature - create form', + 'Feature - delete form' => 'Feature - delete form', + 'Feature - remove to all form' => 'Feature - remove to all form', + 'Feature edit - bottom' => 'Feature edit - bottom', + 'Feature edit - top' => 'Feature edit - top', + 'Features - JavaScript' => 'Features - JavaScript', + 'Features - at the top' => 'Features - at the top', + 'Features - bottom' => 'Features - bottom', + 'Features - table header' => 'Features - table header', + 'Features - table row' => 'Features - table row', + 'Features value - table header' => 'Features value - table header', + 'Features value - table row' => 'Features value - table row', + 'Fermo' => 'Fermo', + 'Ferrara' => 'Ferrara', + 'Fiji' => 'Fiji', + 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)' => 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)', + 'Filename of the error page' => 'Filename of the error page', + 'Finland' => 'Finland', + 'Firenze' => 'Firenze', + 'Florida' => 'Florida', + 'Foggia' => 'Foggia', + 'Folder' => 'Folder', + 'Folder - Edit JavaScript' => 'Folder - Edit JavaScript', + 'Folder - JavaScript' => 'Folder - JavaScript', + 'Folder - Tab' => 'Folder - Tab', + 'Folder - at the top' => 'Folder - at the top', + 'Folder - bottom' => 'Folder - bottom', + 'Folder - caption' => 'Folder - caption', + 'Folder - content' => 'Folder - content', + 'Folder - create form' => 'Folder - create form', + 'Folder - delete form' => 'Folder - delete form', + 'Folder - header' => 'Folder - header', + 'Folder - row' => 'Folder - row', + 'Folder edit - bottom' => 'Folder edit - bottom', + 'Folder edit - right column bottom' => 'Folder edit - right column bottom', + 'Folder edit - right column top' => 'Folder edit - right column top', + 'Folder edit - top' => 'Folder edit - top', + 'Folder page - CSS stylesheet' => 'Folder page - CSS stylesheet', + 'Folder page - after javascript include' => 'Folder page - after javascript include', + 'Folder page - after javascript initialisation' => 'Folder page - after javascript initialisation', + 'Folder page - after the main content area' => 'Folder page - after the main content area', + 'Folder page - at the bottom' => 'Folder page - at the bottom', + 'Folder page - at the bottom of the main area' => 'Folder page - at the bottom of the main area', + 'Folder page - at the top' => 'Folder page - at the top', + 'Folder page - at the top of the main area' => 'Folder page - at the top of the main area', + 'Folder page - before the main content area' => 'Folder page - before the main content area', + 'Forint' => 'Forint', + 'Forlì-Cesena' => 'Forlì-Cesena', + 'Formosa' => 'Formosa', + 'Franc' => 'Franc', + 'France metropolitan' => 'France metropolitan', + 'French 10% VAT' => 'French 10% VAT', + 'French 20% VAT' => 'French 20% VAT', + 'French Southern Territories' => 'French Southern Territories', + 'Front office integration' => 'Front office integration', + 'Frosinone' => 'Frosinone', + 'Fukui' => 'Fukui', + 'Fukuoka' => 'Fukuoka', + 'Fukushima' => 'Fukushima', + 'Gabon' => 'Gabon', + 'Gambia' => 'Gambia', + 'Genova' => 'Genova', + 'Georgia' => 'Georgia', + 'Germany' => 'Germany', + 'Ghana' => 'Ghana', + 'Gifu' => 'Gifu', + 'Google Analytics block' => 'Google Analytics block', + 'Gorizia' => 'Gorizia', + 'Greece' => 'Greece', + 'Grenada' => 'Grenada', + 'Grosseto' => 'Grosseto', + 'Guadeloupe' => 'Guadeloupe', + 'Guanajuato' => 'Guanajuato', + 'Guaraní' => 'Guaraní', + 'Guatemala' => 'Guatemala', + 'Guerrero' => 'Guerrero', + 'Guinea' => 'Guinea', + 'Guinea-Bissau' => 'Guinea-Bissau', + 'Gunma' => 'Gunma', + 'Guyana' => 'Guyana', + 'Guyane Française' => 'Guyane Française', + 'HTML layout - CSS stylesheet' => 'HTML layout - CSS stylesheet', + 'HTML layout - after javascript include' => 'HTML layout - after javascript include', + 'HTML layout - after the main content area' => 'HTML layout - after the main content area', + 'HTML layout - after the opening of the body tag' => 'HTML layout - after the opening of the body tag', + 'HTML layout - after the opening of the head tag' => 'HTML layout - after the opening of the head tag', + 'HTML layout - at the bottom of the header' => 'HTML layout - at the bottom of the header', + 'HTML layout - at the top of the footer' => 'HTML layout - at the top of the footer', + 'HTML layout - at the top of the header' => 'HTML layout - at the top of the header', + 'HTML layout - before the end body tag' => 'HTML layout - before the end body tag', + 'HTML layout - before the end of the head tag' => 'HTML layout - before the end of the head tag', + 'HTML layout - before the main content area' => 'HTML layout - before the main content area', + 'HTML layout - bottom of the footer' => 'HTML layout - bottom of the footer', + 'HTML layout - footer body' => 'HTML layout - footer body', + 'HTML layout - javascript initialization' => 'HTML layout - javascript initialization', + 'HTML layout - primary navigation' => 'HTML layout - primary navigation', + 'HTML layout - secondary navigation' => 'HTML layout - secondary navigation', + 'Haiti' => 'Haiti', + 'Hawaii' => 'Hawaii', + 'Hidalgo' => 'Hidalgo', + 'Hiroshima' => 'Hiroshima', + 'Hokkaido' => 'Hokkaido', + 'Home - JavaScript' => 'Home - JavaScript', + 'Home - at the top' => 'Home - at the top', + 'Home - block' => 'Home - block', + 'Home - bottom' => 'Home - bottom', + 'Home page - CSS stylesheet' => 'Home page - CSS stylesheet', + 'Home page - after javascript include' => 'Home page - after javascript include', + 'Home page - after javascript initialisation' => 'Home page - after javascript initialisation', + 'Home page - main area' => 'Home page - main area', + 'Honduras' => 'Honduras', + 'Hong Kong' => 'Hong Kong', + 'Hong Kong Dollar' => 'Hong Kong Dollar', + 'Hook - Edit JavaScript' => 'Hook - Edit JavaScript', + 'Hook - create form' => 'Hook - create form', + 'Hook - delete form' => 'Hook - delete form', + 'Hook edit - bottom' => 'Hook edit - bottom', + 'Hook edit - top' => 'Hook edit - top', + 'Hook positions' => 'Hook positions', + 'Hooks' => 'Hooks', + 'Hooks - JavaScript' => 'Hooks - JavaScript', + 'Hooks - at the top' => 'Hooks - at the top', + 'Hooks - bottom' => 'Hooks - bottom', + 'Hooks - table header' => 'Hooks - table header', + 'Hooks - table row' => 'Hooks - table row', + 'Hooks management' => 'Hooks management', + 'How document files are delivered in the web space (symlink or copy)' => 'How document files are delivered in the web space (symlink or copy)', + 'How original (full resolution) images are delivered in the web space (symlink or copy)' => 'How original (full resolution) images are delivered in the web space (symlink or copy)', + 'Hungary' => 'Hungary', + 'Hyogo' => 'Hyogo', + 'Ibaraki' => 'Ibaraki', + 'Iceland' => 'Iceland', + 'Idaho' => 'Idaho', + 'Illinois' => 'Illinois', + 'Image - Edit JavaScript' => 'Image - Edit JavaScript', + 'Image edit - bottom' => 'Image edit - bottom', + 'Image edit - top' => 'Image edit - top', + 'Imperia' => 'Imperia', + 'Import - table header' => 'Import - table header', + 'Import - table row' => 'Import - table row', + 'India' => 'India', + 'Indian Rupee' => 'Indian Rupee', + 'Indiana' => 'Indiana', + 'Indonesia' => 'Indonesia', + 'Invoice - After delivery module' => 'Invoice - After delivery module', + 'Invoice - After payment module' => 'Invoice - After payment module', + 'Invoice - CSS' => 'Invoice - CSS', + 'Invoice - additional product information' => 'Invoice - additional product information', + 'Invoice - after addresse area' => 'Invoice - after addresse area', + 'Invoice - after product listing' => 'Invoice - after product listing', + 'Invoice - after the information area' => 'Invoice - after the information area', + 'Invoice - after the order summary' => 'Invoice - after the order summary', + 'Invoice - at the bottom of information area' => 'Invoice - at the bottom of information area', + 'Invoice - at the bottom of the footer' => 'Invoice - at the bottom of the footer', + 'Invoice - at the top of the footer' => 'Invoice - at the top of the footer', + 'Invoice - delivery address' => 'Invoice - delivery address', + 'Invoice - imprint' => 'Invoice - imprint', + 'Invoice - in the header' => 'Invoice - in the header', + 'Invoice choice - CSS stylesheet' => 'Invoice choice - CSS stylesheet', + 'Invoice choice - after javascript include' => 'Invoice choice - after javascript include', + 'Invoice choice - after javascript initialisation' => 'Invoice choice - after javascript initialisation', + 'Invoice choice - at the bottom' => 'Invoice choice - at the bottom', + 'Invoice choice - at the top' => 'Invoice choice - at the top', + 'Invoice choice - delivery address' => 'Invoice choice - delivery address', + 'Invoice choice - extra payment zone' => 'Invoice choice - extra payment zone', + 'Iowa' => 'Iowa', + 'Iran' => 'Iran', + 'Iraq' => 'Iraq', + 'Ireland' => 'Ireland', + 'Isernia' => 'Isernia', + 'Ishikawa' => 'Ishikawa', + 'Israel' => 'Israel', + 'Italy' => 'Italy', + 'Ivory Coast' => 'Ivory Coast', + 'Iwate' => 'Iwate', + 'Jakarta' => 'Jakarta', + 'Jalisco' => 'Jalisco', + 'Jamaica' => 'Jamaica', + 'Jambi' => 'Jambi', + 'Japan' => 'Japan', + 'Jordan' => 'Jordan', + 'Jujuy' => 'Jujuy', + 'Kagawa' => 'Kagawa', + 'Kagoshima' => 'Kagoshima', + 'Kanagawa' => 'Kanagawa', + 'Kansas' => 'Kansas', + 'Kazakhstan' => 'Kazakhstan', + 'Kentucky' => 'Kentucky', + 'Kenya' => 'Kenya', + 'Kenyan shilling' => 'Kenyan shilling', + 'Kiribati' => 'Kiribati', + 'Kochi' => 'Kochi', + 'Krona' => 'Krona', + 'Krone' => 'Krone', + 'Kumamoto' => 'Kumamoto', + 'Kuwait' => 'Kuwait', + 'Kyoto' => 'Kyoto', + 'Kyrgyzstan' => 'Kyrgyzstan', + 'L\'Aquila' => 'L\'Aquila', + 'La Pampa' => 'La Pampa', + 'La Rioja' => 'La Rioja', + 'La Spezia' => 'La Spezia', + 'Lambang Provinsi Papua Barat' => 'Lambang Provinsi Papua Barat', + 'Lambang Riau' => 'Lambang Riau', + 'Lambang propinsi' => 'Lambang propinsi', + 'Lampung' => 'Lampung', + 'Language - create form' => 'Language - create form', + 'Languages - JavaScript' => 'Languages - JavaScript', + 'Languages - at the top' => 'Languages - at the top', + 'Languages - bottom' => 'Languages - bottom', + 'Languages - delete form' => 'Languages - delete form', + 'Languages block' => 'Languages block', + 'Laos' => 'Laos', + 'Lari' => 'Lari', + 'Latina' => 'Latina', + 'Latvia' => 'Latvia', + 'Layout - Before the main content' => 'Layout - Before the main content', + 'Layout - CSS' => 'Layout - CSS', + 'Layout - JavaScript' => 'Layout - JavaScript', + 'Layout - after footer' => 'Layout - after footer', + 'Layout - after top bar' => 'Layout - after top bar', + 'Layout - after top menu' => 'Layout - after top menu', + 'Layout - at the bottom of the top bar' => 'Layout - at the bottom of the top bar', + 'Layout - at the top of the top bar' => 'Layout - at the top of the top bar', + 'Layout - before footer' => 'Layout - before footer', + 'Layout - before top menu' => 'Layout - before top menu', + 'Layout - before topbar' => 'Layout - before topbar', + 'Layout - in footer' => 'Layout - in footer', + 'Layout - in the menu catalog' => 'Layout - in the menu catalog', + 'Layout - in the menu configuration' => 'Layout - in the menu configuration', + 'Layout - in the menu customers' => 'Layout - in the menu customers', + 'Layout - in the menu folders' => 'Layout - in the menu folders', + 'Layout - in the menu modules' => 'Layout - in the menu modules', + 'Layout - in the menu orders' => 'Layout - in the menu orders', + 'Layout - in the menu tools' => 'Layout - in the menu tools', + 'Layout - in top menu items' => 'Layout - in top menu items', + 'Layout - inside top bar' => 'Layout - inside top bar', + 'Leave the default configuration of session' => 'Leave the default configuration of session', + 'Lebanon' => 'Lebanon', + 'Lecce' => 'Lecce', + 'Lecco' => 'Lecco', + 'Lei' => 'Lei', + 'Lesotho' => 'Lesotho', + 'Lev' => 'Lev', + 'Liberia' => 'Liberia', + 'Libya' => 'Libya', + 'Liechtenstein' => 'Liechtenstein', + 'Life time of the cart cookie in the customer browser, in seconds' => 'Life time of the cart cookie in the customer browser, in seconds', + 'Life time of the session cookie in the customer browser, in seconds' => 'Life time of the session cookie in the customer browser, in seconds', + 'Links block' => 'Links block', + 'Lira' => 'Lira', + 'Lithuania' => 'Lithuania', + 'Livorno' => 'Livorno', + 'Lodi' => 'Lodi', + 'Logging system configuration' => 'Logging system configuration', + 'Login page - CSS stylesheet' => 'Login page - CSS stylesheet', + 'Login page - after javascript include' => 'Login page - after javascript include', + 'Login page - after javascript initialisation' => 'Login page - after javascript initialisation', + 'Login page - at the bottom' => 'Login page - at the bottom', + 'Login page - at the bottom of the form' => 'Login page - at the bottom of the form', + 'Login page - at the bottom of the main area' => 'Login page - at the bottom of the main area', + 'Login page - at the top' => 'Login page - at the top', + 'Login page - at the top of the form' => 'Login page - at the top of the form', + 'Login page - at the top of the main area' => 'Login page - at the top of the main area', + 'Logs - JavaScript' => 'Logs - JavaScript', + 'Logs - at the top' => 'Logs - at the top', + 'Logs - bottom' => 'Logs - bottom', + 'Lost password - CSS stylesheet' => 'Lost password - CSS stylesheet', + 'Lost password - after javascript include' => 'Lost password - after javascript include', + 'Lost password - at the bottom' => 'Lost password - at the bottom', + 'Lost password - at the bottom of the form' => 'Lost password - at the bottom of the form', + 'Lost password - at the top' => 'Lost password - at the top', + 'Lost password - at the top of the form' => 'Lost password - at the top of the form', + 'Lost password - javascript initialization' => 'Lost password - javascript initialization', + 'Louisiana' => 'Louisiana', + 'Lucca' => 'Lucca', + 'Luxembourg' => 'Luxembourg', + 'Macedonia' => 'Macedonia', + 'Macerata' => 'Macerata', + 'Madagascar' => 'Madagascar', + 'Mail sent after a subscription to newsletter' => 'Mail sent after a subscription to newsletter', + 'Mail sent to an administrator who requested a new password' => 'Mail sent to an administrator who requested a new password', + 'Mail sent to the customer when its account is created by an administrator in the back-office' => 'Mail sent to the customer when its account is created by an administrator in the back-office', + 'Mail sent to the customer when its password or email is changed in the back-office' => 'Mail sent to the customer when its password or email is changed in the back-office', + 'Mailing system - JavaScript' => 'Mailing system - JavaScript', + 'Mailing system - at the top' => 'Mailing system - at the top', + 'Mailing system - bottom' => 'Mailing system - bottom', + 'Maine' => 'Maine', + 'Malawi' => 'Malawi', + 'Malaysia' => 'Malaysia', + 'Maldives' => 'Maldives', + 'Mali' => 'Mali', + 'Malta' => 'Malta', + 'Maluku' => 'Maluku', + 'Manat' => 'Manat', + 'Manitoba' => 'Manitoba', + 'Mantova' => 'Mantova', + 'Marshall Islands' => 'Marshall Islands', + 'Martinique' => 'Martinique', + 'Maryland' => 'Maryland', + 'Massa' => 'Massa', + 'Massachusetts' => 'Massachusetts', + 'Matera' => 'Matera', + 'Mauritania' => 'Mauritania', + 'Mauritius' => 'Mauritius', + 'Mayotte' => 'Mayotte', + 'Medio Campidano' => 'Medio Campidano', + 'Mendoza' => 'Mendoza', + 'Message - Edit JavaScript' => 'Message - Edit JavaScript', + 'Message - create form' => 'Message - create form', + 'Message - delete form' => 'Message - delete form', + 'Message edit - bottom' => 'Message edit - bottom', + 'Message edit - top' => 'Message edit - top', + 'Message sent to the shop owner when a new order is placed' => 'Message sent to the shop owner when a new order is placed', + 'Messages - JavaScript' => 'Messages - JavaScript', + 'Messages - at the top' => 'Messages - at the top', + 'Messages - bottom' => 'Messages - bottom', + 'Messages - table header' => 'Messages - table header', + 'Messages - table row' => 'Messages - table row', + 'Messina' => 'Messina', + 'Mexico' => 'Mexico', + 'Michigan' => 'Michigan', + 'Michoacán' => 'Michoacán', + 'Micronesia' => 'Micronesia', + 'Mie' => 'Mie', + 'Milano' => 'Milano', + 'Mini cart' => 'Mini cart', + 'Minnesota' => 'Minnesota', + 'Misiones' => 'Misiones', + 'Miss' => 'Miss', + 'Miss_short' => 'Miss_short', + 'Misses' => 'Misses', + 'Mississippi' => 'Mississippi', + 'Missouri' => 'Missouri', + 'Mister' => 'Mister', + 'Miyagi' => 'Miyagi', + 'Miyazaki' => 'Miyazaki', + 'Modena' => 'Modena', + 'Module - Edit JavaScript' => 'Module - Edit JavaScript', + 'Module - configuration' => 'Module - configuration', + 'Module - configuration JavaScript' => 'Module - configuration JavaScript', + 'Module edit - bottom' => 'Module edit - bottom', + 'Module edit - top' => 'Module edit - top', + 'Module hook - Edit JavaScript' => 'Module hook - Edit JavaScript', + 'Module hook - JavaScript' => 'Module hook - JavaScript', + 'Module hook - create form' => 'Module hook - create form', + 'Module hook - delete form' => 'Module hook - delete form', + 'Module hook edit - bottom' => 'Module hook edit - bottom', + 'Module hook edit - top' => 'Module hook edit - top', + 'Modules - JavaScript' => 'Modules - JavaScript', + 'Modules - at the top' => 'Modules - at the top', + 'Modules - bottom' => 'Modules - bottom', + 'Modules - table header' => 'Modules - table header', + 'Modules - table row' => 'Modules - table row', + 'Modules maagement' => 'Modules maagement', + 'Modules management' => 'Modules management', + 'Moldova' => 'Moldova', + 'Monaco' => 'Monaco', + 'Mongolia' => 'Mongolia', + 'Montana' => 'Montana', + 'Monza e della Brianza' => 'Monza e della Brianza', + 'Morelos' => 'Morelos', + 'Morocco' => 'Morocco', + 'Mozambique' => 'Mozambique', + 'Mr.' => 'Mr.', + 'Mrs' => 'Mrs', + 'Nagano' => 'Nagano', + 'Nagasaki' => 'Nagasaki', + 'Name of the active PDF template' => 'Name of the active PDF template', + 'Name of the active back-office template' => 'Name of the active back-office template', + 'Name of the active front-office template' => 'Name of the active front-office template', + 'Name of the active mailing template' => 'Name of the active mailing template', + 'Name of the cart cookie' => 'Name of the cart cookie', + 'Name of the delivery view in the current PDF template (without extension)' => 'Name of the delivery view in the current PDF template (without extension)', + 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)' => 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)', + 'Name of the invoice view in the current PDF template (without extension)' => 'Name of the invoice view in the current PDF template (without extension)', + 'Name of the template view returned when an obsolete (or inactive) product URL is invoked' => 'Name of the template view returned when an obsolete (or inactive) product URL is invoked', + 'Name the cart cookie' => 'Name the cart cookie', + 'Namibia' => 'Namibia', + 'Napoli' => 'Napoli', + 'Nara' => 'Nara', + 'Nauru' => 'Nauru', + 'Navigation block' => 'Navigation block', + 'Nayarit' => 'Nayarit', + 'Nebraska' => 'Nebraska', + 'Nepal' => 'Nepal', + 'Netherlands' => 'Netherlands', + 'Neuquén' => 'Neuquén', + 'Nevada' => 'Nevada', + 'New Brunswick' => 'New Brunswick', + 'New Hampshire' => 'New Hampshire', + 'New Jersey' => 'New Jersey', + 'New Mexico' => 'New Mexico', + 'New Products block' => 'New Products block', + 'New York' => 'New York', + 'New Zealand' => 'New Zealand', + 'New order {$order_ref} placed on {config key="store_name"}' => 'New order {$order_ref} placed on {config key="store_name"}', + 'New password request on {config key="store_name"}' => 'New password request on {config key="store_name"}', + 'Newfoundland and Labrador' => 'Newfoundland and Labrador', + 'Newsletter block' => 'Newsletter block', + 'Newsletter page - CSS stylesheet' => 'Newsletter page - CSS stylesheet', + 'Newsletter page - after javascript include' => 'Newsletter page - after javascript include', + 'Newsletter page - after javascript initialisation' => 'Newsletter page - after javascript initialisation', + 'Newsletter page - at the bottom' => 'Newsletter page - at the bottom', + 'Newsletter page - at the top' => 'Newsletter page - at the top', + 'Newsletter subscription confirmation mail' => 'Newsletter subscription confirmation mail', + 'Newsletter unsubscribe page - CSS stylesheet' => 'Newsletter unsubscribe page - CSS stylesheet', + 'Newsletter unsubscribe page - after javascript include' => 'Newsletter unsubscribe page - after javascript include', + 'Newsletter unsubscribe page - after javascript initialisation' => 'Newsletter unsubscribe page - after javascript initialisation', + 'Newsletter unsubscribe page - at the bottom' => 'Newsletter unsubscribe page - at the bottom', + 'Newsletter unsubscribe page - at the top' => 'Newsletter unsubscribe page - at the top', + 'Nicaragua' => 'Nicaragua', + 'Niger' => 'Niger', + 'Nigeria' => 'Nigeria', + 'Nigerian naira' => 'Nigerian naira', + 'Niigata' => 'Niigata', + 'Niue' => 'Niue', + 'North Carolina' => 'North Carolina', + 'North Dakota' => 'North Dakota', + 'North Korea' => 'North Korea', + 'North Maluku' => 'North Maluku', + 'North Sulawesi' => 'North Sulawesi', + 'North Sumatra' => 'North Sumatra', + 'Northwest Territories' => 'Northwest Territories', + 'Norway' => 'Norway', + 'Not paid' => 'Not paid', + 'Nouvelle-Calédonie' => 'Nouvelle-Calédonie', + 'Nova Scotia' => 'Nova Scotia', + 'Novara' => 'Novara', + 'Nuevo León' => 'Nuevo León', + 'Nuevo Sol' => 'Nuevo Sol', + 'Number by default of results per page for customer list' => 'Number by default of results per page for customer list', + 'Number by default of results per page for order list' => 'Number by default of results per page for order list', + 'Number by default of results per page for product list' => 'Number by default of results per page for product list', + 'Nunavut' => 'Nunavut', + 'Nuoro' => 'Nuoro', + 'Oaxaca' => 'Oaxaca', + 'Ogliastra' => 'Ogliastra', + 'Ohio' => 'Ohio', + 'Oita' => 'Oita', + 'Okayama' => 'Okayama', + 'Okinawa' => 'Okinawa', + 'Oklahoma' => 'Oklahoma', + 'Olbia-Tempio' => 'Olbia-Tempio', + 'Oman' => 'Oman', + 'Ontario' => 'Ontario', + 'Order' => 'Order', + 'Order - After closing product row' => 'Order - After closing product row', + 'Order - After product list' => 'Order - After product list', + 'Order - Before product list' => 'Order - Before product list', + 'Order - Before starting product row' => 'Order - Before starting product row', + 'Order - Edit JavaScript' => 'Order - Edit JavaScript', + 'Order - Tab' => 'Order - Tab', + 'Order - bill bottom' => 'Order - bill bottom', + 'Order - bill top' => 'Order - bill top', + 'Order - cart bottom' => 'Order - cart bottom', + 'Order - cart top' => 'Order - cart top', + 'Order - content' => 'Order - content', + 'Order - customer information bottom' => 'Order - customer information bottom', + 'Order - delivery module bottom' => 'Order - delivery module bottom', + 'Order - payment module bottom' => 'Order - payment module bottom', + 'Order - product list' => 'Order - product list', + 'Order - table header' => 'Order - table header', + 'Order - table row' => 'Order - table row', + 'Order confirmation - after the order summary' => 'Order confirmation - after the order summary', + 'Order confirmation sent to the customer' => 'Order confirmation sent to the customer', + 'Order details - CSS stylesheet' => 'Order details - CSS stylesheet', + 'Order details - additional delivery information' => 'Order details - additional delivery information', + 'Order details - additional information' => 'Order details - additional information', + 'Order details - additional invoice information' => 'Order details - additional invoice information', + 'Order details - additional product information' => 'Order details - additional product information', + 'Order details - after addresses' => 'Order details - after addresses', + 'Order details - after delivery address' => 'Order details - after delivery address', + 'Order details - after global information' => 'Order details - after global information', + 'Order details - after invoice address' => 'Order details - after invoice address', + 'Order details - after javascript include' => 'Order details - after javascript include', + 'Order details - after product' => 'Order details - after product', + 'Order details - after products' => 'Order details - after products', + 'Order details - after products list' => 'Order details - after products list', + 'Order details - at the bottom' => 'Order details - at the bottom', + 'Order details - at the top' => 'Order details - at the top', + 'Order details - before products list' => 'Order details - before products list', + 'Order details - delivery address' => 'Order details - delivery address', + 'Order details - invoice address' => 'Order details - invoice address', + 'Order details - javascript initialization' => 'Order details - javascript initialization', + 'Order edit - bottom' => 'Order edit - bottom', + 'Order edit - delivery address' => 'Order edit - delivery address', + 'Order edit - displayed after product information' => 'Order edit - displayed after product information', + 'Order edit - order product table header' => 'Order edit - order product table header', + 'Order edit - order product table row' => 'Order edit - order product table row', + 'Order edit - top' => 'Order edit - top', + 'Order failed - CSS stylesheet' => 'Order failed - CSS stylesheet', + 'Order failed - after javascript include' => 'Order failed - after javascript include', + 'Order failed - after javascript initialisation' => 'Order failed - after javascript initialisation', + 'Order failed - at the bottom' => 'Order failed - at the bottom', + 'Order failed - at the top' => 'Order failed - at the top', + 'Orders - JavaScript' => 'Orders - JavaScript', + 'Orders - at the top' => 'Orders - at the top', + 'Orders - bottom' => 'Orders - bottom', + 'Orders - table header' => 'Orders - table header', + 'Orders - table row' => 'Orders - table row', + 'Oregon' => 'Oregon', + 'Oristano' => 'Oristano', + 'Osaka' => 'Osaka', + 'Padova' => 'Padova', + 'Page 404 - CSS stylesheet' => 'Page 404 - CSS stylesheet', + 'Page 404 - after javascript include' => 'Page 404 - after javascript include', + 'Page 404 - after javascript initialisation' => 'Page 404 - after javascript initialisation', + 'Page 404 - content area' => 'Page 404 - content area', + 'Paid' => 'Paid', + 'Pakistan' => 'Pakistan', + 'Palermo' => 'Palermo', + 'Panama' => 'Panama', + 'Papua' => 'Papua', + 'Papua Nueva Guinea' => 'Papua Nueva Guinea', + 'Paraguay' => 'Paraguay', + 'Parma' => 'Parma', + 'Path to the directory where documents are stored' => 'Path to the directory where documents are stored', + 'Path to the directory where images are stored' => 'Path to the directory where images are stored', + 'Pavia' => 'Pavia', + 'Pay by cheque' => 'Pay by cheque', + 'Payment failed - CSS stylesheet' => 'Payment failed - CSS stylesheet', + 'Payment failed - after javascript include' => 'Payment failed - after javascript include', + 'Payment failed - javascript initialization' => 'Payment failed - javascript initialization', + 'Payment gateway - CSS stylesheet' => 'Payment gateway - CSS stylesheet', + 'Payment gateway - after javascript include' => 'Payment gateway - after javascript include', + 'Payment gateway - after javascript initialisation' => 'Payment gateway - after javascript initialisation', + 'Payment gateway - javascript' => 'Payment gateway - javascript', + 'Payment gateway - main area' => 'Payment gateway - main area', + 'Pennsylvania' => 'Pennsylvania', + 'Peru' => 'Peru', + 'Perugia' => 'Perugia', + 'Pesaro-Urbino' => 'Pesaro-Urbino', + 'Pescara' => 'Pescara', + 'Peso' => 'Peso', + 'Peso Argentino' => 'Peso Argentino', + 'Philippine Peso' => 'Philippine Peso', + 'Philippines' => 'Philippines', + 'Piacenza' => 'Piacenza', + 'Pisa' => 'Pisa', + 'Pistoia' => 'Pistoia', + 'Placed order - CSS stylesheet' => 'Placed order - CSS stylesheet', + 'Placed order - after javascript include' => 'Placed order - after javascript include', + 'Placed order - after javascript initialisation' => 'Placed order - after javascript initialisation', + 'Placed order - main area' => 'Placed order - main area', + 'Poland' => 'Poland', + 'Polynésie française' => 'Polynésie française', + 'Pordenone' => 'Pordenone', + 'Portugal' => 'Portugal', + 'Potenza' => 'Potenza', + 'Pound' => 'Pound', + 'Prato' => 'Prato', + 'Prince Edward Island' => 'Prince Edward Island', + 'Processing' => 'Processing', + 'Product' => 'Product', + 'Product - Edit JavaScript' => 'Product - Edit JavaScript', + 'Product - Tab' => 'Product - Tab', + 'Product - accessories table header' => 'Product - accessories table header', + 'Product - accessories table row' => 'Product - accessories table row', + 'Product - after combinations' => 'Product - after combinations', + 'Product - at the bottom of a product combination' => 'Product - at the bottom of a product combination', + 'Product - attributes table header' => 'Product - attributes table header', + 'Product - attributes table row' => 'Product - attributes table row', + 'Product - before combinations' => 'Product - before combinations', + 'Product - categories table header' => 'Product - categories table header', + 'Product - categories table row' => 'Product - categories table row', + 'Product - combination delete form' => 'Product - combination delete form', + 'Product - combinations list caption' => 'Product - combinations list caption', + 'Product - content' => 'Product - content', + 'Product - contents table header' => 'Product - contents table header', + 'Product - contents table row' => 'Product - contents table row', + 'Product - create form' => 'Product - create form', + 'Product - delete form' => 'Product - delete form', + 'Product - details pricing form' => 'Product - details pricing form', + 'Product - details promotion form' => 'Product - details promotion form', + 'Product - features table row' => 'Product - features table row', + 'Product - features-table-header' => 'Product - features-table-header', + 'Product - folders table header' => 'Product - folders table header', + 'Product - folders table row' => 'Product - folders table row', + 'Product - stock edit form' => 'Product - stock edit form', + 'Product edit - bottom' => 'Product edit - bottom', + 'Product edit - right column bottom' => 'Product edit - right column bottom', + 'Product edit - right column top' => 'Product edit - right column top', + 'Product edit - top' => 'Product edit - top', + 'Product loop - at the bottom' => 'Product loop - at the bottom', + 'Product loop - at the top' => 'Product loop - at the top', + 'Product page - CSS stylesheet' => 'Product page - CSS stylesheet', + 'Product page - On the bottom of the form' => 'Product page - On the bottom of the form', + 'Product page - On the top of the form' => 'Product page - On the top of the form', + 'Product page - additional information' => 'Product page - additional information', + 'Product page - after javascript include' => 'Product page - after javascript include', + 'Product page - after javascript initialisation' => 'Product page - after javascript initialisation', + 'Product page - at the bottom' => 'Product page - at the bottom', + 'Product page - at the bottom of the detail area' => 'Product page - at the bottom of the detail area', + 'Product page - at the top' => 'Product page - at the top', + 'Product page - at the top of the detail' => 'Product page - at the top of the detail', + 'Product page - photo gallery' => 'Product page - photo gallery', + 'Products - caption' => 'Products - caption', + 'Products - header' => 'Products - header', + 'Products - row' => 'Products - row', + 'Products offer block' => 'Products offer block', + 'Profile - Edit JavaScript' => 'Profile - Edit JavaScript', + 'Profile - create form' => 'Profile - create form', + 'Profile - delete form' => 'Profile - delete form', + 'Profile - table header' => 'Profile - table header', + 'Profile - table row' => 'Profile - table row', + 'Profile edit - bottom' => 'Profile edit - bottom', + 'Profile edit - top' => 'Profile edit - top', + 'Profiles - JavaScript' => 'Profiles - JavaScript', + 'Profiles - at the top' => 'Profiles - at the top', + 'Profiles - bottom' => 'Profiles - bottom', + 'Puebla' => 'Puebla', + 'Puerto Rico' => 'Puerto Rico', + 'Qatar' => 'Qatar', + 'Quebec' => 'Quebec', + 'Querétaro' => 'Querétaro', + 'Quetzal' => 'Quetzal', + 'Quintana Roo' => 'Quintana Roo', + 'Ragusa' => 'Ragusa', + 'Ravenna' => 'Ravenna', + 'Real' => 'Real', + 'Refunded' => 'Refunded', + 'Reggio Calabria' => 'Reggio Calabria', + 'Reggio Emilia' => 'Reggio Emilia', + 'Register - CSS stylesheet' => 'Register - CSS stylesheet', + 'Register - after javascript include' => 'Register - after javascript include', + 'Register - after javascript initialisation' => 'Register - after javascript initialisation', + 'Register - at the bottom' => 'Register - at the bottom', + 'Register - at the bottom of the form' => 'Register - at the bottom of the form', + 'Register - at the top' => 'Register - at the top', + 'Register - at the top of the form' => 'Register - at the top of the form', + 'Rhode Island' => 'Rhode Island', + 'Riau' => 'Riau', + 'Rieti' => 'Rieti', + 'Rimini' => 'Rimini', + 'Ringgit' => 'Ringgit', + 'Riyal' => 'Riyal', + 'Roma' => 'Roma', + 'Romania' => 'Romania', + 'Rovigo' => 'Rovigo', + 'Ruble' => 'Ruble', + 'Rupee' => 'Rupee', + 'Rupiah' => 'Rupiah', + 'Russia' => 'Russia', + 'Rwanda' => 'Rwanda', + 'Réunion(La)' => 'Réunion(La)', + 'Río Negro' => 'Río Negro', + 'Saga' => 'Saga', + 'Saint Barthélemy' => 'Saint Barthélemy', + 'Saint Kitts and Nevis' => 'Saint Kitts and Nevis', + 'Saint Lucia' => 'Saint Lucia', + 'Saint Martin (French part)' => 'Saint Martin (French part)', + 'Saint Vincent and the Grenadines' => 'Saint Vincent and the Grenadines', + 'Saitama' => 'Saitama', + 'Sale - CSS stylesheet' => 'Sale - CSS stylesheet', + 'Sale - after javascript include' => 'Sale - after javascript include', + 'Sale - after the main content area' => 'Sale - after the main content area', + 'Sale - at the bottom' => 'Sale - at the bottom', + 'Sale - at the bottom of the main area' => 'Sale - at the bottom of the main area', + 'Sale - at the top' => 'Sale - at the top', + 'Sale - at the top of the main area' => 'Sale - at the top of the main area', + 'Sale - before the main content area' => 'Sale - before the main content area', + 'Sale - create form' => 'Sale - create form', + 'Sale - delete form' => 'Sale - delete form', + 'Sale - javascript initialization' => 'Sale - javascript initialization', + 'Sale edit - bottom' => 'Sale edit - bottom', + 'Sale edit - top' => 'Sale edit - top', + 'Sale edit page - javascript last call block' => 'Sale edit page - javascript last call block', + 'Salerno' => 'Salerno', + 'Sales - JavaScript' => 'Sales - JavaScript', + 'Sales - at the bottom' => 'Sales - at the bottom', + 'Sales - at the top' => 'Sales - at the top', + 'Sales - table header' => 'Sales - table header', + 'Sales - table row' => 'Sales - table row', + 'Sales management' => 'Sales management', + 'Salta' => 'Salta', + 'San Juan' => 'San Juan', + 'San Luis' => 'San Luis', + 'San Luis Potosí' => 'San Luis Potosí', + 'San Marino' => 'San Marino', + 'Santa Cruz' => 'Santa Cruz', + 'Santa Fe' => 'Santa Fe', + 'Santiago del Estero' => 'Santiago del Estero', + 'Sao Tome and Principe' => 'Sao Tome and Principe', + 'Saskatchewan' => 'Saskatchewan', + 'Sassari' => 'Sassari', + 'Saudi Arabia' => 'Saudi Arabia', + 'Savona' => 'Savona', + 'Search' => 'Search', + 'Search - JavaScript' => 'Search - JavaScript', + 'Search - at the top' => 'Search - at the top', + 'Search - bottom' => 'Search - bottom', + 'Search block' => 'Search block', + 'Search page - CSS stylesheet' => 'Search page - CSS stylesheet', + 'Search page - after javascript include' => 'Search page - after javascript include', + 'Search page - after javascript initialisation' => 'Search page - after javascript initialisation', + 'Secret key for form CSRF token' => 'Secret key for form CSRF token', + 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)' => 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)', + 'Senegal' => 'Senegal', + 'Sent' => 'Sent', + 'Seychelles' => 'Seychelles', + 'Shekel' => 'Shekel', + 'Shiga' => 'Shiga', + 'Shimane' => 'Shimane', + 'Shipping configuration' => 'Shipping configuration', + 'Shipping configuration - Edit' => 'Shipping configuration - Edit', + 'Shipping configuration - Edit JavaScript' => 'Shipping configuration - Edit JavaScript', + 'Shipping configuration - JavaScript' => 'Shipping configuration - JavaScript', + 'Shipping configuration - at the top' => 'Shipping configuration - at the top', + 'Shipping configuration - bottom' => 'Shipping configuration - bottom', + 'Shipping configuration - country delete form' => 'Shipping configuration - country delete form', + 'Shipping configuration - create form' => 'Shipping configuration - create form', + 'Shipping configuration - delete form' => 'Shipping configuration - delete form', + 'Shipping configuration - table header' => 'Shipping configuration - table header', + 'Shipping configuration - table row' => 'Shipping configuration - table row', + 'Shipping configuration edit - bottom' => 'Shipping configuration edit - bottom', + 'Shipping configuration edit - top' => 'Shipping configuration edit - top', + 'Shipping zones edit - bottom' => 'Shipping zones edit - bottom', + 'Shipping zones edit - top' => 'Shipping zones edit - top', + 'Shizuoka' => 'Shizuoka', + 'Show error message instead of a white page on a server error' => 'Show error message instead of a white page on a server error', + 'Siena' => 'Siena', + 'Sierra Leone' => 'Sierra Leone', + 'Sinaloa' => 'Sinaloa', + 'Singapore' => 'Singapore', + 'Siracusa' => 'Siracusa', + 'Sitemap - at the bottom' => 'Sitemap - at the bottom', + 'Slovakia' => 'Slovakia', + 'Slovenia' => 'Slovenia', + 'Smarty template engine integration' => 'Smarty template engine integration', + 'Social Networks block' => 'Social Networks block', + 'Solomon Islands' => 'Solomon Islands', + 'Somalia' => 'Somalia', + 'Sondrio' => 'Sondrio', + 'Sonora' => 'Sonora', + 'South Africa' => 'South Africa', + 'South Carolina' => 'South Carolina', + 'South Dakota' => 'South Dakota', + 'South Kalimantan' => 'South Kalimantan', + 'South Korea' => 'South Korea', + 'South Sulawesi' => 'South Sulawesi', + 'South Sumatra' => 'South Sumatra', + 'Southeast Sulawesi' => 'Southeast Sulawesi', + 'Spain' => 'Spain', + 'Sri Lanka' => 'Sri Lanka', + 'St Pierre et Miquelon' => 'St Pierre et Miquelon', + 'Store Information - JavaScript' => 'Store Information - JavaScript', + 'Store information configuration' => 'Store information configuration', + 'Sudan' => 'Sudan', + 'Suriname' => 'Suriname', + 'Swaziland' => 'Swaziland', + 'Sweden' => 'Sweden', + 'Switzerland' => 'Switzerland', + 'Syria' => 'Syria', + 'System - logs JavaScript' => 'System - logs JavaScript', + 'Tab SEO - bottom' => 'Tab SEO - bottom', + 'Tab SEO - top' => 'Tab SEO - top', + 'Tab SEO - update form' => 'Tab SEO - update form', + 'Tab document - bottom' => 'Tab document - bottom', + 'Tab document - top' => 'Tab document - top', + 'Tab image - bottom' => 'Tab image - bottom', + 'Tab image - top' => 'Tab image - top', + 'Tabasco' => 'Tabasco', + 'Tajikistan' => 'Tajikistan', + 'Tamaulipas' => 'Tamaulipas', + 'Tanzania' => 'Tanzania', + 'Taranto' => 'Taranto', + 'Tax - Edit JavaScript' => 'Tax - Edit JavaScript', + 'Tax - create form' => 'Tax - create form', + 'Tax - delete form' => 'Tax - delete form', + 'Tax edit - bottom' => 'Tax edit - bottom', + 'Tax edit - top' => 'Tax edit - top', + 'Tax rule edit - bottom' => 'Tax rule edit - bottom', + 'Tax rule edit - top' => 'Tax rule edit - top', + 'Tax rules configuration' => 'Tax rules configuration', + 'Taxes - update form' => 'Taxes - update form', + 'Taxes rules - JavaScript' => 'Taxes rules - JavaScript', + 'Taxes rules - at the top' => 'Taxes rules - at the top', + 'Taxes rules - bottom' => 'Taxes rules - bottom', + 'Template - Edit JavaScript' => 'Template - Edit JavaScript', + 'Template - attributes table header' => 'Template - attributes table header', + 'Template - attributes table row' => 'Template - attributes table row', + 'Template - create form' => 'Template - create form', + 'Template - delete form' => 'Template - delete form', + 'Template - features table row' => 'Template - features table row', + 'Template - features-table-header' => 'Template - features-table-header', + 'Template edit - bottom' => 'Template edit - bottom', + 'Template edit - top' => 'Template edit - top', + 'Templates - JavaScript' => 'Templates - JavaScript', + 'Templates - at the top' => 'Templates - at the top', + 'Templates - bottom' => 'Templates - bottom', + 'Templates - table header' => 'Templates - table header', + 'Templates - table row' => 'Templates - table row', + 'Tennessee' => 'Tennessee', + 'Teramo' => 'Teramo', + 'Terni' => 'Terni', + 'Texas' => 'Texas', + 'Thailand' => 'Thailand', + 'The ID of the \'Terms & Conditions\' content.' => 'The ID of the \'Terms & Conditions\' content.', + 'The ID of the folder containing your information pages : terms, imprint, ...' => 'The ID of the folder containing your information pages : terms, imprint, ...', + 'The Vatican' => 'The Vatican', + 'The default quality (in %) of the generated images' => 'The default quality (in %) of the generated images', + 'The minimum length required for an administrator password' => 'The minimum length required for an administrator password', + 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country' => 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country', + 'The path to the document cache directory in the web space' => 'The path to the document cache directory in the web space', + 'The path to the image cache directory in the web space' => 'The path to the image cache directory in the web space', + 'Tierra del Fuego' => 'Tierra del Fuego', + 'TinyMCE WYSIWYG editor' => 'TinyMCE WYSIWYG editor', + 'Tlaxcala' => 'Tlaxcala', + 'Tochigi' => 'Tochigi', + 'Togo' => 'Togo', + 'Tokushima' => 'Tokushima', + 'Tokyo' => 'Tokyo', + 'Tonga' => 'Tonga', + 'Tools - JavaScript' => 'Tools - JavaScript', + 'Tools - at the bottom of column 1' => 'Tools - at the bottom of column 1', + 'Tools - at the top' => 'Tools - at the top', + 'Tools - at the top of the column' => 'Tools - at the top of the column', + 'Tools - bottom' => 'Tools - bottom', + 'Tools panel' => 'Tools panel', + 'Torino' => 'Torino', + 'Tottori' => 'Tottori', + 'Toyama' => 'Toyama', + 'Translations' => 'Translations', + 'Translations - JavaScript' => 'Translations - JavaScript', + 'Trapani' => 'Trapani', + 'Trento' => 'Trento', + 'Treviso' => 'Treviso', + 'Trieste' => 'Trieste', + 'Trinidad and Tobago' => 'Trinidad and Tobago', + 'Tucumán' => 'Tucumán', + 'Tunisia' => 'Tunisia', + 'Tunisian Dinar' => 'Tunisian Dinar', + 'Turkey' => 'Turkey', + 'Turkmenistan' => 'Turkmenistan', + 'Tuvalu' => 'Tuvalu', + 'UK Pound' => 'UK Pound', + 'US Virgin Islands' => 'US Virgin Islands', + 'USA' => 'USA', + 'Udine' => 'Udine', + 'Uganda' => 'Uganda', + 'Ukraine' => 'Ukraine', + 'United Arab Emirates' => 'United Arab Emirates', + 'United Arab Emirates dirham' => 'United Arab Emirates dirham', + 'United Kingdom' => 'United Kingdom', + 'United States Dollar' => 'United States Dollar', + 'Update customer account - CSS stylesheet' => 'Update customer account - CSS stylesheet', + 'Update customer account - after javascript include' => 'Update customer account - after javascript include', + 'Update customer account - after javascript initialisation' => 'Update customer account - after javascript initialisation', + 'Update customer account - at the bottom' => 'Update customer account - at the bottom', + 'Update customer account - at the bottom of the form' => 'Update customer account - at the bottom of the form', + 'Update customer account - at the top' => 'Update customer account - at the top', + 'Update customer account - at the top of the form' => 'Update customer account - at the top of the form', + 'Uruguay' => 'Uruguay', + 'Use a persistent cookie to keep track of customer cart' => 'Use a persistent cookie to keep track of customer cart', + 'Utah' => 'Utah', + 'Uzbekistan' => 'Uzbekistan', + 'Vanuatu' => 'Vanuatu', + 'Varese' => 'Varese', + 'Variable - Edit JavaScript' => 'Variable - Edit JavaScript', + 'Variable - create form' => 'Variable - create form', + 'Variable - delete form' => 'Variable - delete form', + 'Variable edit - bottom' => 'Variable edit - bottom', + 'Variable edit - top' => 'Variable edit - top', + 'Variables - JavaScript' => 'Variables - JavaScript', + 'Variables - at the top' => 'Variables - at the top', + 'Variables - bottom' => 'Variables - bottom', + 'Variables - table header' => 'Variables - table header', + 'Variables - table row' => 'Variables - table row', + 'Venezia' => 'Venezia', + 'Venezuela' => 'Venezuela', + 'Veracruz' => 'Veracruz', + 'Verbano-Cusio-Ossola' => 'Verbano-Cusio-Ossola', + 'Vercelli' => 'Vercelli', + 'Vermont' => 'Vermont', + 'Verona' => 'Verona', + 'Vibo Valentia' => 'Vibo Valentia', + 'Vicenza' => 'Vicenza', + 'Vietnam' => 'Vietnam', + 'View administration logs' => 'View administration logs', + 'Virginia' => 'Virginia', + 'Virtual Product Controller' => 'Virtual Product Controller', + 'Viterbo' => 'Viterbo', + 'Wakayama' => 'Wakayama', + 'Wallis-et-Futuna' => 'Wallis-et-Futuna', + 'Washington' => 'Washington', + 'West Java' => 'West Java', + 'West Kalimantan' => 'West Kalimantan', + 'West Nusa Tenggara' => 'West Nusa Tenggara', + 'West Sulawesi' => 'West Sulawesi', + 'West Sumatra' => 'West Sumatra', + 'West Virginia' => 'West Virginia', + 'Western Samoa' => 'Western Samoa', + 'Where the WYSIWYG editor is required' => 'Where the WYSIWYG editor is required', + 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)' => 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)', + 'Wisconsin' => 'Wisconsin', + 'Wyoming' => 'Wyoming', + 'Yamagata' => 'Yamagata', + 'Yamaguchi' => 'Yamaguchi', + 'Yamanashi' => 'Yamanashi', + 'Yemen' => 'Yemen', + 'Yen' => 'Yen', + 'Yogyakarta' => 'Yogyakarta', + 'You can now login at' => 'You can now login at', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'You have lost your password
    \r\nPlease, change this password after your first connection', + 'You have lost your password
    \r\nYour new password is' => 'You have lost your password
    \r\nYour new password is', + 'Your account information on {config key="store_name"} has been changed.' => 'Your account information on {config key="store_name"} has been changed.', + 'Your new passord is : {$password}' => 'Your new passord is : {$password}', + 'Your new password' => 'Your new password', + 'Your new password for {config key="store_name"}' => 'Your new password for {config key="store_name"}', + 'Your order {$order_ref} at {config key="store_name"}' => 'Your order {$order_ref} at {config key="store_name"}', + 'Your subscription to %store newsletter' => 'Your subscription to %store newsletter', + 'Your subscription to {config key="store_name"} newsletter' => 'Your subscription to {config key="store_name"} newsletter', + 'Yuan' => 'Yuan', + 'Yucatán' => 'Yucatán', + 'Yukon' => 'Yukon', + 'Zacatecas' => 'Zacatecas', + 'Zaire' => 'Zaire', + 'Zambia' => 'Zambia', + 'Zimbabwe' => 'Zimbabwe', + 'Zone - delete form' => 'Zone - delete form', + 'Złoty' => 'Złoty', + '[Firewall/Bruteforce] Number of allowed attemps' => '[Firewall/Bruteforce] Number of allowed attemps', + '[Firewall/Bruteforce] Time to wait between X attempts' => '[Firewall/Bruteforce] Time to wait between X attempts', + '[Firewall] Activate the firewall' => '[Firewall] Activate the firewall', + '[Firewall] Number of allowed attemps' => '[Firewall] Number of allowed attemps', + '[Firewall] Time to wait between X attempts' => '[Firewall] Time to wait between X attempts', + 'changing password email for' => 'changing password email for', + 'customer account - CSS stylesheet' => 'customer account - CSS stylesheet', + 'customer account - after javascript include' => 'customer account - after javascript include', + 'customer account - after javascript initialisation' => 'customer account - after javascript initialisation', + 'customer account - at the bottom' => 'customer account - at the bottom', + 'customer account - at the top' => 'customer account - at the top', + 'export of newsletter subscribers' => 'export of newsletter subscribers', + 'language selection page - CSS stylesheet' => 'language selection page - CSS stylesheet', + 'language selection page - after javascript include' => 'language selection page - after javascript include', + 'language selection page - after javascript initialisation' => 'language selection page - after javascript initialisation', + 'language selection page - at the bottom' => 'language selection page - at the bottom', + 'language selection page - at the top' => 'language selection page - at the top', + 'state - Edit JavaScript' => 'state - Edit JavaScript', + 'state - creation form' => 'state - creation form', + 'state - delete form' => 'state - delete form', + 'state-edit - at the top' => 'state-edit - at the top', + 'state-edit - bottom' => 'state-edit - bottom', + 'states - JavaScript' => 'states - JavaScript', + 'states - at the top' => 'states - at the top', + 'states - bottom' => 'states - bottom', + 'states - table header' => 'states - table header', + 'states - table row' => 'states - table row', + 'tax rule - Edit JavaScript' => 'tax rule - Edit JavaScript', + 'tax rule - create form' => 'tax rule - create form', + 'tax rule - delete form' => 'tax rule - delete form', + 'tinymce wysiwyg editor' => 'tinymce wysiwyg editor', + 'Đồng' => 'Đồng', + 'Гривна' => 'Гривна', +); diff --git a/setup/I18n/es_ES.php b/setup/I18n/es_ES.php new file mode 100644 index 00000000..d2f241ac --- /dev/null +++ b/setup/I18n/es_ES.php @@ -0,0 +1,1067 @@ + 'Fecha de caducidad de cookie "recuerdame", en segundos, para los usuarios de la administración', + '"Remember me" cookie expiration time, in seconds, for customer users' => 'Fecha de caducidad de cookie "Acuérdate de mi", en segundos, para los usuarios cliente', + '"Remember me" cookie name for administration users' => 'Nombre de la cookie "Recordarme" para los usuarios de administración', + '"Remember me" cookie name for customer users' => 'Nombre de la cookie "Recordarme" para los usuarios cliente', + '72h delivery' => 'entrega 72h', + 'A {config key="store_name"} account has been created for you' => 'Una {config key="store_name"} cuenta ha sido creada para ti', + 'API Configuration' => 'Configuración de API', + 'Address' => 'Dirección', + 'Address creation - CSS stylesheet' => 'Creación de dirección - hoja de estilos CSS', + 'Address creation - after javascript include' => 'Creación de dirección- después del include javascript', + 'Address creation - after javascript initialisation' => 'Creación de dirección - después de la inicialización de javascript', + 'Address creation - at the bottom' => 'Creación de dirección - en la parte inferior', + 'Address creation - at the bottom of the form' => 'Creación de dirección - en la parte inferior del formulario', + 'Address creation - at the top' => 'Creación de dirección - en la parte superior', + 'Address creation - at the top of the form' => 'Creación de dirección - en la parte superior del formulario', + 'Address update - CSS stylesheet' => 'Actualización de dirección - hoja de estilos CSS', + 'Address update - after javascript include' => 'Actualización de dirección - tras el include javascript', + 'Address update - after javascript initialisation' => 'Actualización de dirección - después de la inicialización de javascript', + 'Address update - at the bottom' => 'Actualización de dirección - en la parte inferior', + 'Address update - at the bottom of the form' => 'Actualización de dirección - en la parte inferior del formulario', + 'Address update - at the top' => 'Actualizar dirección - en la parte superior', + 'Address update - at the top of the form' => 'Actualizar dirección - en la parte superior del formulario', + 'Admin layout - After the main content' => 'Diseño de administración - Después del contenido principal', + 'Administatros list' => 'Lista de Administradores', + 'Administration profiles management' => 'Gestión de perfiles de administración', + 'Administrator - create form' => 'Administrador - formulario de creación', + 'Administrator - delete form' => 'Administrador - formulario de eliminación', + 'Administrator - update form' => 'Administrador - formulario de actualización', + 'Administrator list' => 'Lista de administrador', + 'Administrators - JavaScript' => 'Administradores - JavaScript', + 'Administrators - at the top' => 'Administradores - en la parte superior', + 'Administrators - bottom' => 'Administradores - inferior', + 'Administrators - header' => 'Administradores - cabecera', + 'Administrators - row' => 'Administradores - fila', + 'Advanced Configuration' => 'Configuración avanzada', + 'Advanced Configuration - Javascript' => 'Configuración avanzada - JavaScript', + 'Advanced configuration' => 'Configuración avanzada', + 'Afghanistan' => 'Afganistán', + 'Albania' => 'Albania', + 'Algeria' => 'Argelia', + 'All Products - CSS stylesheet' => 'Todos los productos - hoja de estilos CSS', + 'All Products - after javascript include' => 'Todos los productos - después de include javascript', + 'All Products - after javascript initialisation' => 'Todos los productos - después de la inicialización de javascript', + 'All Products - at the bottom' => 'Todos los productos - en la parte inferior', + 'All Products - at the top' => 'Todos los productos - en la parte superior', + 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)' => 'Permite a un administrador recrear una contraseña perdida (1 = sí, 0 = no)', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Permitir a los clientes cambiar su correo electrónico. 1 para sí, 0 para no', + 'Allow negative product stock (1) or not (0)' => 'Permitir valores negativos producto (1) o no (0)', + 'Allow negative product stock (1) or not (0, default)' => 'Permite valores negativos producto (1) o no (valor por defecto 0,)', + 'Allow slash ended uri' => 'Permitir barra de fín de url', + 'An image carousel on your home page' => 'Un carrusel de imágenes en la página de inicio', + 'Andorra' => 'Andorra', + 'Angola' => 'Angola', + 'Antigua and Barbuda' => 'Antigua y Barbuda', + 'Api page - at bottom' => 'Página de la API - en la parte inferior', + 'Api page - at top' => 'Página de la API - en la parte superior', + 'Api page - in deletion form' => 'Página de Api - en formulario de eliminación', + 'Argentina' => 'Argentina', + 'Armenia' => 'Armenia', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Preguntar al cliente para confirmar su correo electrónico, 1 para sí, 0 no', + 'Attribut - Edit JavaScript' => 'Atributo - editar JavaScript', + 'Attribut - add to all form' => 'Atributo - agregar a todos los formularios', + 'Attribut - create form' => 'Atributo - formulario de creación', + 'Attribut - delete form' => 'Atributo - formulario de eliminación', + 'Attribut - id delete form' => 'Atributo - Formulario de eliminación de id', + 'Attribut - remove to all form' => 'Atributo - quitar a todos', + 'Attribute edit - bottom' => 'Edición de atributos - inferior', + 'Attribute edit - top' => 'Editar atributo - superior', + 'Attribute value - create form' => 'Valor de atributo - formulario de creación', + 'Attributes - JavaScript' => 'Atributos - JavaScript', + 'Attributes - at the top' => 'Atributos - en la parte superior', + 'Attributes - bottom' => 'Atributos - inferior', + 'Attributes - table header' => 'Atributos - encabezado de tabla', + 'Attributes - table row' => 'Atributos - fila de la tabla', + 'Attributes value - table header' => 'Valor de atributos - encabezado de tabla', + 'Attributes value - table row' => 'Valor de atributos - fila de la tabla', + 'Australia' => 'Australia', + 'Austria' => 'Austria', + 'Azerbaijan' => 'Azerbaiyán', + 'Back-office export management' => 'Gestor de exportación de Back Office', + 'Back-office home page' => 'Página de inicio de back office', + 'Back-office search function' => 'Función de búsqueda de back office', + 'Bahamas' => 'Bahamas', + 'Bahrain' => 'Bahrein', + 'Bangladesh' => 'Bangladesh', + 'Barbados' => 'Barbados', + 'Base URL of the shop (e.g. http://www.yourshopdomain.com)' => 'Base URL de la tienda (por ejemplo http://www.yourshopdomain.com)', + 'Belarus' => 'Belarús', + 'Belgium' => 'Bélgica', + 'Belize' => 'Belice', + 'Benin' => 'Benin', + 'Bhutan' => 'Bhután', + 'Bielorussia' => 'Bielorusia', + 'Bolivia' => 'Bolivia', + 'Bosnia and Herzegovina' => 'Bosnia y Herzegovina', + 'Botswana' => 'Botswana', + 'Brand - Edit JavaScript' => 'Marca - editar JavaScript', + 'Brand - JavaScript' => 'Marca - JavaScript', + 'Brand - Tab' => 'Marca - Tab', + 'Brand - content' => 'Marca - contenido', + 'Brand - create form' => 'Marca - formulario de creación', + 'Brand - delete form' => 'Marca - formulario de eliminación', + 'Brand edit - bottom' => 'Editar marca - inferior', + 'Brand edit - right column bottom' => 'Edición de marca - al pie de la columna derecha', + 'Brand edit - right column top' => 'Edición de marca - encabezado de la columna derecha', + 'Brand edit - top' => 'Editar marca - superior', + 'Brand edit page - in the form' => 'Página de edición de marca - en formulario', + 'Brands - at the top' => 'Marcas - en parte superior', + 'Brands - bottom' => 'Marcas - inferior', + 'Brands - table header' => 'Marcas - encabezado de tabla', + 'Brands - table row' => 'Marcas - file de la tabla', + 'Brands management' => 'Gestión de marcas', + 'Brands page - CSS stylesheet' => 'Página de marcas - hoja de estilos CSS', + 'Brands page - after javascript include' => 'Página de marcas - después de inclusión de javascript', + 'Brands page - after the main content area' => 'Página de marcas - después el área de contenido principal', + 'Brands page - at the bottom' => 'Página de las marcas - en la parte inferior', + 'Brands page - at the bottom of the main area' => 'Página de las marcas - en la parte inferior del área principal', + 'Brands page - at the bottom of the sidebar' => 'Página de las marcas - en la parte inferior de la barra lateral', + 'Brands page - at the top' => 'Página de las marcas - en la parte superior', + 'Brands page - at the top of the main area' => 'Página de las marcas - en la parte inferior del área principal', + 'Brands page - at the top of the sidebar' => 'Página de las marcas - en la parte inferior de la barra lateral', + 'Brands page - before the main content area' => 'Página de marcas - antes del área de contenido principal', + 'Brands page - javascript initialization' => 'Página de marcas - inicialización de javascript', + 'Brands page - the body of the sidebar' => 'Página de marcas - el cuerpo de la barra lateral', + 'Brazil' => 'Brasil', + 'Brunei' => 'Brunei', + 'Bulgaria' => 'Bulgaria', + 'Burkina' => 'Burkina', + 'Burma' => 'Birmania', + 'Burundi' => 'Burundi', + 'Cambodia' => 'Camboya', + 'Cameroon' => 'Camerún', + 'Canceled' => 'Cancelado', + 'Cape Verde' => 'Cabo Verde', + 'Cart - CSS stylesheet' => 'Carrito - hoja de estilos CSS', + 'Cart - after javascript include' => 'Carro - después de inclusión javascript', + 'Cart - at the bottom' => 'Carrito - En la parte inferior', + 'Cart - at the top' => 'Carrito - En la parte superior', + 'Cart - javascript initialization' => 'Carro - inicialización de javascript', + 'Cart block' => 'Bloque de carrito', + 'Categories - JavaScript' => 'Categorías - JavaScript', + 'Categories - at the bottom of the catalog' => 'Categorías - en la parte inferior del catálogo', + 'Categories - at the top' => 'Categorías - en la parte superior', + 'Categories - bottom' => 'Categorías - inferior', + 'Categories - caption' => 'Categorías - título', + 'Categories - header' => 'Categorías - header', + 'Categories - row' => 'Categorías - fila', + 'Category' => 'Categoria', + 'Category - Edit JavaScript' => 'Categoría - edición JavaScript', + 'Category - Tab' => 'Categoría - Tab', + 'Category - content' => 'Categoría - contenido', + 'Category - contents table header' => 'Categoría - encabezado de tabla de contenido', + 'Category - contents table row' => 'Categoría - fila de la tabla de contenido', + 'Category - create form' => 'Formulario de creación de la categoría-', + 'Category - delete form' => 'Categoría - formulario de eliminación', + 'Category configuration' => 'Configuración de la categoría', + 'Category edit - bottom' => 'Editar categoría - inferior', + 'Category edit - right column bottom' => 'Edición de categoría - al pie de la columna derecha', + 'Category edit - right column top' => 'Edición de categoría - al tope de la columna derecha', + 'Category edit - top' => 'Categoría edición - superior', + 'Category page - CSS stylesheet' => 'Página de la categoría - hoja de estilos CSS', + 'Category page - after javascript include' => 'Página de la categoría - después de inclusión javascript', + 'Category page - after javascript initialisation' => 'Página de la categoría - después de la inicialización de javascript', + 'Category page - after the main content area' => 'Página de la categoría - después el área de contenido principal', + 'Category page - at the bottom' => 'Página de la categoría - en la parte inferior', + 'Category page - at the bottom of the main area' => 'Página de la categoría - en la parte inferior de la zona principal', + 'Category page - at the bottom of the sidebar' => 'Página de la categoría - en la parte inferior de la barra lateral', + 'Category page - at the top' => 'Página de la categoría - en la parte superior', + 'Category page - at the top of the main area' => 'Página de categoría - en la parte superior de la zona principal', + 'Category page - at the top of the sidebar' => 'Página de categoría - en la parte inferior de la barra lateral', + 'Category page - before the main content area' => 'Página de categoría - antes el área de contenido principal', + 'Category page - the body of the sidebar' => 'Página de categoría - el cuerpo de la barra lateral', + 'Central African Republic' => 'República Centroafricana', + 'Chad' => 'Chad', + 'Change password - CSS stylesheet' => 'Cambiar contraseña - hoja de estilos CSS', + 'Change password - after javascript include' => 'Cambiar contraseña - después de inclusión javascript', + 'Change password - after javascript initialisation' => 'Cambiar contraseña - después de la inicialización de javascript', + 'Change password - at the bottom' => 'Cambiar contraseña - en la parte inferior', + 'Change password - at the top' => 'Cambiar contraseña - en la parte superior', + 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity' => 'Comprobar disponibilidad de stock de producto (1) o ignorar (0) cuando se muestra o cambia cantidad en pedido', + 'Check if a virtual product delivery module is enabled if at least one product is virtual' => 'Compruebe si un módulo de entrega de producto virtual está habilitado si es virtual por lo menos un producto', + 'Chile' => 'Chile', + 'China' => 'China', + 'Client edit - bottom' => 'Editar cliente - parte inferior', + 'Client edit - top' => 'Editar cliente - superior', + 'Colombia' => 'Colombia', + 'Comoros' => 'Comoras', + 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)' => 'Compilar las plantillas automáticamente en cada cambio de código fuente (1 = sí, 2 = no)', + 'Configuration' => 'Configuración', + 'Configuration - JavaScript' => 'Configuración - JavaScript', + 'Configuration - at the bottom of the catalog' => 'Configuración - en la parte inferior del catálogo', + 'Configuration - at the bottom of the shipping area' => 'Configuración - en la parte inferior de la zona de envío', + 'Configuration - at the bottom of the system area' => 'Configuración - en la parte inferior de la zona del sistema', + 'Configuration - at the top' => 'Configuración - en la parte superior', + 'Configuration - at the top of the catalog area' => 'Configuración - en la parte superior de la zona de catálogo', + 'Configuration - at the top of the shipping area' => 'Configuración - en la parte superior del área de envío', + 'Configuration - at the top of the system area' => 'Configuración - en la parte superior del área del sistema', + 'Configuration - bottom' => 'Configuración - parte inferior', + 'Configuration / Administrator' => 'Configuración / administrador', + 'Configuration / Area' => 'Configuración / área', + 'Configuration / Attribute' => 'Configuración / atributo', + 'Configuration / Cache' => 'Configuración / caché', + 'Configuration / Country' => 'Configuración / país', + 'Configuration / Currency' => 'Configuración / Moneda', + 'Configuration / Feature' => 'Configuración / Característica', + 'Configuration / Language' => 'Configuración / Idioma', + 'Configuration / Mailing-system' => 'Configuración / Sistema de correo', + 'Configuration / Message' => 'Configuración / Mensaje', + 'Configuration / Module' => 'Configuración / Módulo', + 'Configuration / Profile' => 'Configuración / Perfil', + 'Configuration / Shipping-zone' => 'Configuración / Zona de envío', + 'Configuration / System Log' => 'Configuración / Sistema de log', + 'Configuration / Tax' => 'Configuración / Impuestos', + 'Configuration / Template' => 'Configuración / Plantilla', + 'Configuration variables' => 'Variables de configuración', + 'Congo' => 'Congo', + 'Contact block' => 'Bloque de contacto', + 'Contact page - CSS stylesheet' => 'Página de contacto - hoja de estilos CSS', + 'Contact page - after javascript include' => 'Página de contacto - después del include de javascript', + 'Contact page - after javascript initialisation' => 'Página de contacto - después de la inicialización de javascript', + 'Contact page - at the bottom' => 'Página de contacto - en la parte inferior', + 'Contact page - at the bottom of the form' => 'Página de contacto - en la parte inferior del formulario', + 'Contact page - at the top' => 'Página de contacto - en la parte superior', + 'Contact page - at the top of the form' => 'Página de contacto - en la parte superior del formulario', + 'Contact page - if successful response' => 'Página de contacto - si la respuesta es exitosa', + 'Content' => 'Contenido', + 'Content - Edit JavaScript' => 'Contenido - Editar JavaScript', + 'Content - Tab' => 'Contenido - Pestaña', + 'Content - content' => 'Contenido - contenido', + 'Content - create form' => 'Contenido - formulario de creación', + 'Content - delete form' => 'Contenido - Formulario para eliminar', + 'Content edit - bottom' => 'Editar Contenido - inferior', + 'Content edit - right column bottom' => 'Edición de Contenido - al pie de la columna derecha', + 'Content edit - right column top' => 'Edición de Contenido - al tope de la columna derecha', + 'Content edit - top' => 'Editar contenido - superior', + 'Content page - CSS stylesheet' => 'Página de contacto - hoja de estilos CSS', + 'Content page - after javascript include' => 'Página de contacto - después del include de javascript', + 'Content page - after javascript initialisation' => 'Página de contacto - después de la inicialización de javascript', + 'Content page - after the main content area' => 'Página de contenido - después del área de contenido principal', + 'Content page - at the bottom' => 'Página de contacto - en la parte inferior', + 'Content page - at the bottom of the main area' => 'Página de contenido - en la parte inferior de la zona principal', + 'Content page - at the bottom of the sidebar' => 'Página de contenido - en la parte inferior de la barra lateral', + 'Content page - at the top' => 'Página de contacto - en la parte superior', + 'Content page - at the top of the main area' => 'Página de contenido - en la parte superior de la zona principal', + 'Content page - at the top of the sidebar' => 'Página de contenido - en la parte superior de la barra lateral', + 'Content page - before the main content area' => 'Página de contenido - antes del área de contenido principal', + 'Content page - the body of the sidebar' => 'Página de contenido - cuerpo de la barra lateral', + 'Contents - caption' => 'Contenido - leyenda', + 'Contents - header' => 'Contenido - encabezado', + 'Contents - row' => 'Contenido - fila', + 'Cook Islands' => 'Cook', + 'Costa Rica' => 'Costa Rica', + 'Countries - JavaScript' => 'Países - JavaScript', + 'Countries - at the top' => 'Países - en la parte superior', + 'Countries - bottom' => 'Países - parte inferior', + 'Countries - table header' => 'Países - encabezado de la tabla', + 'Countries - table row' => 'Países - fila de la tabla', + 'Country - Edit JavaScript' => 'País - editar JavaScript', + 'Country - create form' => 'País - formulario de creación', + 'Country - delete form' => 'País - formulario para eliminar', + 'Country edit - bottom' => 'Edición de pais - parte inferior', + 'Country edit - top' => 'Edición de país - parte superior', + 'Coupon' => 'Cupón', + 'Coupon - at the top' => 'Cupón - en la parte superior', + 'Coupon - bottom' => 'Cupón - parte inferior', + 'Coupon - create JavaScript' => 'Cupón - crear JavaScript', + 'Coupon - list JavaScript' => 'Cupón - enlistar JavaScript', + 'Coupon - list caption' => 'Cupón - titulo de la lista', + 'Coupon - table header' => 'Cupón - encabezado de tabla', + 'Coupon - table row' => 'Cupón - fila de la tabla', + 'Coupon - update JavaScript' => 'Cupón - actualizar JavaScript', + 'Coupon page - in deletion form' => 'Página de cupón - en formulario de eliminación', + 'Croatia' => 'Croacia', + 'Cuba' => 'Cuba', + 'Curency selection page - CSS stylesheet' => 'Página de selección de divisa - hoja de estilos CSS', + 'Curency selection page - after javascript include' => 'Página de selección de divisa - después de inclusión javascript', + 'Curency selection page - after javascript initialisation' => 'Página de selección de divisa - después de la inicialización de javascript', + 'Curency selection page - at the bottom' => 'Página de selección de divisa - en la parte inferior', + 'Curency selection page - at the top' => 'Página de selección de divisa - en la parte superior', + 'Currencies - JavaScript' => 'Divisas - JavaScript', + 'Currencies - at the top' => 'Divisas - en la parte superior', + 'Currencies - bottom' => 'Divisas - inferior', + 'Currencies - table header' => 'Divisas - encabezado de tabla', + 'Currencies - table row' => 'Divisas - fila de tabla', + 'Currency - Edit JavaScript' => 'Divisas - Editar javaScript', + 'Currency - create form' => 'Divisas - formulario de creación', + 'Currency - delete form' => 'Moneda - Formulario de eliminación', + 'Currency block' => 'Bloque de monedas', + 'Currency edit - bottom' => 'Editar Monedas - Pie', + 'Currency edit - top' => 'Editar Monedas - Cabecera', + 'Customer' => 'Cliente', + 'Customer - Edit' => 'Cliente - Editar', + 'Customer - Edit JavaScript' => 'Cliente - Editar JavaScript', + 'Customer - address create form' => 'Cliente - formulario crear dirección', + 'Customer - address delete form' => 'Cliente - Formulario borrar dirección', + 'Customer - address update form' => 'Cliente - formulario de actualización de dirección', + 'Customer - at the top' => 'Cliente - en la cabecera', + 'Customer - bottom' => 'Cliente - pie', + 'Customer - create form' => 'Cliente - formulario creación', + 'Customer - delete form' => 'Cliente - formulario eliminación', + 'Customer - order table header' => 'Cliente - cabecera tabla de pedidos', + 'Customer - order table row' => 'Cliente - celda tabla pedidos', + 'Customer account - additional information' => 'Cuenta de cliente - información adicional', + 'Customer account block' => 'Bloque de cuenta de cliente', + 'Customer title' => 'Estado civil cliente', + 'Customers - JavaScript' => 'Clientes - JavaScript', + 'Customers - caption' => 'Clientes - texto', + 'Customers - header' => 'Clientes - encabezado', + 'Customers - row' => 'Clientes - fila', + 'Cyprus' => 'Chipre', + 'Czech Republic' => 'República Checa', + 'Dashboard - at the top' => 'Dashboard - en la parte superior', + 'Dashboard - bottom' => 'Dashboard - fondo', + 'Dashboard - middle' => 'Dashboard - medio', + 'Data import / export' => 'Importación/ exportación de datos', + 'Default available stock when check-available-stock is set to 0.' => 'Cuando check-available-stock es 0 stock disponible por defecto.', + 'Default lang without translation' => 'Lenguaje por defecto sin traducción', + 'Delivery - After delivery module' => 'Entrega - después del módulo de entrega', + 'Delivery - CSS' => 'Entrega - CSS', + 'Delivery - additional product information' => 'Entrega - información adicional del producto', + 'Delivery - after addresse area' => 'Entrega - tras el área de dirección', + 'Delivery - after the information area' => 'Entrega - después del área de información', + 'Delivery - after the order summary' => 'Envío - después del resumen de pedido', + 'Delivery - at the bottom of information area' => 'Envío - en el pié del área de información', + 'Delivery - at the bottom of the footer' => 'Envío - En el pie del footer', + 'Delivery - at the top of the footer' => 'Envío - en la parte superior del footer', + 'Delivery - delivery address' => 'Envío - dirección de entrega', + 'Delivery - imprint' => 'Envío - imprimir', + 'Delivery - in the header' => 'Envío - en la cabecera', + 'Delivery choice - CSS stylesheet' => 'Opción de entrega - CSS', + 'Delivery choice - after javascript include' => 'Opción de entrega - después de incluir el javascript', + 'Delivery choice - after javascript initialisation' => 'Opción de entrega - despues de inicializar el javascript', + 'Delivery choice - at the bottom' => 'Elección de entrega - en el pie', + 'Delivery choice - at the bottom of the form' => 'Opción de entrega - en el pie del formulario', + 'Delivery choice - at the top' => 'Opción de entrega - en la cabecera', + 'Delivery choice - at the top of the form' => 'Opción de entrega - en la cabecera del formulario', + 'Delivery choice - extra area' => 'Opción de entrega - área extra', + 'Delivery choice - javascript' => 'Opción de entrega - javascript', + 'Delivery zone - Edit JavaScript' => 'Zona de entrega - Editar JavasCript', + 'Delivery zone - JavaScript' => 'Zona de entrega - JavaScript', + 'Delivery zone - at the top' => 'Zona de entrega - En la cabecera', + 'Delivery zone - bottom' => 'Zona de entrega - en el pie', + 'Delivery zone - table header' => 'Zona de entrega - en el encabezado de tabla', + 'Delivery zone - table row' => 'Zona de entrega - en la fila de la tabla', + 'Denmark' => 'Dinamarca', + 'Display and process prices with (0) or without (1) taxes.' => 'Mostrar y procesar precios con (0) o sin (1) impuestos.', + 'Distrito Federal' => 'Ciudad de México', + 'Djibouti' => 'Djibouti', + 'Document - Edit JavaScript' => 'Documento - edición JavaScript', + 'Document edit - bottom' => 'Edición de documentos - pie', + 'Document edit - top' => 'Edición de documentos - cabecera', + 'Dominica' => 'Dominica', + 'Dominican Republic' => 'República Dominicana', + 'Ecuador' => 'Ecuador', + 'Egypt' => 'Egipto', + 'El Salvador' => 'El Salvador', + 'Email html - layout - CSS' => 'Email HTML - Interfaz - CSS', + 'Email html - layout - footer' => 'Email HTML - Interfaz - pie', + 'Email html - order confirmation - after address' => 'Email HTML - confirmación de orden - después de la dirección', + 'Email html - order notification - order product' => 'Email HTML - notificación de orden - pedir producto', + 'Email txt - order confirmation - after address' => 'Email texto - confirmación de pedido - después de la dirección', + 'Email txt - order confirmation - after products' => 'Email texto - confirmación de pedido - después de los productos', + 'Email txt - order confirmation - before address' => 'Email texto - confirmación de pedido - antes de la dirección', + 'Email txt - order confirmation - before products' => 'Email texto - confirmación de pedido - antes de los productos', + 'Email txt - order confirmation - delivery address' => 'Email texto - confirmación de pedido - dirección de entrega', + 'Email txt - order confirmation - order product' => 'Email texto - confirmación de pedido - pedido de producto', + 'Email txt - order notification - after address' => 'Email texto - notificación de pedido - después de la dirección', + 'Enable (1) or disable (0) URL rewriting' => 'Activar(1) o desactivar(0) reescritura de URL', + 'Equatorial Guinea' => 'Guinea Ecuatorial', + 'Eritrea' => 'Eritrea', + 'Estonia' => 'Estonia', + 'Ethiopia' => 'Etiopía', + 'Euro' => 'Euro', + 'Export - JavaScript' => 'Exportación - JavaScript', + 'Export - table header' => 'Exportación - encabezado de tabla', + 'Export - table row' => 'Exportación - fila de la tabla', + 'Export modal or page - bottom' => 'Modal o página de exportación - inferior', + 'Export modal or page - top' => 'Modal o página de exportación - superior', + 'Exports - JavaScript' => 'Exportar JavaScript', + 'Exports - at the bottom of a category' => 'Exportar - en la parte inferior de una categoría', + 'Exports - at the bottom of column 1' => 'Exportar - en la parte inferior de la columna 1', + 'Exports - at the top' => 'Exportar - en la parte superior', + 'Feature - Edit JavaScript' => 'Característica - Editar JavaScript', + 'Feature - Value create form' => 'Característica - Formulario para crear valor', + 'Feature - add to all form' => 'Característica - Agregar a todos los formularios', + 'Feature - create form' => 'Característica - formulario crear', + 'Feature - delete form' => 'Característica - formulario borrar', + 'Feature - remove to all form' => 'Característica - eliminar todos los formularios', + 'Feature edit - bottom' => 'Editar Característica - inferior', + 'Feature edit - top' => 'Editar Característica - superior', + 'Features - JavaScript' => 'Característica - JavaScript', + 'Features - at the top' => 'Característica - ir arriba', + 'Features - bottom' => 'Característica - inferior', + 'Features - table header' => 'Característica - Encabezado de tabla', + 'Features - table row' => 'Característica - Fila de tabla', + 'Features value - table header' => 'Valor Característica - encabezado de tabla', + 'Features value - table row' => 'Valor Característica - fila de tabla', + 'Fiji' => 'Fiji', + 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)' => 'Nombre de archivo de la vista 404 (no encontrado) en la plantilla actual (con la extensión, ej: 404.html)', + 'Filename of the error page' => 'Nombre de archivo de la página de error', + 'Finland' => 'Finlandia', + 'Folder' => 'Carpeta', + 'Folder - Edit JavaScript' => 'Carpeta - Editar JavaScript', + 'Folder - JavaScript' => 'Carpeta - JavaScript', + 'Folder - Tab' => 'Carpeta - Pestaña', + 'Folder - at the top' => 'Carpeta - ir arriba', + 'Folder - bottom' => 'Carpeta - abajo', + 'Folder - caption' => 'Carpeta - título', + 'Folder - content' => 'Carpeta - contenido', + 'Folder - header' => 'Carpeta - encabezado', + 'Folder - row' => 'Carpeta - fila', + 'Folder edit - bottom' => 'Editar carpeta - parte inferior', + 'Folder edit - right column bottom' => 'Edición de carpeta - al pie de la columna derecha', + 'Folder edit - right column top' => 'Edición de carpeta - al tope de la columna derecha', + 'Folder edit - top' => 'Edición de carpeta - superior', + 'Folder page - CSS stylesheet' => 'Página de la carpeta - hoja de estilos CSS', + 'Folder page - after javascript include' => 'Carpeta de página - después de incluir JavaScript', + 'Folder page - after javascript initialisation' => 'Carpeta de página - después de inicialización de JavaScript', + 'Folder page - after the main content area' => 'Carpeta de página - después del área de contenido principal', + 'Folder page - at the bottom' => 'Carpeta de página - al final', + 'Folder page - at the bottom of the main area' => 'Carpeta de página - al final del área principal', + 'Folder page - at the top' => 'Carpeta de página - en la parte superior', + 'Folder page - at the top of the main area' => 'Carpeta de página - en la parte superior del área principal', + 'Folder page - before the main content area' => 'Carpeta de página - antes del área de contenido principal', + 'France metropolitan' => 'Francia', + 'French 10% VAT' => 'Francés 10% de IVA', + 'French 20% VAT' => 'Francés 20% de IVA', + 'French Southern Territories' => 'Tierras Australes y Antárticas Francesas', + 'Front office integration' => 'Front office integración', + 'Gabon' => 'Gabón', + 'Gambia' => 'Gambia', + 'Georgia' => 'Georgia', + 'Germany' => 'Alemania', + 'Ghana' => 'Ghana', + 'Google Analytics block' => 'Bloque Google Analytics', + 'Greece' => 'Grecia', + 'Grenada' => 'Granada', + 'Guadeloupe' => 'Guadalupe', + 'Guatemala' => 'Guatemala', + 'Guinea' => 'Guinea', + 'Guinea-Bissau' => 'Guinea-Bissau', + 'Guyana' => 'Guyana', + 'Guyane Française' => 'Guayana Francesa', + 'HTML layout - CSS stylesheet' => 'Diseño HTML - hojas de estilo CSS', + 'HTML layout - after javascript include' => 'Diseño HTML - después de incluir javascript', + 'HTML layout - after the main content area' => 'Diseño HTML - después del área de contenido principal', + 'HTML layout - after the opening of the body tag' => 'Diseño HTML - después de la etiqueta body de apertura', + 'HTML layout - after the opening of the head tag' => 'Diseño HTML - después de la etiqueta head de apertura', + 'HTML layout - at the bottom of the header' => 'Diseño HTML - en la parte inferior de la cabecera', + 'HTML layout - at the top of the footer' => 'Diseño HTML - en la parte superior del pie de página', + 'HTML layout - at the top of the header' => 'Diseño HTML - en la parte superior de la cabecera', + 'HTML layout - before the end body tag' => 'Diseño HTML - antes de la etiqueta body de cierre', + 'HTML layout - before the end of the head tag' => 'Diseño HTML - antes de la etiqueta head de cierre', + 'HTML layout - before the main content area' => 'Diseño HTML - antes el área de contenido principal', + 'HTML layout - bottom of the footer' => 'Diseño HTML - parte inferior del pie de página', + 'HTML layout - footer body' => 'Diseño HTML - cuerpo del pie de página', + 'HTML layout - javascript initialization' => 'Diseño HTML - inicialización de JavaScript', + 'HTML layout - primary navigation' => 'Diseño HTML - navegación principal', + 'HTML layout - secondary navigation' => 'Diseño HTML - navegación secundaria', + 'Haiti' => 'Haití', + 'Home - JavaScript' => 'Inicio - JavaScript', + 'Home - at the top' => 'Inicio - en la parte superior', + 'Home - block' => 'Inicio - bloque', + 'Home - bottom' => 'Inicio - fondo', + 'Home page - CSS stylesheet' => 'Página de inicio - hoja de estilos CSS', + 'Home page - after javascript include' => 'Página de inicio - después de incluir JavaScript', + 'Home page - after javascript initialisation' => 'Página de inicio - después de la inicialización de JavaScript', + 'Home page - main area' => 'Página de inicio - Área Principal', + 'Honduras' => 'Honduras', + 'Hong Kong' => 'Hong Kong', + 'Hong Kong Dollar' => 'Dólar de Hong Kong', + 'Hook - Edit JavaScript' => 'Hook - editar JavaScript', + 'Hook edit - bottom' => 'Edición de Hook - inferior', + 'Hook edit - top' => 'Edición de Hook - superior', + 'Hook positions' => 'Posiciones de hook', + 'Hooks' => 'Hooks', + 'Hooks - JavaScript' => 'Hooks - JavaScript', + 'Hooks - at the top' => 'Hooks - en la parte superior', + 'Hooks - bottom' => 'Hooks - inferior', + 'Hooks - table header' => 'Hooks - encabezado de tabla', + 'Hooks - table row' => 'Hooks - fila de la tabla', + 'Hooks management' => 'Gestión de Hooks', + 'How document files are delivered in the web space (symlink or copy)' => 'Cómo los documento son enviados en el espacio de la web (enlace o copia)', + 'How original (full resolution) images are delivered in the web space (symlink or copy)' => 'Cómo se entregan imágenes originales (resolución completa) en el espacio de la web (enlace o copia)', + 'Hungary' => 'Hungría', + 'Iceland' => 'Islandia', + 'Image - Edit JavaScript' => 'Imagen - Editar JavaScript', + 'Image edit - bottom' => 'Edición de imagen - parte inferior', + 'Image edit - top' => 'Edición de imagen - parte superior', + 'Import - table header' => 'Importar - encabezado de tabla', + 'Import - table row' => 'Importar - fila de la tabla', + 'India' => 'India', + 'Indonesia' => 'Indonesia', + 'Invoice - After delivery module' => 'Factura - Después de módulo de entrega de factura', + 'Invoice - After payment module' => 'Factura - Después de módulo de pago de factura', + 'Invoice - CSS' => 'Factura - CSS', + 'Invoice - additional product information' => 'Factura - información adicional del producto', + 'Invoice - after addresse area' => 'Factura - después del área de dirección', + 'Invoice - after product listing' => 'Factura - después de listado de productos', + 'Invoice - after the information area' => 'Factura - después del área de información', + 'Invoice - after the order summary' => 'Factura - después del resumen de la orden', + 'Invoice - at the bottom of information area' => 'Factura - en la parte inferior del área de la información', + 'Invoice - at the bottom of the footer' => 'Factura - en la parte inferior del pie de página', + 'Invoice - at the top of the footer' => 'Factura - en la parte superior del pie de página', + 'Invoice - delivery address' => 'Factura - dirección de envío', + 'Invoice - imprint' => 'Factura - pie de imprenta', + 'Invoice - in the header' => 'Factura - en la cabecera', + 'Invoice choice - CSS stylesheet' => 'Opción de factura - hoja de estilos CSS', + 'Invoice choice - after javascript include' => 'Opción de factura - después de incluir javascript', + 'Invoice choice - after javascript initialisation' => 'Opción de factura - después de la inicialización de javascript', + 'Invoice choice - at the bottom' => 'Opción de factura - en la parte inferior de la factura', + 'Invoice choice - at the top' => 'Opción de factura - en la parte superior', + 'Invoice choice - delivery address' => 'Opción de factura - dirección de envío', + 'Invoice choice - extra payment zone' => 'Opción de factura - zona de pago extra', + 'Iran' => 'Irán', + 'Iraq' => 'Iraq', + 'Ireland' => 'Irlanda', + 'Israel' => 'Israel', + 'Italy' => 'Italia', + 'Ivory Coast' => 'Costa de Marfil', + 'Jamaica' => 'Jamaica', + 'Japan' => 'Japón', + 'Jordan' => 'Jordania', + 'Kazakhstan' => 'Kazajstán', + 'Kenya' => 'Kenia', + 'Kiribati' => 'Kiribati', + 'Kuwait' => 'Kuwait', + 'Kyrgyzstan' => 'Kirguistán', + 'Language - create form' => 'Idioma - formulario de creación', + 'Languages - JavaScript' => 'Idiomas - JavaScript', + 'Languages - at the top' => 'Idiomas - en la parte superior', + 'Languages - bottom' => 'Idiomas - parte inferior', + 'Languages - delete form' => 'Idiomas - Formulario de borrar', + 'Languages block' => 'Bloque de idiomas', + 'Laos' => 'Laos', + 'Latvia' => 'Letonia', + 'Layout - Before the main content' => 'Diseño - antes el contenido principal', + 'Layout - CSS' => 'Diseño - CSS', + 'Layout - JavaScript' => 'Diseño - JavaScript', + 'Layout - after footer' => 'Diseño - después de pie de página', + 'Layout - after top bar' => 'Diseño - después de la barra superior', + 'Layout - after top menu' => 'Diseño - después del menú principal', + 'Layout - at the bottom of the top bar' => 'Diseño - en la parte inferior de la barra superior', + 'Layout - at the top of the top bar' => 'Diseño - en la parte superior de la barra superior', + 'Layout - before footer' => 'Diseño - antes del pie de página', + 'Layout - before top menu' => 'Diseño - antes del menú principal', + 'Layout - before topbar' => 'Diseño - antes de la barra superior', + 'Layout - in footer' => 'Diseño - en el pie de página', + 'Layout - in the menu catalog' => 'Diseño - en el menú de catálogo', + 'Layout - in the menu configuration' => 'Diseño - en el menú de configuración', + 'Layout - in the menu customers' => 'Diseño - en el menú de cliente', + 'Layout - in the menu folders' => 'Diseño - en el menú de carpetas', + 'Layout - in the menu modules' => 'Diseño - en el menú de módulos', + 'Layout - in the menu orders' => 'Diseño - en el menú de pedidos', + 'Layout - in the menu tools' => 'Diseño - en el menú de herramientas', + 'Layout - in top menu items' => 'Diseño - en la parte superior del menú artículos', + 'Layout - inside top bar' => 'Diseño - en la barra superior', + 'Leave the default configuration of session' => 'Abandonde la configuración predeterminada de la sesión', + 'Lebanon' => 'Líbano', + 'Lesotho' => 'Lesoto', + 'Liberia' => 'Liberia', + 'Libya' => 'Libia', + 'Liechtenstein' => 'Liechtenstein', + 'Life time of the cart cookie in the customer browser, in seconds' => 'Tiempo de vida de la cookie del carro en el navegador del cliente, en segundos', + 'Life time of the session cookie in the customer browser, in seconds' => 'Tiempo de vida de la cookie de la sesión en el navegador del cliente, en segundos', + 'Links block' => 'Bloque de enlaces', + 'Lithuania' => 'Lituania', + 'Logging system configuration' => 'Configuración de sistema de registro', + 'Login page - CSS stylesheet' => 'Página de inicio de sesión - hoja de estilos CSS', + 'Login page - after javascript include' => 'Página de inicio de sesión - después de incluir JavaScript', + 'Login page - after javascript initialisation' => 'Página de inicio de sesión - después de la inicialización de JavaScript', + 'Login page - at the bottom' => 'Página de inicio de sesión - en la parte inferior', + 'Login page - at the bottom of the form' => 'Página de inicio de sesión - en la parte inferior del formulario', + 'Login page - at the bottom of the main area' => 'Página de inicio de sesión - en la parte inferior del área principal', + 'Login page - at the top' => 'Página de inicio de sesión - en la parte superior', + 'Login page - at the top of the form' => 'Página de inicio de sesión - en la parte superior del formulario', + 'Login page - at the top of the main area' => 'Página de inicio de sesión - en la parte superior del área principal', + 'Logs - JavaScript' => 'Registros - JavaScript', + 'Logs - at the top' => 'Registros - en la parte superior', + 'Logs - bottom' => 'Registros - inferior', + 'Lost password - CSS stylesheet' => 'Contraseña perdida - hoja de estilos CSS', + 'Lost password - after javascript include' => 'Contraseña perdida - después de incluir javascript', + 'Lost password - at the bottom' => 'Contraseña perdida - en la parte inferior', + 'Lost password - at the bottom of the form' => 'Contraseña perdida - en la parte inferior del formulario', + 'Lost password - at the top' => 'Contraseña perdida - en la parte superior', + 'Lost password - at the top of the form' => 'Contraseña perdida - en la parte superior del formulario', + 'Lost password - javascript initialization' => 'Contraseña perdida - inicialización de JavaScript', + 'Luxembourg' => 'Luxemburgo', + 'Macedonia' => 'Macedonia', + 'Madagascar' => 'Madagascar', + 'Mail sent after a subscription to newsletter' => 'Correo enviado después de la suscripción al boletín de noticias', + 'Mail sent to an administrator who requested a new password' => 'Correo enviado a un administrador que ha solicitado una nueva contraseña', + 'Mail sent to the customer when its account is created by an administrator in the back-office' => 'Correo enviado al cliente cuando se crea su cuenta por un administrador en el back-office', + 'Mail sent to the customer when its password or email is changed in the back-office' => 'Correo enviado al cliente cuando se cambia su contraseña o correo electrónico en el back-office', + 'Mailing system - JavaScript' => 'Sistema de correo - JavaScript', + 'Mailing system - at the top' => 'Sistema de correo - en la parte superior', + 'Mailing system - bottom' => 'Sistema de correo - fondo', + 'Malawi' => 'Malawi', + 'Malaysia' => 'Malasia', + 'Maldives' => 'Maldivas', + 'Mali' => 'Malí', + 'Malta' => 'Malta', + 'Marshall Islands' => 'Marshall', + 'Martinique' => 'Martinica', + 'Mauritania' => 'Mauritania', + 'Mauritius' => 'Mauricio', + 'Mayotte' => 'Mayotte', + 'Message - Edit JavaScript' => 'Mensaje - Editar JavaScript', + 'Message - create form' => 'Mensaje - formulario de creación', + 'Message - delete form' => 'Mensaje - formulario de borrado', + 'Message edit - bottom' => 'Editar mensaje - base', + 'Message edit - top' => 'Editar mensaje - tope', + 'Message sent to the shop owner when a new order is placed' => 'Mensaje enviado al propietario de la tienda cuando se envía una nueva orden', + 'Messages - JavaScript' => 'Mensajes - JavaScript', + 'Messages - at the top' => 'Mensajes - al tope', + 'Messages - bottom' => 'Mensajes - base', + 'Messages - table header' => 'Mensajes - encabezado de la tabla', + 'Messages - table row' => 'Mensajes - fila de la tabla', + 'Mexico' => 'Méjico', + 'Micronesia' => 'Micronesia', + 'Mini cart' => 'Mini tarjeta', + 'Miss' => 'Señorita', + 'Miss_short' => 'Señorita', + 'Misses' => 'Señora', + 'Mister' => 'Señor', + 'Module - Edit JavaScript' => 'Módulo - Editar JavaScript', + 'Module - configuration' => 'Módulo - configuración', + 'Module - configuration JavaScript' => 'Módulo - configuración de JavaScript', + 'Module edit - bottom' => 'Edición de módulo - base', + 'Module edit - top' => 'Edición de módulo - tope', + 'Modules - JavaScript' => 'Módulos - JavaScript', + 'Modules - at the top' => 'Módulos - al inicio', + 'Modules - bottom' => 'Módulos - base', + 'Modules - table header' => 'Módulos - encabezado de la tabla', + 'Modules - table row' => 'Módulos - fila de la tabla', + 'Modules maagement' => 'Administración de módulos', + 'Modules management' => 'Administración de módulos', + 'Moldova' => 'Moldova', + 'Monaco' => 'Mónaco', + 'Mongolia' => 'Mongolia', + 'Morocco' => 'Marruecos', + 'Mozambique' => 'Mozambique', + 'Mr.' => 'Sr.', + 'Mrs' => 'Sra', + 'Name of the active PDF template' => 'Nombre de la plantilla PDF activa', + 'Name of the active back-office template' => 'Nombe de la plantilla del administrador activo', + 'Name of the active front-office template' => 'Nombre de la plantilla activa de recepción', + 'Name of the active mailing template' => 'Nombre de la plantilla de correo activa', + 'Name of the cart cookie' => 'Nombre de la cookie del carrito', + 'Name of the delivery view in the current PDF template (without extension)' => 'Nombre de la vista de entrega en la plantilla PDF actual (sin extensión)', + 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)' => 'Nombre del controlador gráfico usado por la Librería Imagine (ver https://imagine.readthedocs.org)', + 'Name of the invoice view in the current PDF template (without extension)' => 'Nombre de la vista para la factura en la plantilla PDF actual (sin extensión)', + 'Name of the template view returned when an obsolete (or inactive) product URL is invoked' => 'Nombre de la plantilla regresada cuando se llama una URL obsoleta (o inactiva) de un producto', + 'Name the cart cookie' => 'Nombre la cookie de carrito', + 'Namibia' => 'Namibia', + 'Nauru' => 'Nauru', + 'Navigation block' => 'Bloque de navegación', + 'Nepal' => 'Nepal', + 'Netherlands' => 'Países Bajos', + 'New Products block' => 'Bloque de nuevos productos', + 'New York' => 'Nueva York', + 'New Zealand' => 'Nueva Zelandia', + 'New order {$order_ref} placed on {config key="store_name"}' => 'Nueva orden {$order_ref} ubicada en {tecla config = "store_name"}', + 'New password request on {config key="store_name"}' => 'Nueva contraseña solicitada en {config key="store_name"}', + 'Newsletter block' => 'Bloque del boletín de noticias', + 'Newsletter page - CSS stylesheet' => 'Página del boletín de noticias - hoja de estilos CSS', + 'Newsletter page - after javascript include' => 'Página del boletín de noticias - después de incluir JavaScript', + 'Newsletter page - after javascript initialisation' => 'Página del boletín de noticias - después de la inicialización de JavaScript', + 'Newsletter page - at the bottom' => 'Página del boletín de noticias - en la parte inferior', + 'Newsletter page - at the top' => 'Página del boletín de noticias - en la parte superior', + 'Newsletter subscription confirmation mail' => 'Confirmación de suscripción por correo al boletín', + 'Newsletter unsubscribe page - CSS stylesheet' => 'Página de baja del boletín - Hoja de estilos CSS', + 'Newsletter unsubscribe page - after javascript include' => 'Página de baja del boletín - después de incluir JavaScript', + 'Newsletter unsubscribe page - after javascript initialisation' => 'Página de baja del boletín - después de la inicialización de JavaScript', + 'Newsletter unsubscribe page - at the bottom' => 'Página de baja del boletín - al pie', + 'Newsletter unsubscribe page - at the top' => 'Página de baja del boletín - en la parte superior', + 'Nicaragua' => 'Nicaragua', + 'Niger' => 'Níger', + 'Nigeria' => 'Nigeria', + 'Niue' => 'Niue', + 'North Korea' => 'Corea del Norte', + 'Norway' => 'Noruega', + 'Not paid' => 'No pagados', + 'Nouvelle-Calédonie' => 'Nouvelle-Calédonie', + 'Number by default of results per page for customer list' => 'Número predeterminado de resultados por página para la lista de clientes', + 'Number by default of results per page for order list' => 'Número predeterminado de resultados por página para la lista de pedidos', + 'Number by default of results per page for product list' => 'Número predeterminado de resultados por página para la lista de productos', + 'Oman' => 'Omán', + 'Order' => 'Pedido', + 'Order - After closing product row' => 'Orden - después de cerrar la fila de producto', + 'Order - After product list' => 'Orden - después de la lista de productos', + 'Order - Before product list' => 'Orden - antes de la lista de productos', + 'Order - Before starting product row' => 'Orden - antes de comenzar la fila de producto', + 'Order - Edit JavaScript' => 'Orden - editar JavaScript', + 'Order - Tab' => 'Orden - Pestaña', + 'Order - bill bottom' => 'Orden - parte inferior de la cuenta', + 'Order - bill top' => 'Orden - parte superior de la cuenta', + 'Order - cart bottom' => 'Orden - parte inferior del carro', + 'Order - cart top' => 'Orden - parte superior del carro', + 'Order - content' => 'Orden - contenido', + 'Order - customer information bottom' => 'Orden - parte inferior de información del cliente', + 'Order - delivery module bottom' => 'Orden - parte inferior del módulo de entrega', + 'Order - payment module bottom' => 'Orden - parte inferior del módulo de pago', + 'Order - product list' => 'Orden - lista de productos', + 'Order - table header' => 'Orden - encabezado de tabla', + 'Order - table row' => 'Orden - fila de la tabla', + 'Order confirmation - after the order summary' => 'Confirmación de la orden - después del Resumen de la orden', + 'Order confirmation sent to the customer' => 'Confirmación de la orden enviada al cliente', + 'Order details - CSS stylesheet' => 'Detalles de la Orden - hoja de estilos CSS', + 'Order details - additional delivery information' => 'Detalles de la Orden - información adicional del envío', + 'Order details - additional information' => 'Detalles de la Orden - información adicional', + 'Order details - additional invoice information' => 'Detalles de la Orden - información adicional de la factura', + 'Order details - additional product information' => 'Detalles de la Orden - información adicional del producto', + 'Order details - after addresses' => 'Detalles de la Orden - después de direcciones', + 'Order details - after delivery address' => 'Detalles de pedido - después de la dirección de entrega', + 'Order details - after global information' => 'Detalles de la orden - después de la información global', + 'Order details - after invoice address' => 'Detalles de pedido - después de la dirección de facturación', + 'Order details - after javascript include' => 'Detalles de la orden - después de incluir JavaScript', + 'Order details - after product' => 'Detalles de la orden - después del producto', + 'Order details - after products' => 'Detalles de la orden - después de los productos', + 'Order details - after products list' => 'Detalles de la orden - después de la lista de productos', + 'Order details - at the bottom' => 'Detalles de la orden - en la parte inferior', + 'Order details - at the top' => 'Detalles de la orden - en la parte superior', + 'Order details - before products list' => 'Detalles de la orden - antes de lista de productos', + 'Order details - delivery address' => 'Pedir detalles - dirección de envío', + 'Order details - invoice address' => 'Detalles de la orden - dirección de factura', + 'Order details - javascript initialization' => 'Detalles de la Orden - inicialización de JavaScript', + 'Order edit - bottom' => 'Editar Orden - parte inferior', + 'Order edit - delivery address' => 'Editar Orden - dirección de envío', + 'Order edit - displayed after product information' => 'Edición de Pedido - se muestra después de la información de producto', + 'Order edit - order product table header' => 'Edición de Pedido - encabezado de la tabla de pedido de producto', + 'Order edit - order product table row' => 'Edición de Pedido - fila de la tabla del pedido de producto', + 'Order edit - top' => 'Edición de Pedido - al tope', + 'Order failed - CSS stylesheet' => 'Pedido erróneo - Hoja de Estilos CSS', + 'Order failed - after javascript include' => 'Pedido erróneo - después de incluir JavaScript', + 'Order failed - after javascript initialisation' => 'Pedido erróneo - después de la inicialización de JavaScript', + 'Order failed - at the bottom' => 'Pedido erróneo - al pie', + 'Order failed - at the top' => 'Pedido erróneo - al tope', + 'Orders - JavaScript' => 'Pedidos - JavaScript', + 'Orders - at the top' => 'Pedidos - encabezado', + 'Orders - bottom' => 'Pedidos - pie de página', + 'Orders - table header' => 'Pedidos - encabezado de tabla', + 'Orders - table row' => 'Pedidos - fila de tabla', + 'Page 404 - CSS stylesheet' => 'Página 404 - CSS Hoja de estilos', + 'Page 404 - after javascript include' => 'Página 404 - después de incluir JavaScript', + 'Page 404 - after javascript initialisation' => 'Página 404 - después de inicializar JavaScript', + 'Page 404 - content area' => 'Página 404 - área de contenido', + 'Paid' => 'Pagado', + 'Pakistan' => 'Pakistán', + 'Panama' => 'Panamá', + 'Papua Nueva Guinea' => 'Papua Nueva Guinea', + 'Paraguay' => 'Paraguay', + 'Path to the directory where documents are stored' => 'Ruta al directorio donde los documentos estén guardados', + 'Path to the directory where images are stored' => 'Ruta al directorio donde las imágenes estén guardadas', + 'Pay by cheque' => 'Pagar con Cheque', + 'Payment failed - CSS stylesheet' => 'Pago erróneo - Hoja de Estilos CSS', + 'Payment failed - after javascript include' => 'Pago erróneo - después de incluir JavaScript', + 'Payment failed - javascript initialization' => 'Pago erróneo - inicialización de JavaScript', + 'Payment gateway - CSS stylesheet' => 'Pasarela de pago - Hoja de estilos CSS', + 'Payment gateway - after javascript include' => 'Pasarela de pago - después de incluir JavaScript', + 'Payment gateway - after javascript initialisation' => 'Pasarela de pago - después de inicializar JavaScript', + 'Payment gateway - javascript' => 'Pasarela de pago - JavaScript', + 'Payment gateway - main area' => 'Pasarela de pago - área principal', + 'Peru' => 'Perú', + 'Philippines' => 'Filipinas', + 'Placed order - CSS stylesheet' => 'Orden registrada - Hoja de estilo CSS', + 'Placed order - after javascript include' => 'Orden registrada - después del javascript include', + 'Placed order - after javascript initialisation' => 'Orden registrada - después de la inicialización de Javascript', + 'Placed order - main area' => 'Orden registrada - área principal', + 'Poland' => 'Polonia', + 'Polynésie française' => 'Polinesia Francesa', + 'Portugal' => 'Portugal', + 'Processing' => 'Procesando', + 'Product' => 'Producto', + 'Product - Edit JavaScript' => 'Producto - Editar JavaScript', + 'Product - Tab' => 'Producto - Pestaña', + 'Product - accessories table header' => 'Producto - encabezado de la tabla accesoria', + 'Product - accessories table row' => 'Producto - fila de la tabla de accesorios', + 'Product - after combinations' => 'Producto - después de las combinaciones', + 'Product - at the bottom of a product combination' => 'Producto - al pie de la combinación de un producto', + 'Product - attributes table header' => 'Producto - encabezado de la tabla de atributos', + 'Product - attributes table row' => 'Producto - fila de la tabla de atributos', + 'Product - before combinations' => 'Producto - después de las combinaciones', + 'Product - categories table header' => 'Producto - encabezado de la tabla de categorías', + 'Product - categories table row' => 'Producto - fila de la tabla de categorías', + 'Product - combination delete form' => 'Producto - Formulario para borrar combinaciones', + 'Product - combinations list caption' => 'Producto - título de la lista de combinaciones', + 'Product - content' => 'Producto - contenido', + 'Product - contents table header' => 'Producto - contenidos del encabezado de tabla', + 'Product - contents table row' => 'Producto - contenidos de la fila de la tabla', + 'Product - create form' => 'Producto - formulario de creación', + 'Product - delete form' => 'Producto - formulario de borrado', + 'Product - details pricing form' => 'Producto - formato de detalles del precio', + 'Product - details promotion form' => 'Producto - formulario de detalles de la promoción', + 'Product - features table row' => 'Producto - fila de la tabla de características', + 'Product - features-table-header' => 'Producto - encabezado de la tabla de características', + 'Product - folders table header' => 'Producto - encabezado de la tabla de carpetas', + 'Product - folders table row' => 'Producto - fila de la tabla de carpetas', + 'Product - stock edit form' => 'Producto - Editar formulario de stock', + 'Product edit - bottom' => 'Editar producto - parte inferior', + 'Product edit - right column bottom' => 'Edición de producto - al pie de la columna derecha', + 'Product edit - right column top' => 'Edición de producto - encabezado de la columna derecha', + 'Product edit - top' => 'Editar producto - parte superior', + 'Product loop - at the bottom' => 'Ciclo del producto - en la parte inferior', + 'Product loop - at the top' => 'Ciclo del producto - en la parte superior', + 'Product page - CSS stylesheet' => 'Página de producto - hoja de estilos CSS', + 'Product page - On the bottom of the form' => 'Página del producto - en la parte inferior del formulario', + 'Product page - On the top of the form' => 'Página de producto - en la parte superior del formulario', + 'Product page - additional information' => 'Página de producto - información adicional', + 'Product page - after javascript include' => 'Página de producto - después de incluir JavaScript', + 'Product page - after javascript initialisation' => 'Página de producto - después de la inicialización de Javascript', + 'Product page - at the bottom' => 'Página de producto - en la parte inferior', + 'Product page - at the bottom of the detail area' => 'Página de producto - en la parte inferior del área de detalle', + 'Product page - at the top' => 'Página de producto - en la parte superior', + 'Product page - at the top of the detail' => 'Página de producto - en la parte superior del detalle', + 'Product page - photo gallery' => 'Página de producto - Galería de fotos', + 'Products - caption' => 'Productos - leyenda', + 'Products - header' => 'Productos - encabezado', + 'Products - row' => 'Productos - fila', + 'Products offer block' => 'Bloque de oferta de productos', + 'Profile - Edit JavaScript' => 'Perfil - editar JavaScript', + 'Profile - create form' => 'Perfil - formulario de alta', + 'Profile - delete form' => 'Perfil - formulario de borrado', + 'Profile - table header' => 'Perfil - encabezado de tabla', + 'Profile - table row' => 'Perfil - fila de la tabla', + 'Profile edit - bottom' => 'Editar Perfil - parte inferior', + 'Profile edit - top' => 'Editar Perfil - parte superior', + 'Profiles - JavaScript' => 'Perfiles - JavaScript', + 'Profiles - at the top' => 'Perfiles - en la parte superior', + 'Profiles - bottom' => 'Perfiles - parte inferior', + 'Qatar' => 'Qatar', + 'Refunded' => 'Reembolsado', + 'Register - CSS stylesheet' => 'Registro - hoja de estilos CSS', + 'Register - after javascript include' => 'Registro - después de incluir JavaScript', + 'Register - after javascript initialisation' => 'Registro - después de la inicialización de JavaScript', + 'Register - at the bottom' => 'Registro - en la parte inferior', + 'Register - at the bottom of the form' => 'Registro - en la parte inferior del formulario', + 'Register - at the top' => 'Registro - en la parte superior', + 'Register - at the top of the form' => 'Registro - en la parte superior del formulario', + 'Romania' => 'Rumania', + 'Russia' => 'Rusia', + 'Rwanda' => 'Ruanda', + 'Réunion(La)' => 'Réunion(la)', + 'Saint Barthélemy' => 'San Bartolomé', + 'Saint Kitts and Nevis' => 'San Cristóbal', + 'Saint Lucia' => 'Santa Lucía', + 'Saint Martin (French part)' => 'San Martín (parte francesa)', + 'Saint Vincent and the Grenadines' => 'San Vicente y las Granadinas', + 'Sale - CSS stylesheet' => 'Venta - Hoja de estilos CSS', + 'Sale - after javascript include' => 'Venta - después de incluir JavaScript', + 'Sale - after the main content area' => 'Venta - después del área de contenido principal', + 'Sale - at the bottom' => 'Venta - al pie', + 'Sale - at the bottom of the main area' => 'Venta - al pie del área principal', + 'Sale - at the top' => 'Venta - encabezado', + 'Sale - at the top of the main area' => 'Venta - encabezado del área principal', + 'Sale - before the main content area' => 'Venta - antes del área de contenido principal', + 'Sale - create form' => 'Venta - formulario de creación', + 'Sale - delete form' => 'Venta - formulario de borrado', + 'Sale - javascript initialization' => 'Venta - inicialización de JavaScript', + 'Sale edit - bottom' => 'Editar Venta - parte inferior', + 'Sale edit - top' => 'Editar Venta - parte superior', + 'Sale edit page - javascript last call block' => 'Página de edición de Venta - última bloque de llamada JavaScript', + 'Sales - JavaScript' => 'Ventas - JavaScript', + 'Sales - at the bottom' => 'Ventas - en la parte inferior', + 'Sales - at the top' => 'Ventas - en la parte superior', + 'Sales - table header' => 'Ventas - encabezado de tabla', + 'Sales - table row' => 'Ventas - fila de la tabla', + 'Sales management' => 'Administración de ventas', + 'San Marino' => 'San Marino', + 'Sao Tome and Principe' => 'Santo Tomé y Príncipe', + 'Saudi Arabia' => 'Arabia Saudita', + 'Search' => 'Buscar', + 'Search - JavaScript' => 'Búsqueda - JavaScript', + 'Search - at the top' => 'Búsqueda - al inicio', + 'Search - bottom' => 'Búsqueda - base', + 'Search block' => 'Bloque de búsqueda', + 'Search page - CSS stylesheet' => 'Página de búsqueda - Hoja de Estilos en Cascada', + 'Search page - after javascript include' => 'Página de búsqueda - después de incluir JavaScript', + 'Search page - after javascript initialisation' => 'Página de búsqueda - después de inicializar JavaScript', + 'Secret key for form CSRF token' => 'Clave secreta para el token CSRF del formulario', + 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)' => 'Enviar un correo de confirmación a los suscriptores del boletín (1 = sí, 0 = no)', + 'Senegal' => 'Senegal', + 'Sent' => 'Enviado', + 'Seychelles' => 'Seychelles', + 'Shipping configuration' => 'Configuración de envío', + 'Shipping configuration - Edit' => 'Configuración de envío - Editar', + 'Shipping configuration - Edit JavaScript' => 'Configuración de envío - Editar JavaScript', + 'Shipping configuration - JavaScript' => 'Configuración de envío - JavaScript', + 'Shipping configuration - at the top' => 'Configuración de envío - al inicio', + 'Shipping configuration - bottom' => 'Configuración de envío - base', + 'Shipping configuration - country delete form' => 'Configuración de envío - formulario de borrado de país', + 'Shipping configuration - create form' => 'Configuración de envío - formulario de creación', + 'Shipping configuration - delete form' => 'Configuración de envío - formulario de borrado', + 'Shipping configuration - table header' => 'Configuración de envío - encabezado de tabla', + 'Shipping configuration - table row' => 'Configuración de envío - fila de tabla', + 'Shipping configuration edit - bottom' => 'Configuración de envío - base', + 'Shipping configuration edit - top' => 'Configuración de envío - inicio', + 'Shipping zones edit - bottom' => 'Edición zonas de envío - base', + 'Shipping zones edit - top' => 'Edición zonas de envío - inicio', + 'Show error message instead of a white page on a server error' => 'Mostrar mensaje de error en lugar de una página en blanco cuando ocurre un error de servidor', + 'Sierra Leone' => 'Sierra Leona', + 'Singapore' => 'Singapur', + 'Sitemap - at the bottom' => 'Mapa de sitio - en la base', + 'Slovakia' => 'Eslovaquia', + 'Slovenia' => 'Eslovenia', + 'Smarty template engine integration' => 'Integración del motor de plantillas Smarty', + 'Social Networks block' => 'Bloque de Redes Sociales', + 'Solomon Islands' => 'Salomón', + 'Somalia' => 'Somalia', + 'South Africa' => 'Sudáfrica', + 'South Korea' => 'Corea del Sur', + 'Spain' => 'España', + 'Sri Lanka' => 'Sri Lanka', + 'St Pierre et Miquelon' => 'San Pedro y Miquelón', + 'Store Information - JavaScript' => 'Información de tienda - JavaScript', + 'Store information configuration' => 'Configuración de la información de tienda', + 'Sudan' => 'Sudán', + 'Suriname' => 'Suriname', + 'Swaziland' => 'Swazilandia', + 'Sweden' => 'Suecia', + 'Switzerland' => 'Suiza', + 'Syria' => 'Siria', + 'System - logs JavaScript' => 'Sistema - registros de JavaScript', + 'Tab SEO - bottom' => 'Ficha SEO - abajo', + 'Tab SEO - top' => 'Ficha SEO - arriba', + 'Tab SEO - update form' => 'Ficha SEO - formato de actualización', + 'Tab document - bottom' => 'Ficha de documento - abajo', + 'Tab document - top' => 'Ficha de documento - arriba', + 'Tab image - bottom' => 'Pestaña de imagen - abajo', + 'Tab image - top' => 'Pestaña de imagen - arriba', + 'Tajikistan' => 'Tayikistán', + 'Tanzania' => 'Tanzanía', + 'Tax - Edit JavaScript' => 'Editar JavaScript', + 'Tax - create form' => 'Impuesto - formulario de creación', + 'Tax - delete form' => 'Impuesto - formulario de borrado', + 'Tax edit - bottom' => 'Editar Impuesto - base', + 'Tax edit - top' => 'Editar Impuesto - parte superior', + 'Tax rule edit - bottom' => 'Editar regla de Impuesto - base', + 'Tax rule edit - top' => 'Edición de regla de impuesto - parte superior', + 'Tax rules configuration' => 'Configuración de las reglas de impuestos', + 'Taxes - update form' => 'Impuestos - formulario de actualización', + 'Taxes rules - JavaScript' => 'Reglas de impuestos - JavaScript', + 'Taxes rules - at the top' => 'Reglas de impuestos - en la parte superior', + 'Taxes rules - bottom' => 'Reglas de impuestos - parte inferior', + 'Template - Edit JavaScript' => 'Plantilla - editar JavaScript', + 'Template - attributes table header' => 'Plantilla - cabecera de la tabla de atributos', + 'Template - attributes table row' => 'Plantilla - fila de la tabla de atributos', + 'Template - create form' => 'Plantilla - formulario de creación', + 'Template - delete form' => 'Plantilla - formulario de borrado', + 'Template - features table row' => 'Plantilla - fila de la tabla de características', + 'Template - features-table-header' => 'Plantilla - encabezado de tabla de características', + 'Template edit - bottom' => 'Editar plantilla - parte inferior', + 'Template edit - top' => 'Editar plantilla - parte superior', + 'Templates - JavaScript' => 'Plantillas - JavaScript', + 'Templates - at the top' => 'Plantillas - en la parte superior', + 'Templates - bottom' => 'Plantillas - parte inferior', + 'Templates - table header' => 'Plantillas - encabezado de tabla', + 'Templates - table row' => 'Plantillas - fila de la tabla', + 'Thailand' => 'Tailandia', + 'The ID of the \'Terms & Conditions\' content.' => 'El ID de los contenidos de \'Términos y condiciones\'.', + 'The ID of the folder containing your information pages : terms, imprint, ...' => 'El ID de la carpeta que contiene sus páginas de información: términos, impresión,...', + 'The Vatican' => 'El Vatican', + 'The default quality (in %) of the generated images' => 'La calidad por defecto (en %) de las imágenes generadas', + 'The minimum length required for an administrator password' => 'La longitud mínima de la contraseña de administrador', + 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country' => 'La ruta (relativa a la plantilla de back office por defecto) a la imagen que se utiliza cuando no se puede encontrar ninguna imagen de la bandera para un país', + 'The path to the document cache directory in the web space' => 'La ruta al directorio de caché de documentos en el espacio web', + 'The path to the image cache directory in the web space' => 'La ruta de acceso para el directorio de caché de imagen en el espacio web', + 'TinyMCE WYSIWYG editor' => 'Editor TinyMCE WYSIWYG', + 'Togo' => 'Togo', + 'Tonga' => 'Tonga', + 'Tools - JavaScript' => 'Herramientas - JavaScript', + 'Tools - at the bottom of column 1' => 'Herramientas - en la parte inferior de la columna 1', + 'Tools - at the top' => 'Herramientas - en la parte superior', + 'Tools - at the top of the column' => 'Herramientas - en la parte superior de la columna', + 'Tools - bottom' => 'Herramientas - parte inferior', + 'Tools panel' => 'Panel de herramientas', + 'Translations' => 'Traducciones', + 'Translations - JavaScript' => 'Traducciones - JavaScript', + 'Trinidad and Tobago' => 'Trinidad y Tabago', + 'Tunisia' => 'Túnez', + 'Turkey' => 'Turquía', + 'Turkmenistan' => 'Turkmenistán', + 'Tuvalu' => 'Tuvalu', + 'UK Pound' => 'Libra Reino Unido', + 'Ukraine' => 'Ucrania', + 'United Arab Emirates' => 'Emiratos Árabes Unidos', + 'United Kingdom' => 'Reino Unido', + 'United States Dollar' => 'Dólar Estadunidense', + 'Update customer account - CSS stylesheet' => 'Actualización de cuenta del cliente - Hoja de estilos CSS', + 'Update customer account - after javascript include' => 'Actualización de cuenta del cliente - después de incluir JavaScript', + 'Update customer account - after javascript initialisation' => 'Actualización de cuenta de cliente - después de inicializar JavaScript', + 'Update customer account - at the bottom' => 'Actualización de cuenta de cliente - al pie', + 'Update customer account - at the bottom of the form' => 'Actualización de cuenta de cliente - al pie del formulario', + 'Update customer account - at the top' => 'Actualización de cuenta de cliente - encabezado', + 'Update customer account - at the top of the form' => 'Actualización de cuenta de cliente - encabezado del formulario', + 'Uruguay' => 'Uruguay', + 'Use a persistent cookie to keep track of customer cart' => 'Usa una \'cookie\' persistente para mantener el trayecto del carrito del cliente', + 'Uzbekistan' => 'Uzbekistán', + 'Vanuatu' => 'Vanuatu', + 'Variable - Edit JavaScript' => 'Variable - Editar JavaScript', + 'Variable - create form' => 'Variable - formulario de creación', + 'Variable - delete form' => 'Variable - formulario de borrado', + 'Variable edit - bottom' => 'Editar variable - parte inferior', + 'Variable edit - top' => 'Editar variable - parte superior', + 'Variables - JavaScript' => 'Variables - JavaScript', + 'Variables - at the top' => 'Variables - en la parte superior', + 'Variables - bottom' => 'Variables - parte inferior', + 'Variables - table header' => 'Variables - encabezado de tabla', + 'Variables - table row' => 'Variables - fila de la tabla', + 'Venezuela' => 'Venezuela', + 'Vietnam' => 'Viet Nam', + 'View administration logs' => 'Ver logs de administración', + 'Virtual Product Controller' => 'Controlador de producto virtual', + 'Wallis-et-Futuna' => 'Wallis-et-Futuna', + 'Western Samoa' => 'Samoa', + 'Where the WYSIWYG editor is required' => 'Donde se requiere el editor WYSIWYG', + 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)' => 'Espacio en blanco del ajuste nivel del código HTML generado (0 = ninguna, 1 = medio, 2 = máximo)', + 'Yemen' => 'Yemen', + 'You can now login at' => 'Ahora puede entrar', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'Ha perdido su contraseña < br / > \r\nPor favor, cambiar esta contraseña después de su primera conexión', + 'You have lost your password
    \r\nYour new password is' => 'Ha perdido su contraseña < br / > \r\nSu nueva contraseña es', + 'Your account information on {config key="store_name"} has been changed.' => 'La información de su cuenta en {tecla config = "store_name"} ha sido cambiada.', + 'Your new passord is : {$password}' => 'Su nueva contraseña es: {$password}', + 'Your new password' => 'Su nueva contraseña', + 'Your new password for {config key="store_name"}' => 'Su nueva contraseña para {tecla config = "store_name"}', + 'Your order {$order_ref} at {config key="store_name"}' => 'Su orden {$order_ref} en {tecla config = "store_name"}', + 'Your subscription to %store newsletter' => 'Tu suscripción al boletín de %store', + 'Your subscription to {config key="store_name"} newsletter' => 'Tu subscripción al boletín de {config key="store_name"}', + 'Zaire' => 'Zaire', + 'Zambia' => 'Zambia', + 'Zimbabwe' => 'Zimbabue', + 'Zone - delete form' => 'Zona - formulario de borrado', + '[Firewall/Bruteforce] Number of allowed attemps' => '[Firewall/Bruteforce] Número de intentos permitidos', + '[Firewall/Bruteforce] Time to wait between X attempts' => '[Firewall/Bruteforce] Tiempo de espera entre X intentos', + '[Firewall] Activate the firewall' => '[Firewall] Activar el firewall', + '[Firewall] Number of allowed attemps' => '[Firewall] Número de intentos permitidos', + '[Firewall] Time to wait between X attempts' => '[Firewall] Tiempo de espera entre X intentos', + 'changing password email for' => 'cambio de correo electrónico contraseña para', + 'customer account - CSS stylesheet' => 'cuenta de cliente - hoja de estilos CSS', + 'customer account - after javascript include' => 'cuenta de cliente - después de incluir JavaScript', + 'customer account - after javascript initialisation' => 'cuenta de cliente - después de la inicialización de JavaScript', + 'customer account - at the bottom' => 'cuenta de cliente - en la parte inferior', + 'customer account - at the top' => 'cuenta de cliente - en la parte superior', + 'export of newsletter subscribers' => 'exportación de los suscriptores del boletín de noticias', + 'language selection page - CSS stylesheet' => 'página de selección de idioma - hoja de estilos CSS', + 'language selection page - after javascript include' => 'página de selección de idioma - después de incluir JavaScript', + 'language selection page - after javascript initialisation' => 'página de selección de idioma - después de la inicialización de JavaScript', + 'language selection page - at the bottom' => 'página de selección de idioma - en la parte inferior', + 'language selection page - at the top' => 'página de selección de idioma - en la parte superior', + 'state - Edit JavaScript' => 'estado - Editar JavaScript', + 'state - creation form' => 'estado - formulario de creación', + 'state - delete form' => 'estado - formulario de borrado', + 'state-edit - at the top' => 'estado - editar - encabezado', + 'state-edit - bottom' => 'estado - al pie', + 'states - JavaScript' => 'estados - JavaScript', + 'states - at the top' => 'estados - encabezado', + 'states - bottom' => 'estados - al pie', + 'states - table header' => 'estados - encabezado de tabla', + 'states - table row' => 'estados - fila de tabla', + 'tax rule - Edit JavaScript' => 'regla de impuesto - Editar JavaScript', + 'tax rule - create form' => 'regla de impuesto - formulario de creación', + 'tax rule - delete form' => 'regla de impuesto - formulario de borrado', + 'tinymce wysiwyg editor' => 'editor tinymce wysiwyg', +]; diff --git a/setup/I18n/fa_IR.php b/setup/I18n/fa_IR.php new file mode 100644 index 00000000..fa2d7e17 --- /dev/null +++ b/setup/I18n/fa_IR.php @@ -0,0 +1,311 @@ + 'تحویل 72 ساعته', + 'API Configuration' => 'تنظیمات API', + 'Address' => 'نشانی', + 'Address creation - CSS stylesheet' => 'ایجاد آدرس - فایل CSS', + 'Address creation - after javascript include' => 'ایجاد آدرس - پس از include جاوا اسکریپت', + 'Address creation - after javascript initialisation' => 'ایجاد آدرس - پس از initial جاوا اسکریپت', + 'Address creation - at the bottom' => 'ایجاد آدرس - در پایین', + 'Address creation - at the bottom of the form' => 'ایجاد آدرس - در پایین فرم', + 'Address creation - at the top' => 'ایجاد آدرس - در بالای', + 'Address creation - at the top of the form' => 'ایجاد آدرس - در بالای فرم', + 'Administrator - create form' => 'مدیر - فرم ایجاد', + 'Administrator - delete form' => 'مدیر - فرم حذف', + 'Administrator - update form' => 'مدیر - فرم به روز رسانی', + 'Administrator list' => 'لیست مدیر', + 'Administrators - JavaScript' => 'مدیران - جاوا اسکریپت', + 'Administrators - at the top' => 'مدیران - در بالا', + 'Administrators - bottom' => 'مدیران - پایین', + 'Administrators - header' => 'مدیران - هدر', + 'Administrators - row' => 'مدیران - ردیف', + 'Advanced Configuration' => 'پیکربندی پیشرفته', + 'Advanced Configuration - Javascript' => 'پیکربندی پیشرفته - جاوا اسکریپت', + 'Advanced configuration' => 'پیکربندی پیشرفته', + 'Afghanistan' => 'افغانستان', + 'Albania' => 'آلبانی', + 'Algeria' => 'الجزایر', + 'Andorra' => 'آندورا', + 'Angola' => 'آنگولا', + 'Antigua and Barbuda' => 'آنتیگوا و باربودا', + 'Argentina' => 'آرژانتین', + 'Armenia' => 'ارمنستان', + 'Attributes - table row' => 'ویژگی های - ردیف جدول', + 'Australia' => 'استراليا', + 'Austria' => 'اتریش', + 'Azerbaijan' => 'آذربایجان', + 'Bahamas' => 'باهاما', + 'Bahrain' => 'بحرین', + 'Bangladesh' => 'بنگلادش', + 'Barbados' => 'باربادوس', + 'Belarus' => 'بلاروس', + 'Belgium' => 'بلژیک', + 'Belize' => 'بلیز', + 'Benin' => 'بنین', + 'Bhutan' => 'بوتان', + 'Bolivia' => 'بولیوی', + 'Bosnia and Herzegovina' => 'بوسنی و هرزگوین', + 'Botswana' => 'بوتسوانا', + 'Brazil' => 'برزيل', + 'Brunei' => 'برونئی', + 'Bulgaria' => 'بلغارستان', + 'Burkina' => 'بورکینا', + 'Burma' => 'برمه', + 'Burundi' => 'بوروندی', + 'Cambodia' => 'کامبوج', + 'Cameroon' => 'کامرون', + 'Canceled' => 'لغو شده', + 'Category' => 'دسته‌بندی', + 'Category - contents table row' => 'دسته بندی - ردیف جدول محتویات', + 'Chad' => 'چاد', + 'Chile' => 'شیلی', + 'China' => 'چین', + 'Colombia' => 'کلمبیا', + 'Comoros' => 'کومور', + 'Configuration' => 'پیکربندی', + 'Configuration / Administrator' => 'پیکربندی / مدیران', + 'Configuration / Area' => 'پیکربندی / منطقه', + 'Configuration / Attribute' => 'پیکربندی / خصوصیت', + 'Configuration / Cache' => 'پیکربندی / حافظه موقت', + 'Configuration / Country' => 'پیکربندی / کشور', + 'Configuration / Currency' => 'پیکربندی / ارز', + 'Configuration / Feature' => 'پیکربندی / ویژگی', + 'Configuration / Language' => 'پیکربندی / زبان', + 'Configuration / Mailing-system' => 'پیکربندی / سیستم ایمیل', + 'Configuration / Message' => 'پیکربندی / پیام', + 'Configuration / Module' => 'پیکربندی / ماژول', + 'Configuration / Profile' => 'پیکربندی / حساب کاربری', + 'Configuration / Shipping-zone' => 'پیکربندی / نواحی حمل و نقل', + 'Configuration / System Log' => 'پیکربندی / گزارش سیستم', + 'Configuration / Tax' => 'پیکربندی / مالیات', + 'Configuration / Template' => 'پیکربندی / قالب', + 'Configuration variables' => 'پیکربندی متغییرها', + 'Congo' => 'کنگو', + 'Contact block' => 'بلوک تماس با ما', + 'Content' => 'محتوا', + 'Content edit - bottom' => 'ویرایش محتوا - پایین', + 'Cook Islands' => 'جزایر کوک', + 'Costa Rica' => 'کاستاریکا', + 'Coupon' => 'کوپن', + 'Croatia' => 'کرواسی', + 'Cuba' => 'کوبا', + 'Currency edit - top' => 'ویرایش واحد پول - بالا', + 'Customer' => 'مشتری', + 'Customer title' => 'عنوان مشتری', + 'Cyprus' => 'قبرس', + 'Czech Republic' => 'جمهوری چک', + 'Dashboard - at the top' => 'پیشخوان - در بالا', + 'Dashboard - bottom' => 'پیشخوان - پایین', + 'Dashboard - middle' => 'پیشخوان - وسط', + 'Data import / export' => 'ورود/خروج اطلاعات', + 'Delivery zone - table row' => 'منطقه تحویل - ردیف جدول', + 'Denmark' => 'دانمارک', + 'Djibouti' => 'جیبوتی', + 'Document - Edit JavaScript' => 'سند - ویرایش جاوا اسکریپت', + 'Document edit - bottom' => 'ویرایش نوشتار - پایین', + 'Document edit - top' => 'ویرایش نوشتار - بالا', + 'Dominica' => 'دومینیکا', + 'Dominican Republic' => 'جمهوری دومینیکن', + 'Ecuador' => 'اکوادور', + 'Egypt' => 'مصر', + 'El Salvador' => 'السالوادور', + 'Equatorial Guinea' => 'گینه استوایی', + 'Eritrea' => 'اریتره', + 'Estonia' => 'استونی', + 'Ethiopia' => 'اتیوپی', + 'Euro' => 'یورو', + 'Fiji' => 'فیجی', + 'Finland' => 'فنلاند', + 'Folder' => 'پوشه', + 'Gabon' => 'گابن', + 'Gambia' => 'گامبیا', + 'Georgia' => 'گرجستان', + 'Germany' => 'آلمان', + 'Ghana' => 'غنا', + 'Greece' => 'یونان', + 'Grenada' => 'گراندا', + 'Guadeloupe' => 'گوادلوپ', + 'Guatemala' => 'گواتمالا', + 'Guinea' => 'گینه', + 'Guinea-Bissau' => 'گینه بیسائو', + 'Guyana' => 'گویان', + 'Haiti' => 'هائیتی', + 'Honduras' => 'هندوراس', + 'Hong Kong' => 'هنگ کنگ', + 'Hook - Edit JavaScript' => 'قلاب - ویرایش جاوا اسکریپت', + 'Hook - create form' => 'قلاب - فرم ایجاد', + 'Hook - delete form' => 'قلاب - فرم حذف', + 'Hook edit - bottom' => 'قلاب ویرایش - پایین', + 'Hook edit - top' => 'قلاب ویرایش - بالا', + 'Hook positions' => 'موقعیت‌های قلاب', + 'Hooks' => 'قلاب‌ها', + 'Hooks - JavaScript' => 'قلاب‌ها - جاوا اسکریپت', + 'Hungary' => 'مجارستان', + 'Iceland' => 'ایسلند', + 'Image - Edit JavaScript' => 'تصویر - ویرایش جاوا اسکریپت', + 'India' => 'هند', + 'Indonesia' => 'اندونزی', + 'Iran' => 'ایران', + 'Iraq' => 'عراق', + 'Ireland' => 'ایرلند', + 'Israel' => 'اسرائیل', + 'Italy' => 'ايتاليا', + 'Ivory Coast' => 'ساحل عاج', + 'Jamaica' => 'جامائیکا', + 'Japan' => 'ژاپن', + 'Jordan' => 'اردن', + 'Kazakhstan' => 'قزاقستان', + 'Kenya' => 'کنیا', + 'Kiribati' => 'کیریباتی', + 'Kuwait' => 'کویت', + 'Kyrgyzstan' => 'قرقیزستان', + 'Laos' => 'لائوس', + 'Latvia' => 'لتونی', + 'Lebanon' => 'لبنان', + 'Lesotho' => 'لسوتو', + 'Liberia' => 'لیبریا', + 'Libya' => 'لیبی', + 'Liechtenstein' => 'لیختن اشتاین', + 'Lithuania' => 'لیتوانی', + 'Luxembourg' => 'لوکزامبورگ', + 'Macedonia' => 'مقدونیه', + 'Madagascar' => 'ماداگاسکار', + 'Malawi' => 'مالاوی', + 'Malaysia' => 'مالزی', + 'Maldives' => 'مالدیو', + 'Mali' => 'مالی', + 'Malta' => 'مالت', + 'Marshall Islands' => 'جزایر مارشال', + 'Martinique' => 'مارتینیک', + 'Mauritania' => 'موریتانی', + 'Mauritius' => 'موریس', + 'Mayotte' => 'مایوت', + 'Mexico' => 'مکزیک', + 'Micronesia' => 'میکرونزی', + 'Miss' => 'خانم', + 'Miss_short' => 'خانم', + 'Mister' => 'آقا', + 'Moldova' => 'مولداوی', + 'Monaco' => 'موناکو', + 'Mongolia' => 'مغولستان', + 'Morocco' => 'مراکش', + 'Mozambique' => 'موزامبیک', + 'Mr.' => 'آقای', + 'Mrs' => 'خانم', + 'Namibia' => 'نامیبیا', + 'Nauru' => 'نائورو', + 'Nepal' => 'نپال', + 'Netherlands' => 'هلند', + 'New York' => 'تالش', + 'New Zealand' => 'نيوزلند', + 'Nicaragua' => 'نیکاراگوئه', + 'Niger' => 'نیجر', + 'Nigeria' => 'نیجریه', + 'Niue' => 'نیو', + 'North Korea' => 'کره شمالی', + 'Norway' => 'نروژ', + 'Not paid' => 'پرداخت نشده', + 'Oman' => 'عمان', + 'Order' => 'سفارش', + 'Paid' => 'پرداخت شده', + 'Pakistan' => 'پاکستان', + 'Panama' => 'پاناما', + 'Paraguay' => 'پاراگوئه', + 'Pay by cheque' => 'پرداخت با چک', + 'Peru' => 'پرو', + 'Philippines' => 'فیلیپین', + 'Poland' => 'لهستان', + 'Portugal' => 'پرتغال', + 'Processing' => 'پردازش', + 'Product' => 'محصول', + 'Qatar' => 'قطر', + 'Refunded' => 'برگشت وجه شده', + 'Romania' => 'رومانی', + 'Russia' => 'روسیه', + 'Rwanda' => 'رواندا', + 'Saint Kitts and Nevis' => 'سنت کیتس و نویس', + 'Saint Lucia' => 'سنت لوسیا', + 'Sales management' => 'مدیریت حراج', + 'San Marino' => 'سن مارینو', + 'Saudi Arabia' => 'عربستان سعودی', + 'Search' => 'جستجو', + 'Senegal' => 'سنگال', + 'Sent' => 'ارسال', + 'Seychelles' => 'سیشل', + 'Shipping configuration' => 'پیکربندی حمل و نقل', + 'Shipping configuration - Edit' => 'پیکربندی حمل و نقل - ویرایش', + 'Sierra Leone' => 'سیرالئون', + 'Singapore' => 'سنگاپور', + 'Sitemap - at the bottom' => 'نقشه سایت - در پایین', + 'Slovakia' => 'اسلواکی', + 'Slovenia' => 'اسلوونی', + 'Solomon Islands' => 'جزایر سلیمان', + 'Somalia' => 'سومالی', + 'South Africa' => 'آفریقای جنوبی', + 'South Korea' => 'کره جنوبی', + 'Spain' => 'اسپانیا', + 'Sri Lanka' => 'سریلانکا', + 'Sudan' => 'سودان', + 'Suriname' => 'سورینام', + 'Swaziland' => 'سوازیلند', + 'Sweden' => 'سوئد', + 'Switzerland' => 'سوئیس', + 'Syria' => 'سوریه', + 'Tajikistan' => 'تاجیکستان', + 'Tanzania' => 'تانزانیا', + 'Togo' => 'توگو', + 'Tonga' => 'تونگا', + 'Tools - JavaScript' => 'ابزارها - جاوا اسکریپت', + 'Translations' => 'ترجمه‌ها', + 'Tunisia' => 'تونس', + 'Turkey' => 'ترکیه', + 'Turkmenistan' => 'ترکمنستان', + 'Tuvalu' => 'تووالو', + 'UK Pound' => 'پوند انگلستان', + 'Uganda' => 'اوگاندا', + 'Ukraine' => 'اکراین', + 'United Arab Emirates' => 'امارات متحده عربی', + 'United Kingdom' => 'انگلستان', + 'United States Dollar' => 'دلار آمریکا', + 'Update customer account - CSS stylesheet' => 'به روز رسانی حساب مشتری - CSS', + 'Update customer account - after javascript include' => 'به روز رسانی حساب مشتری - پس از include شدن جاوا اسکریپت', + 'Update customer account - after javascript initialisation' => 'به روز رسانی حساب مشتری - پس از intial شدن جاوا اسکریپت', + 'Update customer account - at the bottom' => 'به روز رسانی حساب مشتری - در قسمت پایین', + 'Update customer account - at the bottom of the form' => 'به روز رسانی حساب مشتری - در قسمت پایین فرم', + 'Update customer account - at the top' => 'به روز رسانی حساب مشتری - در قسمت بالا', + 'Update customer account - at the top of the form' => 'به روز رسانی حساب مشتری - در قسمت بالای فرم', + 'Uruguay' => 'اروگوئه', + 'Use a persistent cookie to keep track of customer cart' => 'استفاده از کوکی ماندگار برای پیگیری سبد خرید مشتریان', + 'Uzbekistan' => 'ازبکستان', + 'Vanuatu' => 'وانواتو', + 'Variable - Edit JavaScript' => 'متغیر - ویرایش جاوا اسکریپت', + 'Variable - create form' => 'متغیر - ایجاد فرم', + 'Variable - delete form' => 'متغير - حذف فرم', + 'Variable edit - bottom' => 'ویرایش متغیر - پایین', + 'Variable edit - top' => 'ویرایش متغیر - بالا', + 'Variables - JavaScript' => 'متغیرهای - جاوا اسکریپت', + 'Variables - at the top' => 'متغیرهای - در بالای', + 'Variables - bottom' => 'متغیرهای - پایین', + 'Variables - table header' => 'متغیرهای - عنوان جدول', + 'Variables - table row' => 'متغیرهای - ردیف جدول', + 'Venezuela' => 'ونزوئلا', + 'Vietnam' => 'ویتنام', + 'View administration logs' => 'مشاهده لاگ مدیریت', + 'Virtual Product Controller' => 'کنترل کننده محصولات مجازی', + 'Wallis-et-Futuna' => 'والیس و فوتونا', + 'Western Samoa' => 'ساموآ غربی', + 'Where the WYSIWYG editor is required' => 'جایی که ویرایشگر دیداری لازم است', + 'Yemen' => 'یمن', + 'You can now login at' => 'شما می‌توانید وارد شوید در', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'رمزعبور شما از دست رفته است
    \r\nلطفا پس از اولین ارتباط رمزعبور را تغییر دهید', + 'You have lost your password
    \r\nYour new password is' => 'روزعبور شما از دست رفته است
    \r\nرمزعبور جدید شما هست:', + 'Your account information on {config key="store_name"} has been changed.' => 'اطلاعات حساب شما در {config key="store_name"} تغییر کرد.', + 'Your new passord is : {$password}' => 'رمزعبور جدید شما: {$password}', + 'Your new password' => 'رمز عبور جدید شما', + 'Your new password for {config key="store_name"}' => 'رمزعبور جدید شما برای {config key="store_name"}', + 'Your order {$order_ref} at {config key="store_name"}' => 'سفارش شما {$order_ref} در {config key="store_name"}', + 'Zaire' => 'زئیر', + 'Zambia' => 'زامبیا', + 'Zimbabwe' => 'زیمباوه', +]; diff --git a/setup/I18n/fr_FR.php b/setup/I18n/fr_FR.php new file mode 100644 index 00000000..8bd1eb72 --- /dev/null +++ b/setup/I18n/fr_FR.php @@ -0,0 +1,1450 @@ + 'Délai d\'expiration du cookie "Remember me", en secondes, pour les utilisateurs d\'administration', + '"Remember me" cookie expiration time, in seconds, for customer users' => 'Délai d\'expiration du cookie "Remember me", en secondes, pour les clients', + '"Remember me" cookie name for administration users' => 'Nom du cookie "Remember me" pour les utilisateurs d\'administration', + '"Remember me" cookie name for customer users' => 'Nom du cookie "Remember me" pour les clients', + '72h delivery' => 'Livraison par colissimo en 72h', + 'A {config key="store_name"} account has been created for you' => 'Un compte {config key="store_name"} vient d\'être créé pour vous.', + 'API Configuration' => 'Configuration de l\'API', + 'Aceh' => 'Aceh', + 'Address' => 'Adresse', + 'Address creation - CSS stylesheet' => 'Création d\'adresse - feuille de style CSS', + 'Address creation - after javascript include' => 'Création d\'adresse - après l\'inclusion du JavaScript', + 'Address creation - after javascript initialisation' => 'Création d\'adresse - après l\'initialisation du JavaScript', + 'Address creation - at the bottom' => 'Création d\'adresse - en bas', + 'Address creation - at the bottom of the form' => 'Création d\'adresse - en bas du formulaire', + 'Address creation - at the top' => 'Création d\'adresse - en haut', + 'Address creation - at the top of the form' => 'Création d\'adresse - en haut du formulaire', + 'Address update - CSS stylesheet' => 'Modification d\'adresse - feuille de style CSS', + 'Address update - after javascript include' => 'Modification d\'adresse - après l\'inclusion du JavaScript', + 'Address update - after javascript initialisation' => 'Modification d\'adresse - après l\'initialisation du JavaScript', + 'Address update - at the bottom' => 'Modification d\'adresse - en bas', + 'Address update - at the bottom of the form' => 'Modification d\'adresse - en bas du formulaire', + 'Address update - at the top' => 'Modification d\'adresse - en haut', + 'Address update - at the top of the form' => 'Modification d\'adresse - en haut du formulaire', + 'Admin layout - After the main content' => 'Admin layout - Après le contenu principal', + 'Administatros list' => 'Liste des administrateurs', + 'Administration profiles management' => 'Gestion des profils d\'administration', + 'Administrator - create form' => 'Administateur - formulaire de création', + 'Administrator - delete form' => 'Administateur - formulaire de suppression', + 'Administrator - update form' => 'Administateur - formulaire de modification', + 'Administrator list' => 'Liste des administrateurs', + 'Administrators - JavaScript' => 'Administateurs - JavaScript', + 'Administrators - at the top' => 'Administateurs - en haut', + 'Administrators - bottom' => 'Administateurs - bas', + 'Administrators - header' => 'Administrateurs - en-tête', + 'Administrators - row' => 'Administrateurs - ligne', + 'Advanced Configuration' => 'Configuration avancée', + 'Advanced Configuration - Javascript' => 'Configuration avancée - JavaScript', + 'Advanced configuration' => 'Configuration avancée', + 'Afghanistan' => 'Afghanistan', + 'Agrigento' => 'Agrigento', + 'Aguascalientes' => 'Aguascalientes', + 'Aichi' => 'Aichi', + 'Akita' => 'Akita', + 'Alabama' => 'Alabama', + 'Alaska' => 'Alaska', + 'Albania' => 'Albanie', + 'Alberta' => 'Alberta', + 'Alessandria' => 'Alessandria', + 'Algeria' => 'Algérie', + 'All Products - CSS stylesheet' => 'Tous les produits - feuille de style CSS', + 'All Products - after javascript include' => 'Tous les produits - après l\'inclusion du JavaScript', + 'All Products - after javascript initialisation' => 'Tous les produits - après l\'initialisation du JavaScript', + 'All Products - at the bottom' => 'Tous les produits - en bas', + 'All Products - at the top' => 'Tous les produits - en haut', + 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)' => 'Permettre à un administrateur de recréer un mot de passe perdu (1 = Oui, 0 = non)', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Permettre aux utilisateurs de changer leur email. 1 pour oui, 0 pour non', + 'Allow negative product stock (1) or not (0)' => 'Autoriser un stock négatif sur les produits (1) ou pas (0, défaut)', + 'Allow negative product stock (1) or not (0, default)' => 'Autoriser le stock négatif (1) ou pas (0) (0 par défaut)', + 'Allow slash ended uri' => 'Autoriser les URI terminées par un slash', + 'An image carousel on your home page' => 'Un carrousel d\'images sur votre page d\'accueil', + 'Ancona' => 'Ancona', + 'Andorra' => 'Andorre', + 'Angola' => 'Angola', + 'Antigua and Barbuda' => 'Antigua-et-Barbuda', + 'Aomori' => 'Aomori', + 'Aosta' => 'Aosta', + 'Api page - at bottom' => 'Page api - en bas', + 'Api page - at top' => 'Page api - en haut', + 'Api page - in deletion form' => 'Page api - formulaire de suppression', + 'Arezzo' => 'Arezzo', + 'Argentina' => 'Argentine', + 'Arizona' => 'Arizona', + 'Arkansas' => 'Arkansas', + 'Armenia' => 'Arménie', + 'Ascoli Piceno' => 'Ascoli Piceno', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Demander aux clients de confirmer leur email. 1 pour oui, 0 pour non', + 'Asti' => 'Asti', + 'Attribut - Edit JavaScript' => 'Attribut - JavaScript modification', + 'Attribut - add to all form' => 'Attribut - formulaire ajouter à tous', + 'Attribut - create form' => 'Attribut - formulaire de création', + 'Attribut - delete form' => 'Attribut - formulaire de suppression', + 'Attribut - id delete form' => 'Attribut - formulaire de suppression ID', + 'Attribut - remove to all form' => 'Attribut - formulaire de suppression multiple', + 'Attribute edit - bottom' => 'Édition d\'une déclinaison - en bas', + 'Attribute edit - top' => 'Édition d\'une déclinaison - en haut', + 'Attribute value - create form' => 'Valeur d\'attribut - formulaire de création', + 'Attributes - JavaScript' => 'Attributs - JavaScript', + 'Attributes - at the top' => 'Attributs - en haut', + 'Attributes - bottom' => 'Attributs - bas', + 'Attributes - table header' => 'Attributs - colonne tableau', + 'Attributes - table row' => 'Attributs - ligne tableau', + 'Attributes value - table header' => 'Valeurs des attributs - colonne tableau', + 'Attributes value - table row' => 'Valeurs des attributs - ligne tableau', + 'Australia' => 'Australie', + 'Austria' => 'Autriche', + 'Avellino' => 'Avellino', + 'Azerbaijan' => 'Azerbaïdjan', + 'Back-office export management' => 'gestion des exports', + 'Back-office home page' => 'Page d\'acceuil de l\'administration', + 'Back-office search function' => 'Fonction de recherche dans l\'administration', + 'Bahamas' => 'Bahamas', + 'Bahrain' => 'Bahreïn', + 'Baht' => 'Baht', + 'Baja California' => 'Baja California', + 'Baja California Sur' => 'Baja California Sur', + 'Bali' => 'Bali', + 'Bangka' => 'Bangka', + 'Bangladesh' => 'Bangladesh', + 'Banten' => 'Banten', + 'Barbados' => 'Barbade', + 'Bari' => 'Bari', + 'Barletta-Andria-Trani' => 'Barletta-Andria-Trani', + 'Base URL of the shop (e.g. http://www.yourshopdomain.com)' => 'URL de base pour la boutique (par exemple http://www.yourshopdomain.com)', + 'Belarus' => 'Belarus', + 'Belarusian ruble' => 'Rouble Biélorusse', + 'Belgium' => 'Belgique', + 'Belize' => 'Belize', + 'Belluno' => 'Belluno', + 'Benevento' => 'Benevento', + 'Bengkulu' => 'Bengkulu', + 'Benin' => 'Bénin', + 'Bergamo' => 'Bergamo', + 'Bhutan' => 'Bhoutan', + 'Biella' => 'Biella', + 'Bielorussia' => 'Biélorussie', + 'Bolivia' => 'Bolivie', + 'Boliviano' => 'Bolivie', + 'Bologna' => 'Bologne', + 'Bolzano' => 'Bolzano', + 'Bolívar fuerte' => 'Bolivar Vénézuélien', + 'Bosnia and Herzegovina' => 'Bosnie-Herzégovine', + 'Botswana' => 'Botswana', + 'Brand - Edit JavaScript' => 'Marque - Modification du JavaScript', + 'Brand - JavaScript' => 'Marque - JavaScript', + 'Brand - Tab' => 'Marque - Onglet', + 'Brand - content' => 'Marque - contenu', + 'Brand - create form' => 'Marque - formulaire de création', + 'Brand - delete form' => 'Marque - formulaire de suppression', + 'Brand edit - bottom' => 'Édition d\'une marque - en bas', + 'Brand edit - right column bottom' => 'Édition d\'une marque - en bas de la colonne de droite', + 'Brand edit - right column top' => 'Édition d\'une marque - en haut de la colonne de droite', + 'Brand edit - top' => 'Édition d\'une marque - en haut', + 'Brand edit page - in the form' => 'Page brand edit - dans formulaire', + 'Brands - at the top' => 'Marques - en haut', + 'Brands - bottom' => 'Marques - bas', + 'Brands - table header' => 'Marques - colonne tableau', + 'Brands - table row' => 'Marques - ligne tableau', + 'Brands management' => 'Gestion des marques', + 'Brands page - CSS stylesheet' => 'Page des marques - feuille de style CSS', + 'Brands page - after javascript include' => 'Page des marques - après l\'inclusion du JavaScript', + 'Brands page - after the main content area' => 'Page des marques - en dessous de la zone de contenu principale', + 'Brands page - at the bottom' => 'Page des marques - en bas', + 'Brands page - at the bottom of the main area' => 'Page des marques - en bas de la zone principal', + 'Brands page - at the bottom of the sidebar' => 'Page des marques - en bas de la sidebar', + 'Brands page - at the top' => 'Page des marques - en haut', + 'Brands page - at the top of the main area' => 'Page des marques - en haut de la zone principal', + 'Brands page - at the top of the sidebar' => 'Page des marques - en haut de la sidebar', + 'Brands page - before the main content area' => 'Page des marques - au dessus de la zone de contenu principale', + 'Brands page - javascript initialization' => 'Page des marques - initialisation du JavaScript', + 'Brands page - the body of the sidebar' => 'Page des marques - le corps de la sidebar', + 'Brazil' => 'Brésil', + 'Brescia' => 'Brescia', + 'Brindisi' => 'Brindisi', + 'British Columbia' => 'Colombie-Britannique', + 'Brunei' => 'Brunei', + 'Buenos Aires' => 'Buenos Aires', + 'Bulgaria' => 'Bulgarie', + 'Burkina' => 'Burkina', + 'Burma' => 'Birmanie', + 'Burundi' => 'Burundi', + 'Cagliari' => 'Cagliari', + 'California' => 'Californie', + 'Caltanissetta' => 'Caltanissetta', + 'Cambodia' => 'Cambodge', + 'Cameroon' => 'Cameroun', + 'Campeche' => 'Campeche', + 'Campobasso' => 'Campobasso', + 'Canada' => 'Canada', + 'Canceled' => 'Annulée', + 'Cape Verde' => 'Cap-Vert', + 'Carbonia-Iglesias' => 'Carbonia-Iglesias', + 'Cart - CSS stylesheet' => 'Panier - feuille de style CSS', + 'Cart - after javascript include' => 'Panier - après l\'inclusion du JavaScript', + 'Cart - at the bottom' => 'Panier - en bas', + 'Cart - at the top' => 'Panier - en haut', + 'Cart - javascript initialization' => 'Panier - initialisation du JavaScript', + 'Cart block' => 'Bloc panier', + 'Caserta' => 'Caserta', + 'Catamarca' => 'Catamarca', + 'Catania' => 'Catane', + 'Catanzaro' => 'Catanzaro', + 'Categories - JavaScript' => 'Catégories - JavaScript', + 'Categories - at the bottom of the catalog' => 'Catégories - en bas du catalogue', + 'Categories - at the top' => 'Catégories - en haut', + 'Categories - bottom' => 'Catégories - bas', + 'Categories - caption' => 'Catégories - légende', + 'Categories - header' => 'Catégories - en-tête', + 'Categories - row' => 'Catégories - ligne', + 'Category' => 'Catégorie', + 'Category - Edit JavaScript' => 'Catégorie - JavaScript modification', + 'Category - Tab' => 'Catégorie - Onglet', + 'Category - content' => 'Catégorie - contenu', + 'Category - contents table header' => 'Catégorie - colonne tableau contenus', + 'Category - contents table row' => 'Catégorie - ligne tableau contenus', + 'Category - create form' => 'Catégorie - formulaire de création', + 'Category - delete form' => 'Catégorie - formulaire de suppression', + 'Category configuration' => 'Configuration d\'une catégorie', + 'Category edit - bottom' => 'Édition d\'une categorie - en bas', + 'Category edit - right column bottom' => 'Édition d\'une catégorie - en bas de la colonne de droite', + 'Category edit - right column top' => 'Édition d\'une catégorie - en haut de la colonne de droite', + 'Category edit - top' => 'Édition d\'une categorie - en haut', + 'Category page - CSS stylesheet' => 'Page catégorie - feuille de style CSS', + 'Category page - after javascript include' => 'Page catégorie - après l\'inclusion du JavaScript', + 'Category page - after javascript initialisation' => 'Page catégorie - après l\'initialisation du JavaScript', + 'Category page - after the main content area' => 'Page catégorie - en dessous de la zone de contenu principale', + 'Category page - at the bottom' => 'Page catégorie - en bas', + 'Category page - at the bottom of the main area' => 'Page catégorie - en bas de la zone principal', + 'Category page - at the bottom of the sidebar' => 'Page catégorie - en bas de la sidebar', + 'Category page - at the top' => 'Page catégorie - en haut', + 'Category page - at the top of the main area' => 'Page catégorie - en haut de la zone principal', + 'Category page - at the top of the sidebar' => 'Page catégorie - en haut de la sidebar', + 'Category page - before the main content area' => 'Page catégorie - au dessus de la zone de contenu principale', + 'Category page - the body of the sidebar' => 'Page catégorie - le corps de la sidebar', + 'Central African Republic' => 'République centrafricaine', + 'Central Java' => 'Central Java', + 'Central Kalimantan' => 'Kalimantan occidental', + 'Central Sulawesi' => 'Sulawesi central', + 'Chaco' => 'Chaco', + 'Chad' => 'Tchad', + 'Change password - CSS stylesheet' => 'Changement de mot de passe - feuille de style CSS', + 'Change password - after javascript include' => 'Changement de mot de passe - après l\'inclusion du JavaScript', + 'Change password - after javascript initialisation' => 'Changement de mot de passe - après l\'initialisation du JavaScript', + 'Change password - at the bottom' => 'Changement de mot de passe - en bas', + 'Change password - at the top' => 'Changement de mot de passe - en haut', + 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity' => 'Vérifier la présence de produits en stock (1) ou l\'ignorer (0) lors de l\'affichage et la modification des quantités commandées', + 'Check if a virtual product delivery module is enabled if at least one product is virtual' => 'Vérifie qu\'un module de livraison pour produit virtuel soit activé si des produits virtuels existent', + 'Chiapas' => 'Chiapas', + 'Chiba' => 'Chiba', + 'Chieti' => 'Chieti', + 'Chihuahua' => 'Chihuahua', + 'Chile' => 'Chili', + 'China' => 'Chine', + 'Chubut' => 'Chubut', + 'Ciudad de Buenos Aires' => 'Ciudad de Buenos Aires', + 'Client edit - bottom' => 'Édition d\'un client - en bas', + 'Client edit - top' => 'Édition d\'un client - en haut', + 'Coahuila' => 'Coahuila', + 'Coat of arms of East Java' => 'Coat of arms of East Java', + 'Colima' => 'Colima', + 'Colombia' => 'Colombie', + 'Colorado' => 'Colorado', + 'Colón' => 'Colón', + 'Como' => 'Como', + 'Comoros' => 'Comores', + 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)' => 'Compiler les resources du modèle actif à chaque changement (1 = oui, 2 = non)', + 'Configuration' => 'Configuration', + 'Configuration - JavaScript' => 'Configuration - JavaScript', + 'Configuration - at the bottom of the catalog' => 'Configuration - en bas du catlogue', + 'Configuration - at the bottom of the shipping area' => 'Configuration - en bas de la zone livraison', + 'Configuration - at the bottom of the system area' => 'Configuration - en bas de la zone système', + 'Configuration - at the top' => 'Configuration - en haut', + 'Configuration - at the top of the catalog area' => 'Configuration - en haut de la zone catalogue', + 'Configuration - at the top of the shipping area' => 'Configuration - en haut de la zone livraison', + 'Configuration - at the top of the system area' => 'Configuration - en haut de la zone système', + 'Configuration - bottom' => 'Configuration - bas', + 'Configuration / Administrator' => 'Configuration / Administrateur', + 'Configuration / Area' => 'Configuration / Zone', + 'Configuration / Attribute' => 'Configuration / Attribut', + 'Configuration / Cache' => 'Configuration / Cache', + 'Configuration / Country' => 'Configuration / Pays', + 'Configuration / Currency' => 'Configuration / Devise', + 'Configuration / Feature' => 'Configuration / Caractéristique', + 'Configuration / Language' => 'Configuration / Langue', + 'Configuration / Mailing-system' => 'Configuration / Système de mails', + 'Configuration / Message' => 'Configuration / Message', + 'Configuration / Module' => 'Configuration / Module', + 'Configuration / Profile' => 'Configuration / Profil', + 'Configuration / Shipping-zone' => 'Configuration / Zone de livraison', + 'Configuration / System Log' => 'Configuration / Logs système', + 'Configuration / Tax' => 'Configuration / Taxe', + 'Configuration / Template' => 'Configuration / Modèle', + 'Configuration variables' => 'Variables de configuration', + 'Congo' => 'Congo', + 'Connecticut' => 'Connecticut', + 'Contact block' => 'Bloc contact', + 'Contact page - CSS stylesheet' => 'Page contact - feuille de style CSS', + 'Contact page - after javascript include' => 'Page contact - après l\'inclusion du JavaScript', + 'Contact page - after javascript initialisation' => 'Page contact - après l\'initialisation du JavaScript', + 'Contact page - at the bottom' => 'Page contact - en bas', + 'Contact page - at the bottom of the form' => 'Page contact - en bas du formulaire', + 'Contact page - at the top' => 'Page contact - en haut', + 'Contact page - at the top of the form' => 'Page contact - en haut du formulaire', + 'Contact page - if successful response' => 'Page contact - en cas de succès', + 'Content' => 'Contenu', + 'Content - Edit JavaScript' => 'Contenu - JavaScript modification', + 'Content - Tab' => 'Contenu - Onglet', + 'Content - content' => 'Contenu - contenu', + 'Content - create form' => 'Contenu - formulaire de création', + 'Content - delete form' => 'Contenu - formulaire de suppression', + 'Content edit - bottom' => 'Édition d\'un contenu - en bas', + 'Content edit - right column bottom' => 'Édition d\'un contenu - en bas de la colonne de droite', + 'Content edit - right column top' => 'Édition d\'un contenu - en haut de la colonne de droite', + 'Content edit - top' => 'Édition d\'un contenu - en haut', + 'Content page - CSS stylesheet' => 'Page de contenu - feuille de style CSS', + 'Content page - after javascript include' => 'Page de contenu - après l\'inclusion du JavaScript', + 'Content page - after javascript initialisation' => 'Page de contenu - après l\'initialisation du JavaScript', + 'Content page - after the main content area' => 'Page de contenu - en dessous de la zone de contenu principale', + 'Content page - at the bottom' => 'Page de contenu - en bas', + 'Content page - at the bottom of the main area' => 'Page de contenu - en bas de la zone principal', + 'Content page - at the bottom of the sidebar' => 'Page de contenu - en bas de la sidebar', + 'Content page - at the top' => 'Page de contenu - en haut', + 'Content page - at the top of the main area' => 'Page de contenu - en haut de la zone principal', + 'Content page - at the top of the sidebar' => 'Page de contenu - en haut de la sidebar', + 'Content page - before the main content area' => 'Page de contenu - au dessus de la zone de contenu principale', + 'Content page - the body of the sidebar' => 'Page de contenu - le corps de la sidebar', + 'Contents - caption' => 'Contenus - légende', + 'Contents - header' => 'Contenus - en-tête', + 'Contents - row' => 'Contenus - ligne', + 'Cook Islands' => 'Cook', + 'Corrientes' => 'Corrientes', + 'Cosenza' => 'Cosenza', + 'Costa Rica' => 'Costa Rica', + 'Countries - JavaScript' => 'Pays - JavaScript', + 'Countries - at the top' => 'Pays - en haut', + 'Countries - bottom' => 'Pays - bas', + 'Countries - table header' => 'Pays - colonne tableau', + 'Countries - table row' => 'Pays - ligne tableau', + 'Country - Edit JavaScript' => 'Pays - JavaScript modification', + 'Country - create form' => 'Pays - formulaire de création', + 'Country - delete form' => 'Pays - formulaire de suppression', + 'Country edit - bottom' => 'Édition d\'un pays - en bas', + 'Country edit - top' => 'Édition d\'un pays - en haut', + 'Coupon' => 'Code promo', + 'Coupon - at the top' => 'Code promo - en haut', + 'Coupon - bottom' => 'Code promo - bas', + 'Coupon - create JavaScript' => 'Code promo - JavaScript création', + 'Coupon - list JavaScript' => 'Code promo - JavaScript des listes', + 'Coupon - list caption' => 'Code promo - légende liste', + 'Coupon - table header' => 'Code promo - colonne tableau', + 'Coupon - table row' => 'Code promo - ligne tableau', + 'Coupon - update JavaScript' => 'Code promo - JavaScript modification', + 'Coupon page - in deletion form' => 'Page coupon - formulaire de suppression', + 'Cremona' => 'Cremona', + 'Croatia' => 'Croatie', + 'Croatian Kuna' => 'Kuna Croate', + 'Crotone' => 'Crotone', + 'Cuba' => 'Cuba', + 'Cuneo' => 'Cuneo', + 'Curency selection page - CSS stylesheet' => 'Page du choix de la device - feuille de style CSS', + 'Curency selection page - after javascript include' => 'Page du choix de la device - après l\'inclusion du JavaScript', + 'Curency selection page - after javascript initialisation' => 'Page du choix de la device - après l\'initialisation du JavaScript', + 'Curency selection page - at the bottom' => 'Page du choix de la device - en bas', + 'Curency selection page - at the top' => 'Page du choix de la device - en haut', + 'Currencies - JavaScript' => 'Devises - JavaScript', + 'Currencies - at the top' => 'Devises - en haut', + 'Currencies - bottom' => 'Devises - bas', + 'Currencies - table header' => 'Devises - colonne tableau', + 'Currencies - table row' => 'Devises - ligne tableau', + 'Currency - Edit JavaScript' => 'Devise - JavaScript modification', + 'Currency - create form' => 'Devise - formulaire de création', + 'Currency - delete form' => 'Devise - formulaire de suppression', + 'Currency block' => 'Bloc des devises', + 'Currency edit - bottom' => 'Édition d\'une devise - en bas', + 'Currency edit - top' => 'Édition d\'une devise - en haut', + 'Customer' => 'Client', + 'Customer - Edit' => 'Client - Modification', + 'Customer - Edit JavaScript' => 'Client - JavaScript modification', + 'Customer - address create form' => 'Client - formulaire de création d\'adresse', + 'Customer - address delete form' => 'Client - formulaire de suppression adresse', + 'Customer - address update form' => 'Client - formulaire de Modification d\'adresse', + 'Customer - at the top' => 'Client - en haut', + 'Customer - bottom' => 'Client - bas', + 'Customer - create form' => 'Client - formulaire de création', + 'Customer - delete form' => 'Client - formulaire de suppression', + 'Customer - order table header' => 'Client - colonne tableau commande', + 'Customer - order table row' => 'Client - ligne tableau commande', + 'Customer account - additional information' => 'Compte client - informations additionnelles', + 'Customer account block' => 'Bloc compte client', + 'Customer title' => 'civilité client', + 'Customers - JavaScript' => 'Clients - JavaScript', + 'Customers - caption' => 'Clients - légende', + 'Customers - header' => 'Clients - en-tête', + 'Customers - row' => 'Clients - ligne', + 'Cyprus' => 'Chypre', + 'Czech Republic' => 'République tchèque', + 'Czech koruna' => 'Couronne Tchèque', + 'Córdoba' => 'Cordoba', + 'Danish krone' => 'Couronne Danoise', + 'Dashboard - at the top' => 'Tableau de bord - en haut', + 'Dashboard - bottom' => 'Tableau de bord - bas', + 'Dashboard - middle' => 'Tableau de bord - au milieu', + 'Data import / export' => 'Importation / exportation de données', + 'Default available stock when check-available-stock is set to 0.' => 'Stock disponible par défaut quand check-available-stock est à 0.', + 'Default lang without translation' => 'Langue par défaut sans traduction', + 'Delaware' => 'Delaware', + 'Delivery - After delivery module' => 'Commande - après le module de livraison', + 'Delivery - CSS' => 'Bon de livraison - CSS', + 'Delivery - additional product information' => 'Bon de livraison - informations additionnelles pour un produit', + 'Delivery - after addresse area' => 'Bon de livraison - après la zone d\'adresses', + 'Delivery - after the information area' => 'Bon de livraison - après la zone d\'informations', + 'Delivery - after the order summary' => 'Bon de livraison - après le résumé de la commande', + 'Delivery - at the bottom of information area' => 'Bon de livraison - en bas de la zone d\'informations', + 'Delivery - at the bottom of the footer' => 'Bon de livraison - en bas du pied de page', + 'Delivery - at the top of the footer' => 'Bon de livraison - en haut du pied de page', + 'Delivery - delivery address' => 'Bon de livraison - adresse de livraison', + 'Delivery - imprint' => 'Bon de livraison - mentions légales', + 'Delivery - in the header' => 'Bon de livraison - dans l\'en-tête', + 'Delivery choice - CSS stylesheet' => 'Choix du transporteur - feuille de style CSS', + 'Delivery choice - after javascript include' => 'Choix du transporteur - après l\'inclusion du JavaScript', + 'Delivery choice - after javascript initialisation' => 'Choix du transporteur - après l\'initialisation du JavaScript', + 'Delivery choice - at the bottom' => 'Choix du transporteur - en bas', + 'Delivery choice - at the bottom of the form' => 'Choix du transporteur - en bas du formulaire', + 'Delivery choice - at the top' => 'Choix du transporteur - en haut', + 'Delivery choice - at the top of the form' => 'Choix du transporteur - en haut du formulaire', + 'Delivery choice - extra area' => 'Choix du transporteur - zone supplémentaire', + 'Delivery choice - javascript' => 'Choix du transporteur - javascript', + 'Delivery zone - Edit JavaScript' => 'Zone de livraison - JavaScript modification', + 'Delivery zone - JavaScript' => 'Zone de livraison - JavaScript', + 'Delivery zone - at the top' => 'Zone de livraison - en haut', + 'Delivery zone - bottom' => 'Zone de livraison - bas', + 'Delivery zone - table header' => 'Zone de livraison - colonne tableau', + 'Delivery zone - table row' => 'Zone de livraison - ligne tableau', + 'Denmark' => 'Danemark', + 'Dinar' => 'Dinar', + 'Display and process prices with (0) or without (1) taxes.' => 'Affiche et traite les prix avec(0) ou sans (1) les taxes', + 'Displays the default blocks on the homepage of the administration' => 'Affiche les blocs par défaut sur la page d\'accueil de l\'administration', + 'District of Columbia' => 'District de Columbia', + 'Distrito Federal' => 'Distrito Federal', + 'Djibouti' => 'Djibouti', + 'Document - Edit JavaScript' => 'Document - JavaScript modification', + 'Document edit - bottom' => 'Édition d\'un document - en bas', + 'Document edit - top' => 'Édition d\'un document - en haut', + 'Dollar' => 'Dollar', + 'Dollar (CAD)' => 'Dollar Canadien', + 'Dominica' => 'Dominique', + 'Dominican Republic' => 'République dominicaine', + 'Durango' => 'Durango', + 'East Nusa Tenggara' => 'Nusa Tenggara oriental', + 'East kalimantan' => 'Kalimantan oriental', + 'Ecuador' => 'Équateur', + 'Egypt' => 'Égypte', + 'Ehime' => 'Ehime', + 'El Salvador' => 'Salvador', + 'Email html - layout - CSS' => 'Email html - layout - CSS', + 'Email html - layout - footer' => 'Email html - layout - pied de page', + 'Email html - order confirmation - after address' => 'Email html - confirmation commande - après adresses', + 'Email html - order confirmation - after products' => 'Email html - confirmation commande - après produits', + 'Email html - order confirmation - before address' => 'Email html - confirmation commande - avant adresses', + 'Email html - order confirmation - before products' => 'Email html - confirmation commande - avant produits', + 'Email html - order confirmation - delivery address' => 'Email html - confirmation commande - adresse de livraison', + 'Email html - order confirmation - footer' => 'Email html - confirmation commande - pied de page', + 'Email html - order confirmation - order product' => 'Email html - confirmation commande - produit de la commande', + 'Email html - order notification - after address' => 'Email html - notification commande - après adresses', + 'Email html - order notification - after products' => 'Email html - notification commande - après produits', + 'Email html - order notification - before address' => 'Email html - notification commande - avant adresses', + 'Email html - order notification - before products' => 'Email html - notification commande - avant produits', + 'Email html - order notification - delivery address' => 'Email html - notification commande - adresse de livraison', + 'Email html - order notification - order product' => 'Email html - notification commande - produit de la commande', + 'Email txt - order confirmation - after address' => 'Email txt - confirmation commande - après adresses', + 'Email txt - order confirmation - after products' => 'Email txt - confirmation commande - après produits', + 'Email txt - order confirmation - before address' => 'Email txt - confirmation commande - avant adresses', + 'Email txt - order confirmation - before products' => 'Email txt - confirmation commande - avant produits', + 'Email txt - order confirmation - delivery address' => 'Email txt - confirmation commande - adresse de livraison', + 'Email txt - order confirmation - order product' => 'Email txt - confirmation commande - produit de la commande', + 'Email txt - order notification - after address' => 'Email txt - notification commande - après adresses', + 'Email txt - order notification - after products' => 'Email txt - notification commande - après produits', + 'Email txt - order notification - before address' => 'Email txt - notification commande - avant adresses', + 'Email txt - order notification - before products' => 'Email txt - notification commande - avant produits', + 'Email txt - order notification - delivery address' => 'Email txt - notification commande - adresse de livraison', + 'Email txt - order notification - order product' => 'Email txt - notification commande - produit de la commande', + 'Enable (1) or disable (0) URL rewriting' => 'Activer (1) ou désactiver (0) la réécriture d\'URL', + 'Enna' => 'Enna', + 'Entre Ríos' => 'Entre Ríos', + 'Equatorial Guinea' => 'Guinée équatoriale', + 'Eritrea' => 'Érythrée', + 'Estado de México' => 'Estado de México', + 'Estonia' => 'Estonie', + 'Ethiopia' => 'Éthiopie', + 'Euro' => 'Euro', + 'Export - JavaScript' => 'Export - JavaScript', + 'Export - table header' => 'Export - colonne tableau', + 'Export - table row' => 'Export - ligne du tableau', + 'Export modal or page - bottom' => 'Modal ou page d\'export - en bas', + 'Export modal or page - top' => 'Modal ou page d\'export - en haut', + 'Exports - JavaScript' => 'Exports - JavaScript', + 'Exports - at the bottom of a category' => 'Exports - en bas d\'une catégorie', + 'Exports - at the bottom of column 1' => 'Exports - en bas de la colonne 1', + 'Exports - at the top' => 'Exports - en haut', + 'Feature - Edit JavaScript' => 'Caractéristique - JavaScript modification', + 'Feature - Value create form' => 'Caractéristique - Formulaire de création de valeur', + 'Feature - add to all form' => 'Caractéristique - formulaire ajouter à tous', + 'Feature - create form' => 'Caractéristique - formulaire de création', + 'Feature - delete form' => 'Caractéristique - formulaire de suppression', + 'Feature - remove to all form' => 'Caractéristique - formulaire de suppression multiple', + 'Feature edit - bottom' => 'Édition d\'une caractéristique - en bas', + 'Feature edit - top' => 'Édition d\'une caractéristique - en haut', + 'Features - JavaScript' => 'Caractéristiques - JavaScript', + 'Features - at the top' => 'Caractéristiques - en haut', + 'Features - bottom' => 'Caractéristiques - bas', + 'Features - table header' => 'Caractéristiques - colonne tableau', + 'Features - table row' => 'Caractéristiques - ligne tableau', + 'Features value - table header' => 'Valeur de caractéristiques - colonne tableau', + 'Features value - table row' => 'Valeur de caractéristiques - ligne tableau', + 'Fermo' => 'Fermo', + 'Ferrara' => 'Ferrara', + 'Fiji' => 'Fidji', + 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)' => 'Nom de la page 404 (introuvable) dans le modèle actuel (avec l\'extension, par exemple, 404.html)', + 'Filename of the error page' => 'Nom du fichier de la page d\'erreur', + 'Finland' => 'Finlande', + 'Firenze' => 'Firenze', + 'Florida' => 'Floride', + 'Foggia' => 'Foggia', + 'Folder' => 'Dossier', + 'Folder - Edit JavaScript' => 'Dossier - JavaScript modification', + 'Folder - JavaScript' => 'Dossiers - JavaScript', + 'Folder - Tab' => 'Dossier - Onglet', + 'Folder - at the top' => 'Dossiers - en haut', + 'Folder - bottom' => 'Dossiers - bas', + 'Folder - caption' => 'Dossiers - légende', + 'Folder - content' => 'Dossier - contenu', + 'Folder - create form' => 'Dossier - formulaire de création', + 'Folder - delete form' => 'Dossier - formulaire de suppression', + 'Folder - header' => 'Dossiers - en-tête', + 'Folder - row' => 'Dossiers - ligne', + 'Folder edit - bottom' => 'Édition d\'un dossier - en bas', + 'Folder edit - right column bottom' => 'Édition d\'un dossier - en bas de la colonne de droite', + 'Folder edit - right column top' => 'Édition d\'un dossier - en haut de la colonne de droite', + 'Folder edit - top' => 'Édition d\'un dossier - en haut', + 'Folder page - CSS stylesheet' => 'Page dossier - feuille de style CSS', + 'Folder page - after javascript include' => 'Page dossier - après l\'inclusion du JavaScript', + 'Folder page - after javascript initialisation' => 'Page dossier - après l\'initialisation du JavaScript', + 'Folder page - after the main content area' => 'Page dossier - en dessous de la zone de contenu principale', + 'Folder page - at the bottom' => 'Page dossier - en bas', + 'Folder page - at the bottom of the main area' => 'Page dossier - en bas de la zone principale', + 'Folder page - at the top' => 'Page dossier - en haut', + 'Folder page - at the top of the main area' => 'Page dossier - en haut de la zone principale', + 'Folder page - before the main content area' => 'Page dossier - au dessus de la zone de contenu principale', + 'Forint' => 'Forint', + 'Forlì-Cesena' => 'Forlì-Cesena', + 'Formosa' => 'Formosa', + 'Franc' => 'Franc', + 'France metropolitan' => 'France métropolitaine', + 'French 10% VAT' => 'TVA française à 10%', + 'French 20% VAT' => 'TVA française à 20%', + 'French Southern Territories' => 'Terres australes et antarctiques françaises', + 'Front office integration' => 'Module Front office', + 'Frosinone' => 'Frosinone', + 'Fukui' => 'Fukui', + 'Fukuoka' => 'Fukuoka', + 'Fukushima' => 'Fukushima', + 'Gabon' => 'Gabon', + 'Gambia' => 'Gambie', + 'Genova' => 'Genova', + 'Georgia' => 'Géorgie', + 'Germany' => 'Allemagne', + 'Ghana' => 'Ghana', + 'Gifu' => 'Gifu', + 'Google Analytics block' => 'Bloc Google Analytics', + 'Gorizia' => 'Gorizia', + 'Greece' => 'Grèce', + 'Grenada' => 'Grenade', + 'Grosseto' => 'Grosseto', + 'Guadeloupe' => 'Guadeloupe', + 'Guanajuato' => 'Guanajuato', + 'Guaraní' => 'Guaraní', + 'Guatemala' => 'Guatemala', + 'Guerrero' => 'Guerrero', + 'Guinea' => 'Guinée', + 'Guinea-Bissau' => 'Guinée-Bissao', + 'Gunma' => 'Gunma', + 'Guyana' => 'Guyane', + 'Guyane Française' => 'Guyane Française', + 'HTML layout - CSS stylesheet' => 'Structure HTML - feuille de style CSS', + 'HTML layout - after javascript include' => 'Structure HTML - après l\'inclusion du JavaScript', + 'HTML layout - after the main content area' => 'Structure HTML - en dessous de la zone de contenu principale', + 'HTML layout - after the opening of the body tag' => 'Structure HTML - après l\'ouverture de la balise body', + 'HTML layout - after the opening of the head tag' => 'Structure HTML - après l\'ouverture de la balise head', + 'HTML layout - at the bottom of the header' => 'Structure HTML - en bas du header', + 'HTML layout - at the top of the footer' => 'Structure HTML - en haut du pied de page', + 'HTML layout - at the top of the header' => 'Structure HTML - en haut du header', + 'HTML layout - before the end body tag' => 'Structure HTML - avant la fin de la balise body', + 'HTML layout - before the end of the head tag' => 'Structure HTML - avant la fin de la balise head', + 'HTML layout - before the main content area' => 'Structure HTML - au dessus de la zone de contenu principale', + 'HTML layout - bottom of the footer' => 'Structure HTML - en bas du pied de page', + 'HTML layout - footer body' => 'Structure HTML - corps du pied de page', + 'HTML layout - javascript initialization' => 'Structure HTML - initialisation du JavaScript', + 'HTML layout - primary navigation' => 'Structure HTML - navigation principale', + 'HTML layout - secondary navigation' => 'Structure HTML - navigation secondaire', + 'Haiti' => 'Haïti', + 'Hawaii' => 'Hawaii', + 'Hidalgo' => 'Hidalgo', + 'Hiroshima' => 'Hiroshima', + 'Hokkaido' => 'Hokkaido', + 'Home - JavaScript' => 'Accueil - JavaScript', + 'Home - at the top' => 'Accueil - en haut', + 'Home - block' => 'Accueil - bloc', + 'Home - bottom' => 'Accueil - bas', + 'Home page - CSS stylesheet' => 'Page d\'accueil - feuille de style CSS', + 'Home page - after javascript include' => 'Page d\'accueil - après l\'inclusion du JavaScript', + 'Home page - after javascript initialisation' => 'Page d\'accueil - après l\'initialisation du JavaScript', + 'Home page - main area' => 'Page d\'accueil - zone principale', + 'Honduras' => 'Honduras', + 'Hong Kong' => 'Hong Kong', + 'Hong Kong Dollar' => 'Dollar de Honk-Kong', + 'Hook - Edit JavaScript' => 'Point d\'accroche - JavaScript modification', + 'Hook - create form' => 'Point d\'accroche - formulaire de création', + 'Hook - delete form' => 'Point d\'accroche - formulaire de suppression', + 'Hook edit - bottom' => 'Édition d\'hook - en bas', + 'Hook edit - top' => 'Édition d\'hook - en haut', + 'Hook positions' => 'Positions des points d\'accroche', + 'Hooks' => 'Points d\'accroche', + 'Hooks - JavaScript' => 'Points d\'accroche - Javascript', + 'Hooks - at the top' => 'Point d\'accroches - en haut', + 'Hooks - bottom' => 'Point d\'accroches - bas', + 'Hooks - table header' => 'Point d\'accroches - colonne tableau', + 'Hooks - table row' => 'Point d\'accroches - ligne tableau', + 'Hooks management' => 'Gestion des hooks', + 'How document files are delivered in the web space (symlink or copy)' => 'Comment les documents sont-ils fournis dans l\'espace web (lien symbolique ou copie)', + 'How original (full resolution) images are delivered in the web space (symlink or copy)' => 'Comment les images originales (pleine résolution) sont-elles fournises dans l\'espace web (lien symbolique ou copie)', + 'Hungary' => 'Hongrie', + 'Hyogo' => 'Hyogo', + 'Ibaraki' => 'Ibaraki', + 'Iceland' => 'Islande', + 'Idaho' => 'Idaho', + 'Illinois' => 'Illinois', + 'Image - Edit JavaScript' => 'Image - Modification de JavaScript', + 'Image edit - bottom' => 'Édition d\'image - en bas', + 'Image edit - top' => 'Édition d\'image - en haut', + 'Imperia' => 'Imperia', + 'Import - table header' => 'Import - colonne tableau', + 'Import - table row' => 'Import - ligne du tableau', + 'India' => 'Inde', + 'Indian Rupee' => 'Roupie Hindoue', + 'Indiana' => 'Indiana', + 'Indonesia' => 'Indonésie', + 'Invoice - After delivery module' => 'Commande - après le module de livraison', + 'Invoice - After payment module' => 'Commande - après le module de paiement', + 'Invoice - CSS' => 'Facture - CSS', + 'Invoice - additional product information' => 'Facture - informations additionnelles pour un produit', + 'Invoice - after addresse area' => 'Facture - après la zone d\'adresses', + 'Invoice - after product listing' => 'Facture - après la liste des produits', + 'Invoice - after the information area' => 'Facture - après la zone d\'informations', + 'Invoice - after the order summary' => 'Facture - après le résumé de la commande', + 'Invoice - at the bottom of information area' => 'Facture - en bas de la zone d\'informations', + 'Invoice - at the bottom of the footer' => 'Facture - en bas du pied de page', + 'Invoice - at the top of the footer' => 'Facture - en haut du pied de page', + 'Invoice - delivery address' => 'Facture - adresse de livraison', + 'Invoice - imprint' => 'Facture - mentions légales', + 'Invoice - in the header' => 'Facture - dans l\'en-tête', + 'Invoice choice - CSS stylesheet' => 'Choix du mode de paiement - feuille de style CSS', + 'Invoice choice - after javascript include' => 'Choix du mode de paiement - après l\'inclusion du JavaScript', + 'Invoice choice - after javascript initialisation' => 'Choix du mode de paiement - après l\'initialisation du JavaScript', + 'Invoice choice - at the bottom' => 'Choix du mode de paiement - en bas', + 'Invoice choice - at the top' => 'Choix du mode de paiement - en haut', + 'Invoice choice - delivery address' => 'Choix du mode de paiement - adresse de livraison', + 'Invoice choice - extra payment zone' => 'Choix du mode de paiement - zone de paiement supplémentaire', + 'Iowa' => 'Iowa', + 'Iran' => 'Iran', + 'Iraq' => 'Iraq', + 'Ireland' => 'Irlande', + 'Isernia' => 'Isernia', + 'Ishikawa' => 'Ishikawa', + 'Israel' => 'Israël', + 'Italy' => 'Italie', + 'Ivory Coast' => 'Côte dIvoire', + 'Iwate' => 'Iwate', + 'Jakarta' => 'Jakarta', + 'Jalisco' => 'Jalisco', + 'Jamaica' => 'Jamaïque', + 'Jambi' => 'Jambi', + 'Japan' => 'Japon', + 'Jordan' => 'Jordanie', + 'Jujuy' => 'Jujuy', + 'Kagawa' => 'Kagawa', + 'Kagoshima' => 'Kagoshima', + 'Kanagawa' => 'Kanagawa', + 'Kansas' => 'Kansas', + 'Kazakhstan' => 'Kazakhstan', + 'Kentucky' => 'Kentucky', + 'Kenya' => 'Kenya', + 'Kenyan shilling' => 'Shilling Kenyan', + 'Kiribati' => 'Kiribati', + 'Kochi' => 'Kochi', + 'Krona' => 'Couronne Suédoise', + 'Krone' => 'Couronne Norvégienne', + 'Kumamoto' => 'Kumamoto', + 'Kuwait' => 'Koweït', + 'Kyoto' => 'Kyoto', + 'Kyrgyzstan' => 'Kirghizistan', + 'L\'Aquila' => 'L\'Aquila', + 'La Pampa' => 'La Pampa', + 'La Rioja' => 'La Rioja', + 'La Spezia' => 'La Spezia', + 'Lambang Provinsi Papua Barat' => 'Lambang Provinsi Papua Barat', + 'Lambang Riau' => 'Lambang Riau', + 'Lambang propinsi' => 'Lambang propinsi', + 'Lampung' => 'Lampung', + 'Language - create form' => 'Langage - formulaire de création', + 'Languages - JavaScript' => 'Langages - JavaScript', + 'Languages - at the top' => 'Langages - en haut', + 'Languages - bottom' => 'Langages - bas', + 'Languages - delete form' => 'Langages - formulaire de suppression', + 'Languages block' => 'Bloc des langues', + 'Laos' => 'Laos', + 'Lari' => 'Lari', + 'Latina' => 'Latina', + 'Latvia' => 'Lettonie', + 'Layout - Before the main content' => 'Layout - Avant le contenu principal', + 'Layout - CSS' => 'Mise en page - CSS', + 'Layout - JavaScript' => 'Mise en page - JavaScript', + 'Layout - after footer' => 'Mise en page - après le pied de page', + 'Layout - after top bar' => 'Mise en page - après la barre de titre', + 'Layout - after top menu' => 'Mise en page - après le menu haut', + 'Layout - at the bottom of the top bar' => 'Mise en page - en bas de la barre supérieure', + 'Layout - at the top of the top bar' => 'Mise en page - en haut de la barre supérieure', + 'Layout - before footer' => 'Mise en page - avant le pied de page', + 'Layout - before top menu' => 'Mise en page - avant le menu haut', + 'Layout - before topbar' => 'Mise en page - avant la barre de titre', + 'Layout - in footer' => 'Mise en page - dans le pied de page', + 'Layout - in the menu catalog' => 'Mise en page - dans le menu catalogue', + 'Layout - in the menu configuration' => 'Mise en page - dans le menu configuration', + 'Layout - in the menu customers' => 'Mise en page - dans le menu clients', + 'Layout - in the menu folders' => 'Mise en page - dans le menu dossiers', + 'Layout - in the menu modules' => 'Mise en page - dans le menu modules', + 'Layout - in the menu orders' => 'Mise en page - dans le menu commandes', + 'Layout - in the menu tools' => 'Mise en page - dans le menu outils', + 'Layout - in top menu items' => 'Mise en page - éléments du menu haut', + 'Layout - inside top bar' => 'Mise en page - dans la barre de titre', + 'Leave the default configuration of session' => 'Laisser la configuration par défaut de la session', + 'Lebanon' => 'Liban', + 'Lecce' => 'Lecce', + 'Lecco' => 'Lecco', + 'Lei' => 'Lei', + 'Lesotho' => 'Lesotho', + 'Lev' => 'Lev', + 'Liberia' => 'Liberia', + 'Libya' => 'Libye', + 'Liechtenstein' => 'Liechtenstein', + 'Life time of the cart cookie in the customer browser, in seconds' => 'Durée de vie du cookie du panier dans le navigateur du client, en secondes', + 'Life time of the session cookie in the customer browser, in seconds' => 'Durée de vie du cookie de la session dans le navigateur du client, en secondes', + 'Links block' => 'Bloc liens', + 'Lira' => 'Lire', + 'Lithuania' => 'Lituanie', + 'Livorno' => 'Livourne', + 'Lodi' => 'Lodi', + 'Logging system configuration' => 'Configuration du système de log', + 'Login page - CSS stylesheet' => 'Page de connexion - feuille de style CSS', + 'Login page - after javascript include' => 'Page de connexion - après l\'inclusion du JavaScript', + 'Login page - after javascript initialisation' => 'Page de connexion - après l\'initialisation du JavaScript', + 'Login page - at the bottom' => 'Page de connexion - en bas', + 'Login page - at the bottom of the form' => 'Page de connexion - en bas du formulaire', + 'Login page - at the bottom of the main area' => 'Page de connexion - en bas de la zone principal', + 'Login page - at the top' => 'Page de connexion - en haut', + 'Login page - at the top of the form' => 'Page de connexion - en haut du formulaire', + 'Login page - at the top of the main area' => 'Page de connexion - en haut de la zone principal', + 'Logs - JavaScript' => 'Journaux - JavaScript', + 'Logs - at the top' => 'Logs - en haut', + 'Logs - bottom' => 'Logs - bas', + 'Lost password - CSS stylesheet' => 'Mot de passe perdu - feuille de style CSS', + 'Lost password - after javascript include' => 'Mot de passe perdu - après l\'inclusion du JavaScript', + 'Lost password - at the bottom' => 'Mot de passe perdu - en bas', + 'Lost password - at the bottom of the form' => 'Mot de passe perdu - en bas du formulaire', + 'Lost password - at the top' => 'Mot de passe perdu - en haut', + 'Lost password - at the top of the form' => 'Mot de passe perdu - en haut du formulaire', + 'Lost password - javascript initialization' => 'Mot de passe perdu - initialisation du JavaScript', + 'Louisiana' => 'Louisiane', + 'Lucca' => 'Lucca', + 'Luxembourg' => 'Luxembourg', + 'Macedonia' => 'Macédoine', + 'Macerata' => 'Macerata', + 'Madagascar' => 'Madagascar', + 'Mail sent after a subscription to newsletter' => 'Email envoyé après l\'inscription à la newsletter', + 'Mail sent to an administrator who requested a new password' => 'Courrier envoyé à un administrateur qui a demandé un nouveau mot de passe', + 'Mail sent to the customer when its account is created by an administrator in the back-office' => 'Mail envoyé au client lorsque son compte est créé depuis le back-office par un administrateur', + 'Mail sent to the customer when its password or email is changed in the back-office' => 'Message envoyé au client lorsque son mot de passe ou son email est changé dans le back-office', + 'Mailing system - JavaScript' => 'Envoi des e-mails - JavaScript', + 'Mailing system - at the top' => 'Envoi des e-mails - en haut', + 'Mailing system - bottom' => 'Envoi des e-mails - en bas', + 'Maine' => 'Maine', + 'Malawi' => 'Malawi', + 'Malaysia' => 'Malaisie', + 'Maldives' => 'Maldives', + 'Mali' => 'Mali', + 'Malta' => 'Malte', + 'Maluku' => 'Maluku', + 'Manat' => 'Manat', + 'Manitoba' => 'Manitoba', + 'Mantova' => 'Mantova', + 'Marshall Islands' => 'Marshall', + 'Martinique' => 'Martinique', + 'Maryland' => 'Maryland', + 'Massa' => 'Massa', + 'Massachusetts' => 'Massachusetts', + 'Matera' => 'Matera', + 'Mauritania' => 'Mauritanie', + 'Mauritius' => 'Maurice', + 'Mayotte' => 'Mayotte', + 'Medio Campidano' => 'Medio Campidano', + 'Mendoza' => 'Mendoza', + 'Message - Edit JavaScript' => 'Message - Modification de JavaScript', + 'Message - create form' => 'Message - formulaire de création', + 'Message - delete form' => 'Message - formulaire de suppression', + 'Message edit - bottom' => 'Édition d\'un message - en bas', + 'Message edit - top' => 'Édition d\'un message - en haut', + 'Message sent to the shop owner when a new order is placed' => 'Message envoyé au gestionnaire de la boutique lors d\'une nouvelle commande.', + 'Messages - JavaScript' => 'Messages - JavaScript', + 'Messages - at the top' => 'Messages - en haut', + 'Messages - bottom' => 'Messages - bas', + 'Messages - table header' => 'Messages - colonne tableau', + 'Messages - table row' => 'Messages - ligne tableau', + 'Messina' => 'Messina', + 'Mexico' => 'Mexique', + 'Michigan' => 'Michigan', + 'Michoacán' => 'Michoacán', + 'Micronesia' => 'Micronésie', + 'Mie' => 'Mie', + 'Milano' => 'Milano', + 'Mini cart' => 'Mini panier', + 'Minnesota' => 'Minnesota', + 'Misiones' => 'Misiones', + 'Miss' => 'Mademoiselle', + 'Miss_short' => 'Mlle', + 'Misses' => 'Madame', + 'Mississippi' => 'Mississippi', + 'Missouri' => 'Missouri', + 'Mister' => 'Monsieur', + 'Miyagi' => 'Miyagi', + 'Miyazaki' => 'Miyazaki', + 'Modena' => 'Modena', + 'Module - Edit JavaScript' => 'Module - Modification de JavaScript', + 'Module - configuration' => 'Module - configuration', + 'Module - configuration JavaScript' => 'Module - JavaScript configuration', + 'Module edit - bottom' => 'Édition d\'un module - en bas', + 'Module edit - top' => 'Édition d\'un module - en haut', + 'Module hook - Edit JavaScript' => 'Module hook - Modification de JavaScript', + 'Module hook - JavaScript' => 'Point d\'accroche des modules - Javascript', + 'Module hook - create form' => 'Module hook - formulaire de création', + 'Module hook - delete form' => 'Module hook - formulaire de suppression', + 'Module hook edit - bottom' => 'Édition d\'un hook de module - en bas', + 'Module hook edit - top' => 'Édition d\'un hook de module - en haut', + 'Modules - JavaScript' => 'Modules - JavaScript', + 'Modules - at the top' => 'Modules - en haut', + 'Modules - bottom' => 'Modules - bas', + 'Modules - table header' => 'Modules - colonne tableau', + 'Modules - table row' => 'Modules - ligne tableau', + 'Modules maagement' => 'Gestion des modules', + 'Modules management' => 'Gestion des modules', + 'Moldova' => 'Moldavie', + 'Monaco' => 'Principauté de Monaco', + 'Mongolia' => 'Mongolie', + 'Montana' => 'Montana', + 'Monza e della Brianza' => 'Monza e della Brianza', + 'Morelos' => 'Morelos', + 'Morocco' => 'Maroc', + 'Mozambique' => 'Mozambique', + 'Mr.' => 'M.', + 'Mrs' => 'Mme', + 'Nagano' => 'Nagano', + 'Nagasaki' => 'Nagasaki', + 'Name of the active PDF template' => 'Nom du modèle PDF actif', + 'Name of the active back-office template' => 'Nom du modèle de back-office actif', + 'Name of the active front-office template' => 'Nom du modèle de front-office actif', + 'Name of the active mailing template' => 'Nom du modèle d\'e-mail actif', + 'Name of the cart cookie' => 'Nom du cookie de stockage du panier', + 'Name of the delivery view in the current PDF template (without extension)' => 'Nom de la vue de la livraison dans le modèle PDF en cours (sans extension)', + 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)' => 'Nom du pilote graphique utilisé par la bibliothèque Imagine (voir https://imagine.readthedocs.org)', + 'Name of the invoice view in the current PDF template (without extension)' => 'Nom de la vue de la facture dans le modèle PDF en cours (sans extension)', + 'Name of the template view returned when an obsolete (or inactive) product URL is invoked' => 'Nom de la page du modèle retournée lorsqu\'une URL obsolète (ou inactive) est invoquée', + 'Name the cart cookie' => 'Nom du cookie pour le panier', + 'Namibia' => 'Namibie', + 'Napoli' => 'Napoli', + 'Nara' => 'Nara', + 'Nauru' => 'Nauru', + 'Navigation block' => 'Bloc menu', + 'Nayarit' => 'Nayarit', + 'Nebraska' => 'Nebraska', + 'Nepal' => 'Népal', + 'Netherlands' => 'Pays-Bas', + 'Neuquén' => 'Neuquén', + 'Nevada' => 'Nevada', + 'New Brunswick' => 'Nouveau-Brunswick', + 'New Hampshire' => 'New Hampshire', + 'New Jersey' => 'New Jersey', + 'New Mexico' => 'Nouveau-Mexique', + 'New Products block' => 'Bloc nouveaux produits', + 'New York' => 'New York', + 'New Zealand' => 'Nouvelle-Zélande', + 'New order {$order_ref} placed on {config key="store_name"}' => 'Nouvelle commande {$order_ref} reçue sur {config key="store_name"}', + 'New password request on {config key="store_name"}' => 'Nouvelle demande de mot de passe sur {config key="store_name"}', + 'Newfoundland and Labrador' => 'Terre Neuve et Labrador', + 'Newsletter block' => 'Bloc newsletter', + 'Newsletter page - CSS stylesheet' => 'Page newsletter - feuille de style CSS', + 'Newsletter page - after javascript include' => 'Page newsletter - après l\'inclusion du JavaScript', + 'Newsletter page - after javascript initialisation' => 'Page newsletter - après l\'initialisation du JavaScript', + 'Newsletter page - at the bottom' => 'Page newsletter - en bas', + 'Newsletter page - at the top' => 'Page newsletter - en haut', + 'Newsletter subscription confirmation mail' => 'Mail de confirmation d\'inscription à la newsletter', + 'Newsletter unsubscribe page - CSS stylesheet' => 'Désabonnement newsletter - feuille de style CSS', + 'Newsletter unsubscribe page - after javascript include' => 'Désabonnement newsletter - après l\'inclusion du JavaScript', + 'Newsletter unsubscribe page - after javascript initialisation' => 'Désabonnement newsletter - après l\'initialisation du JavaScript', + 'Newsletter unsubscribe page - at the bottom' => 'Désabonnement newsletter - en bas', + 'Newsletter unsubscribe page - at the top' => 'Désabonnement newsletter - en haut', + 'Nicaragua' => 'Nicaragua', + 'Niger' => 'Niger', + 'Nigeria' => 'Nigeria', + 'Nigerian naira' => 'Naira Nigérien', + 'Niigata' => 'Niigata', + 'Niue' => 'Niue', + 'North Carolina' => 'Caroline du Nord', + 'North Dakota' => 'Dakota du Nord', + 'North Korea' => 'Corée du Nord', + 'North Maluku' => 'Maluku du Nord', + 'North Sulawesi' => 'Sulawesi du Nord', + 'North Sumatra' => 'Sumatra-Nord', + 'Northwest Territories' => 'Territoires du Nord-Ouest', + 'Norway' => 'Norvège', + 'Not paid' => 'Non payée', + 'Nouvelle-Calédonie' => 'Nouvelle-Calédonie', + 'Nova Scotia' => 'Nouvelle-Écosse', + 'Novara' => 'Novara', + 'Nuevo León' => 'Nuevo León', + 'Nuevo Sol' => 'Nuevo Sol', + 'Number by default of results per page for customer list' => 'Nombre par défaut de résultats par page pour la liste des clients', + 'Number by default of results per page for order list' => 'Nombre par défaut de résultats par page pour la liste des commandes', + 'Number by default of results per page for product list' => 'Nombre par défaut de résultats par page pour la liste des produits', + 'Nunavut' => 'Nunavut', + 'Nuoro' => 'Nuoro', + 'Oaxaca' => 'Oaxaca', + 'Ogliastra' => 'Ogliastra', + 'Ohio' => 'Ohio', + 'Oita' => 'Oita', + 'Okayama' => 'Okayama', + 'Okinawa' => 'Okinawa', + 'Oklahoma' => 'Oklahoma', + 'Olbia-Tempio' => 'Olbia-Tempio', + 'Oman' => 'Oman', + 'Ontario' => 'Ontario', + 'Order' => 'Commande', + 'Order - After closing product row' => 'Commande - Après avoir fermé la ligne produit', + 'Order - After product list' => 'Commande - Après la liste des produits', + 'Order - Before product list' => 'Commande - Avant la liste des produits', + 'Order - Before starting product row' => 'Commande - Avant d\'ouvrir la ligne produit', + 'Order - Edit JavaScript' => 'Commande - Modification de JavaScript', + 'Order - Tab' => 'Commande- Onglet', + 'Order - bill bottom' => 'Commande - facture bas', + 'Order - bill top' => 'Commande - facture haut', + 'Order - cart bottom' => 'Commande - panier bas', + 'Order - cart top' => 'Commande - panier haut', + 'Order - content' => 'Commande - contenu', + 'Order - customer information bottom' => 'Commande - en bas des informations client', + 'Order - delivery module bottom' => 'Commande - en bas du module de livraison', + 'Order - payment module bottom' => 'Commande - en bas du module de paiement', + 'Order - product list' => 'Commande - liste produit', + 'Order - table header' => 'Commande - colonne tableau', + 'Order - table row' => 'Commande - ligne tableau', + 'Order confirmation - after the order summary' => 'Confirmation de commande - après les récapitulatif de commande', + 'Order confirmation sent to the customer' => 'Confirmation de commande envoyée au client', + 'Order details - CSS stylesheet' => 'Détail d\'une commande - feuille de style CSS', + 'Order details - additional delivery information' => 'Détail d\'une commande - informations additionnelles pour l\'expédition', + 'Order details - additional information' => 'Détail d\'une commande - informations additionnelles', + 'Order details - additional invoice information' => 'Détail d\'une commande - informations additionnelles pour la facturation', + 'Order details - additional product information' => 'Détail d\'une commande - informations additionnelles pour un produit', + 'Order details - after addresses' => 'Détail d\'une commande - Après les adresses', + 'Order details - after delivery address' => 'Détails d\'une commande - après l\'adresse de livraison', + 'Order details - after global information' => 'Détail d\'une commande - après les informations générales', + 'Order details - after invoice address' => 'Détail d\'une commande - après l\'adresse de facturation', + 'Order details - after javascript include' => 'Détail d\'une commande - après l\'inclusion du JavaScript', + 'Order details - after product' => 'Détail d\'une commande - Après un produit', + 'Order details - after products' => 'Détail d\'une commande - Après les produits', + 'Order details - after products list' => 'Détail d\'une commande - après la liste des produits', + 'Order details - at the bottom' => 'Détail d\'une commande - en bas', + 'Order details - at the top' => 'Détail d\'une commande - en haut', + 'Order details - before products list' => 'Détail d\'une commande - avant la liste des produits', + 'Order details - delivery address' => 'Détail d\'une commande - adresse de livraison', + 'Order details - invoice address' => 'Détail d\'une commande - adresse de facturation', + 'Order details - javascript initialization' => 'Détail d\'une commande - initialisation du JavaScript', + 'Order edit - bottom' => 'Édition d\'une commande - en bas', + 'Order edit - delivery address' => 'Modification commande - adresse de livraison', + 'Order edit - displayed after product information' => 'Édition d\'une commande - sous les informations du produit', + 'Order edit - order product table header' => 'Modification commande - en-tête des produits', + 'Order edit - order product table row' => 'Modification commande - ligne du tableau des produits', + 'Order edit - top' => 'Édition d\'une commande - en haut', + 'Order failed - CSS stylesheet' => 'Échec de la commande - feuille de style CSS', + 'Order failed - after javascript include' => 'Echec de la commande - après l\'inclusion du JavaScript', + 'Order failed - after javascript initialisation' => 'Echec de la commande - après l\'initialisation du JavaScript', + 'Order failed - at the bottom' => 'Échec de la commande - en bas', + 'Order failed - at the top' => 'Échec de la commande - en haut', + 'Orders - JavaScript' => 'Commandes - JavaScript', + 'Orders - at the top' => 'Commandes - en haut', + 'Orders - bottom' => 'Commandes - en bas', + 'Orders - table header' => 'Commandes - colonne tableau', + 'Orders - table row' => 'Commandes - ligne tableau', + 'Oregon' => 'Oregon', + 'Oristano' => 'Oristano', + 'Osaka' => 'Osaka', + 'Padova' => 'Padova', + 'Page 404 - CSS stylesheet' => 'Page introuvable - feuille de style CSS', + 'Page 404 - after javascript include' => 'Page introuvable - après l\'inclusion du JavaScript', + 'Page 404 - after javascript initialisation' => 'Page introuvable - après l\'initialisation du JavaScript', + 'Page 404 - content area' => 'Page introuvable - zone de contenu', + 'Paid' => 'Payée', + 'Pakistan' => 'Pakistan', + 'Palermo' => 'Palerme', + 'Panama' => 'Panama', + 'Papua' => 'Papouasie', + 'Papua Nueva Guinea' => 'Papouasie', + 'Paraguay' => 'Paraguay', + 'Parma' => 'Parma', + 'Path to the directory where documents are stored' => 'Chemin vers le répertoire où sont stockés les documents', + 'Path to the directory where images are stored' => 'Chemin vers le répertoire où les images sont stockées', + 'Pavia' => 'Pavie', + 'Pay by cheque' => 'Payer par chèque', + 'Payment failed - CSS stylesheet' => 'Échec du paiement - feuille de style CSS', + 'Payment failed - after javascript include' => 'Echec du paiement - après l\'inclusion du JavaScript', + 'Payment failed - javascript initialization' => 'Echec du paiement - initialisation du JavaScript', + 'Payment gateway - CSS stylesheet' => 'Passerelle de paiement - feuille de style CSS', + 'Payment gateway - after javascript include' => 'Passerelle de paiement - après l\'inclusion du JavaScript', + 'Payment gateway - after javascript initialisation' => 'Passerelle de paiement - après l\'initialisation du JavaScript', + 'Payment gateway - javascript' => 'Passerelle de paiement - javascript', + 'Payment gateway - main area' => 'Passerelle de paiement - zone principale', + 'Pennsylvania' => 'Pennsylvanie', + 'Peru' => 'Pérou', + 'Perugia' => 'Pérouse', + 'Pesaro-Urbino' => 'Pesaro-Urbino', + 'Pescara' => 'Pescara', + 'Peso' => 'Peso', + 'Peso Argentino' => 'Peso Argentin', + 'Philippine Peso' => 'Peso Philippin', + 'Philippines' => 'Philippines', + 'Piacenza' => 'Piacenza', + 'Pisa' => 'Pise', + 'Pistoia' => 'Pistoia', + 'Placed order - CSS stylesheet' => 'Commande terminée - feuille de style CSS', + 'Placed order - after javascript include' => 'Commande terminée - après l\'inclusion du JavaScript', + 'Placed order - after javascript initialisation' => 'Commande terminée - après l\'initialisation du JavaScript', + 'Placed order - main area' => 'Commande terminée - zone principale', + 'Poland' => 'Pologne', + 'Polynésie française' => 'Polynésie française', + 'Pordenone' => 'Pordenone', + 'Portugal' => 'Portugal', + 'Potenza' => 'Potenza', + 'Pound' => 'Livre', + 'Prato' => 'Prato', + 'Prince Edward Island' => 'Île-du-Prince-Édouard', + 'Processing' => 'Traitement', + 'Product' => 'Produit', + 'Product - Edit JavaScript' => 'Produit - Modification de JavaScript', + 'Product - Tab' => 'Produit - Onglet', + 'Product - accessories table header' => 'Produit - colonne tableau accessoires', + 'Product - accessories table row' => 'Produit - ligne tableau accessoires', + 'Product - after combinations' => 'Produit - après les déclinaisons', + 'Product - at the bottom of a product combination' => 'Produit - en bas d\'une combinaison de déclinaisons', + 'Product - attributes table header' => 'Produit - colonne tableau attributs', + 'Product - attributes table row' => 'Produit - ligne tableau attributs', + 'Product - before combinations' => 'Produit - avant les déclinaisons', + 'Product - categories table header' => 'Produit - colonne tableau catégories', + 'Product - categories table row' => 'Produit - ligne tableau catégories', + 'Product - combination delete form' => 'Produit - formulaire de suppression de combinaison', + 'Product - combinations list caption' => 'Produit - légende liste des déclinaisons', + 'Product - content' => 'Produit - contenu', + 'Product - contents table header' => 'Produit - colonne tableau contenus', + 'Product - contents table row' => 'Produit - ligne tableau contenus', + 'Product - create form' => 'Produit - formulaire de création', + 'Product - delete form' => 'Produit - formulaire de suppression', + 'Product - details pricing form' => 'Produit - Formulaire détail des prix', + 'Product - details promotion form' => 'Produit - Formulaire détail des promotions', + 'Product - features table row' => 'Produit - ligne tableau caractéristiques', + 'Product - features-table-header' => 'Produit - colonne tableau caractéristiques', + 'Product - folders table header' => 'Produit - colonne tableau dossiers', + 'Product - folders table row' => 'Produit - ligne tableau dossiers', + 'Product - stock edit form' => 'Produit - formulaire de modification du stock', + 'Product edit - bottom' => 'Édition d\'un produit - en bas', + 'Product edit - right column bottom' => 'Édition d\'un produit - en bas de la colonne de droite', + 'Product edit - right column top' => 'Édition d\'un produit - en haut de la colonne de droite', + 'Product edit - top' => 'Édition d\'un produit - en haut', + 'Product loop - at the bottom' => 'Boucle produit - en bas', + 'Product loop - at the top' => 'Boucle produit - en haut', + 'Product page - CSS stylesheet' => 'Page produit - feuille de style CSS', + 'Product page - On the bottom of the form' => 'Page produit - En bas du formulaire', + 'Product page - On the top of the form' => 'Page produit - En haut du formulaire', + 'Product page - additional information' => 'Page produit - informations additionnelles', + 'Product page - after javascript include' => 'Page produit - après l\'inclusion du JavaScript', + 'Product page - after javascript initialisation' => 'Page produit - après l\'initialisation du JavaScript', + 'Product page - at the bottom' => 'Page produit - en bas', + 'Product page - at the bottom of the detail area' => 'Page produit - en dessous de la zone de détail', + 'Product page - at the top' => 'Page produit - en haut', + 'Product page - at the top of the detail' => 'Page produit - en haut de la zone détail', + 'Product page - photo gallery' => 'Page produit - galerie photos', + 'Products - caption' => 'Produits - légende', + 'Products - header' => 'Produits - en-tête', + 'Products - row' => 'Produits - ligne', + 'Products offer block' => 'Bloc promotions', + 'Profile - Edit JavaScript' => 'Profil - Modification de JavaScript', + 'Profile - create form' => 'Profil - formulaire de création', + 'Profile - delete form' => 'Profil - formulaire de suppression', + 'Profile - table header' => 'Profil - colonne tableau', + 'Profile - table row' => 'Profil - ligne du tableau', + 'Profile edit - bottom' => 'Édition d\'un profil - en bas', + 'Profile edit - top' => 'Édition d\'un profil - en haut', + 'Profiles - JavaScript' => 'Profils - JavaScript', + 'Profiles - at the top' => 'Profils - en haut', + 'Profiles - bottom' => 'Profils - en bas', + 'Puebla' => 'Puebla', + 'Puerto Rico' => 'Porto Rico', + 'Qatar' => 'Qatar', + 'Quebec' => 'Québec', + 'Querétaro' => 'Querétaro', + 'Quetzal' => 'Quetzal', + 'Quintana Roo' => 'Quintana Roo', + 'Ragusa' => 'Ragusa', + 'Ravenna' => 'Ravenne', + 'Real' => 'Real', + 'Refunded' => 'Remboursé', + 'Reggio Calabria' => 'Reggio de Calabre', + 'Reggio Emilia' => 'Reggio d\'Émilie', + 'Register - CSS stylesheet' => 'Création de compte - feuille de style CSS', + 'Register - after javascript include' => 'Création de compte - après l\'inclusion du JavaScript', + 'Register - after javascript initialisation' => 'Création de compte - après l\'initialisation du JavaScript', + 'Register - at the bottom' => 'Création de compte - en bas', + 'Register - at the bottom of the form' => 'Création de compte - en bas du formulaire', + 'Register - at the top' => 'Création de compte - en haut', + 'Register - at the top of the form' => 'Création de compte - en haut du formulaire', + 'Rhode Island' => 'Rhode Island', + 'Riau' => 'Riau', + 'Rieti' => 'Rieti', + 'Rimini' => 'Rimini', + 'Ringgit' => 'Ringgit', + 'Riyal' => 'Riyal', + 'Roma' => 'Rome', + 'Romania' => 'Roumanie', + 'Rovigo' => 'Rovigo', + 'Ruble' => 'Rouble', + 'Rupee' => 'Roupie Pakistanaise', + 'Rupiah' => 'Roupie Indonésienne', + 'Russia' => 'Russie', + 'Rwanda' => 'Rwanda', + 'Réunion(La)' => 'Réunion(La)', + 'Río Negro' => 'Rio Negro', + 'Saga' => 'Saga', + 'Saint Barthélemy' => 'Saint-Barthélemy', + 'Saint Kitts and Nevis' => 'Saint-Christophe-et-Niévès', + 'Saint Lucia' => 'Sainte-Lucie', + 'Saint Martin (French part)' => 'Saint-Martin (Antilles françaises)', + 'Saint Vincent and the Grenadines' => 'Saint-Vincent-et-les Grenadines', + 'Saitama' => 'Saitama', + 'Sale - CSS stylesheet' => 'Promotion - feuille de style CSS', + 'Sale - after javascript include' => 'Promotion - après l\'inclusion du JavaScript', + 'Sale - after the main content area' => 'Promotion - en dessous de la zone de contenu principale', + 'Sale - at the bottom' => 'Promotion - en bas', + 'Sale - at the bottom of the main area' => 'Promotion - en bas de la zone principal', + 'Sale - at the top' => 'Promotion - en haut', + 'Sale - at the top of the main area' => 'Promotion - en haut de la zone principal', + 'Sale - before the main content area' => 'Promotion - au dessous de la zone de contenu principale', + 'Sale - create form' => 'Promotion - formulaire de création', + 'Sale - delete form' => 'Promotion - formulaire de suppression', + 'Sale - javascript initialization' => 'Promotion - initialisation du JavaScript', + 'Sale edit - bottom' => 'Édition d\'une promotion - en bas', + 'Sale edit - top' => 'Édition d\'une promotion - en haut', + 'Sale edit page - javascript last call block' => 'Page sale edit - appel javascript', + 'Salerno' => 'Salerno', + 'Sales - JavaScript' => 'Promotions - JavaScript', + 'Sales - at the bottom' => 'Promotions - en bas', + 'Sales - at the top' => 'Promotions - en haut', + 'Sales - table header' => 'Promotions - colonne tableau', + 'Sales - table row' => 'Promotions - ligne du tableau', + 'Sales management' => 'Gestion des promotions', + 'Salta' => 'Salta', + 'San Juan' => 'San Juan', + 'San Luis' => 'San Luis', + 'San Luis Potosí' => 'San Luis Potosí', + 'San Marino' => 'Saint-Marin', + 'Santa Cruz' => 'Santa Cruz', + 'Santa Fe' => 'Santa Fe', + 'Santiago del Estero' => 'Santiago del Estero', + 'Sao Tome and Principe' => 'Sao Tomé-et-Principe', + 'Saskatchewan' => 'Saskatchewan', + 'Sassari' => 'Sassari', + 'Saudi Arabia' => 'Arabie saoudite', + 'Savona' => 'Savona', + 'Search' => 'Recherche', + 'Search - JavaScript' => 'Recherche - JavaScript', + 'Search - at the top' => 'Recherche - en haut', + 'Search - bottom' => 'Recherche - en bas', + 'Search block' => 'Bloc de recherche', + 'Search page - CSS stylesheet' => 'Page de recherche - feuille de style CSS', + 'Search page - after javascript include' => 'Page de recherche - après l\'inclusion du JavaScript', + 'Search page - after javascript initialisation' => 'Page de recherche - après l\'initialisation du JavaScript', + 'Secret key for form CSRF token' => 'Clé secrète pour le jeton CSRF des formulaires', + 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)' => 'Envoyer un email de confirmation aux abonnés de la newsletter (1 = Oui, 0 = non)', + 'Senegal' => 'Sénégal', + 'Sent' => 'Envoyée', + 'Seychelles' => 'Seychelles', + 'Shekel' => 'Shekel', + 'Shiga' => 'Shiga', + 'Shimane' => 'Shimane', + 'Shipping configuration' => 'Configuration du transport', + 'Shipping configuration - Edit' => 'Configuration du transport - Modification', + 'Shipping configuration - Edit JavaScript' => 'Configuration du transport - Modification de JavaScript', + 'Shipping configuration - JavaScript' => 'Configuration du transport - JavaScript', + 'Shipping configuration - at the top' => 'Configuration du transport - en haut', + 'Shipping configuration - bottom' => 'Configuration du transport - en bas', + 'Shipping configuration - country delete form' => 'Configuration du transport - formulaire de suppression de pays', + 'Shipping configuration - create form' => 'Configuration du transport - formulaire de création', + 'Shipping configuration - delete form' => 'Configuration du transport - formulaire de suppression', + 'Shipping configuration - table header' => 'Configuration du transport - colonne tableau', + 'Shipping configuration - table row' => 'Configuration du transport - ligne tableau', + 'Shipping configuration edit - bottom' => 'Édition d\'une zone de livraiso - en bas', + 'Shipping configuration edit - top' => 'Édition d\'une zone de livraison - en haut', + 'Shipping zones edit - bottom' => 'Édition des zones de livraison d\'un transporteur - en bas', + 'Shipping zones edit - top' => 'Édition des zones de livraison d\'un transporteur - en haut', + 'Shizuoka' => 'Shizuoka', + 'Show error message instead of a white page on a server error' => 'Afficher un message d\'erreur à la place d\'une page blanche lors d\'une erreur serveur', + 'Siena' => 'Siena', + 'Sierra Leone' => 'Sierra Léone', + 'Sinaloa' => 'Sinaloa', + 'Singapore' => 'Singapour', + 'Siracusa' => 'Siracusa', + 'Sitemap - at the bottom' => 'Sitemap - en bas', + 'Slovakia' => 'Slovaquie', + 'Slovenia' => 'Slovénie', + 'Smarty template engine integration' => 'Intégration du moteur de template Smarty', + 'Social Networks block' => 'Bloc réseaux sociaux', + 'Solomon Islands' => 'Salomon', + 'Somalia' => 'Somalie', + 'Sondrio' => 'Sondrio', + 'Sonora' => 'Sonora', + 'South Africa' => 'Afrique du Sud', + 'South Carolina' => 'Caroline du Sud', + 'South Dakota' => 'Dakota du Sud', + 'South Kalimantan' => 'Kalimantan du Sud', + 'South Korea' => 'Corée du Sud', + 'South Sulawesi' => 'Sulawesi du Sud', + 'South Sumatra' => 'Sumatra du Sud', + 'Southeast Sulawesi' => 'Sulawesi du sud-est', + 'Spain' => 'Espagne', + 'Sri Lanka' => 'Sri Lanka', + 'St Pierre et Miquelon' => 'St Pierre et Miquelon', + 'Store Information - JavaScript' => 'Information boutique - JavaScript', + 'Store information configuration' => 'Configuration des informations sur la boutique', + 'Sudan' => 'Soudan', + 'Suriname' => 'Suriname', + 'Swaziland' => 'Swaziland', + 'Sweden' => 'Suède', + 'Switzerland' => 'Suisse', + 'Syria' => 'Syrie', + 'System - logs JavaScript' => 'Système - logs JavaScript', + 'Tab SEO - bottom' => 'Onglet SEO - en bas', + 'Tab SEO - top' => 'Onglet SEO - en haut', + 'Tab SEO - update form' => 'Onglet SEO - formulaire de mise à jour', + 'Tab document - bottom' => 'Onglet document - en bas', + 'Tab document - top' => 'Onglet document - en haut', + 'Tab image - bottom' => 'Onglet image - en bas', + 'Tab image - top' => 'Onglet image - en haut', + 'Tabasco' => 'Tabasco', + 'Tajikistan' => 'Tadjikistan', + 'Tamaulipas' => 'Tamaulipas', + 'Tanzania' => 'Tanzanie', + 'Taranto' => 'Taranto', + 'Tax - Edit JavaScript' => 'Taxe - Modification de JavaScript', + 'Tax - create form' => 'Taxe - formulaire de création', + 'Tax - delete form' => 'Taxe - formulaire de suppression', + 'Tax edit - bottom' => 'Édition d\'une taxe - en bas', + 'Tax edit - top' => 'Édition d\'une taxe - en haut', + 'Tax rule edit - bottom' => 'Édition d\'une règle de taxe - en bas', + 'Tax rule edit - top' => 'Édition d\'une règle de taxe - en haut', + 'Tax rules configuration' => 'Configuration des règles de taxes', + 'Taxes - update form' => 'Taxes - formulaire de modification', + 'Taxes rules - JavaScript' => 'Règles de taxes - JavaScript', + 'Taxes rules - at the top' => 'Règles de taxes - en haut', + 'Taxes rules - bottom' => 'Règles de taxes - en bas', + 'Template - Edit JavaScript' => 'Gabarit - Modification de JavaScript', + 'Template - attributes table header' => 'Gabarit - colonne tableau attributs', + 'Template - attributes table row' => 'Gabarit - ligne tableau attributs', + 'Template - create form' => 'Gabarit - formulaire de création', + 'Template - delete form' => 'Gabarit - formulaire de suppression', + 'Template - features table row' => 'Gabarit - ligne tableau caractéristiques', + 'Template - features-table-header' => 'Gabarit - colonne tableau caractéristiques', + 'Template edit - bottom' => 'Édition d\'un gabarit - en bas', + 'Template edit - top' => 'Édition d\'un gabarit - en haut', + 'Templates - JavaScript' => 'Gabarits - JavaScript', + 'Templates - at the top' => 'Gabarits - en haut', + 'Templates - bottom' => 'Gabarits - en bas', + 'Templates - table header' => 'Gabarits - colonne tableau', + 'Templates - table row' => 'Gabarits - ligne tableau', + 'Tennessee' => 'Tennessee', + 'Teramo' => 'Teramo', + 'Terni' => 'Terni', + 'Texas' => 'Texas', + 'Thailand' => 'Thaïlande', + 'The ID of the \'Terms & Conditions\' content.' => 'L\'ID du contenu de vos \'CGV\'.', + 'The ID of the folder containing your information pages : terms, imprint, ...' => 'L\'ID du dossier contenant vos pages d\'informations : CGV, mentions légales, ...', + 'The Vatican' => 'Vatican', + 'The default quality (in %) of the generated images' => 'La qualité par défaut (en %) dans les images générées', + 'The minimum length required for an administrator password' => 'La longueur minimale requise pour un mot de passe administrateur', + 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country' => 'Le chemin (par rapport au modèle de back-office par défaut) vers l\'image utilisée lorsque aucune image de drapeau ne peut être trouvée pour un pays', + 'The path to the document cache directory in the web space' => 'Chemin d\'accès au répertoire de cache de documents dans l\'espace web', + 'The path to the image cache directory in the web space' => 'Chemin vers le répertoire de cache d\'images dans l\'espace web', + 'Tierra del Fuego' => 'Tierra del Fuego', + 'TinyMCE WYSIWYG editor' => 'Editeur visuel TinyMCE', + 'Tlaxcala' => 'Tlaxcala', + 'Tochigi' => 'Tochigi', + 'Togo' => 'Togo', + 'Tokushima' => 'Tokushima', + 'Tokyo' => 'Tokyo', + 'Tonga' => 'Îles Tonga', + 'Tools - JavaScript' => 'Outils - JavaScript', + 'Tools - at the bottom of column 1' => 'Outils - en bas de la colonne 1', + 'Tools - at the top' => 'Outils - en haut', + 'Tools - at the top of the column' => 'Outils - en haut de la colonne', + 'Tools - bottom' => 'Outils - en bas', + 'Tools panel' => 'Outils', + 'Torino' => 'Torino', + 'Tottori' => 'Tottori', + 'Toyama' => 'Toyama', + 'Translations' => 'Traductions', + 'Translations - JavaScript' => 'Traductions - JavaScript', + 'Trapani' => 'Trapani', + 'Trento' => 'Trento', + 'Treviso' => 'Treviso', + 'Trieste' => 'Trieste', + 'Trinidad and Tobago' => 'Trinité-et-Tobago', + 'Tucumán' => 'Tucuman', + 'Tunisia' => 'Tunisie', + 'Tunisian Dinar' => 'Dinar Tunisien', + 'Turkey' => 'Turquie', + 'Turkmenistan' => 'Turkménistan', + 'Tuvalu' => 'Tuvalu', + 'UK Pound' => 'Livre anglaise', + 'US Virgin Islands' => 'Îles Vierges américaines', + 'USA' => 'États-Unis', + 'Udine' => 'Udine', + 'Uganda' => 'Ouganda', + 'Ukraine' => 'Ukraine', + 'United Arab Emirates' => 'Émirats arabes unis', + 'United Arab Emirates dirham' => 'Dirham des Émirats Arabes Unis', + 'United Kingdom' => 'Royaume-Uni', + 'United States Dollar' => 'Dollar Américain', + 'Update customer account - CSS stylesheet' => 'Modification compte client - feuille de style CSS', + 'Update customer account - after javascript include' => 'Modification compte client - après l\'inclusion du JavaScript', + 'Update customer account - after javascript initialisation' => 'Modification compte client - après l\'initialisation du JavaScript', + 'Update customer account - at the bottom' => 'Modification compte client - en bas', + 'Update customer account - at the bottom of the form' => 'Modification compte client - en bas du formulaire', + 'Update customer account - at the top' => 'Modification compte client - en haut', + 'Update customer account - at the top of the form' => 'Modification compte client - en haut du formulaire', + 'Uruguay' => 'Uruguay', + 'Use a persistent cookie to keep track of customer cart' => 'Utiliser un cookie persistant pour mémoriser le panier du client', + 'Utah' => 'Utah', + 'Uzbekistan' => 'Ouzbékistan', + 'Vanuatu' => 'Vanuatu', + 'Varese' => 'Varese', + 'Variable - Edit JavaScript' => 'Variable - Modification de JavaScript', + 'Variable - create form' => 'Variable - formulaire de création', + 'Variable - delete form' => 'Variable - formulaire de suppression', + 'Variable edit - bottom' => 'Édition d\'une variable - en bas', + 'Variable edit - top' => 'Édition d\'une variable - en haut', + 'Variables - JavaScript' => 'Variables - JavaScript', + 'Variables - at the top' => 'Variables - en haut', + 'Variables - bottom' => 'Variables - en bas', + 'Variables - table header' => 'Variables - colonne tableau', + 'Variables - table row' => 'Variables - ligne tableau', + 'Venezia' => 'Venezia', + 'Venezuela' => 'Vénézuela', + 'Veracruz' => 'Veracruz', + 'Verbano-Cusio-Ossola' => 'Verbano-Cusio-Ossola', + 'Vercelli' => 'Vercelli', + 'Vermont' => 'Vermont', + 'Verona' => 'Vérone', + 'Vibo Valentia' => 'Vibo Valentia', + 'Vicenza' => 'Vicenza', + 'Vietnam' => 'Viêt Nam', + 'View administration logs' => 'Consulter les logs d\'administration', + 'Virginia' => 'Virginie', + 'Virtual Product Controller' => 'Contôle de produit virtuel', + 'Viterbo' => 'Viterbo', + 'Wakayama' => 'Wakayama', + 'Wallis-et-Futuna' => 'Wallis-et-Futuna', + 'Washington' => 'Washington', + 'West Java' => 'Java-Ouest', + 'West Kalimantan' => 'Kalimantan occidental', + 'West Nusa Tenggara' => 'Nusa Tenggara occidental', + 'West Sulawesi' => 'Sulawesi occidental', + 'West Sumatra' => 'Sumatra occidental', + 'West Virginia' => 'Virginie-occidentale', + 'Western Samoa' => 'Samoa occidentales', + 'Where the WYSIWYG editor is required' => 'Partout ou l\'éditeur WYSIWYG est nécessaire', + 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)' => 'Niveau de découpe des espaces dans le code HTML généré (0 = aucun, 1 = moyen, 2 = maximum)', + 'Wisconsin' => 'Wisconsin', + 'Wyoming' => 'Wyoming', + 'Yamagata' => 'Yamagata', + 'Yamaguchi' => 'Yamaguchi', + 'Yamanashi' => 'Yamanashi', + 'Yemen' => 'Yémen', + 'Yen' => 'Yen', + 'Yogyakarta' => 'Yogyakarta', + 'You can now login at' => 'Vous pouvez maintenant vous connecter sur ', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'Vous avez oublié votre mot de passe
    \r\nVeuillez modifier ce mot de passe après votre première connexion', + 'You have lost your password
    \r\nYour new password is' => 'Vous avez oublié votre mot de passe
    \r\nVotre nouveau mot de passe est ', + 'Your account information on {config key="store_name"} has been changed.' => 'L\'accès à votre compte {config key="store_name"} a changé', + 'Your new passord is : {$password}' => 'Votre nouveau mot de passe est : {$password}', + 'Your new password' => 'Votre nouveau mot de passe', + 'Your new password for {config key="store_name"}' => 'Votre nouveau mot de passe {config key="store_name"}', + 'Your order {$order_ref} at {config key="store_name"}' => 'Votre commande {$order_ref} chez {config key="store_name"}', + 'Your subscription to %store newsletter' => 'Vous avez souscrit à la newsletter du site %store', + 'Your subscription to {config key="store_name"} newsletter' => 'Votre abonnement à {config key="store_name"} newsletter', + 'Yuan' => 'Yuan', + 'Yucatán' => 'Yucatán', + 'Yukon' => 'Yukon', + 'Zacatecas' => 'Zacatecas', + 'Zaire' => 'Zaïre', + 'Zambia' => 'Zambie', + 'Zimbabwe' => 'Zimbabwe', + 'Zone - delete form' => 'Zone - formulaire de suppression', + 'Złoty' => 'Złoty', + '[Firewall/Bruteforce] Number of allowed attemps' => '[Pare-feu/Bruteforce] Nombre de tentatives autorisées', + '[Firewall/Bruteforce] Time to wait between X attempts' => '[Pare-feu/Bruteforce] Temps à attendre entre X essais', + '[Firewall] Activate the firewall' => '[Pare-feu] Activer le pare-feu', + '[Firewall] Number of allowed attemps' => '[Pare-feu] Nombre de tentatives autorisées', + '[Firewall] Time to wait between X attempts' => '[Pare-feu] Temps à attendre entre X essais', + 'changing password email for' => 'Changement du mot de passe pour', + 'customer account - CSS stylesheet' => 'Compte client - feuille de style CSS', + 'customer account - after javascript include' => 'Compte client - après l\'inclusion du JavaScript', + 'customer account - after javascript initialisation' => 'Compte client - après l\'initialisation du JavaScript', + 'customer account - at the bottom' => 'Compte client - en bas', + 'customer account - at the top' => 'Compte client - en haut', + 'export of newsletter subscribers' => 'Export des inscrits à la newsletter', + 'language selection page - CSS stylesheet' => 'Page du choix du langage - feuille de style CSS', + 'language selection page - after javascript include' => 'Page du choix du langage - après l\'inclusion du JavaScript', + 'language selection page - after javascript initialisation' => 'Page du choix du langage - après l\'initialisation du JavaScript', + 'language selection page - at the bottom' => 'Page du choix du langage - en bas', + 'language selection page - at the top' => 'Page du choix du langage - en haut', + 'state - Edit JavaScript' => 'Etat - JavaScript modification', + 'state - creation form' => 'état - formulaire de création', + 'state - delete form' => 'état - formulaire de suppression', + 'state-edit - at the top' => 'édition d\'un état - en haut', + 'state-edit - bottom' => 'édition d\'un état - en bas', + 'states - JavaScript' => 'états - JavaScript', + 'states - at the top' => 'états - en haut', + 'states - bottom' => 'états - bas', + 'states - table header' => 'états - colonne tableau', + 'states - table row' => 'états - ligne du tableau', + 'tax rule - Edit JavaScript' => 'Règle de taxe - Modification de JavaScript', + 'tax rule - create form' => 'Règle de taxe - formulaire de création', + 'tax rule - delete form' => 'Règle de taxe - formulaire de suppression', + 'tinymce wysiwyg editor' => 'Editeur TinyMCE', + 'Đồng' => 'Đồng', + 'Гривна' => 'Hryvnia Ukrainien', +]; diff --git a/setup/I18n/hu_HU.php b/setup/I18n/hu_HU.php new file mode 100644 index 00000000..b09b55fe --- /dev/null +++ b/setup/I18n/hu_HU.php @@ -0,0 +1,17 @@ + 'Cím', + 'Advanced configuration' => 'Speciális beállítások', + 'Category' => 'Kategória', + 'Configuration' => 'Beállítások', + 'Content' => 'Tartalom', + 'Coupon' => 'Kupon', + 'Customer' => 'Ügyfél', + 'New York' => 'New York', + 'Product' => 'Termék', + 'Sales management' => 'Kampányok kezelése', + 'Search' => 'Keresés', + 'Shipping configuration' => 'Szállítási beállítások', + 'Translations' => 'Fordítások', +]; diff --git a/setup/I18n/id_ID.php b/setup/I18n/id_ID.php new file mode 100644 index 00000000..c37c8e05 --- /dev/null +++ b/setup/I18n/id_ID.php @@ -0,0 +1,49 @@ + '"Ingatkan saya" waktu kedaluwarsa kuki, secepatnya, untuk pengguna bagian administrasi', + '"Remember me" cookie expiration time, in seconds, for customer users' => '"Ingatkan saya" waktu kedaluwarsa kuki, secepatnya, untuk pelanggan', + '"Remember me" cookie name for administration users' => '"Ingatkan saya" nama kuki untuk administrator', + '"Remember me" cookie name for customer users' => '"Ingatkan saya" nama kuki untuk pelanggan', + '72h delivery' => 'Pengiriman 72 jam', + 'A {config key="store_name"} account has been created for you' => 'Sebuah akun {config key="store_name"} telah dibuat', + 'API Configuration' => 'Konfigurasi API', + 'Aceh' => 'Aceh', + 'Address' => 'Alamat', + 'Address creation - CSS stylesheet' => 'Kreasi alamat - CSS stylesheet', + 'Address creation - after javascript include' => 'Kreasi alamat - setelah mencakup javascript', + 'Address creation - after javascript initialisation' => 'Kreasi alamat - setelah inisiasi javascript', + 'Address creation - at the bottom' => 'Kreasi alamat - di bagian bawah', + 'Address creation - at the bottom of the form' => 'Kreasi alamat - di bawah formulir', + 'Address creation - at the top' => 'Kreasi alamat - di atas', + 'Address creation - at the top of the form' => 'Kreasi alamat - di atas formulir', + 'Address update - CSS stylesheet' => 'Alamat diperbarui - CSS stylesheet', + 'Address update - after javascript include' => 'Alamat diperbarui - setelah mencakup javascript', + 'Address update - after javascript initialisation' => 'Alamat diperbarui - setelah mencakup javascript', + 'Address update - at the bottom' => 'Alamat diubah - di bagian bawah', + 'Address update - at the bottom of the form' => 'Alamat diubah - di bawah formulir', + 'Address update - at the top' => 'Alamat diperbarui - di atas', + 'Address update - at the top of the form' => 'Alamat diubah - di atas formulir', + 'Admin layout - After the main content' => 'Tata letak admin - setelah konten utama', + 'Administatros list' => 'Daftar administrator', + 'Administration profiles management' => 'Manajemen profil administrasi', + 'Administrator - create form' => 'Administrator - buat formulir', + 'Administrator - delete form' => 'Administrator - hapus formulir', + 'Administrator - update form' => 'Administrator - Perbarui formulir', + 'Administrator list' => 'Daftar administrator', + 'Administrators - JavaScript' => 'Administrator - JavaScript', + 'Administrators - at the top' => 'Administrator - di atas', + 'Administrators - bottom' => 'Administrator - bawah', + 'Administrators - header' => 'Administrator - header', + 'Administrators - row' => 'Administrator - baris', + 'Alabama' => 'Alabama', + 'Alaska' => 'Alaska', + 'All Products - at the top' => 'Semua produk - di atas', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Memungkinkan pelanggan untuk mengubah email mereka. 1 untuk ya, 0 untuk tidak', + 'Category' => 'Kategori', + 'Content' => 'Konten', + 'Folder' => 'Folder', + 'Hooks' => 'Kaitan', + 'Order' => 'Pesan', + 'Translations' => 'Alih Bahasa', +]; diff --git a/setup/I18n/it_IT.php b/setup/I18n/it_IT.php new file mode 100644 index 00000000..bce278c0 --- /dev/null +++ b/setup/I18n/it_IT.php @@ -0,0 +1,165 @@ + 'Configurazione API', + 'Address' => 'Indirizzo', + 'Advanced configuration' => 'Configurazione avanzata', + 'Agrigento' => 'Agrigento', + 'Akita' => 'Akita', + 'Alabama' => 'Alabama', + 'Alaska' => 'Alaska', + 'Alberta' => 'Alberta', + 'Alessandria' => 'Alessandria', + 'Ancona' => 'Ancona', + 'Aosta' => 'Aosta', + 'Arezzo' => 'Arezzo', + 'Arizona' => 'Arizona', + 'Arkansas' => 'Arkansas', + 'Ascoli Piceno' => 'Ascoli Piceno', + 'Asti' => 'Asti', + 'Avellino' => 'Avellino', + 'Bali' => 'Bali', + 'Bari' => 'Bari', + 'Belluno' => 'Belluno', + 'Benevento' => 'Benevento', + 'Bergamo' => 'Bergamo', + 'Biella' => 'Biella', + 'Bologna' => 'Bologna', + 'Brescia' => 'Brescia', + 'Brindisi' => 'Brindisi', + 'Buenos Aires' => 'Buenos Aires', + 'Cagliari' => 'Cagliari', + 'California' => 'California', + 'Caltanissetta' => 'Caltanissetta', + 'Campobasso' => 'Campobasso', + 'Canada' => 'Canada', + 'Caserta' => 'Caserta', + 'Catania' => 'Catania', + 'Catanzaro' => 'Catanzaro', + 'Category' => 'Categoria', + 'Chieti' => 'Chieti', + 'Colorado' => 'Colorado', + 'Como' => 'Como', + 'Configuration' => 'Impostazioni', + 'Content' => 'Contenuto', + 'Cosenza' => 'Cosenza', + 'Coupon' => 'Promozione', + 'Cremona' => 'Cremona', + 'Crotone' => 'Crotone', + 'Cuneo' => 'Cuneo', + 'Customer' => 'Cliente', + 'Ferrara' => 'Ferrara', + 'Firenze' => 'Firenze', + 'Florida' => 'Florida', + 'Foggia' => 'Foggia', + 'Folder' => 'Cartella', + 'Forlì-Cesena' => 'Forlì-Cesena', + 'French Southern Territories' => 'Terre australi e antartiche francesi', + 'Genova' => 'Genova', + 'Gorizia' => 'Gorizia', + 'Hook positions' => 'Posizioni dell\'hook', + 'Idaho' => 'Idaho', + 'Illinois' => 'Illinois', + 'Imperia' => 'Imperia', + 'Jakarta' => 'Jakarta', + 'Kansas' => 'Kansas', + 'Kentucky' => 'Kentucky', + 'L\'Aquila' => 'L\'Aquila', + 'La Spezia' => 'La Spezia', + 'Lari' => 'Lari', + 'Latina' => 'Latina', + 'Lecce' => 'Lecce', + 'Lecco' => 'Lecco', + 'Livorno' => 'Livorno', + 'Lodi' => 'Lodi', + 'Louisiana' => 'Louisiana', + 'Lucca' => 'Lucca', + 'Macerata' => 'Macerata', + 'Maine' => 'Maine', + 'Mantova' => 'Mantova', + 'Maryland' => 'Maryland', + 'Massa' => 'Massa', + 'Massachusetts' => 'Massachusetts', + 'Matera' => 'Matera', + 'Medio Campidano' => 'Medio Campidano', + 'Messina' => 'Messina', + 'Michigan' => 'Michigan', + 'Milano' => 'Milano', + 'Minnesota' => 'Minnesota', + 'Mississippi' => 'Mississippi', + 'Missouri' => 'Missouri', + 'Modena' => 'Modena', + 'Montana' => 'Montana', + 'Napoli' => 'Napoli', + 'Nevada' => 'Nevada', + 'New Hampshire' => 'New Hampshire', + 'New Jersey' => 'New Jersey', + 'New York' => 'Roma', + 'North Carolina' => 'North Carolina', + 'North Dakota' => 'North Dakota', + 'Novara' => 'Novara', + 'Ohio' => 'Ohio', + 'Oklahoma' => 'Oklahoma', + 'Olbia-Tempio' => 'Olbia-Tempio', + 'Ontario' => 'Ontario', + 'Oregon' => 'Oregon', + 'Oristano' => 'Oristano', + 'Padova' => 'Padova', + 'Palermo' => 'Palermo', + 'Parma' => 'Parma', + 'Pavia' => 'Pavia', + 'Pennsylvania' => 'Pennsylvania', + 'Perugia' => 'Perugia', + 'Pesaro-Urbino' => 'Pesaro-Urbino', + 'Pescara' => 'Pescara', + 'Piacenza' => 'Piacenza', + 'Pisa' => 'Pisa', + 'Pistoia' => 'Pistoia', + 'Pordenone' => 'Pordenone', + 'Potenza' => 'Potenza', + 'Prato' => 'Prato', + 'Product' => 'Prodotto', + 'Puerto Rico' => 'Puerto Rico', + 'Quebec' => 'Quebec', + 'Ragusa' => 'Ragusa', + 'Ravenna' => 'Ravenna', + 'Reggio Calabria' => 'Reggio Calabria', + 'Reggio Emilia' => 'Reggio Emilia', + 'Rieti' => 'Rieti', + 'Rimini' => 'Rimini', + 'Saint Barthélemy' => 'Saint-Barthélemy', + 'Saint Martin (French part)' => 'Saint-Martin', + 'Salerno' => 'Salerno', + 'Sales management' => 'Gestione vendite', + 'Santa Cruz' => 'Santa Cruz', + 'Sassari' => 'Sassari', + 'Savona' => 'Savona', + 'Search' => 'Ricerca', + 'Shipping configuration' => 'Configurazione di spedizione', + 'Siena' => 'Siena', + 'Siracusa' => 'Siracusa', + 'Sondrio' => 'Sondrio', + 'Taranto' => 'Taranto', + 'Teramo' => 'Teramo', + 'Terni' => 'Terni', + 'Tokyo' => 'Tokyo', + 'Torino' => 'Torino', + 'Trapani' => 'Trapani', + 'Trento' => 'Trento', + 'Treviso' => 'Treviso', + 'Trieste' => 'Trieste', + 'USA' => 'USA', + 'Udine' => 'Udine', + 'Varese' => 'Varese', + 'Venezia' => 'Venezia', + 'Vercelli' => 'Vercelli', + 'Vermont' => 'Vermont', + 'Verona' => 'Verona', + 'Vibo Valentia' => 'Vibo Valentia', + 'Vicenza' => 'Vicenza', + 'Viterbo' => 'Viterbo', + 'Yucatán' => 'Yucatán', + 'language selection page - at the top' => 'pagina selezione lingua - nella parte superiore', + 'tax rule - Edit JavaScript' => 'regola fiscale - Modificare JavaScript', + 'tinymce wysiwyg editor' => 'tinymce wysiwyg editor', +]; diff --git a/setup/I18n/pl_PL.php b/setup/I18n/pl_PL.php new file mode 100644 index 00000000..be8f6b17 --- /dev/null +++ b/setup/I18n/pl_PL.php @@ -0,0 +1,479 @@ + '"Zapamiętaj mnie" czas ważności ciastka (cookie) w sekundach dla administratorów', + '"Remember me" cookie expiration time, in seconds, for customer users' => '"Zapamiętaj mnie" czas ważności ciastka (cookie) w sekundach, dla zalogowanych klientów', + '"Remember me" cookie name for administration users' => '"Zapamiętaj mnie" nazwa ciastka (cookie) dla administratorów', + '"Remember me" cookie name for customer users' => '"Zapamiętaj mnie" nazwa ciastka (cookie) dla zalogowanych klientów', + '72h delivery' => 'Dostawa w 72h', + 'A {config key="store_name"} account has been created for you' => '{config key="store_name"} konto zostało utworzone dla Ciebie', + 'API Configuration' => 'Konfiguracja interfejsu API', + 'Aceh' => 'Aceh', + 'Address creation - CSS stylesheet' => 'Tworzenie adresu - style CSS', + 'Address creation - after javascript include' => 'Tworzenie adresu - po załadowaniu javascript', + 'Address creation - after javascript initialisation' => 'Tworzenie adresu - po inicjalizacji javascript', + 'Address creation - at the bottom' => 'Tworzenie adresu - na dole', + 'Address creation - at the bottom of the form' => 'Tworzenie adresu - w dolnej części formularza', + 'Address creation - at the top' => 'Tworzenie adresu - na górze', + 'Address creation - at the top of the form' => 'Tworzenie adresu - w górnej części formularza', + 'Address update - CSS stylesheet' => 'Aktualizacja adresu - style CSS', + 'Address update - after javascript include' => 'Aktualizacja adresu - po załadowaniu javascript', + 'Address update - after javascript initialisation' => 'Aktualizacja adresu - po inicjalizacji javascript', + 'Address update - at the bottom' => 'Aktualizacja adresu - na dole', + 'Address update - at the bottom of the form' => 'Aktualizacja adresu - w dolnej części formularza', + 'Address update - at the top' => 'Aktualizacja adresu - na górze', + 'Address update - at the top of the form' => 'Aktualizacja adresu - w górnej części formularza', + 'Admin layout - After the main content' => 'Układ admin - Pod główną zawartością', + 'Administatros list' => 'Lista administratorów', + 'Administration profiles management' => 'Zarządzanie profilami administratorów', + 'Administrator - create form' => 'Administrator - formularz dodawania', + 'Administrator - delete form' => 'Administrator - formularz usuwania', + 'Administrator - update form' => 'Administrator - formularz modyfikacji', + 'Administrator list' => 'Lista administratorów', + 'Administrators - JavaScript' => 'Administratorzy - JavaScript', + 'Administrators - at the top' => 'Administratorzy - u góry', + 'Administrators - bottom' => 'Administratorzy - Dolny', + 'Administrators - header' => 'Administratorzy - nagłówek', + 'Administrators - row' => 'Administratorzy - wiersz', + 'Advanced Configuration' => 'Zaawansowana konfiguracja', + 'Advanced Configuration - Javascript' => 'Zaawansowana konfiguracja - po załadowaniu javascript', + 'Advanced configuration' => 'Zaawansowana konfiguracja', + 'Afghanistan' => 'Afganistan', + 'Albania' => 'Albania', + 'Algeria' => 'Algieria', + 'All Products - CSS stylesheet' => 'Wszystkie produkty -style CSS', + 'All Products - after javascript include' => 'Wszystkie produkty - po załadowaniu javascript', + 'All Products - after javascript initialisation' => 'Wszystkie produkty - po inicjalizacji javascript', + 'All Products - at the bottom' => 'Wszystkie produkty - na dole', + 'All Products - at the top' => 'Wszystkie produkty - na górze', + 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)' => 'Pozwól administratorom na ponowne utworzenie hasła (1 = tak, 0 = nie)', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Zezwalaj klientom na zmianę adresu email. 1 - zezwalaj, 0 - nie zezwalaj', + 'Allow negative product stock (1) or not (0)' => 'Zezwalaj na ujemną liczbę produktów w magazynie, 1 - zezwalaj, 0 - nie zezwalaj', + 'Allow negative product stock (1) or not (0, default)' => 'Zezwalaj na ujemną liczbę produktów w magazynie, 1 - zezwalaj, 0 - nie zezwalaj (domyślnie)', + 'Allow slash ended uri' => 'Ukośnik na końcu adresu uri', + 'Ancona' => 'Ancona', + 'Andorra' => 'Andora', + 'Angola' => 'Angola', + 'Antigua and Barbuda' => 'Antigua i Barbuda', + 'Aomori' => 'Aomori', + 'Aosta' => 'Aosta', + 'Api page - at bottom' => 'Strona Api - na dole', + 'Api page - at top' => 'Strona Api - u góry', + 'Api page - in deletion form' => 'Api - formularz usuwania', + 'Argentina' => 'Argentyna', + 'Armenia' => 'Armenia', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Poprosić klientów o potwierdzenie adresu email? 1 - tak, 0 - nie', + 'Attribut - Edit JavaScript' => 'Atrybut - edycja javascript', + 'Attribut - add to all form' => 'Atrybut - dodaj do wszystkich formularzy', + 'Attribut - create form' => 'Atrybuty - formularz dodawania', + 'Attribut - delete form' => 'Atrybuty - formularz usuwania', + 'Attribut - id delete form' => 'Atrybuty - Formularz usuwania (id)', + 'Attribut - remove to all form' => 'Atrybuty - formularz usuwania wielu atrybutów', + 'Attribute edit - bottom' => 'Edycja atrybutu - dół', + 'Attribute edit - top' => 'Edycja atrybutu - góra', + 'Australia' => 'Australia', + 'Austria' => 'Austria', + 'Avellino' => 'Avellino', + 'Azerbaijan' => 'Azerbejdżan', + 'Back-office home page' => 'Back-office strona główna', + 'Bahamas' => 'Bahamy', + 'Bahrain' => 'Bahrajn', + 'Baht' => 'Baht', + 'Baja California' => 'Baja California', + 'Bangladesh' => 'Bangladesz', + 'Barbados' => 'Barbados', + 'Base URL of the shop (e.g. http://www.yourshopdomain.com)' => 'Podstawowy URL sklepu (np. http://www.yourshopdomain.com)', + 'Belarus' => 'Białoruś', + 'Belgium' => 'Belgia', + 'Belize' => 'Belize', + 'Benin' => 'Benin', + 'Bergamo' => 'Bergamo', + 'Bhutan' => 'Bhutan', + 'Biella' => 'Biella', + 'Bielorussia' => 'Białoruś', + 'Bolivia' => 'Boliwia', + 'Boliviano' => 'Boliwijski', + 'Bologna' => 'Bolonia', + 'Bolzano' => 'Bolzano', + 'Bolívar fuerte' => 'Bolivar fuerte', + 'Bosnia and Herzegovina' => 'Bośnia i Hercegowina', + 'Botswana' => 'Botswana', + 'Brand - Edit JavaScript' => 'Marka - edycja javascript', + 'Brand - JavaScript' => 'Marka - JavaScript', + 'Brand - Tab' => 'Marka - zakładka', + 'Brand - content' => 'Marka - treść', + 'Brand - create form' => 'Marka - formularz dodawania', + 'Brand - delete form' => 'Marka - formularz usuwania', + 'Brand edit - bottom' => 'Edycja marki - dół', + 'Brand edit - right column bottom' => 'Edycja marki - prawa kolumna, dół', + 'Brand edit - right column top' => 'Edycja marki - prawa kolumna, góra', + 'Brand edit - top' => 'Edycja marki - góra', + 'Brand edit page - in the form' => 'Strona edycji marki - w formularzu', + 'Brands - at the top' => 'Marki - na górze', + 'Brands - bottom' => 'Marki - dół', + 'Brands - table header' => 'Marki - nagłówek tabeli', + 'Brands - table row' => 'Marki - wiersz tabeli', + 'Brands management' => 'Zarządzanie markami', + 'Brands page - CSS stylesheet' => 'Strona marek - style CSS', + 'Brazil' => 'Brazylia', + 'Brunei' => 'Brunei', + 'Bulgaria' => 'Bułgaria', + 'Burkina' => 'Burkina', + 'Burma' => 'Birma', + 'Burundi' => 'Burundi', + 'Cagliari' => 'Cagliari', + 'California' => 'Kalifornia', + 'Caltanissetta' => 'Caltanissetta', + 'Cambodia' => 'Kambodża', + 'Cameroon' => 'Kamerun', + 'Campeche' => 'Campeche', + 'Campobasso' => 'Campobasso', + 'Canada' => 'Kanada', + 'Canceled' => 'Anulowany', + 'Cape Verde' => 'Wyspy Zielonego Przylądka', + 'Carbonia-Iglesias' => 'Carbonia-Iglesias', + 'Cart - CSS stylesheet' => 'Koszyk - style CSS', + 'Cart - after javascript include' => 'Koszyk - po dołączeniu javascript', + 'Cart - at the bottom' => 'Koszyk - na dole', + 'Cart - at the top' => 'Koszyk - na górze', + 'Cart - javascript initialization' => 'Koszyk - inicjalizacja javascript', + 'Cart block' => 'Blok koszyka', + 'Categories - JavaScript' => 'Kategorie - JavaScript', + 'Categories - at the bottom of the catalog' => 'Kategorie - w dolnej części katalogu', + 'Categories - at the top' => 'Kategorie - na górze', + 'Categories - bottom' => 'Kategorie - dół', + 'Categories - caption' => 'Kategorie - podpis', + 'Categories - header' => 'Kategorie - nagłówek', + 'Categories - row' => 'Kategorii - wiersz', + 'Category' => 'Kategoria', + 'Category - Edit JavaScript' => 'Kategoria - edycja JavaScript', + 'Category - Tab' => 'Kategoria - Zakładka', + 'Category - content' => 'Kategoria - treść', + 'Category - contents table header' => 'Kategoria - zawartość nagłówka tabeli', + 'Category - contents table row' => 'Kategoria - zawartość wiersza tabeli', + 'Category configuration' => 'Konfiguracja kategorii', + 'Category edit - bottom' => 'Edycja kategorii - dół', + 'Category edit - top' => 'Edycja kategorii - góra', + 'Category page - CSS stylesheet' => 'Strona kategorii - style CSS', + 'Category page - after javascript include' => 'Strona kategorii - po dołączeniu javascript', + 'Category page - after javascript initialisation' => 'Strona kategorii - po inicjalizacji javascript', + 'Category page - after the main content area' => 'Strona kategorii - pod obszarem głównej treści', + 'Category page - at the bottom' => 'Strona kategorii - na dole', + 'Category page - at the bottom of the main area' => 'Strona kategorii - w dolnej części głównego obszaru', + 'Category page - at the bottom of the sidebar' => 'Strona kategorii - na dole paska bocznego', + 'Category page - at the top' => 'Strona kategorii - na górze', + 'Category page - at the top of the main area' => 'Strona kategorii - w górnej części obszaru głównego', + 'Category page - at the top of the sidebar' => 'Strona kategorii - w górnej części paska bocznego', + 'Category page - before the main content area' => 'Strona kategorii - przed obszarem głównej treści', + 'Category page - the body of the sidebar' => 'Strona kategorii - body paska bocznego', + 'Central African Republic' => 'Republika Środkowej Afryki', + 'Chad' => 'Czad', + 'Change password - CSS stylesheet' => 'Zmiana hasła - CSS', + 'Change password - after javascript include' => 'Zmiana hasła - po dołączeniu plików javascript', + 'Change password - after javascript initialisation' => 'Zmiana hasła - po inicjalizacji javascript', + 'Change password - at the bottom' => 'Zmiana hasła - na dole', + 'Configuration' => 'Konfiguracja', + 'Configuration - at the top' => 'Konfiguracja - na górze', + 'Configuration - at the top of the catalog area' => 'Konfiguracja - w górnej części obszaru katalog', + 'Configuration - at the top of the shipping area' => 'Konfiguracja - w górnej części obszaru dostawy', + 'Configuration - at the top of the system area' => 'Konfiguracja - w górnej części obszaru systemu', + 'Configuration - bottom' => 'Konfiguracja - góra', + 'Configuration / Administrator' => 'Konfiguracja / Administrator', + 'Configuration / Area' => 'Konfiguracja / Obszar', + 'Configuration / Attribute' => 'Konfiguracja / Atrybut', + 'Configuration / Cache' => 'Konfiguracja / Cache', + 'Configuration / Country' => 'Konfiguracja / Kraj', + 'Configuration / Currency' => 'Konfiguracja / Waluty', + 'Configuration / Feature' => 'Konfiguracja / Cecha', + 'Configuration / Language' => 'Konfiguracja / Język', + 'Configuration / Mailing-system' => 'Konfiguracja / Mailing-system', + 'Configuration / Message' => 'Konfiguracja / Wiadomości', + 'Configuration / Module' => 'Konfiguracja / Moduł', + 'Configuration / Profile' => 'Konfiguracja / Profil', + 'Configuration / Shipping-zone' => 'Konfiguracja / strefy dostawy', + 'Configuration / System Log' => 'Konfiguracja / System Logowania', + 'Configuration / Tax' => 'Konfiguracja / Podatek', + 'Configuration / Template' => 'Konfiguracja / Szablon', + 'Configuration variables' => 'Zmienne konfiguracyjne', + 'Congo' => 'Kongo', + 'Contact block' => 'Blok kontakt', + 'Contact page - CSS stylesheet' => 'Strona kontaktowa - style CSS', + 'Contact page - after javascript include' => 'Strona kontaktowa - po dołączeniu plików javascript', + 'Contact page - after javascript initialisation' => 'Strona kontaktowa - po inicjalizacji javascript', + 'Contact page - at the bottom' => 'Kontakt - na dole', + 'Contact page - at the bottom of the form' => 'Kontakt - w dolnej części formularza', + 'Contact page - at the top' => 'Kontakt - na górze', + 'Contact page - at the top of the form' => 'Kontakt - w górnej części formularza', + 'Contact page - if successful response' => 'Kontakt strona - jeśli udana odpowiedź', + 'Content' => 'Zawartość', + 'Content - Edit JavaScript' => 'Treść - edycja JavaScript', + 'Content - Tab' => 'Treść - Zakładka', + 'Content - content' => 'Zawartość - treści', + 'Costa Rica' => 'Kostaryka', + 'Countries - JavaScript' => 'Kraje - JavaScript', + 'Countries - at the top' => 'Krajach - na górze', + 'Countries - bottom' => 'Kraje - dół', + 'Countries - table header' => 'Kraje - nagłówek tabeli', + 'Countries - table row' => 'Kraje - wiersz tabeli', + 'Country - Edit JavaScript' => 'Kraj - edycja JavaScript', + 'Croatia' => 'Chorwacja', + 'Cuba' => 'Kuba', + 'Customer - Edit' => 'Klient - Edycja', + 'Customer - Edit JavaScript' => 'Klient - edycja JavaScript', + 'Customer - address create form' => 'Klient - formularz tworzenia adresu', + 'Customer - address update form' => 'Klient - formularz aktualizacji adresu', + 'Customer - at the top' => 'Klient - na górze', + 'Customer - bottom' => 'Klient - dół', + 'Customer - create form' => 'Klient - formularz tworzenia', + 'Customer - delete form' => 'Klient - formularz usuwania', + 'Customer - order table header' => 'Klient - nagłówek tabeli zamówienia', + 'Customer - order table row' => 'Klient - wiersz tabeli zamówienia', + 'Customer account - additional information' => 'Konto klienta - dodatkowe informacje', + 'Customer account block' => 'Blok konta klienta', + 'Customer title' => 'Tytuł klienta', + 'Customers - JavaScript' => 'Klienci - JavaScript', + 'Customers - header' => 'Klienci - nagłówek', + 'Customers - row' => 'Klienci - wiersz', + 'Cyprus' => 'Cypr', + 'Czech Republic' => 'Republika Czeska', + 'Dashboard - at the top' => 'Panel główny - u góry', + 'Dashboard - bottom' => 'Panel główny - dół', + 'Dashboard - middle' => 'Panel główny - środek', + 'Data import / export' => 'Import / export danych', + 'Default lang without translation' => 'Domyślny język bez tłumaczenia', + 'Delivery - After delivery module' => 'Dostawa - po module dostawy', + 'Delivery - CSS' => 'Dostawa - CSS', + 'Delivery - additional product information' => 'Dostawa - dodatkowe informacje o produkcie', + 'Delivery - after addresse area' => 'Dostawa - pod obszarem adresu', + 'Delivery - after the information area' => 'Dostawa - pod obszarem informacji', + 'Delivery - after the order summary' => 'Dostawa - po podsumowaniu zamówienia', + 'Delivery - at the bottom of information area' => 'Dostawa - w dolnej części obszaru informacyjnego', + 'Delivery - at the bottom of the footer' => 'Dostawa - na dole stopki', + 'Delivery - at the top of the footer' => 'Dostawa - na górze stopki', + 'Delivery - delivery address' => 'Dostawa - adres dostawy', + 'Delivery - in the header' => 'Dostawa - w nagłówku', + 'Delivery choice - CSS stylesheet' => 'Wybór dostawcy - style CSS', + 'Delivery choice - after javascript include' => 'Wybór dostawcy - po dołączeniu javascript', + 'Denmark' => 'Dania', + 'Djibouti' => 'Dżibuti', + 'Dominica' => 'Dominika', + 'Dominican Republic' => 'Dominikana', + 'Ecuador' => 'Ekwador', + 'Egypt' => 'Egipt', + 'El Salvador' => 'Salwador', + 'Enable (1) or disable (0) URL rewriting' => 'Włącz (1) lub wyłącz (0) nadpisywanie URLi', + 'Equatorial Guinea' => 'Gwinea Równikowa', + 'Eritrea' => 'Erytrea', + 'Estonia' => 'Estonia', + 'Ethiopia' => 'Etiopia', + 'Euro' => 'Euro', + 'Export - JavaScript' => 'Eksport - JavaScript', + 'Export - table header' => 'Eksport - nagłówek tabeli', + 'Export - table row' => 'Eksport - wiersz tabeli', + 'Export modal or page - bottom' => 'Eksport modal lub strona - dół', + 'Export modal or page - top' => 'Eksport modal lub strona - góra', + 'Exports - JavaScript' => 'Eksport - JavaScript', + 'Exports - at the bottom of a category' => 'Eksportu - na dole kategorii', + 'Exports - at the bottom of column 1' => 'Export - w dolnej części kolumny 1', + 'Exports - at the top' => 'Eksportu - na górze', + 'Fiji' => 'Fidżi', + 'Filename of the error page' => 'Nazwa pliku strony błędu', + 'Finland' => 'Finlandia', + 'Folder' => 'Katalog', + 'Gabon' => 'Gabon', + 'Gambia' => 'Gambia', + 'Georgia' => 'Gruzja', + 'Germany' => 'Niemcy', + 'Ghana' => 'Ghana', + 'Google Analytics block' => 'Blok Google Analytics', + 'Greece' => 'Grecja', + 'Grenada' => 'Grenada', + 'Guadeloupe' => 'Gwadelupa', + 'Guatemala' => 'Gwatemala', + 'Guinea' => 'Gwinea', + 'Guinea-Bissau' => 'Gwinea Bissau', + 'Guyana' => 'Gujana', + 'Guyane Française' => 'Guyane Française', + 'HTML layout - CSS stylesheet' => 'Układ HTML - styl CSS', + 'HTML layout - after javascript include' => 'Układ HTML - po dołączeniu plików javascript', + 'HTML layout - after the main content area' => 'Układ HTML - pod głównym obszarem zawartości', + 'HTML layout - after the opening of the body tag' => 'Układ HTML - po otwarciu znacznika body', + 'HTML layout - after the opening of the head tag' => 'Układ HTML - po otwarciu znacznika head', + 'HTML layout - at the bottom of the header' => 'Układ HTML - na dole nagłówka', + 'HTML layout - at the top of the footer' => 'Układ HTML - na górze stopki', + 'HTML layout - at the top of the header' => 'Układ HTML - na górze nagłówka', + 'HTML layout - before the end body tag' => 'Układ HTML - przed zamknięciem znacznika body', + 'HTML layout - before the end of the head tag' => 'Układ HTML - przed zamknięciem znacznika head', + 'HTML layout - before the main content area' => 'Układ HTML - nad obszarem głównej treści', + 'HTML layout - bottom of the footer' => 'Układ HTML - na dole stopki', + 'HTML layout - footer body' => 'Układ HTML - stopka', + 'HTML layout - javascript initialization' => 'Układ HTML - inicjalizacja javascript', + 'HTML layout - primary navigation' => 'Układ HTML - podstawowa nawigacja', + 'HTML layout - secondary navigation' => 'Układ HTML - drugorzędna nawigacja', + 'Haiti' => 'Haiti', + 'Home - JavaScript' => 'Strona główna - JavaScript', + 'Home - at the top' => 'Strona główna - na górze', + 'Home - block' => 'Strona główna - blok', + 'Home - bottom' => 'Strona główna - dół', + 'Home page - CSS stylesheet' => 'Strona główna - style CSS', + 'Home page - after javascript include' => 'Strona główna - po dołączeniu plików javascript', + 'Home page - after javascript initialisation' => 'Strona główna - po inicjalizacji javascript', + 'Home page - main area' => 'Strona główna - główny obszar', + 'Honduras' => 'Honduras', + 'Hong Kong' => 'Hong Kong', + 'Hook - Edit JavaScript' => 'Hook - edycja javascript', + 'Hungary' => 'Węgry', + 'Iceland' => 'Islandia', + 'India' => 'Indie', + 'Indonesia' => 'Indonezja', + 'Iran' => 'Iran', + 'Iraq' => 'Irak', + 'Ireland' => 'Irlandia', + 'Israel' => 'Izrael', + 'Italy' => 'Włochy', + 'Ivory Coast' => 'Wybrzeże Kości Słoniowej', + 'Jamaica' => 'Jamajka', + 'Japan' => 'Japonia', + 'Jordan' => 'Jordania', + 'Kazakhstan' => 'Kazachstan', + 'Kenya' => 'Kenia', + 'Kiribati' => 'Kiribati', + 'Kuwait' => 'Kuwejt', + 'Kyrgyzstan' => 'Kirgistan', + 'Laos' => 'Laotański', + 'Latvia' => 'Łotwa', + 'Layout - Before the main content' => 'Układ - przed główną treścią', + 'Layout - CSS' => 'Układ - CSS', + 'Layout - JavaScript' => 'Układ - JavaScript', + 'Layout - after footer' => 'Układ - pod stopką', + 'Layout - after top bar' => 'Układ - pod górnym paskiem', + 'Lebanon' => 'Liban', + 'Liberia' => 'Liberia', + 'Libya' => 'Libia', + 'Liechtenstein' => 'Liechtenstein', + 'Lithuania' => 'Litwa', + 'Luxembourg' => 'Luxemburg', + 'Macedonia' => 'Macedonia', + 'Madagascar' => 'Madagaskar', + 'Malawi' => 'Malawi', + 'Malaysia' => 'Malezja', + 'Maldives' => 'Malediwy', + 'Mali' => 'Mali', + 'Malta' => 'Malta', + 'Marshall Islands' => 'Wyspy Marshalla', + 'Martinique' => 'Martynika', + 'Mauritania' => 'Mauretania', + 'Mauritius' => 'Mauritius', + 'Mayotte' => 'Majotta', + 'Mexico' => 'Meksyk', + 'Micronesia' => 'Mikronezja', + 'Miss' => 'Pani', + 'Miss_short' => 'Pani', + 'Misses' => 'Pani', + 'Mister' => 'Pan', + 'Moldova' => 'Mołdawia', + 'Monaco' => 'Monako', + 'Mongolia' => 'Mongolia', + 'Morocco' => 'Maroko', + 'Mozambique' => 'Mozambik', + 'Mr.' => 'Pan', + 'Mrs' => 'Pani', + 'Name of the active PDF template' => 'Nazwa aktywnego szablonu PDF', + 'Name of the active back-office template' => 'Nazwa aktywnego szablonu back-office', + 'Name of the active front-office template' => 'Nazwa aktywnego szablonu front-office', + 'Name of the active mailing template' => 'Nazwa aktywnego szablonu korespondencji email', + 'Name of the cart cookie' => 'Nazwa ciastka koszyka', + 'Name of the delivery view in the current PDF template (without extension)' => 'Nazwa widoku dostawy w bieżącym szablonie PDF (bez rozszerzenia)', + 'Name the cart cookie' => 'Nazwa ciastka koszyka', + 'Namibia' => 'Namibia', + 'Nauru' => 'Nauru', + 'Navigation block' => 'Blok nawigacji', + 'Nepal' => 'Nepal', + 'Netherlands' => 'Holandia', + 'New Products block' => 'Blok nowych produktów', + 'New York' => 'New York', + 'New Zealand' => 'Nowa Zelandia', + 'New order {$order_ref} placed on {config key="store_name"}' => 'Nowe zamówienie {$order_ref} złożone w {config key="store_name"}', + 'Nicaragua' => 'Nikaragua', + 'Niger' => 'Niger', + 'Nigeria' => 'Nigeria', + 'Niue' => 'Niue', + 'North Korea' => 'Korea Północna', + 'Norway' => 'Norwegia', + 'Not paid' => 'Nie zapłacono', + 'Nouvelle-Calédonie' => 'Nowa Kaledonia', + 'Oman' => 'Oman', + 'Order' => 'Zamówienie', + 'Page 404 - CSS stylesheet' => 'Strona 404 - style CSS', + 'Page 404 - content area' => 'Strona 404 - treść', + 'Paid' => 'Zapłacone', + 'Pakistan' => 'Pakistan', + 'Panama' => 'Panama', + 'Papua Nueva Guinea' => 'Papua-Nowa Gwinea', + 'Paraguay' => 'Paragwaj', + 'Pay by cheque' => 'Zapłać czekiem', + 'Peru' => 'Peru', + 'Philippines' => 'Filipiny', + 'Poland' => 'Polska', + 'Portugal' => 'Portugalia', + 'Processing' => 'Przetwarzanie', + 'Qatar' => 'Katar', + 'Romania' => 'Rumunia', + 'Russia' => 'Rosja', + 'Rwanda' => 'Rwanda', + 'San Marino' => 'San Marino', + 'Sao Tome and Principe' => 'Wyspy Świętego Tomasza i Książęca', + 'Saudi Arabia' => 'Arabia Saudyjska', + 'Search' => 'Szukaj', + 'Senegal' => 'Senegal', + 'Sent' => 'Wysłano', + 'Seychelles' => 'Seszele', + 'Sierra Leone' => 'Sierra Leone', + 'Singapore' => 'Singapur', + 'Slovakia' => 'Słowacja', + 'Slovenia' => 'Słowenia', + 'Social Networks block' => 'Blok Sieci Społecznościowych', + 'Solomon Islands' => 'Wyspy Salomona', + 'Somalia' => 'Somalia', + 'South Africa' => 'Afryka Południowa', + 'South Korea' => 'Korea Południowa', + 'Spain' => 'Hiszpania', + 'Sri Lanka' => 'Sri Lanka', + 'Sudan' => 'Sudan', + 'Suriname' => 'Surinam', + 'Swaziland' => 'Suazi', + 'Sweden' => 'Szwecja', + 'Switzerland' => 'Szwajcaria', + 'Syria' => 'Syria', + 'Tajikistan' => 'Tadżykistan', + 'Tanzania' => 'Tanzania', + 'Thailand' => 'Tajlandia', + 'The Vatican' => 'Watykan', + 'Togo' => 'Togo', + 'Tonga' => 'Tonga', + 'Translations' => 'Tłumaczenia', + 'Tunisia' => 'Tunezja', + 'Turkey' => 'Turcja', + 'Turkmenistan' => 'Turkmenistan', + 'Tuvalu' => 'Tuwalu', + 'UK Pound' => 'Funt Wielkiej Brytanii', + 'Uganda' => 'Uganda', + 'Ukraine' => 'Ukraina', + 'United Arab Emirates' => 'Zjednoczone Emiraty Arabskie', + 'United Kingdom' => 'Wielka Brytania', + 'United States Dollar' => 'Dolar amerykański', + 'Venezuela' => 'Wenezuela', + 'Vietnam' => 'Wietnam', + 'Yemen' => 'Jemen', + 'You can now login at' => 'Możesz teraz zalogować się na', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'Straciłeś hasło
    \r\nProszę zmienić hasło po pierwszym logowaniu', + 'You have lost your password
    \r\nYour new password is' => 'Straciłeś hasło < br / > \r\nTwoje nowe hasło', + 'Your account information on {config key="store_name"} has been changed.' => 'Informacje o twoim koncie na {config key="store_name"} zostały zmienione.', + 'Your new passord is : {$password}' => 'Twoje nowe hasło: {$password}', + 'Your new password' => 'Twoje nowe hasło', + 'Your new password for {config key="store_name"}' => 'Twoje nowe hasło dla {config key="store_name"}', + 'Your order {$order_ref} at {config key="store_name"}' => 'Twoje zamówienie {$order_ref} w {config key="store_name"}', + 'Zaire' => 'Zair', + 'Zambia' => 'Zambia', + 'Zimbabwe' => 'Zimbabwe', +]; diff --git a/setup/I18n/pt_BR.php b/setup/I18n/pt_BR.php new file mode 100644 index 00000000..6cd03e4f --- /dev/null +++ b/setup/I18n/pt_BR.php @@ -0,0 +1,72 @@ + '"Lembrar-me" cookie de expiração tempo, em segundos, para usuários de administração', + '"Remember me" cookie expiration time, in seconds, for customer users' => '"Lembrar-me" cookie expiração tempo, em segundos, para os usuários do cliente', + 'Address' => 'Endereço', + 'Address creation - CSS stylesheet' => 'Criação de endereço - folha de estilos CSS', + 'Advanced configuration' => 'Configuração avançada', + 'Afghanistan' => 'Afeganistão', + 'Albania' => 'Albânia', + 'Algeria' => 'Argélia', + 'All Products - CSS stylesheet' => 'Todos os produtos - folha de estilos CSS', + 'All Products - after javascript include' => 'Todos os produtos - após incluir javascript', + 'All Products - after javascript initialisation' => 'Todos os produtos - após a inicialização do javascript', + 'All Products - at the bottom' => 'Todos os produtos - na parte inferior', + 'All Products - at the top' => 'Todos os produtos - no topo', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Permitir que clientes mudem seu e-mail. 1 Sim, 0 não', + 'Allow negative product stock (1) or not (0)' => 'Permitir o estoque de produto negativo (1) ou não (0)', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Pergunte aos clientes para confirmar seu e-mail, 1 para Sim, 0 não', + 'Australia' => 'Austrália', + 'Austria' => 'Áustria', + 'Azerbaijan' => 'Azerbeijão', + 'Bahamas' => 'Bahamas', + 'Bahrain' => 'Bahrein', + 'Bangladesh' => 'Bangladesh', + 'Barbados' => 'Barbados', + 'Belarus' => 'Bielorrússia', + 'Belgium' => 'Bélgica', + 'Belize' => 'Belize', + 'Benin' => 'República do Benim', + 'Bhutan' => 'Butão', + 'Bielorussia' => 'Bielorussia', + 'Bolivia' => 'Bolívia', + 'Bosnia and Herzegovina' => 'Bósnia e Herzegovina', + 'Botswana' => 'Botsuana', + 'Brand - JavaScript' => 'Marca - JavaScript', + 'Brand - Tab' => 'Marca - guia', + 'Brand - content' => 'Marca - conteúdo', + 'Brand - create form' => 'Marca - formulário de criação', + 'Brand - delete form' => 'Marca - formulário de exclusão', + 'Brazil' => 'Brasil', + 'Brunei' => 'Brunei', + 'Bulgaria' => 'Bulgária', + 'Burma' => 'Birmânia', + 'Burundi' => 'Burundi', + 'Cambodia' => 'Camboja', + 'Cameroon' => 'Camarões', + 'Canceled' => 'Cancelado', + 'Cape Verde' => 'Cabo Verde', + 'Cart - CSS stylesheet' => 'Carrinho - folha de estilos CSS', + 'Cart - after javascript include' => 'Carrinho - após incluir javascript', + 'Cart - at the bottom' => 'Carrinho - na parte inferior', + 'Cart - javascript initialization' => 'Carrinho - inicialização de javascript', + 'Cart block' => 'Bloco do carrinho', + 'Categories - JavaScript' => 'Categorias - JavaScript', + 'Categories - at the bottom of the catalog' => 'Categorias - na parte inferior do catálogo', + 'Categories - at the top' => 'Categorias - no topo', + 'Categories - caption' => 'Categorias - legenda', + 'Categories - header' => 'Categorias - cabeçalho', + 'Category' => 'Categoria', + 'Category - Edit JavaScript' => 'Categoria - editar JavaScript', + 'Category - Tab' => 'Categoria - guia', + 'Category - content' => 'Categoria - conteúdo', + 'Configuration' => 'Configuração', + 'Content' => 'Conteúdo', + 'Coupon' => 'Cupom', + 'Customer' => 'Cliente', + 'Hooks' => 'Ganchos', + 'Modules maagement' => 'Módulos', + 'New York' => 'Cidade', + 'Search' => 'Procurar', +]; diff --git a/setup/I18n/pt_PT.php b/setup/I18n/pt_PT.php new file mode 100644 index 00000000..ba155fb7 --- /dev/null +++ b/setup/I18n/pt_PT.php @@ -0,0 +1,5 @@ + 'Endereço', +]; diff --git a/setup/I18n/ru_RU.php b/setup/I18n/ru_RU.php new file mode 100644 index 00000000..8d17b988 --- /dev/null +++ b/setup/I18n/ru_RU.php @@ -0,0 +1,10 @@ + 'Адрес', + 'Advanced configuration' => 'Расширенная конфигурация', + 'Category' => 'Категория', + 'Content' => 'Содержимое', + 'New York' => 'New York', + 'Search' => 'Поиск', +]; diff --git a/setup/I18n/sk_SK.php b/setup/I18n/sk_SK.php new file mode 100644 index 00000000..81844243 --- /dev/null +++ b/setup/I18n/sk_SK.php @@ -0,0 +1,528 @@ + '"Pamätaj si ma" cookie čas vypršania, v sekundách, pre adminov', + '"Remember me" cookie expiration time, in seconds, for customer users' => '"Pamätaj si ma" cookie čas vypršania, v sekundách, pre zákazníkov', + '"Remember me" cookie name for administration users' => '"Pamätaj si ma" cookie meno pre adminov', + '"Remember me" cookie name for customer users' => '"Pamätaj si ma" cookie meno pre zákazníckych užívateľov', + '72h delivery' => 'dodanie do 72hodín', + 'A {config key="store_name"} account has been created for you' => '{kľúč config = "store_name"} účet bol vytvorený pre vás', + 'API Configuration' => 'API konfigurácia', + 'Aceh' => 'Aceh', + 'Address' => 'Adresa', + 'Address creation - CSS stylesheet' => 'Vytvorenie adresy - CSS štýlov', + 'Address update - at the bottom' => 'Aktualizovať adresu - naspodku', + 'Address update - at the bottom of the form' => 'Aktualizovať adresu - v spodnej časti formulára', + 'Address update - at the top' => 'Adresa update - hore', + 'Administatros list' => 'Zoznam administrátorov', + 'Administrator - create form' => 'Administrátor - vytvorenie formulára', + 'Administrator - delete form' => 'Správca - Vymazať formulár', + 'Administrator list' => 'Zoznam administrátorov', + 'Administrators - JavaScript' => 'Správcovia - JavaScript', + 'Administrators - at the top' => 'Správcovia - hore', + 'Administrators - bottom' => 'Správcovia - spodné', + 'Administrators - header' => 'Správcovia - hlavička', + 'Advanced Configuration' => 'Pokročilá konfigurácia', + 'Advanced Configuration - Javascript' => 'Pokročilá konfigurácia - Javascript', + 'Advanced configuration' => 'Pokročilá konfigurácia', + 'Afghanistan' => 'Afganistan', + 'Agrigento' => 'Agrigento', + 'Aguascalientes' => 'Aguascalientes', + 'Aichi' => 'Aiči', + 'Akita' => 'Akita', + 'Alabama' => 'Alabama', + 'Alaska' => 'Aljaška', + 'Albania' => 'Albánsko', + 'Alberta' => 'Alberta', + 'Alessandria' => 'Alessandria', + 'Algeria' => 'Alžírsko', + 'All Products - CSS stylesheet' => 'Všetky produkty - CSS štýlov', + 'All Products - at the bottom' => 'Všetky produkty - na spodu', + 'All Products - at the top' => 'Všetky produkty - hore', + 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)' => 'Povoliť správcom obnoviť stratené heslo (1 = áno, 0 = nie)', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Umožniť zákazníkom zmeniť ich e-mail. 1 áno, 0 pre nie', + 'An image carousel on your home page' => 'Kolotočový obrázok na vašu hlavnú stránku', + 'Ancona' => 'Ancona', + 'Andorra' => 'Andorra', + 'Aomori' => 'Aomori', + 'Aosta' => 'Aosta', + 'Arezzo' => 'Arezzo', + 'Arizona' => 'Arizona', + 'Arkansas' => 'Arkansas', + 'Ascoli Piceno' => 'Ascoli Piceno', + 'Asti' => 'Asti', + 'Attribut - create form' => 'Attribut - vytvoriť formulár', + 'Attribut - delete form' => 'Attribut - Vymazať formulár', + 'Attribut - id delete form' => 'Attribut - id Vymazať formulár', + 'Attribute value - create form' => 'Atribút hodnoty - vytvorenie formulára', + 'Australia' => 'Austrália', + 'Austria' => 'Rakúsko', + 'Avellino' => 'Avellino', + 'Azerbaijan' => 'Azerbajdžan', + 'Back-office export management' => 'Riadenie vývozov back-office', + 'Back-office home page' => 'Back-office – Domovská stránka', + 'Bahamas' => 'Bahamy', + 'Bahrain' => 'Bahrajn', + 'Baht' => 'Baht', + 'Baja California' => 'Baja California', + 'Baja California Sur' => 'Baja California Sur', + 'Bali' => 'Bali', + 'Bangka' => 'Bangka', + 'Bangladesh' => 'Bangladéš', + 'Banten' => 'Banten', + 'Barbados' => 'Barbados', + 'Bari' => 'Bari', + 'Barletta-Andria-Trani' => 'Barletta-Andria-Trani', + 'Belarus' => 'Bielorusko', + 'Belarusian ruble' => 'Bieloruský rubeľ', + 'Belgium' => 'Belgicko', + 'Belize' => 'Belize', + 'Belluno' => 'Belluno', + 'Benevento' => 'Benevento', + 'Bengkulu' => 'Bengkulu', + 'Benin' => 'Benin', + 'Bergamo' => 'Bergamo', + 'Bhutan' => 'Bhután', + 'Biella' => 'Biella', + 'Bielorussia' => 'Bielorusko', + 'Bolivia' => 'Bolívia', + 'Boliviano' => 'Bolívijské Boliviano', + 'Bologna' => 'Bologna', + 'Bolzano' => 'Bolzano', + 'Bolívar fuerte' => 'Bolivar fuerte', + 'Bosnia and Herzegovina' => 'Bosna a Hercegovina', + 'Botswana' => 'Botswana', + 'Brand - Edit JavaScript' => 'Značka - upraviť JavaScript', + 'Brand - JavaScript' => 'Značka - JavaScript', + 'Brand - content' => 'Značka - obsah', + 'Brand - create form' => 'Značka - vytvoriť formulár', + 'Brand - delete form' => 'Značka - Vymazať formulár', + 'Brand edit - right column bottom' => 'Upraviť značky - dolnej časti pravého stĺpca', + 'Brand edit - right column top' => 'Upraviť značky - pravý stĺpec hore', + 'Brescia' => 'Brescia', + 'Brindisi' => 'Brindisi', + 'British Columbia' => 'Britská Kolumbia', + 'Brunei' => 'Brunej', + 'Buenos Aires' => 'Buenos Aires', + 'Bulgaria' => 'Bulharsko', + 'Burkina' => 'Burkina', + 'Burma' => 'Barma', + 'Burundi' => 'Burundi', + 'Cagliari' => 'Cagliari', + 'California' => 'Kalifornia', + 'Caltanissetta' => 'Caltanissetta', + 'Cambodia' => 'Kambodža', + 'Cameroon' => 'Kamerun', + 'Campeche' => 'Campeche', + 'Campobasso' => 'Campobasso', + 'Canada' => 'Kanada', + 'Canceled' => 'Zrušené', + 'Cape Verde' => 'Kapverdy', + 'Carbonia-Iglesias' => 'Athina-Iglesias', + 'Cart - CSS stylesheet' => 'Nákupný košík - CSS štýlov', + 'Cart - after javascript include' => 'Nákupný košík - po javascript obsahovať', + 'Cart - at the bottom' => 'Nákupný košík - na dne', + 'Cart - at the top' => 'Nákupný košík - hore', + 'Cart - javascript initialization' => 'Nákupný košík - javascript Inicializácia', + 'Cart block' => 'Blok košík', + 'Caserta' => 'Caserta', + 'Catamarca' => 'Catamarca', + 'Catania' => 'Catania', + 'Catanzaro' => 'Catanzaro', + 'Categories - JavaScript' => 'Kategórie - JavaScript', + 'Categories - at the bottom of the catalog' => 'Kategórie - v spodnej časti katalógu', + 'Categories - at the top' => 'Kategórie - v hornej časti', + 'Categories - bottom' => 'Kategórie - spodné', + 'Categories - caption' => 'Kategórie - Popis', + 'Categories - header' => 'Kategórie - hlavička', + 'Categories - row' => 'Kategórie - riadok', + 'Category' => 'Kategória', + 'Category - Edit JavaScript' => 'Kategória - upraviť JavaScript', + 'Category - content' => 'Kategória - obsah', + 'Category - create form' => 'Kategória - vytvoriť formulár', + 'Category - delete form' => 'Kategória - Vymazať formulár', + 'Category edit - right column bottom' => 'Upraviť kategóriu - dolnej časti pravého stĺpca', + 'Category edit - right column top' => 'Upraviť kategóriu - pravý stĺpec hore', + 'Central African Republic' => 'Stredoafrická republika', + 'Central Java' => 'Centrálna Java', + 'Central Kalimantan' => 'Centrálnej Kalimantan', + 'Central Sulawesi' => 'Centrálnej Sulawesi', + 'Chaco' => 'Chaco', + 'Chad' => 'Čad', + 'Change password - CSS stylesheet' => 'Zmena hesla - CSS štýlov', + 'Change password - at the bottom' => 'Zmena hesla - na dne', + 'Change password - at the top' => 'Zmena hesla - hore', + 'Chiapas' => 'Chiapas', + 'Chiba' => 'Chiba', + 'Chieti' => 'Chieti', + 'Chihuahua' => 'Čivava', + 'Chile' => 'Čile', + 'China' => 'Čína', + 'Chubut' => 'Chubut', + 'Ciudad de Buenos Aires' => 'Ciudad de Buenos Aires', + 'Coahuila' => 'Coahuila', + 'Colima' => 'Colima', + 'Colombia' => 'Kolumbia', + 'Colorado' => 'Colorado', + 'Colón' => 'Colón', + 'Configuration' => 'Konfigurácia', + 'Configuration - JavaScript' => 'Konfigurácia - JavaScript', + 'Configuration - at the bottom of the catalog' => 'Konfigurácia - v spodnej časti katalógu', + 'Configuration - at the bottom of the shipping area' => 'Konfigurácia - v dolnej časti oblasti pre odoslanie', + 'Configuration - at the bottom of the system area' => 'Konfigurácia - v spodnej časti oblasti systému', + 'Configuration / Module' => 'Konfigurácia / modul', + 'Configuration / Profile' => 'Nastavenia / profil', + 'Configuration / Shipping-zone' => 'Konfigurácia / zóna doručenia', + 'Configuration / System Log' => 'Konfigurácia / systém Log', + 'Configuration / Tax' => 'Konfigurácia / daň', + 'Congo' => 'Kongo', + 'Connecticut' => 'Connecticut', + 'Content' => 'Obsah', + 'Content - create form' => 'Obsah - vytvoriť formulár', + 'Content - delete form' => 'Obsah - Vymazať formulár', + 'Content edit - right column bottom' => 'Upraviť obsah - dolnej časti pravého stĺpca', + 'Content edit - right column top' => 'Upraviť obsah - pravý stĺpec hore', + 'Corrientes' => 'Corrientes', + 'Cosenza' => 'Cosenza', + 'Country - create form' => 'Krajina - vytvoriť formulár', + 'Country - delete form' => 'Krajina - Vymazať formulár', + 'Coupon' => 'Kupón', + 'Cremona' => 'Cremona', + 'Croatia' => 'Chorvátsko', + 'Croatian Kuna' => 'Chorvátska Kuna', + 'Crotone' => 'Crotone', + 'Cuba' => 'Kuba', + 'Cuneo' => 'Cuneo', + 'Currencies - at the top' => 'Meny - hore', + 'Currencies - bottom' => 'Meny - spodné', + 'Currencies - table header' => 'Meny - hlavička tabuľky', + 'Currencies - table row' => 'Meny - riadok tabuľky', + 'Currency - create form' => 'Mena - vytvoriť formulár', + 'Currency - delete form' => 'Mena - Vymazať formulár', + 'Customer' => 'Zákazník', + 'Customer - Edit' => 'Zákazník - upraviť', + 'Customer - address create form' => 'Zákazník – formulár vytvorenia adresy', + 'Customer - address delete form' => 'Zákazník – formulár odstránenia adresy', + 'Customer - address update form' => 'Zákazník – formulár aktualizovania adresy', + 'Customer - at the top' => 'Zákazník - hore', + 'Customer - bottom' => 'Zákazník - dole', + 'Customer - create form' => 'Zákazník - vytvoriť formulár', + 'Customer - delete form' => 'Zákazník - Vymazať formulár', + 'Cyprus' => 'Cyprus', + 'Czech Republic' => 'Česká republika', + 'Czech koruna' => 'Česká koruna', + 'Córdoba' => 'Córdoba', + 'Danish krone' => 'Dánska koruna', + 'Delaware' => 'Delaware', + 'Delivery - CSS' => 'Dodanie - CSS', + 'Dinar' => 'Dinár', + 'Displays the default blocks on the homepage of the administration' => 'Zobrazuje predvolené bloky na domovskú stránku správy', + 'District of Columbia' => 'District of Columbia', + 'Distrito Federal' => 'Distrito Federal', + 'Dollar' => 'Dolár', + 'Dollar (CAD)' => 'Dolár (CAD)', + 'Durango' => 'Durango', + 'East Nusa Tenggara' => 'East Nusa Tenggara', + 'East kalimantan' => 'East kalimantan', + 'Ehime' => 'Ehime', + 'Email html - layout - CSS' => 'Html email - usporiadanie - CSS', + 'Email html - layout - footer' => 'E-mail - štruktúra - html päta', + 'Email html - order confirmation - after address' => 'E-mail Html - potvrdenie objednávky - po adrese', + 'Email html - order confirmation - after products' => 'E-mail html - potvrdenieobjednávky - po produktoch', + 'Email html - order confirmation - before address' => 'E-mail html - potvrdenie objednávky - pred adresu', + 'Email html - order confirmation - before products' => 'E-mail html- potvrdenie objednávky - pred produkty', + 'Email html - order confirmation - delivery address' => 'E-mail Html - potvrdenie objednávky - dodacia adresa', + 'Email html - order confirmation - footer' => 'E-mail html - potvrdenie objednávky - päta', + 'Email html - order confirmation - order product' => 'E-mail html - potvrdenie objednávky -objednaný produkt', + 'Email html - order notification - after address' => 'E-mail Html - potvrdenie objednávky - po adrese', + 'Email html - order notification - after products' => 'E-mail html - potvrdenie objednávky - po produktoch', + 'Email html - order notification - before address' => 'E-mail html - potvrdenie objednávky - pred adresu', + 'Email html - order notification - before products' => 'E-mail html - potvrdenie objednávky - po produktoch', + 'Email html - order notification - delivery address' => 'E-mail Html - potvrdenie objednávky - dodacia adresa', + 'Email html - order notification - order product' => 'E-mail html - potvrdenie objednávky -objednaný produkt', + 'Email txt - order confirmation - after address' => 'E-mail txt - potvrdenie objednávky - po adrese', + 'Email txt - order confirmation - after products' => 'E-mail txt - potvrdenie objednávky - po produktov', + 'Email txt - order confirmation - before address' => 'E-mail txt - potvrdenie objednávky - pred adresu', + 'Email txt - order confirmation - before products' => 'E-mail txt - potvrdenie objednávky - pred produktami', + 'Email txt - order confirmation - delivery address' => 'E-mail txt - potvrdenie objednávky - dodacia adresa', + 'Email txt - order confirmation - order product' => 'E-mail txt - potvrdenie objednávky - objednaný produkt', + 'Email txt - order notification - after address' => 'E-mail txt - potvrdenie objednávky - po adrese', + 'Email txt - order notification - after products' => 'E-mail txt - potvrdenie objednávky - po produktoch', + 'Email txt - order notification - before address' => 'E-mail txt - potvrdenie objednávky - pred adresu', + 'Email txt - order notification - before products' => 'E-mail txt - potvrdenie objednávky - pred produktami', + 'Email txt - order notification - delivery address' => 'E-mail txt - potvrdenie objednávky - dodacia adresa', + 'Email txt - order notification - order product' => 'E-mail txt - potvrdenie objednávky -objednaný produkt', + 'Enna' => 'Enna', + 'Entre Ríos' => 'Entre Ríos', + 'Estado de México' => 'Estado de México', + 'Feature - Value create form' => 'Funkcia - hodnota vytvoriť formulár', + 'Feature - create form' => 'Charakteristika - vytvoriť formulár', + 'Feature - delete form' => 'Charakteristika - Vymazať formulár', + 'Fermo' => 'Fermo', + 'Ferrara' => 'Ferrara', + 'Firenze' => 'Firenze', + 'Florida' => 'Florida', + 'Foggia' => 'Foggia', + 'Folder' => 'Priečinok', + 'Folder - create form' => 'Zložky - vytvorenie formulára', + 'Folder - delete form' => 'Zložku - Vymazať formulár', + 'Folder edit - right column bottom' => 'Upraviť zložky - dolná časť pravého stĺpca', + 'Folder edit - right column top' => 'Upraviť zložky - pravý stĺpec hore', + 'Forint' => 'Maďarský forint', + 'Forlì-Cesena' => 'Forlì-Cesena', + 'Formosa' => 'Formosa', + 'Franc' => 'Frank', + 'French Southern Territories' => 'Francúzske južné územia', + 'Frosinone' => 'Frosinone', + 'Fukui' => 'Fukui', + 'Fukuoka' => 'Fukuoka', + 'Fukushima' => 'Fukushima', + 'Genova' => 'Genova', + 'Gifu' => 'Gifu', + 'Gorizia' => 'Gorizia', + 'Grosseto' => 'Grosseto', + 'Guanajuato' => 'Guanajuato', + 'Guaraní' => 'Guaraní', + 'Guerrero' => 'Guerrero', + 'Gunma' => 'Gunma', + 'Hawaii' => 'Havaj', + 'Invoice - After delivery module' => 'Faktúra - po dodanie modul', + 'Invoice - After payment module' => 'Faktúra - po platobný modul', + 'Invoice - CSS' => 'Faktúra - CSS', + 'Invoice - additional product information' => 'Faktúra - ďalšie informácie o produkte', + 'Invoice - after addresse area' => 'Faktúra - po Address oblasť', + 'Invoice - after product listing' => 'Faktúra - po výpis produktov', + 'Invoice - after the information area' => 'Faktúra - po informácie', + 'Invoice - after the order summary' => 'Faktúra - po súhrne objednávky', + 'Invoice - delivery address' => 'Faktúra - adresa doručenia', + 'Invoice - imprint' => 'Faktúra -pečiatka', + 'Invoice - in the header' => 'Faktúra - v hlavičke', + 'Invoice choice - at the bottom' => 'Výber faktúry - naspodku', + 'Invoice choice - at the top' => 'Výber faktúry - hore', + 'Jakarta' => 'Jakarta', + 'Kuwait' => 'Kuvajt', + 'Kyrgyzstan' => 'Kirgizsko', + 'Language - create form' => 'Jazyk - vytvoriť formulár', + 'Languages - JavaScript' => 'Jazyky - JavaScript', + 'Languages - at the top' => 'Jazyky - hore', + 'Languages - bottom' => 'Jazyky - spodné', + 'Languages - delete form' => 'Jazyky - Vymazať formulár', + 'Laos' => 'Laos', + 'Lecco' => 'Lecco', + 'Lei' => 'Lei', + 'Lev' => 'Lev', + 'Lira' => 'Líra', + 'Livorno' => 'Livorno', + 'Lodi' => 'Lodi', + 'Louisiana' => 'Louisiana', + 'Lucca' => 'Lucca', + 'Macerata' => 'Macerata', + 'Mail sent after a subscription to newsletter' => 'E-mail zaslaný po prihlásení sa na odber noviniek', + 'Mail sent to an administrator who requested a new password' => 'E-mail, ktorý je odoslaný adminovi po žiadosti o nové heslo', + 'Maine' => 'Maine', + 'Maluku' => 'Maluku', + 'Manat' => 'Turkménsky manat', + 'Manitoba' => 'Manitoba', + 'Mantova' => 'Mantova', + 'Maryland' => 'Maryland', + 'Massa' => 'Massa', + 'Massachusetts' => 'Massachusetts', + 'Matera' => 'Matera', + 'Medio Campidano' => 'Medio Campidano', + 'Mendoza' => 'Mendoza', + 'Messina' => 'Messina', + 'Michigan' => 'Michigan', + 'Michoacán' => 'Michoacán', + 'Mie' => 'Mie', + 'Milano' => 'Milano', + 'Mini cart' => 'Mini nákupný košík', + 'Minnesota' => 'Minnesota', + 'Misiones' => 'Misiones', + 'Mississippi' => 'Mississippi', + 'Missouri' => 'Missouri', + 'Miyagi' => 'Miyagi', + 'Miyazaki' => 'Miyazaki', + 'Modena' => 'Modena', + 'New York' => 'New York', + 'Nunavut' => 'Nunavut', + 'Nuoro' => 'Nuoro', + 'Oaxaca' => 'Oaxaca', + 'Ogliastra' => 'Ogliastra', + 'Ohio' => 'Ohio', + 'Oita' => 'Oita', + 'Okayama' => 'Okayama', + 'Okinawa' => 'Okinawa', + 'Oklahoma' => 'Oklahoma', + 'Olbia-Tempio' => 'Olbia Tempio', + 'Ontario' => 'Ontario', + 'Order' => 'Objednávka', + 'Order - cart bottom' => 'Objednávka - dno košíka', + 'Order - cart top' => 'Objednávka - košík top', + 'Order details - after delivery address' => 'Podrobnosti objednávky - po adresu doručenia', + 'Order details - after invoice address' => 'Podrobnosti objednávky - po fakturačnej adrese', + 'Oregon' => 'Oregon', + 'Oristano' => 'Oristano', + 'Osaka' => 'Osaka', + 'Padova' => 'Padova', + 'Palermo' => 'Palermo', + 'Papua' => 'Papua', + 'Parma' => 'Parma', + 'Pavia' => 'Pavia', + 'Pennsylvania' => 'Pennsylvania', + 'Perugia' => 'Perugia', + 'Pesaro-Urbino' => 'Pesaro-Urbino', + 'Potenza' => 'Potenza', + 'Pound' => 'Libra', + 'Prato' => 'Prato', + 'Prince Edward Island' => 'Ostrov princa Eduarda', + 'Product - create form' => 'Produkt - vytvoriť formulár', + 'Product - delete form' => 'Produkt - Vymazať formulár', + 'Puebla' => 'Puebla', + 'Puerto Rico' => 'Portoriko', + 'Quebec' => 'Quebec', + 'Querétaro' => 'Querétaro', + 'Quetzal' => 'Guatemalský quetzal', + 'Quintana Roo' => 'Quintana Roo', + 'Ragusa' => 'Ragusa', + 'Ravenna' => 'Ravenna', + 'Real' => 'Reálne', + 'Reggio Calabria' => 'Reggio Calabria', + 'Reggio Emilia' => 'Reggio Emilia', + 'Rhode Island' => 'Rhode Island', + 'Riau' => 'Riau', + 'Rieti' => 'Rieti', + 'Rimini' => 'Rimini', + 'Ringgit' => 'Ringgit', + 'Riyal' => 'Riál', + 'Roma' => 'Rím', + 'Rovigo' => 'Rovigo', + 'Ruble' => 'Rubeľ', + 'Rupee' => 'Rupia', + 'Rupiah' => 'Rupia', + 'Río Negro' => 'Río Negro', + 'Saga' => 'Sága', + 'Saint Barthélemy' => 'Svätý Bartolomej', + 'Saint Martin (French part)' => 'Svätý Martin (Francúzska časť)', + 'Saitama' => 'Saitama', + 'Sale - CSS stylesheet' => 'Predaj - CSS štýlov', + 'Sale - at the top' => 'Výpredaj - hore', + 'Sale - at the top of the main area' => 'Výpredaj - v hornej časti hlavnej oblasti', + 'Salerno' => 'Salerno', + 'Salta' => 'Salta', + 'San Juan' => 'San Juan', + 'San Luis' => 'San Luis', + 'San Luis Potosí' => 'San Luis Potosí', + 'Santa Cruz' => 'Santa Cruz', + 'Santa Fe' => 'Santa Fe', + 'Santiago del Estero' => 'Santiago del Estero', + 'Saskatchewan' => 'Saskatchewan', + 'Sassari' => 'Sassari', + 'Savona' => 'Savona', + 'Search' => 'Hľadať', + 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)' => 'Poslať potvrdzovací e-mail pre záujemcov o newsletter (1 = áno, 0 = nie)', + 'Shekel' => 'Shekel', + 'Shiga' => 'Šiga', + 'Shimane' => 'Šimane', + 'Shizuoka' => 'Shizuoka', + 'Siena' => 'Siena', + 'Sinaloa' => 'Sinaloa', + 'Siracusa' => 'Siracusa', + 'Sondrio' => 'Sondrio', + 'Sonora' => 'Sonora', + 'South Carolina' => 'Južná Karolína', + 'South Dakota' => 'Južná Dakota', + 'South Kalimantan' => 'Južná Kalimantan', + 'South Sulawesi' => 'Južná Sulawesi', + 'South Sumatra' => 'Južná Sumatra', + 'Southeast Sulawesi' => 'Juhovýchodný Sulawesi', + 'Tabasco' => 'Tabasco', + 'Tamaulipas' => 'Tamaulipas', + 'Taranto' => 'Taranto', + 'Tennessee' => 'Tennessee', + 'Teramo' => 'Teramo', + 'Terni' => 'Terni', + 'Texas' => 'Texas', + 'The minimum length required for an administrator password' => 'Minimálna požadovaná dĺžka hesla administrátora', + 'Tierra del Fuego' => 'Tierra del Fuego', + 'Tlaxcala' => 'Tlaxcala', + 'Tochigi' => 'Točigi', + 'Tokushima' => 'Tokushima', + 'Tokyo' => 'Tokio', + 'Torino' => 'Torino', + 'Tottori' => 'Tottori', + 'Toyama' => 'Toyama', + 'Translations' => 'Preklady', + 'Trapani' => 'Trapani', + 'Trento' => 'Trento', + 'Treviso' => 'Treviso', + 'Trieste' => 'Trieste', + 'Tucumán' => 'Tucumán', + 'Tunisian Dinar' => 'Tuniský dinár', + 'US Virgin Islands' => 'AMERICKÉ Panenské ostrovy', + 'USA' => 'USA', + 'Udine' => 'Udine', + 'Uganda' => 'Uganda', + 'Ukraine' => 'Ukrajina', + 'United Arab Emirates' => 'Spojené Arabské Emiráty', + 'United Arab Emirates dirham' => 'Spojené Arabské Emiráty dirham', + 'Utah' => 'Utah', + 'Uzbekistan' => 'Uzbekistan', + 'Vanuatu' => 'Vanuatu', + 'Varese' => 'Varese', + 'Venezia' => 'Venezia', + 'Veracruz' => 'Veracruz', + 'Verbano-Cusio-Ossola' => 'Verbano-Cusio-Ossola', + 'Vercelli' => 'Vercelli', + 'Vermont' => 'Vermont', + 'Verona' => 'Verona', + 'Vibo Valentia' => 'Vibo Valentia', + 'Vicenza' => 'Vicenza', + 'Virginia' => 'Virginia', + 'Viterbo' => 'Viterbo', + 'Wakayama' => 'Wakayama', + 'Washington' => 'Washington', + 'West Java' => 'Západná Jáva', + 'West Kalimantan' => 'West Kalimantan', + 'West Nusa Tenggara' => 'West Nusa Tenggara', + 'West Sulawesi' => 'Západ Sulawesi', + 'West Sumatra' => 'Západná Sumatra', + 'West Virginia' => 'Západná Virgínia', + 'Western Samoa' => 'Západná Samoa', + 'Wisconsin' => 'Wisconsin', + 'Wyoming' => 'Wyoming', + 'Yamagata' => 'Yamagata', + 'Yamaguchi' => 'Yamaguchi', + 'Yamanashi' => 'Jamanaši', + 'Yemen' => 'Jemen', + 'Yen' => 'Yen', + 'Yogyakarta' => 'Yogyakarta', + 'You can now login at' => 'Teraz sa môžete prihlásiť na', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'Stratili ste heslo < br / > \r\n Prosím, zmeňte si heslo po prvom prihlásení', + 'You have lost your password
    \r\nYour new password is' => 'Stratili ste heslo
    \r\n Vaše nové heslo je', + 'Your new passord is : {$password}' => 'Nové heslo je: {$password}', + 'Your subscription to %store newsletter' => 'Odoberanie noviniek %store', + 'Your subscription to {config key="store_name"} newsletter' => 'Odber {kľúč config = "store_name"} noviniek', + 'Yuan' => 'Yuan', + 'Yucatán' => 'Yucatán', + 'Yukon' => 'Yukon', + 'Zacatecas' => 'Zacatecas', + 'Zimbabwe' => 'Zimbabwe', + 'Złoty' => 'Złoty', + 'changing password email for' => 'zmena hesla e-mailom na', + 'customer account - CSS stylesheet' => 'zákaznícky účet - CSS štýlov', + 'customer account - after javascript initialisation' => 'zákaznícky účet - po javascript inicializáciu', + 'customer account - at the top' => 'zákaznícky účet - hore', + 'language selection page - at the top' => 'jazyk výber stránky - hore', + 'state - Edit JavaScript' => 'štát - úprava JavaScript', + 'state - creation form' => 'štát - vytvorenie formulára', + 'state - delete form' => 'štát - Vymazať formulár', + 'state-edit - at the top' => 'štát-edit - hore', + 'state-edit - bottom' => 'štát-edit - spodné', + 'states - JavaScript' => 'štáty - JavaScript', + 'states - at the top' => 'štáty - hore', + 'states - bottom' => 'štáty - spodné', + 'states - table header' => 'štáty - hlavička tabuľky', + 'states - table row' => 'štáty - riadok tabuľky', + 'Đồng' => 'Đồng', + 'Гривна' => 'ГРИВНА', +]; diff --git a/setup/I18n/tr_TR.php b/setup/I18n/tr_TR.php new file mode 100644 index 00000000..99b51a4f --- /dev/null +++ b/setup/I18n/tr_TR.php @@ -0,0 +1,1020 @@ + '"Beni hatırla" tanımlama bilgisi zaman aşımı süresi, saniye cinsinden için yönetim kullanıcı', + '"Remember me" cookie expiration time, in seconds, for customer users' => '"Beni hatırla" tanımlama bilgisi zaman aşımı süresi, saniye cinsinden müşteri kullanıcılar için', + '"Remember me" cookie name for administration users' => '"Beni hatırla" tanımlama bilgisi adı yönetim kullanıcılar için', + '"Remember me" cookie name for customer users' => '"Beni hatırla" tanımlama bilgisi adı Müşteri kullanıcılar için', + '72h delivery' => '72h teslim', + 'A {config key="store_name"} account has been created for you' => 'A {config anahtarı "store_name" =} hesabı sizin için oluşturuldu', + 'API Configuration' => 'API yapılandırma', + 'Address' => 'Adres', + 'Address creation - CSS stylesheet' => 'Adres oluşturma - CSS stil sayfası', + 'Address creation - after javascript include' => 'JavaScript içerme sonra oluşturma - adres', + 'Address creation - after javascript initialisation' => 'Adres oluşturma - javascript başlatma sonra', + 'Address creation - at the bottom' => 'Adres oluşturma - alt', + 'Address creation - at the bottom of the form' => 'Adres oluşturma - alt formu', + 'Address creation - at the top' => 'Adres oluşturma - üst', + 'Address creation - at the top of the form' => 'Adres oluşturma - alt formu', + 'Address update - CSS stylesheet' => 'Güncelleştirme - CSS stil sayfası', + 'Address update - after javascript include' => 'JavaScript içerme sonra güncelleme - adres', + 'Address update - after javascript initialisation' => 'Adres güncelleme - javascript başlatma sonra', + 'Address update - at the bottom' => 'Güncelleştirme - alt', + 'Address update - at the bottom of the form' => 'Güncelleştirme - alt formu', + 'Address update - at the top' => 'Güncelleştirme - üst', + 'Address update - at the top of the form' => 'Güncelleştirme - alt formu', + 'Admin layout - After the main content' => 'Admin düzeni - sonra ana içerik', + 'Administatros list' => 'Administatros listesi', + 'Administration profiles management' => 'Yönetim profilleri yönetim', + 'Administrator - create form' => 'Yönetici - oluşturma formu', + 'Administrator - delete form' => 'Yönetici - silme formu', + 'Administrator - update form' => 'Yönetici - güncelleştirme formu', + 'Administrator list' => 'Yönetici listesi', + 'Administrators - JavaScript' => 'Yöneticiler - JavaScript', + 'Administrators - at the top' => 'Yöneticiler - üst', + 'Administrators - bottom' => 'Yöneticiler - alt', + 'Administrators - header' => 'Yöneticiler - başlık', + 'Administrators - row' => 'Yöneticiler - kürek', + 'Advanced Configuration' => 'Gelişmiş yapılandırma', + 'Advanced Configuration - Javascript' => 'Gelişmiş yapılandırma - JavaScript', + 'Advanced configuration' => 'Gelişmiş yapılandırma', + 'Afghanistan' => 'Afganistan', + 'Albania' => 'Albania', + 'Algeria' => 'Algeria', + 'All Products - CSS stylesheet' => 'Tüm ürünler - CSS stil sayfası', + 'All Products - after javascript include' => 'Tüm ürünler - sonra JavaScript içerme', + 'All Products - after javascript initialisation' => 'Tüm ürünler - javascript başlatma sonra', + 'All Products - at the bottom' => 'Tüm ürünler - alt', + 'All Products - at the top' => 'Tüm ürünler - üst', + 'Allow customers to change their email. 1 for yes, 0 for no' => 'Müşterilerin kendi e-posta değiştirmek izin. Evet için 1, hayır için 0', + 'Allow negative product stock (1) or not (0)' => 'Negatif ürün stok (1) izin (0)', + 'Allow negative product stock (1) or not (0, default)' => 'Negatif ürün stok (1) izin (0, varsayılan)', + 'Allow slash ended uri' => 'Eğik çizgi sona erdi URI izin', + 'An image carousel on your home page' => 'Giriş sayfanızdaki bir görüntü slayt', + 'Andorra' => 'Andorra', + 'Angola' => 'Angola', + 'Antigua and Barbuda' => 'Antigua and Barbuda', + 'Api page - at bottom' => 'API sayfa - alt', + 'Api page - at top' => 'API sayfa - üst', + 'Api page - in deletion form' => 'API sayfa - silme formu', + 'Argentina' => 'Arjantin', + 'Armenia' => 'Ermenistan', + 'Ask the customers to confirm their email, 1 for yes, 0 for no' => 'Onların 1 e-posta, "Evet," için onaylamak için müşteriler sormak 0 hayır için', + 'Attribut - Edit JavaScript' => 'Attribut - düzen JavaScript', + 'Attribut - add to all form' => 'Attribut - tüm forma ekleme', + 'Attribut - create form' => 'Attribut - oluşturma formu', + 'Attribut - delete form' => 'Attribut - silme formu', + 'Attribut - id delete form' => 'Attribut - kimliği silme formu', + 'Attribut - remove to all form' => 'Attribut - tüm form için Kaldır', + 'Attribute edit - bottom' => 'Öznitelik Düzenle - alt', + 'Attribute edit - top' => 'Öznitelik Düzenle - üst', + 'Attribute value - create form' => 'Öznitelik değeri - oluşturma formu', + 'Attributes - JavaScript' => 'Öznitelikleri - JavaScript', + 'Attributes - at the top' => 'Öznitelikleri - üst', + 'Attributes - bottom' => 'Öznitelikleri - alt', + 'Attributes - table header' => 'Öznitelikleri - Tablo üstbilgisi', + 'Attributes - table row' => 'Öznitelikleri - tablo satırı', + 'Attributes value - table header' => 'Öznitelikleri değeri - Tablo üstbilgisi', + 'Attributes value - table row' => 'Öznitelikleri değeri - tablo satırı', + 'Australia' => 'Avusturalya', + 'Austria' => 'Avusturya', + 'Azerbaijan' => 'Azerbaycan', + 'Back-office export management' => 'Arka ofis ihracat yönetimi', + 'Back-office home page' => 'Arka ofis ana sayfa', + 'Back-office search function' => 'Arka ofis arama fonksiyonu', + 'Bahamas' => 'Bahamalar', + 'Bahrain' => 'Bahrain', + 'Bangladesh' => 'Bangladeş', + 'Barbados' => 'Barbados', + 'Base URL of the shop (e.g. http://www.yourshopdomain.com)' => 'Shop (örneğin http://www.yourshopdomain.com) temel URL', + 'Belarus' => 'Beyaz Rusya (Belarus)', + 'Belgium' => 'Belgium', + 'Belize' => 'Belize', + 'Benin' => 'Benin', + 'Bhutan' => 'Butan', + 'Bielorussia' => 'Bielorussia', + 'Bolivia' => 'Bolivia', + 'Bosnia and Herzegovina' => 'Bosnia and Herzegovina', + 'Botswana' => 'Botsvana', + 'Brand - Edit JavaScript' => 'Marka - düzenleme JavaScript', + 'Brand - JavaScript' => 'Marka - JavaScript', + 'Brand - Tab' => 'Marka - sekmesi', + 'Brand - content' => 'Marka - içerik', + 'Brand - create form' => 'Marka - oluşturma formu', + 'Brand - delete form' => 'Marka - silme formu', + 'Brand edit - bottom' => 'Düzenle marka - alt', + 'Brand edit - top' => 'Marka Düzenle - üst', + 'Brand edit page - in the form' => 'Marka Düzenle sayfa - formu', + 'Brands - at the top' => 'Marka - üst', + 'Brands - bottom' => 'Marka - alt', + 'Brands - table header' => 'Marka - Tablo üstbilgisi', + 'Brands - table row' => 'Marka - tablo satırı', + 'Brands management' => 'Marka yönetimi', + 'Brands page - CSS stylesheet' => 'Markalar sayfa - CSS stil sayfası', + 'Brands page - after javascript include' => 'Markalar - JavaScript içerme sonra sayfa', + 'Brands page - after the main content area' => 'Markalar sayfa - ana içerik alanına sonra', + 'Brands page - at the bottom' => 'Markalar sayfa - alt', + 'Brands page - at the bottom of the main area' => 'Markalar sayfa - ana alanının altındaki', + 'Brands page - at the bottom of the sidebar' => 'Markalar sayfa - alt kenar çubuğu', + 'Brands page - at the top' => 'Markalar sayfa - üst', + 'Brands page - at the top of the main area' => 'Markalar sayfa - ana alanının altındaki', + 'Brands page - at the top of the sidebar' => 'Markalar sayfa - alt kenar çubuğu', + 'Brands page - before the main content area' => '-Ana içerik alanına önce markalar sayfa', + 'Brands page - javascript initialization' => 'Markalar sayfa - javascript başlatma', + 'Brands page - the body of the sidebar' => 'Markalar sayfa - kenar gövdesi', + 'Brazil' => 'Brazilya', + 'Brunei' => 'Brunei', + 'Bulgaria' => 'Bulgaria', + 'Burkina' => 'Burkina', + 'Burma' => 'Burma', + 'Burundi' => 'Burundi', + 'Cambodia' => 'Cambodia', + 'Cameroon' => 'Kamerun', + 'Canceled' => 'İptal', + 'Cape Verde' => 'Yeşil Burun Adaları', + 'Cart - CSS stylesheet' => 'Sepeti - CSS stil sayfası', + 'Cart - after javascript include' => 'Cart - sonra JavaScript içerme', + 'Cart - at the bottom' => 'Sepeti - alt', + 'Cart - at the top' => 'Sepeti - üst', + 'Cart - javascript initialization' => 'Sepeti - javascript başlatma', + 'Cart block' => 'Alışveriş Sepeti', + 'Categories - JavaScript' => 'Kategoriler - JavaScript', + 'Categories - at the bottom of the catalog' => 'Kategoriler - katalog alt', + 'Categories - at the top' => 'Kategoriler - üst', + 'Categories - bottom' => 'Alt Kategoriler-', + 'Categories - caption' => 'Kategoriler - resim yazısı', + 'Categories - header' => 'Kategoriler - başlık', + 'Categories - row' => 'Kategoriler - kürek', + 'Category' => 'kategori', + 'Category - Edit JavaScript' => 'Kategori - düzenleme JavaScript', + 'Category - Tab' => 'Kategori - sekmesi', + 'Category - content' => 'Kategori - içerik', + 'Category - contents table header' => 'Kategori - içindekiler tablosu başlığı', + 'Category - contents table row' => 'Kategori - içeriği tablo satırı', + 'Category - create form' => 'Kategori - oluşturma formu', + 'Category - delete form' => 'Kategori - silme formu', + 'Category configuration' => 'Kategori yapılandırma', + 'Category edit - bottom' => 'Kategori Düzenle - alt', + 'Category edit - top' => 'Kategori Düzenle - üst', + 'Category page - CSS stylesheet' => 'Kategori sayfası - CSS stil sayfası', + 'Category page - after javascript include' => 'Kategori sayfası - sonra JavaScript içerme', + 'Category page - after javascript initialisation' => 'Kategori sayfası - javascript başlatma sonra', + 'Category page - after the main content area' => 'Kategori sayfası - ana içerik alanına sonra', + 'Category page - at the bottom' => 'Kategori sayfası - alt', + 'Category page - at the bottom of the main area' => 'Kategori sayfası - ana alanının altındaki', + 'Category page - at the bottom of the sidebar' => 'Kategori sayfası - alt kenar çubuğu', + 'Category page - at the top' => 'Kategori sayfası - üst', + 'Category page - at the top of the main area' => 'Kategori sayfası - ana alanının altındaki', + 'Category page - at the top of the sidebar' => 'Kategori sayfası - alt kenar çubuğu', + 'Category page - before the main content area' => 'Kategori sayfası - ana içerik alanına önce', + 'Category page - the body of the sidebar' => 'Kategori sayfası - kenar gövdesi', + 'Central African Republic' => 'Orta Afrika Cumhuriyeti', + 'Chad' => 'Chad', + 'Change password - CSS stylesheet' => 'Şifre Değiştir - CSS stil sayfası', + 'Change password - after javascript include' => 'JavaScript içerme sonra Parola Değiştir-', + 'Change password - after javascript initialisation' => 'Şifre Değiştir - javascript başlatma sonra', + 'Change password - at the bottom' => 'Şifre Değiştir - alt', + 'Change password - at the top' => 'Şifre Değiştir - üst', + 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity' => 'Mevcut ürün stok (1) kontrol veya sipariş edilen miktar görüntüleme ve değiştirmeye ne zaman (0) aldırmamak', + 'Check if a virtual product delivery module is enabled if at least one product is virtual' => 'En az bir ürün sanal ise bir sanal ürün teslim modülü etkin olup olmadığını denetleyin', + 'Chile' => 'Chile', + 'China' => 'Çin Halk Cumhuriyeti', + 'Client edit - bottom' => 'İstemci Düzenle - alt', + 'Client edit - top' => 'İstemci Düzenle - üst', + 'Colombia' => 'Colombia', + 'Comoros' => 'Komor Adaları', + 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)' => 'Şablonları kıymetler kıymet kaynak değişikliği üzerine otomatik olarak derlemek (1 = yes, 0 = Hayır)', + 'Configuration' => 'Ayarlar', + 'Configuration - JavaScript' => 'Yapılandırma - JavaScript', + 'Configuration - at the bottom of the catalog' => 'Yapılandırma - katalog alt', + 'Configuration - at the bottom of the shipping area' => 'Yapılandırma - sevkiyat alanına alt', + 'Configuration - at the bottom of the system area' => 'Yapılandırma - başta-in belgili tanımlık sistem alan', + 'Configuration - at the top' => 'Yapılandırma - üst', + 'Configuration - at the top of the catalog area' => 'Yapılandırma - katalog alanının üstündeki', + 'Configuration - at the top of the shipping area' => 'Yapılandırma - sevkiyat alanına alt', + 'Configuration - at the top of the system area' => 'Yapılandırma - başta-in belgili tanımlık sistem alan', + 'Configuration - bottom' => 'Yapılandırma - alt', + 'Configuration / Administrator' => 'Yapılandırma / Yönetici', + 'Configuration / Area' => 'Yapılandırma / alan', + 'Configuration / Attribute' => 'Yapılandırma / özniteliği', + 'Configuration / Cache' => 'Yapılandırma / Cache', + 'Configuration / Country' => 'Yapılandırma ülke', + 'Configuration / Currency' => 'Yapılandırma / para birimi', + 'Configuration / Feature' => 'Yapılandırma / özellik', + 'Configuration / Language' => 'Yapılandırma / dil', + 'Configuration / Mailing-system' => 'Yapılandırma / posta sistemi', + 'Configuration / Message' => 'Yapılandırma / mesaj', + 'Configuration / Module' => 'Yapılandırma / modülü', + 'Configuration / Profile' => 'Yapılandırma / profil', + 'Configuration / Shipping-zone' => 'Yapılandırma / nakliye bölgesi', + 'Configuration / System Log' => 'Yapılandırma / sistem günlüğü', + 'Configuration / Tax' => 'Yapılandırma /Kdv', + 'Configuration / Template' => 'Yapılandırma / şablon', + 'Configuration variables' => 'Yapılandırma değişkenleri', + 'Congo' => 'Congo', + 'Contact block' => 'İletişim bilgileri', + 'Contact page - CSS stylesheet' => 'İletişim sayfası - CSS stil sayfası', + 'Contact page - after javascript include' => 'JavaScript içerme sonra sayfa - iletişim', + 'Contact page - after javascript initialisation' => '-Sonra javascript başlatma iletişim sayfası', + 'Contact page - at the bottom' => '-Alt iletişim sayfası', + 'Contact page - at the bottom of the form' => '-Formun altındaki iletişim sayfası', + 'Contact page - at the top' => '-Üst iletişim sayfası', + 'Contact page - at the top of the form' => '-Formun altındaki iletişim sayfası', + 'Contact page - if successful response' => 'İletişim sayfası - başarılı olursa yanıt', + 'Content' => 'Içerik', + 'Content - Edit JavaScript' => 'İçerik - düzenleme JavaScript', + 'Content - Tab' => 'İçerik - sekmesi', + 'Content - content' => 'İçerik - içerik', + 'Content - create form' => 'İçerik - oluşturma formu', + 'Content - delete form' => 'İçerik - silme formu', + 'Content edit - bottom' => 'Düzenleme içerik - alt', + 'Content edit - top' => 'İçerik düzenleme - üst', + 'Content page - CSS stylesheet' => 'İletişim sayfası - CSS stil sayfası', + 'Content page - after javascript include' => 'JavaScript içerme sonra sayfa - iletişim', + 'Content page - after javascript initialisation' => '-Sonra javascript başlatma iletişim sayfası', + 'Content page - after the main content area' => 'İçerik sayfası - ana içerik alanına sonra', + 'Content page - at the bottom' => '-Alt iletişim sayfası', + 'Content page - at the bottom of the main area' => 'İçerik sayfası - ana alanının altındaki', + 'Content page - at the bottom of the sidebar' => 'İçerik sayfası - alt kenar çubuğu', + 'Content page - at the top' => '-Üst iletişim sayfası', + 'Content page - at the top of the main area' => 'İçerik sayfası - ana alanının altındaki', + 'Content page - at the top of the sidebar' => 'İçerik sayfası - alt kenar çubuğu', + 'Content page - before the main content area' => '-Daha önce ana içerik alanına içerik sayfası', + 'Content page - the body of the sidebar' => 'İçerik sayfası - kenar gövdesi', + 'Contents - caption' => 'İçindekiler - resim yazısı', + 'Contents - header' => 'İçindekiler - başlık', + 'Contents - row' => 'İçindekiler - kürek', + 'Cook Islands' => 'Cook Adaları', + 'Costa Rica' => 'Kosta Rica', + 'Countries - JavaScript' => 'Ülkeler - JavaScript', + 'Countries - at the top' => 'Ülkeler - üst', + 'Countries - bottom' => 'Ülkeler - alt', + 'Countries - table header' => 'Ülkeler - Tablo üstbilgisi', + 'Countries - table row' => 'Ülkeler - tablo satırı', + 'Country - Edit JavaScript' => 'Ülke - düzenleme JavaScript', + 'Country - create form' => 'Ülke - oluşturma formu', + 'Country - delete form' => 'Ülke - silme formu', + 'Country edit - bottom' => 'Ülke düzenleme - alt', + 'Country edit - top' => 'Ülke Düzenle - üst', + 'Coupon' => 'Kupon', + 'Coupon - at the top' => 'Kupon - üst', + 'Coupon - bottom' => 'Kupon - alt', + 'Coupon - create JavaScript' => 'Kupon - JavaScript oluşturmak', + 'Coupon - list JavaScript' => 'Kupon - JavaScript listesi', + 'Coupon - list caption' => 'Kupon - liste resim yazısı', + 'Coupon - table header' => 'Kupon - Tablo üstbilgisi', + 'Coupon - table row' => 'Kupon - tablo satırı', + 'Coupon - update JavaScript' => 'Kupon - JavaScript güncelleştirmek', + 'Coupon page - in deletion form' => 'Kupon sayfasında - silme formu', + 'Croatia' => 'Hırvatistan', + 'Cuba' => 'Cuba', + 'Curency selection page - CSS stylesheet' => 'Curency seçim sayfası - CSS stil sayfası', + 'Curency selection page - after javascript include' => 'Curency seçimi sayfa JavaScript içerme-', + 'Curency selection page - after javascript initialisation' => 'Curency seçim sayfası - javascript başlatma sonra', + 'Curency selection page - at the bottom' => 'Curency seçim sayfası - alt', + 'Curency selection page - at the top' => 'Curency seçim sayfası - üst', + 'Currencies - JavaScript' => 'Para birimleri - JavaScript', + 'Currencies - at the top' => 'Para birimleri - üst', + 'Currencies - bottom' => 'Para birimleri - alt', + 'Currencies - table header' => 'Para birimleri - Tablo üstbilgisi', + 'Currencies - table row' => 'Para birimleri - tablo satırı', + 'Currency - Edit JavaScript' => 'Döviz Alım - düzenleme JavaScript', + 'Currency - create form' => 'Döviz Alım - oluşturma formu', + 'Currency - delete form' => 'Döviz Alım - silme formu', + 'Currency block' => 'Kur kutusu', + 'Currency edit - bottom' => 'Para birimi Düzenle - alt', + 'Currency edit - top' => 'Para birimi Düzenle - üst', + 'Customer' => 'Customer', + 'Customer - Edit' => 'Müşteri - Düzenle', + 'Customer - Edit JavaScript' => 'Müşteri - düzenleme JavaScript', + 'Customer - address create form' => 'Müşteri - adres oluşturma formu', + 'Customer - address delete form' => 'Müşteri - adresi silme formu', + 'Customer - address update form' => 'Müşteri - adres güncelleştirme formu', + 'Customer - at the top' => 'Müşteri - üst', + 'Customer - bottom' => 'Müşteri - alt', + 'Customer - create form' => 'Müşteri - oluşturma formu', + 'Customer - delete form' => 'Müşteri - silme formu', + 'Customer - order table header' => 'Müşteri - sipariş tablo başlığı', + 'Customer - order table row' => 'Müşteri - sipariş tablo satırı', + 'Customer account - additional information' => 'Müşteri hesabı - ek bilgi', + 'Customer account block' => 'Müşteri hesap blok', + 'Customer title' => 'Müşteri adı', + 'Customers - JavaScript' => 'Müşteriler - JavaScript', + 'Customers - caption' => 'Müşteriler - resim yazısı', + 'Customers - header' => 'Müşteriler - başlık', + 'Customers - row' => 'Müşteriler - kürek', + 'Cyprus' => 'Kıbrıs Cumhuriyeti', + 'Czech Republic' => 'Çek Cumhuriyeti', + 'Dashboard - at the top' => 'Pano - üst', + 'Dashboard - bottom' => 'Pano - alt', + 'Dashboard - middle' => 'Pano - orta', + 'Data import / export' => 'Veri ithalat / ihracat', + 'Default available stock when check-available-stock is set to 0.' => 'Kullanılabilir stok onay mevcut stok 0 olarak ayarlandığında varsayılan.', + 'Default lang without translation' => 'Varsayılan lang çeviri olmadan', + 'Delivery - After delivery module' => 'Dağıtım - sonra teslim modülü', + 'Delivery - CSS' => 'Dağıtım - CSS', + 'Delivery - additional product information' => 'Dağıtım - daha fazla ürün bilgisi', + 'Delivery - after addresse area' => 'Dağıtım - adres alanı sonra', + 'Delivery - after the information area' => 'Dağıtım - bilgi alan sonra', + 'Delivery - after the order summary' => 'Dağıtım - Özet sipariş sonrası', + 'Delivery - at the bottom of information area' => 'Dağıtım - bilgi alanının altındaki', + 'Delivery - at the bottom of the footer' => 'Dağıtım - altbilgi alt', + 'Delivery - at the top of the footer' => 'Dağıtım - altbilgi üstündeki', + 'Delivery - delivery address' => 'Dağıtım - teslimat adresi', + 'Delivery - imprint' => 'Dağıtım - Künye', + 'Delivery - in the header' => 'Dağıtım - başlıktaki', + 'Delivery choice - CSS stylesheet' => 'Teslimat seçim - CSS stil sayfası', + 'Delivery choice - after javascript include' => 'JavaScript içerme sonra teslim seçim-', + 'Delivery choice - after javascript initialisation' => 'Teslimat seçim - javascript başlatma sonra', + 'Delivery choice - at the bottom' => 'Teslimat seçim - alt', + 'Delivery choice - at the bottom of the form' => 'Teslimat seçim - alt formu', + 'Delivery choice - at the top' => 'Teslimat seçim - üst', + 'Delivery choice - at the top of the form' => 'Teslimat seçim - alt formu', + 'Delivery choice - extra area' => 'Teslimat seçim - ilave alan', + 'Delivery choice - javascript' => 'Teslimat seçim - javascript', + 'Delivery zone - Edit JavaScript' => 'Teslimat bölgesi - JavaScript Düzenle', + 'Delivery zone - JavaScript' => 'Teslimat bölgesi - JavaScript', + 'Delivery zone - at the top' => 'Teslimat bölgesi - üst', + 'Delivery zone - bottom' => 'Teslimat bölgesi - alt', + 'Delivery zone - table header' => 'Teslimat bölgesi - Tablo üstbilgisi', + 'Delivery zone - table row' => 'Teslimat bölgesi - tablo satırı', + 'Denmark' => 'Danimarka', + 'Display and process prices with (0) or without (1) taxes.' => 'Görüntü ve işlem fiyatları (0) ile veya olmadan (1) vergi.', + 'Djibouti' => 'Cibuti', + 'Document - Edit JavaScript' => 'Belge - düzenleme JavaScript', + 'Document edit - bottom' => 'Belge düzenleme - alt', + 'Document edit - top' => 'Belge düzenleme - üst', + 'Dominica' => 'Dominika', + 'Dominican Republic' => 'Dominican Republic', + 'Ecuador' => 'Ecuador', + 'Egypt' => 'Mısır', + 'El Salvador' => 'El Salvador', + 'Enable (1) or disable (0) URL rewriting' => 'Etkinleştir (1) veya devre dışı bırak (0) URL yeniden yazma', + 'Equatorial Guinea' => 'Ekvator Ginesi', + 'Eritrea' => 'Eritrea', + 'Estonia' => 'Estonya', + 'Ethiopia' => 'Ethiopia', + 'Euro' => 'Euro', + 'Export - JavaScript' => 'İhracat - JavaScript', + 'Export - table header' => 'İthalat - Tablo üstbilgisi', + 'Export - table row' => 'İhracat - tablo satırı', + 'Export modal or page - bottom' => 'Kalıcı ihracat veya sayfa - alt', + 'Export modal or page - top' => 'İhracat kalıcı veya sayfa - üst', + 'Exports - JavaScript' => 'İhracat - JavaScript', + 'Exports - at the bottom of a category' => 'İhracat - kategorisi altındaki', + 'Exports - at the bottom of column 1' => 'İhracat - 1 sütunun altındaki', + 'Exports - at the top' => 'İhracat - üst', + 'Feature - Edit JavaScript' => 'Özellik - düzenleme JavaScript', + 'Feature - Value create form' => 'Özellik - değer oluşturma formu', + 'Feature - add to all form' => 'Özellik - tüm forma ekleme', + 'Feature - create form' => 'Özellik - oluşturma formu', + 'Feature - delete form' => 'Özellik - silme formu', + 'Feature - remove to all form' => 'Özellik - tüm forma çıkarmak', + 'Feature edit - bottom' => 'Düzenleme özelliği - alt', + 'Feature edit - top' => 'Özelliği Düzenle - üst', + 'Features - JavaScript' => 'Özellikler - JavaScript', + 'Features - at the top' => 'Özellikler - üst', + 'Features - bottom' => 'Özellikler - alt', + 'Features - table header' => 'Özellikler - Tablo üstbilgisi', + 'Features - table row' => 'Özellikler - tablo satırı', + 'Features value - table header' => 'Özellik değeri - Tablo üstbilgisi', + 'Features value - table row' => 'Özellik değeri - tablo satırı', + 'Fiji' => 'Fiji', + 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)' => 'Dosya adı (uzantısı, örneğin 404.html) geçerli şablonunda 404 (bulunamadı) görünümü', + 'Filename of the error page' => 'Hata sayfasının dosya adı', + 'Finland' => 'Finland', + 'Folder' => 'Klasör', + 'Folder - Edit JavaScript' => 'Klasör - düzenleme JavaScript', + 'Folder - JavaScript' => 'Klasör - JavaScript', + 'Folder - Tab' => 'Klasör - sekmesi', + 'Folder - at the top' => 'Klasör - üst', + 'Folder - bottom' => 'Klasör - alt', + 'Folder - caption' => 'Klasör - resim yazısı', + 'Folder - content' => 'Klasör - içerik', + 'Folder - create form' => 'Klasör - oluşturma formu', + 'Folder - delete form' => 'Klasör - silme formu', + 'Folder - header' => 'Klasör - başlık', + 'Folder - row' => 'Klasör - satır', + 'Folder edit - bottom' => 'Klasörünü düzenlemek - alt', + 'Folder edit - top' => 'Klasörü Düzenle - üst', + 'Folder page - CSS stylesheet' => 'Klasör sayfası - CSS stil sayfası', + 'Folder page - after javascript include' => 'Klasör sayfa JavaScript içerme-', + 'Folder page - after javascript initialisation' => 'Klasör sayfası - javascript başlatma sonra', + 'Folder page - after the main content area' => 'Klasör sayfası - ana içerik alanına sonra', + 'Folder page - at the bottom' => '-Alt klasörü sayfası', + 'Folder page - at the bottom of the main area' => '-Ana alanının alt klasörü sayfası', + 'Folder page - at the top' => 'Klasör sayfası - üst', + 'Folder page - at the top of the main area' => '-Ana alanının alt klasörü sayfası', + 'Folder page - before the main content area' => '-Ana içerik alanına önce klasörü sayfası', + 'France metropolitan' => 'Fransa metropolitan', + 'French 10% VAT' => 'Fransız % 10 KDV', + 'French 20% VAT' => 'Fransız % 10 KDV', + 'Front office integration' => 'Açık ofis entegrasyonu', + 'Gabon' => 'Gabon', + 'Gambia' => 'Gambiya', + 'Georgia' => 'Gürcistan', + 'Germany' => 'Germany', + 'Ghana' => 'Gana', + 'Google Analytics block' => 'Google Analytics blok', + 'Greece' => 'Greece', + 'Grenada' => 'Grenada', + 'Guadeloupe' => 'Guadeloupe', + 'Guatemala' => 'Guatemala', + 'Guinea' => 'Guinea', + 'Guinea-Bissau' => 'Gine Bissau', + 'Guyana' => 'Guyana', + 'Guyane Française' => 'Guyane Française', + 'HTML layout - CSS stylesheet' => 'HTML Düzeni - CSS stil sayfası', + 'HTML layout - after javascript include' => 'HTML Düzeni - sonra JavaScript içerme', + 'HTML layout - after the main content area' => 'HTML Düzeni - ana içerik alanına sonra', + 'HTML layout - after the opening of the body tag' => 'HTML Düzeni - ten etiket açtıktan sonra', + 'HTML layout - after the opening of the head tag' => 'HTML Düzeni - ten etiket açtıktan sonra', + 'HTML layout - at the bottom of the header' => 'HTML Düzeni - başlığının altındaki', + 'HTML layout - at the top of the footer' => 'HTML Düzeni - altbilgi üstündeki', + 'HTML layout - at the top of the header' => 'HTML Düzeni - başlığının altındaki', + 'HTML layout - before the end body tag' => 'HTML Düzeni - son beden etiketinden önce', + 'HTML layout - before the end of the head tag' => 'HTML Düzeni - baş etiketi sonundan önce', + 'HTML layout - before the main content area' => 'HTML Düzeni - ana içerik alanına önce', + 'HTML layout - bottom of the footer' => 'HTML Düzeni - altbilginin alt kısmı', + 'HTML layout - footer body' => 'HTML Düzeni - altbilgi vücut', + 'HTML layout - javascript initialization' => 'HTML Düzeni - javascript başlatma', + 'HTML layout - primary navigation' => 'HTML Düzeni - birincil gezinti', + 'HTML layout - secondary navigation' => 'HTML Düzeni - ikincil gezinti', + 'Haiti' => 'Haiti', + 'Home - JavaScript' => 'Ana sayfa - JavaScript', + 'Home - at the top' => 'Ana sayfa - üst', + 'Home - block' => 'Ana sayfa - blok', + 'Home - bottom' => 'Ana sayfa - alt', + 'Home page - CSS stylesheet' => 'Ana sayfa - CSS stil sayfası', + 'Home page - after javascript include' => 'Ana sayfa - sonra javascript içerme', + 'Home page - after javascript initialisation' => 'Klasör sayfası - javascript başlatma sonra', + 'Home page - main area' => 'Ana sayfa - ana alan', + 'Honduras' => 'Honduras', + 'Hong Kong' => 'Hong Kong', + 'Hook - Edit JavaScript' => 'Hook - düzenleme JavaScript', + 'Hook - create form' => 'Kanca oluşturma formu', + 'Hook - delete form' => 'Hook - silme formu', + 'Hook edit - bottom' => 'Düzenle kanca - alt', + 'Hook edit - top' => 'Kanca Düzenle - üst', + 'Hook positions' => 'Kanca pozisyonlar', + 'Hooks' => 'Kanca (modül)', + 'Hooks - JavaScript' => 'Kanca - JavaScript', + 'Hooks - at the top' => 'Kanca - üst', + 'Hooks - bottom' => 'Kanca - alt', + 'Hooks - table header' => 'Kanca - Tablo üstbilgisi', + 'Hooks - table row' => 'Kanca - tablo satırı', + 'Hooks management' => 'Kanca yönetimi', + 'How document files are delivered in the web space (symlink or copy)' => 'Nasıl belge dosyaları web alanı (sembolik link veya kopya) teslim edilir', + 'How original (full resolution) images are delivered in the web space (symlink or copy)' => 'Nasıl orijinal (tam çözünürlükte) görüntüler web alanı (sembolik link veya kopya) teslim edilir', + 'Hungary' => 'Hungary', + 'Iceland' => 'İzlanda', + 'Image - Edit JavaScript' => 'Resim - düzenleme JavaScript', + 'Image edit - bottom' => 'Görüntü Düzenle - alt', + 'Image edit - top' => 'Görüntü Düzenle - üst', + 'Import - table header' => 'İthalat - Tablo üstbilgisi', + 'Import - table row' => 'İthalat - tablo satırı', + 'India' => 'Hindistan', + 'Indonesia' => 'Indonesia', + 'Invoice - After delivery module' => 'Fatura - sonra teslim modülü', + 'Invoice - After payment module' => '-Fatura ödeme modülü sonra', + 'Invoice - CSS' => 'Fatura - CSS', + 'Invoice - additional product information' => 'Fatura - daha fazla ürün bilgisi', + 'Invoice - after addresse area' => '-Adres alanı sonrası fatura', + 'Invoice - after product listing' => 'Fatura - sonra ürün listesi', + 'Invoice - after the information area' => '-Bilgi alan sonrası fatura', + 'Invoice - after the order summary' => '-Fatura Özet sipariş sonra', + 'Invoice - at the bottom of information area' => 'Fatura - bilgi alanının altındaki', + 'Invoice - at the bottom of the footer' => 'Fatura - altbilgi alt', + 'Invoice - at the top of the footer' => 'Fatura - altbilgi üstündeki', + 'Invoice - delivery address' => 'Fatura - teslimat adresi', + 'Invoice - imprint' => 'Fatura - Künye', + 'Invoice - in the header' => 'Fatura - başlıktaki', + 'Invoice choice - CSS stylesheet' => 'Fatura seçim - CSS stil sayfası', + 'Invoice choice - after javascript include' => 'JavaScript içerme sonra seçim - fatura', + 'Invoice choice - after javascript initialisation' => 'Fatura seçim - javascript başlatma sonra', + 'Invoice choice - at the bottom' => 'Fatura seçim - alt', + 'Invoice choice - at the top' => 'Fatura seçim - üst', + 'Invoice choice - delivery address' => 'Fatura seçim - teslimat adresi', + 'Invoice choice - extra payment zone' => 'Fatura seçim - ilave ödeme bölge', + 'Iran' => 'Iran', + 'Iraq' => 'Iraq', + 'Ireland' => 'İrlanda', + 'Israel' => 'Israel', + 'Italy' => 'Italy', + 'Ivory Coast' => 'Ivory Coast', + 'Jamaica' => 'Jameika', + 'Japan' => 'Japonya', + 'Jordan' => 'Ürdün', + 'Kazakhstan' => 'Kazakistan', + 'Kenya' => 'Kenya', + 'Kiribati' => 'Kiribati', + 'Kuwait' => 'Kuwait', + 'Kyrgyzstan' => 'Kırgızistan', + 'Language - create form' => 'Dil - oluşturma formu', + 'Languages - JavaScript' => 'Diller - JavaScript', + 'Languages - at the top' => 'Diller - üst', + 'Languages - bottom' => 'Diller - alt', + 'Languages - delete form' => 'Diller - silme formu', + 'Languages block' => 'Dil paketi', + 'Laos' => 'Laos', + 'Latvia' => 'Latviya', + 'Layout - Before the main content' => 'Düzen - daha önce ana içerik', + 'Layout - CSS' => 'Düzen - CSS', + 'Layout - JavaScript' => 'Düzen - JavaScript', + 'Layout - after footer' => 'Düzen - altbilgi sonra', + 'Layout - after top bar' => 'Düzen - en iyi bar sonra', + 'Layout - after top menu' => 'Düzen - üst menü sonra', + 'Layout - at the bottom of the top bar' => 'Düzen - üst çubuğu altındaki', + 'Layout - at the top of the top bar' => 'Düzen - üst çubuğu üstündeki', + 'Layout - before footer' => 'Düzen - altbilgi önce', + 'Layout - before top menu' => 'Düzen - üst menü önce', + 'Layout - before topbar' => 'Düzen - topbar önce', + 'Layout - in footer' => 'Düzen - altbilgi', + 'Layout - in the menu catalog' => 'Düzen - menü Kataloğu', + 'Layout - in the menu configuration' => 'Düzen - menü yapılandırma', + 'Layout - in the menu customers' => 'Düzen - menü müşterilerinde', + 'Layout - in the menu folders' => 'Düzen - menü klasörlerde', + 'Layout - in the menu modules' => 'Düzen - menü modülleri', + 'Layout - in the menu orders' => 'Düzen - menü klasörlerde', + 'Layout - in the menu tools' => 'Düzen - menü Araçlar', + 'Layout - in top menu items' => 'Düzen - üst menü öğeleri', + 'Layout - inside top bar' => 'Düzen - en iyi bar içinde', + 'Leave the default configuration of session' => 'Oturum varsayılan yapılandırmasını bırakın', + 'Lebanon' => 'Lübnan', + 'Lesotho' => 'Lesoto', + 'Liberia' => 'Liberia', + 'Libya' => 'Libya', + 'Liechtenstein' => 'Liechtenstein', + 'Life time of the cart cookie in the customer browser, in seconds' => 'Müşteri tarayıcı sepeti çerezde yaşam süresi saniye içinde', + 'Life time of the session cookie in the customer browser, in seconds' => 'Müşteri tarayıcı oturum çerezinin yaşam süresi saniye içinde', + 'Links block' => 'Bağlantı kutusu', + 'Lithuania' => 'Letonya', + 'Logging system configuration' => 'Günlük sistem yapılandırmasını', + 'Login page - CSS stylesheet' => 'Giriş sayfası - CSS stil sayfası', + 'Login page - after javascript include' => 'Giriş sayfası - sonra JavaScript içerme', + 'Login page - after javascript initialisation' => 'Klasör sayfası - javascript başlatma sonra', + 'Login page - at the bottom' => 'Giriş sayfası - alt', + 'Login page - at the bottom of the form' => 'Giriş sayfası - alt formu', + 'Login page - at the bottom of the main area' => 'Giriş sayfası - ana alanının altındaki', + 'Login page - at the top' => 'Giriş sayfası - üst', + 'Login page - at the top of the form' => 'Giriş sayfası - formun üstündeki', + 'Login page - at the top of the main area' => 'Giriş sayfası - ana alanının altındaki', + 'Logs - JavaScript' => 'Günlükleri - JavaScript', + 'Logs - at the top' => 'Günlükleri - üst', + 'Logs - bottom' => 'Günlükleri - alt', + 'Lost password - CSS stylesheet' => 'Parolayı unuttum - CSS stil sayfası', + 'Lost password - after javascript include' => 'Kayıp parola - sonra javascript içerme', + 'Lost password - at the bottom' => 'Parolayı unuttum - alt', + 'Lost password - at the bottom of the form' => 'Parolayı unuttum - alt formu', + 'Lost password - at the top' => 'Parolayı unuttum - üst', + 'Lost password - at the top of the form' => 'Parolayı unuttum - alt formu', + 'Lost password - javascript initialization' => 'Parolayı unuttum - javascript başlatma', + 'Luxembourg' => 'Luxembourg', + 'Macedonia' => 'Macedonia', + 'Madagascar' => 'Madagascar', + 'Mail sent to the customer when its account is created by an administrator in the back-office' => 'Arka ofiste bir yönetici tarafından kendi hesabınızı oluştururken müşteriye gönderilen posta', + 'Mail sent to the customer when its password or email is changed in the back-office' => 'Onun parola veya e-posta arka ofis değiştiğinde müşteriye gönderilen posta', + 'Mailing system - JavaScript' => 'JavaScript sistemi - posta', + 'Mailing system - at the top' => 'Posta sistemi - üst', + 'Mailing system - bottom' => 'Sistem - posta alt', + 'Malawi' => 'Malavi', + 'Malaysia' => 'Malezya', + 'Maldives' => 'Maldives', + 'Mali' => 'Mali', + 'Malta' => 'Malta', + 'Marshall Islands' => 'Marshall Islands', + 'Martinique' => 'Martinique', + 'Mauritania' => 'Mauritania', + 'Mauritius' => 'Morityus', + 'Mayotte' => 'Mayotte', + 'Message - Edit JavaScript' => 'Mesaj - düzenleme JavaScript', + 'Message - create form' => 'Mesaj - oluşturma formu', + 'Message - delete form' => 'Mesaj - silme formu', + 'Message edit - bottom' => 'Düzenle mesaj - alt', + 'Message edit - top' => 'İleti düzenleme - üst', + 'Message sent to the shop owner when a new order is placed' => 'Yeni bir sipariş verildiğinde dükkan sahibine gönderilen ileti', + 'Messages - JavaScript' => 'Mesaj - JavaScript', + 'Messages - at the top' => 'Mesaj - üst', + 'Messages - bottom' => 'Mesaj - alt', + 'Messages - table header' => 'Mesaj - Tablo üstbilgisi', + 'Messages - table row' => 'Mesaj - tablo satırı', + 'Mexico' => 'Meksika', + 'Micronesia' => 'Micronesia', + 'Mini cart' => 'Mini arabası', + 'Miss' => 'Miss', + 'Miss_short' => 'Miss', + 'Misses' => 'Eksikler', + 'Mister' => 'Bay', + 'Module - Edit JavaScript' => 'Modül - düzenleme JavaScript', + 'Module - configuration' => 'Modül - yapılandırma', + 'Module - configuration JavaScript' => 'Modül - yapılandırma JavaScript', + 'Module edit - bottom' => 'Modülü Düzenle - alt', + 'Module edit - top' => 'Modülü Düzenle - üst', + 'Module hook - Edit JavaScript' => 'Modülü kanca - JavaScript Düzenle', + 'Module hook - JavaScript' => 'Modülü kanca - JavaScript', + 'Module hook - create form' => 'Modülü kanca - oluşturma formu', + 'Module hook - delete form' => 'Modülü kanca - silme formu', + 'Module hook edit - bottom' => 'Modülü kanca Düzenle - alt', + 'Module hook edit - top' => 'Modülü kanca Düzenle - üst', + 'Modules - JavaScript' => 'Modüller - JavaScript', + 'Modules - at the top' => 'Modüller - üst', + 'Modules - bottom' => 'Modüller - alt', + 'Modules - table header' => 'Modüller - Tablo üstbilgisi', + 'Modules - table row' => 'Modüller - tablo satırı', + 'Modules maagement' => 'Modülleri maagement', + 'Modules management' => 'Modülleri maagement', + 'Moldova' => 'Moldova', + 'Monaco' => 'Monaco', + 'Mongolia' => 'Mongolia', + 'Morocco' => 'Morocco', + 'Mozambique' => 'Mozambique', + 'Mr.' => 'Bay.', + 'Mrs' => 'Bayan', + 'Name of the active PDF template' => 'Adı active PDF şablonu', + 'Name of the active back-office template' => 'Etkin arka ofis şablonunun adı', + 'Name of the active front-office template' => 'Aktif ön büro şablonunun adı', + 'Name of the active mailing template' => 'Etkin posta şablonunun adı', + 'Name of the cart cookie' => 'Sepeti tanımlama bilgisinin adını', + 'Name of the delivery view in the current PDF template (without extension)' => 'Geçerli PDF şablonu (uzantısı olmadan) teslim görünümün adı', + 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)' => 'Hayal Kitaplığı tarafından kullanılan grafik sürücüsünün adı (bkz: https://imagine.readthedocs.org)', + 'Name of the invoice view in the current PDF template (without extension)' => 'Geçerli PDF şablonu (uzantısı olmadan) teslim görünümün adı', + 'Name of the template view returned when an obsolete (or inactive) product URL is invoked' => 'Bir kullanılmayan (veya etkin) ürün URL\'si çağrıldığında döndürülen şablon görünümün adı', + 'Name the cart cookie' => 'Adı sepeti tanımlama bilgisi', + 'Namibia' => 'Nambiya', + 'Nauru' => 'Nauru', + 'Navigation block' => 'Gezinti blok', + 'Nepal' => 'Nepal', + 'Netherlands' => 'Netherlands', + 'New Products block' => 'Yeni Ürünler Bloğu', + 'New York' => 'Adresinizi yazınız', + 'New Zealand' => 'Yeni Zelanda', + 'New order {$order_ref} placed on {config key="store_name"}' => 'Yeni sipariş {$order_ref} yerleştirilir {config anahtarı "store_name" =}', + 'Newfoundland and Labrador' => 'Newfoundland ve Labrador', + 'Newsletter block' => 'Haber bülteni kutusu', + 'Newsletter page - CSS stylesheet' => 'Bülten sayfa - CSS stil sayfası', + 'Newsletter page - after javascript include' => 'Bülten sayfa JavaScript içerme-', + 'Newsletter page - after javascript initialisation' => 'Bülten sayfa - javascript başlatma sonra', + 'Newsletter page - at the bottom' => 'Bülten sayfa - alt', + 'Newsletter page - at the top' => 'Bülten sayfa - üst', + 'Nicaragua' => 'Nicaragua', + 'Niger' => 'Nijer', + 'Nigeria' => 'Nijerya', + 'Niue' => 'Norveç', + 'North Carolina' => 'Güney Carolina', + 'North Dakota' => 'Kuzey Dakota', + 'North Korea' => 'Kuzey Kore', + 'Northwest Territories' => 'Kuzeybatı Toprakları', + 'Norway' => 'Norway', + 'Not paid' => 'Ödenmeyen', + 'Nouvelle-Calédonie' => 'Yeni Kaledonya', + 'Oman' => 'Oman', + 'Order' => 'Sipariş', + 'Order - After closing product row' => 'Sipariş ürün satır kapattıktan sonra-', + 'Order - After product list' => 'Sipariş - sonra ürün listesi', + 'Order - Before product list' => 'Sipariş - önce ürün listesi', + 'Order - Before starting product row' => 'Sipariş ürün satır başlamadan önce-', + 'Order - Edit JavaScript' => 'Sipariş - düzenleme JavaScript', + 'Order - Tab' => 'Sipariş - sekmesi', + 'Order - bill bottom' => 'Sipariş - bill alt', + 'Order - bill top' => 'Sipariş - bill üst', + 'Order - cart bottom' => 'Sipariş - sepeti alt', + 'Order - cart top' => 'Sipariş - sepeti üst', + 'Order - content' => 'Sipariş - içerik', + 'Order - customer information bottom' => 'Sipariş - müşteri bilgi alt', + 'Order - delivery module bottom' => 'Sipariş - teslimat modülü alt', + 'Order - payment module bottom' => 'Sipariş - ödeme modülü alt', + 'Order - product list' => 'Sipariş - ürün listesi', + 'Order - table header' => 'Siparişler - Tablo üstbilgisi', + 'Order - table row' => 'Siparişler - tablo satırı', + 'Order confirmation - after the order summary' => 'Sipariş teyidi - sonra sipariş Özeti', + 'Order confirmation sent to the customer' => 'Müşteriye gönderilen sipariş teyidi', + 'Order details - CSS stylesheet' => 'Detaylar - CSS stil sayfası sipariş', + 'Order details - additional delivery information' => 'Ek teslimat bilgilerini detaylar - sipariş', + 'Order details - additional information' => 'Daha fazla bilgi ayrıntılı bilgi - sipariş', + 'Order details - additional invoice information' => 'Detaylar - ek fatura bilgileri sipariş', + 'Order details - additional product information' => 'Daha fazla ürün bilgisi detaylar - sipariş', + 'Order details - after addresses' => 'Sipariş ayrıntıları - adresleri sonra', + 'Order details - after global information' => 'Sipariş ayrıntıları - küresel bilgi sonra', + 'Order details - after javascript include' => 'JavaScript içerme sonra detaylar - siparişi', + 'Order details - after product' => 'Sipariş ayrıntıları - ürün sonra', + 'Order details - after products' => 'Sipariş ayrıntıları - ürün sonra', + 'Order details - after products list' => 'Sipariş ayrıntıları - ürünler listesinden sonra', + 'Order details - at the bottom' => 'Sipariş ayrıntıları - alt', + 'Order details - at the top' => 'Sipariş ayrıntıları - üst', + 'Order details - before products list' => 'Sipariş ayrıntıları - önce ürün listesi', + 'Order details - delivery address' => 'Teslimat adresi detaylar - sipariş', + 'Order details - invoice address' => 'Sipariş ayrıntıları - fatura adresi', + 'Order details - javascript initialization' => 'Detaylar - javascript başlatma sipariş', + 'Order edit - bottom' => 'Düzenleme sipariş - alt', + 'Order edit - delivery address' => 'Siparişi gir - teslimat adresi', + 'Order edit - displayed after product information' => 'Sonra ürün bilgileri görüntülenen sipariş Düzenle-', + 'Order edit - order product table header' => 'Siparişi gir - sipariş ürün tablo başlığı', + 'Order edit - order product table row' => 'Siparişi gir - sipariş ürün tablo satırı', + 'Order edit - top' => 'Sipariş Düzenle - üst', + 'Order failed - CSS stylesheet' => 'Başarısız - sipariş CSS stil sayfası', + 'Order failed - after javascript include' => 'Başarısız - sipariş sonra javascript içerme', + 'Order failed - after javascript initialisation' => 'Başarısız - sipariş sonra javascript başlatma', + 'Order failed - at the bottom' => 'Başarısız - sipariş alt', + 'Order failed - at the top' => 'Sipariş başarısız - üst', + 'Orders - JavaScript' => 'Siparişler - JavaScript', + 'Orders - at the top' => 'Siparişler - üst', + 'Orders - bottom' => 'Siparişler - Alt', + 'Orders - table header' => 'Siparişler - Tablo üstbilgisi', + 'Orders - table row' => 'Siparişler - tablo satırı', + 'Page 404 - CSS stylesheet' => 'Sayfa 404 - CSS stil sayfası', + 'Page 404 - after javascript include' => 'Sayfa javascript içerme sonra 404-', + 'Page 404 - after javascript initialisation' => 'Sayfa 404 - javascript başlatma sonra', + 'Page 404 - content area' => 'Sayfa 404 - içerik alanı', + 'Paid' => 'Ödendi', + 'Pakistan' => 'Pakistan', + 'Panama' => 'Panama', + 'Papua Nueva Guinea' => 'Papua Nueva Gine', + 'Paraguay' => 'Paraguay', + 'Path to the directory where documents are stored' => 'Belgeleri depolandığı dizinin yolunu', + 'Path to the directory where images are stored' => 'Görüntüleri depolandığı dizinin yolunu', + 'Pay by cheque' => 'Çekle Ödeme', + 'Payment failed - CSS stylesheet' => 'Ödeme başarısız oldu - CSS stil sayfası', + 'Payment failed - after javascript include' => 'JavaScript içerme sonra ödeme - başarısız oldu', + 'Payment failed - javascript initialization' => 'Ödeme başlatma başarısız oldu - javascript', + 'Payment gateway - CSS stylesheet' => 'Ödeme ağ geçidi - CSS stil sayfası', + 'Payment gateway - after javascript include' => 'JavaScript içerme sonra ödeme ağ geçidi-', + 'Payment gateway - after javascript initialisation' => 'Ödeme ağ geçidi - javascript başlatma sonra', + 'Payment gateway - javascript' => 'Ödeme ağ geçidi - javascript', + 'Payment gateway - main area' => 'Ödeme ağ geçidi - ana alan', + 'Peru' => 'Peru', + 'Philippines' => 'Filipinler', + 'Placed order - CSS stylesheet' => 'Yerleştirilmiş sipariş - CSS stil sayfası', + 'Placed order - after javascript include' => 'Sipariş - sonra javascript içerme', + 'Placed order - after javascript initialisation' => 'Yerleştirilmiş sipariş - javascript başlatma sonra', + 'Placed order - main area' => 'Yerleştirilmiş sipariş - ana alan', + 'Poland' => 'Polonya', + 'Polynésie française' => 'Polynésie française', + 'Portugal' => 'Portekiz', + 'Processing' => 'İşlem devam ediyor', + 'Product' => 'ürün', + 'Product - Edit JavaScript' => 'Ürün - düzenleme JavaScript', + 'Product - Tab' => 'Ürün - sekmesi', + 'Product - accessories table header' => 'Ürün - Aksesuar Tablo üstbilgisi', + 'Product - accessories table row' => 'Ürün - Aksesuar tablo satırı', + 'Product - after combinations' => 'Ürün - sonra kombinasyonları', + 'Product - at the bottom of a product combination' => 'Ürünler - ürün birleşimi dibinde', + 'Product - attributes table header' => 'Ürün - öznitelikleri üstbilgi masa.', + 'Product - attributes table row' => 'Ürün - öznitelikleri satır tablo.', + 'Product - before combinations' => 'Ürün - önce kombinasyonları', + 'Product - categories table header' => 'Ürün - Kategoriler tablosu başlığı', + 'Product - categories table row' => 'Ürün - kategoriler tablo satırı', + 'Product - combination delete form' => 'Ürün - birleşimi silme formu', + 'Product - combinations list caption' => 'Ürün - kombinasyon listesi başlığı', + 'Product - content' => 'Ürün - içerik', + 'Product - contents table header' => 'Ürün - içindekiler tablosu başlığı', + 'Product - contents table row' => 'Ürün - içeriği tablo satırı', + 'Product - create form' => 'Ürün - oluşturma formu', + 'Product - delete form' => 'Ürün - silme formu', + 'Product - details pricing form' => 'Ürün - form fiyat tafsilât', + 'Product - details promotion form' => 'Ürün - ayrıntıları tanıtım formu', + 'Product - features table row' => 'Ürün - özellikleri tablo satırı', + 'Product - features-table-header' => 'Ürün - özellikleri Tablo başlık', + 'Product - folders table header' => 'Ürün - klasörler Tablo üstbilgisi', + 'Product - folders table row' => 'Ürün - klasörler tablo satırı', + 'Product - stock edit form' => 'Ürün - stok düzenleme formu', + 'Product edit - bottom' => 'Ürün Düzenle - alt', + 'Product edit - top' => 'Ürün Düzenle - üst', + 'Product loop - at the bottom' => 'Ürün döngüsü - alt', + 'Product loop - at the top' => 'Ürün döngüsü - üst', + 'Product page - CSS stylesheet' => 'Ürün sayfası - CSS stil sayfası', + 'Product page - On the bottom of the form' => 'Ürün sayfasında - formun altı', + 'Product page - On the top of the form' => 'Ürün sayfasında - formun altı', + 'Product page - additional information' => 'Ürün sayfası - ek bilgi', + 'Product page - after javascript include' => 'Ürün sayfa JavaScript içerme-', + 'Product page - after javascript initialisation' => 'Ürün sayfası - javascript başlatma sonra', + 'Product page - at the bottom' => 'Alt - ürün sayfası', + 'Product page - at the bottom of the detail area' => 'Ayrıntı alanının alt - ürün sayfası', + 'Product page - at the top' => 'Ürün sayfası - üst', + 'Product page - at the top of the detail' => 'Ürün sayfası - detay üstündeki', + 'Product page - photo gallery' => 'Ürün sayfası - Fotoğraf Galerisi', + 'Products - caption' => 'Ürünler - resim yazısı', + 'Products - header' => 'Ürünler - başlık', + 'Products - row' => 'Ürünler - kürek', + 'Products offer block' => 'Blok ürünler sunmak', + 'Profile - Edit JavaScript' => 'Profil - düzenleme JavaScript', + 'Profile - create form' => 'Profil - oluşturma formu', + 'Profile - delete form' => 'Profili - silme form', + 'Profile - table header' => 'Profil - Tablo üstbilgisi', + 'Profile - table row' => 'Profil - tablo satırı', + 'Profile edit - bottom' => 'Düzenle Profil - alt', + 'Profile edit - top' => 'Profil Düzenle - üst', + 'Profiles - JavaScript' => 'Profiller - JavaScript', + 'Profiles - at the top' => 'Profiller - üst', + 'Profiles - bottom' => 'Profiller - alt', + 'Qatar' => 'Katar', + 'Refunded' => 'Geri ödeme', + 'Register - CSS stylesheet' => 'Kayıt - CSS stil sayfası', + 'Register - after javascript include' => 'Sonra JavaScript içerme - kayıt', + 'Register - after javascript initialisation' => '-Javascript başlatma sonra kayıt', + 'Register - at the bottom' => 'Kayıt - alt', + 'Register - at the bottom of the form' => '-Kayıt formu alt kısmında', + 'Register - at the top' => 'Kayıt - üst', + 'Register - at the top of the form' => '-Kayıt formu üst kısmında', + 'Romania' => 'Romanya', + 'Russia' => 'Rusya', + 'Rwanda' => 'Ruanda', + 'Réunion(La)' => 'Réunion(La)', + 'Saint Kitts and Nevis' => 'Saint Kitts ve Nevis', + 'Saint Lucia' => 'Saint Lucia', + 'Saint Vincent and the Grenadines' => 'Saint Vincent and the Grenadines', + 'Sale - create form' => 'Satılık - oluşturma formu', + 'Sale - delete form' => 'Satılık - silme formu', + 'Sale edit - bottom' => 'Satılık Düzenle - alt', + 'Sale edit - top' => 'Satılık düzen - en iyi', + 'Sale edit page - javascript last call block' => 'Satış sayfa - javascript son çağrı blok Düzenle', + 'Sales - JavaScript' => 'Satış - JavaScript', + 'Sales - at the bottom' => 'Satış - alt', + 'Sales - at the top' => 'Satış - üst', + 'Sales - table header' => 'Satış - Tablo üstbilgisi', + 'Sales - table row' => 'Satış - tablo satırı', + 'Sales management' => 'Satış Yönetimi', + 'San Marino' => 'San Marino', + 'Sao Tome and Principe' => 'Sao Tome ve Principe', + 'Saudi Arabia' => 'Saudi Arabia', + 'Search' => 'Arama', + 'Search - JavaScript' => 'Arama - JavaScript', + 'Search - at the top' => 'Arama - üst', + 'Search - bottom' => 'Arama - alt', + 'Search block' => 'Arama engelleme', + 'Search page - CSS stylesheet' => 'Arama sayfası - CSS stil sayfası', + 'Search page - after javascript include' => 'Arama sayfası - sonra JavaScript içerme', + 'Search page - after javascript initialisation' => 'Arama sayfası - javascript başlatma sonra', + 'Secret key for form CSRF token' => 'Form CSRF belirteci için gizli anahtar', + 'Senegal' => 'Senegal', + 'Sent' => 'Gönder', + 'Seychelles' => 'Seyşel Adaları', + 'Shipping configuration' => 'Aktarma yapılandırması', + 'Shipping configuration - Edit' => 'Aktarma yapılandırması - Düzenle', + 'Shipping configuration - Edit JavaScript' => 'Aktarma yapılandırması - JavaScript Düzenle', + 'Shipping configuration - JavaScript' => 'Aktarma yapılandırması - JavaScript', + 'Shipping configuration - at the top' => 'Aktarma yapılandırması - üst', + 'Shipping configuration - bottom' => 'Aktarma yapılandırması - alt', + 'Shipping configuration - country delete form' => 'Aktarma yapılandırması - ülke silme formu', + 'Shipping configuration - create form' => 'Aktarma yapılandırması - oluşturma formu', + 'Shipping configuration - delete form' => 'Aktarma yapılandırması - silme formu', + 'Shipping configuration - table header' => 'Aktarma yapılandırması - Tablo üstbilgisi', + 'Shipping configuration - table row' => 'Aktarma yapılandırması - tablo satırı', + 'Shipping configuration edit - bottom' => 'Aktarma yapılandırması Düzenle - alt', + 'Shipping configuration edit - top' => 'Sevkiyat yapılandırma Düzenle - üst', + 'Shipping zones edit - bottom' => 'Nakliye bölgeleri düzenlemek - alt', + 'Shipping zones edit - top' => 'Nakliye bölgeleri Düzenle - üst', + 'Show error message instead of a white page on a server error' => 'Bir sunucu hatası üzerinde beyaz bir sayfa yerine hata iletisi göster', + 'Sierra Leone' => 'Sierra Leone', + 'Singapore' => 'Singapore', + 'Sitemap - at the bottom' => 'Site Haritası - alt', + 'Slovakia' => 'Slovakya', + 'Slovenia' => 'Slovenya', + 'Smarty template engine integration' => 'Smarty şablon motoru entegrasyonu', + 'Social Networks block' => 'Sosyal ağlar blok', + 'Solomon Islands' => 'Solomon Islands', + 'Somalia' => 'Somali', + 'South Africa' => 'Güney Afrika', + 'South Carolina' => 'Güney Carolina', + 'South Dakota' => 'Güney Dakota', + 'South Korea' => 'South Korea', + 'Spain' => 'Spain', + 'Sri Lanka' => 'Sri Lanka', + 'St Pierre et Miquelon' => 'St Pierre et Miquelon', + 'Store Information - JavaScript' => 'Mağaza bilgileri - JavaScript', + 'Store information configuration' => 'Mağaza bilgileri yapılandırma', + 'Sudan' => 'Sudan', + 'Suriname' => 'Suriname', + 'Swaziland' => 'Svaziland', + 'Sweden' => 'İsveç', + 'Switzerland' => 'Switzerland', + 'Syria' => 'Suriye', + 'System - logs JavaScript' => 'Sistem - günlükleri JavaScript', + 'Tab SEO - bottom' => 'SEO sekme - alt', + 'Tab SEO - top' => 'Sekme SEO - üst', + 'Tab SEO - update form' => 'Sekme SEO - güncelleştirme formu', + 'Tab document - bottom' => 'Belge sekmesi - alt', + 'Tab document - top' => 'Sekmesini belge - üst', + 'Tab image - bottom' => 'Resim sekmesi - alt', + 'Tab image - top' => 'Sekme resmi - üst', + 'Tajikistan' => 'Tajikistan', + 'Tanzania' => 'Tanzanya', + 'Tax - Edit JavaScript' => 'Kdv- düzenleme JavaScript', + 'Tax - create form' => 'Kdv - oluşturma formu', + 'Tax - delete form' => 'Kdv - silme formu', + 'Tax edit - bottom' => 'Düzenleme Kdvi - alt', + 'Tax edit - top' => 'Kdv Düzenle - üst', + 'Tax rule edit - bottom' => 'Kural düzenleme Kdv - alt', + 'Tax rule edit - top' => 'Kdv Kural Düzenle - üst', + 'Tax rules configuration' => 'Kdv kuralları yapılandırma', + 'Taxes - update form' => 'Kdv - güncelleştirme formu', + 'Taxes rules - JavaScript' => 'Kdv kuralları - JavaScript', + 'Taxes rules - at the top' => 'Kdv kuralları - üst', + 'Taxes rules - bottom' => 'Kdv kuralları - alt', + 'Template - Edit JavaScript' => 'Şablon - düzenleme JavaScript', + 'Template - attributes table header' => 'Şablon - öznitelikleri üstbilgi masa.', + 'Template - attributes table row' => 'Şablon - öznitelikleri satır tablo.', + 'Template - create form' => 'Şablon - oluşturma formu', + 'Template - delete form' => 'Şablon - silme formu', + 'Template - features table row' => 'Şablon - Özellikleri tablo satırı', + 'Template - features-table-header' => 'Şablon - Özellikleri tablo başlık', + 'Template edit - bottom' => 'Şablonu Düzenle - alt', + 'Template edit - top' => 'Şablonu Düzenle - üst', + 'Templates - JavaScript' => 'Şablonlar - JavaScript', + 'Templates - at the top' => 'Şablonlar - üst', + 'Templates - bottom' => 'Şablonlar - alt', + 'Templates - table header' => 'Şablonlar - Tablo üstbilgisi', + 'Templates - table row' => 'Şablonlar - tablo satırı', + 'Thailand' => 'Tayland', + 'The ID of the \'Terms & Conditions\' content.' => '\'Şartlar ve koşullar\' içerik Kımlığı.', + 'The ID of the folder containing your information pages : terms, imprint, ...' => 'Bilgi sayfaları içeren klasörü Kımlığı: şartları, Künye,...', + 'The Vatican' => 'Vatikan', + 'The default quality (in %) of the generated images' => 'Oluşturulan görüntülerin varsayılan kalitesini (% olarak)', + 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country' => '(Göre varsayılan arka ofis şablon) yolu hiçbir bayrak resmi bir ülke için bulduğunda kullanılan görüntüsüne', + 'The path to the document cache directory in the web space' => 'Web alanı belge önbellek dizininde yolunu', + 'The path to the image cache directory in the web space' => 'Web alanı resim önbellek dizininde yolunu', + 'TinyMCE WYSIWYG editor' => 'TinyMCE WYSIWYG editörü', + 'Togo' => 'Togo', + 'Tonga' => 'Tonga', + 'Tools - JavaScript' => 'Araçlar - JavaScript', + 'Tools - at the bottom of column 1' => 'Araçlar - 1 sütunun altındaki', + 'Tools - at the top' => 'Araçlar - üst', + 'Tools - at the top of the column' => 'Üst sütun - Araçlar', + 'Tools - bottom' => 'Araçlar - alt', + 'Tools panel' => 'Araçlar paneli', + 'Translations' => 'Çeviri', + 'Translations - JavaScript' => 'Çeviriler - JavaScript', + 'Trinidad and Tobago' => 'Trinidad and Tobago', + 'Tunisia' => 'Tunisia', + 'Turkey' => 'Türkiye', + 'Turkmenistan' => 'Türkmenistan', + 'Tuvalu' => 'Tuvalu', + 'UK Pound' => 'İngiliz Lirası', + 'Uganda' => 'Uganda', + 'Ukraine' => 'Ukrayna', + 'United Arab Emirates' => 'United Arab Emirates', + 'United Kingdom' => 'Birleşik Krallık', + 'United States Dollar' => 'ABD doları', + 'Update customer account - CSS stylesheet' => 'Müşteri hesabını güncelle - CSS stil sayfası', + 'Update customer account - after javascript include' => 'JavaScript içerme sonra müşteri hesabı - güncelleme', + 'Update customer account - after javascript initialisation' => 'Javascript başlatma sonra - müşteri hesabını güncelle', + 'Update customer account - at the bottom' => 'Alt - müşteri hesabını güncelle', + 'Update customer account - at the bottom of the form' => 'Formun alt - müşteri hesabını güncelle', + 'Update customer account - at the top' => 'Üst - müşteri hesabını güncelle', + 'Update customer account - at the top of the form' => 'Formun alt - müşteri hesabını güncelle', + 'Uruguay' => 'Uruguay', + 'Use a persistent cookie to keep track of customer cart' => 'Müşteri sepeti izlemek için kalıcı bir tanımlama bilgisi kullanın', + 'Uzbekistan' => 'Özbekistan', + 'Vanuatu' => 'Vanuatu Cumhuriyeti', + 'Variable - Edit JavaScript' => 'Değişken - düzenleme JavaScript', + 'Variable - create form' => 'Değişken - oluşturma formu', + 'Variable - delete form' => 'Değişken - silme formu', + 'Variable edit - bottom' => 'Değişkenini Düzenle - alt', + 'Variable edit - top' => 'Değişken Düzenle - üst', + 'Variables - JavaScript' => 'Değişkenleri - JavaScript', + 'Variables - at the top' => 'Değişkenleri - üst', + 'Variables - bottom' => 'Değişkenleri - alt', + 'Variables - table header' => 'Değişkenleri - Tablo üstbilgisi', + 'Variables - table row' => 'Değişkenleri - tablo satırı', + 'Venezuela' => 'Venezuela', + 'Vietnam' => 'Vietnam', + 'View administration logs' => 'Yönetim günlüklerini görüntüleme', + 'Virtual Product Controller' => 'Sanal ürün denetleyicisi', + 'Wallis-et-Futuna' => 'Wallis-et-Futuna', + 'Western Samoa' => 'Batı Samoa', + 'Where the WYSIWYG editor is required' => 'WYSIWYG editörü gerekli olduğu', + 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)' => 'Boşluk kırpmak oluşturulan HTML kodunun düzeyi (0 = yok, 1 = orta, 2 = maksimum)', + 'Yemen' => 'Yemen', + 'You can now login at' => 'Şimdi giriş yapınız', + 'You have lost your password
    \r\nPlease, change this password after your first connection' => 'Şifrenizi kaybetti < br / > \r\nPlease, ilk bağlantıdan sonra bu parolayı değiştirme', + 'You have lost your password
    \r\nYour new password is' => 'Şifrenizi kaybetti < br / > \r\nYour yeni şifre', + 'Your account information on {config key="store_name"} has been changed.' => 'Hesap bilgilerinizi {config anahtarı "store_name" =} değiştirildi.', + 'Your new passord is : {$password}' => 'Senin yeni geçmek mi: {$password}', + 'Your new password' => 'Yeni parola', + 'Your new password for {config key="store_name"}' => 'Yeni parolanızı {config anahtarı "store_name" =}', + 'Your order {$order_ref} at {config key="store_name"}' => 'Sipariş {$order_ref}, {config anahtarı "store_name" =}', + 'Zaire' => 'Zaire', + 'Zambia' => 'Zambia', + 'Zimbabwe' => 'Zimbabwe', + 'Zone - delete form' => 'Bölge - silme formu', + '[Firewall/Bruteforce] Number of allowed attemps' => '[Güvenlik duvarı/Bruteforce] İzin verilen kalkışmak sayısı', + '[Firewall/Bruteforce] Time to wait between X attempts' => '[Güvenlik duvarı/Bruteforce] X arasında beklenecek süre çalışır', + '[Firewall] Activate the firewall' => '[Firewall] Güvenlik Duvarı\'nı etkinleştirme', + '[Firewall] Number of allowed attemps' => '[Firewall] sayısı izin verilen kalkışmak', + '[Firewall] Time to wait between X attempts' => '[Firewall] X arasında beklenecek süre çalışır', + 'changing password email for' => 'şifre e-posta için değiştirme', + 'customer account - CSS stylesheet' => 'Müşteri hesabı - CSS stil sayfası', + 'customer account - after javascript include' => 'Müşteri hesabı - sonra JavaScript içerme', + 'customer account - after javascript initialisation' => 'Müşteri hesabı - javascript başlatma sonra', + 'customer account - at the bottom' => 'Müşteri hesabı - alt', + 'customer account - at the top' => 'Müşteri hesabı - üst', + 'export of newsletter subscribers' => 'bülten abonesi ihracat', + 'language selection page - CSS stylesheet' => 'Dil seçimi sayfası - CSS stil sayfası', + 'language selection page - after javascript include' => 'Dil seçimi sayfa JavaScript içerme-', + 'language selection page - after javascript initialisation' => 'Dil seçimi sayfası - javascript başlatma sonra', + 'language selection page - at the bottom' => 'Dil seçimi sayfası - alt', + 'language selection page - at the top' => 'Dil seçimi sayfası - üst', + 'tax rule - Edit JavaScript' => 'Kdv kural - JavaScript Düzenle', + 'tax rule - create form' => 'Kdv kural - oluşturma formu', + 'tax rule - delete form' => 'Kdv kural - silme formu', + 'tinymce wysiwyg editor' => 'TinyMCE WYSIWYG editörü', +]; diff --git a/setup/I18n/uk_UA.php b/setup/I18n/uk_UA.php new file mode 100644 index 00000000..64971cb8 --- /dev/null +++ b/setup/I18n/uk_UA.php @@ -0,0 +1,8 @@ + 'Категорія', + 'Content' => 'Контент', + 'Folder' => 'Каталог', + 'Hooks' => 'Хуки', +]; diff --git a/setup/Readme.md b/setup/Readme.md new file mode 100644 index 00000000..339a0da0 --- /dev/null +++ b/setup/Readme.md @@ -0,0 +1,35 @@ +Readme +====== + +## This is the repository of Thelia setup/update scripts. All the pull requests on this repo will be ignored. +### If you want to create a project, please take a look at [thelia/thelia-project](https://github.com/thelia/thelia-project) +### If you want to contribute to Thelia, please take a look at [thelia/thelia](https://github.com/thelia/thelia) + +Thelia +------ +[![Build Status](https://travis-ci.org/thelia/thelia.png?branch=master)](https://travis-ci.org/thelia/thelia) [![License](https://poser.pugx.org/thelia/thelia/license.png)](https://packagist.org/packages/thelia/thelia) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/thelia/thelia/badges/quality-score.png?s=61e3e04a69bffd71c29b08e5392080317a546716)](https://scrutinizer-ci.com/g/thelia/thelia/) + +[Thelia](http://thelia.net/) is an open source tool for creating e-business websites and managing online content. This software is published under LGPL. + +This is the new major version of Thelia. + +You can download this version and have a try or take a look at the source code (or anything you wish, respecting LGPL). See http://thelia.net/ web site for more information. + +A repository containing all thelia modules is available at this address : https://github.com/thelia-modules + +Requirements +------------ + +* php 5.4 + * Required extensions : + * PDO_Mysql + * mcrypt + * intl + * gd + * curl + * safe_mode off + * memory_limit at least 128M, preferably 256. + * post_max_size 20M + * upload_max_filesize 2M +* apache 2 +* mysql diff --git a/setup/composer.json b/setup/composer.json new file mode 100644 index 00000000..f1b0d121 --- /dev/null +++ b/setup/composer.json @@ -0,0 +1,11 @@ +{ + "name": "thelia/setup", + "type": "thelia-local", + "require": { + "thelia/installer": "~1.1", + "fzaninotto/faker": "1.5.*" + }, + "extra": { + "installer-name": "setup" + } +} diff --git a/setup/faker-assets/FreeSans.ttf b/setup/faker-assets/FreeSans.ttf new file mode 100644 index 00000000..9db95853 Binary files /dev/null and b/setup/faker-assets/FreeSans.ttf differ diff --git a/setup/faker.php b/setup/faker.php new file mode 100644 index 00000000..bf64a30d --- /dev/null +++ b/setup/faker.php @@ -0,0 +1,1212 @@ +boot(); +$thelia->getContainer()->get('thelia.translator'); +// The default faker is en_US +$faker = Faker\Factory::create('en_US'); + +// Create localized version for content generation +$localizedFaker = []; + +foreach ($localeList as $locale) { + $localizedFaker[$locale] = Faker\Factory::create($locale); +} + +$con = \Propel\Runtime\Propel::getConnection( + Thelia\Model\Map\ProductTableMap::DATABASE_NAME +); +$con->beginTransaction(); + +// Intialize URL management +$url = new Thelia\Tools\URL(); + +$currency = \Thelia\Model\CurrencyQuery::create()->filterByCode('EUR')->findOne(); + +//\Thelia\Log\Tlog::getInstance()->setLevel(\Thelia\Log\Tlog::ERROR); + +try { + $stmt = $con->prepare("SET foreign_key_checks = 0"); + $stmt->execute(); + + echo "Clearing tables\n"; + + Model\ProductAssociatedContentQuery::create()->deleteAll(); + Model\CategoryAssociatedContentQuery::create()->deleteAll(); + Model\FeatureProductQuery::create()->deleteAll(); + Model\AttributeCombinationQuery::create()->deleteAll(); + Model\FeatureQuery::create()->deleteAll(); + Model\FeatureI18nQuery::create()->deleteAll(); + Model\FeatureAvQuery::create()->deleteAll(); + Model\FeatureAvI18nQuery::create()->deleteAll(); + Model\AttributeQuery::create()->deleteAll(); + Model\AttributeI18nQuery::create()->deleteAll(); + Model\AttributeAvQuery::create()->deleteAll(); + Model\AttributeAvI18nQuery::create()->deleteAll(); + Model\CategoryQuery::create()->deleteAll(); + Model\CategoryI18nQuery::create()->deleteAll(); + Model\ProductQuery::create()->deleteAll(); + Model\ProductI18nQuery::create()->deleteAll(); + Model\CustomerQuery::create()->deleteAll(); + Model\AdminQuery::create()->deleteAll(); + Model\FolderQuery::create()->deleteAll(); + Model\FolderI18nQuery::create()->deleteAll(); + Model\ContentQuery::create()->deleteAll(); + Model\ContentI18nQuery::create()->deleteAll(); + Model\AccessoryQuery::create()->deleteAll(); + Model\ProductSaleElementsQuery::create()->deleteAll(); + Model\ProductPriceQuery::create()->deleteAll(); + Model\BrandQuery::create()->deleteAll(); + Model\BrandI18nQuery::create()->deleteAll(); + Model\ProductImageQuery::create()->deleteAll(); + Model\CategoryImageQuery::create()->deleteAll(); + Model\FolderImageQuery::create()->deleteAll(); + Model\ContentImageQuery::create()->deleteAll(); + Model\BrandImageQuery::create()->deleteAll(); + Model\ProductDocumentQuery::create()->deleteAll(); + Model\CategoryDocumentQuery::create()->deleteAll(); + Model\FolderDocumentQuery::create()->deleteAll(); + Model\ContentDocumentQuery::create()->deleteAll(); + Model\BrandDocumentQuery::create()->deleteAll(); + Model\CouponQuery::create()->deleteAll(); + Model\OrderQuery::create()->deleteAll(); + Model\SaleQuery::create()->deleteAll(); + Model\SaleProductQuery::create()->deleteAll(); + Model\MetaDataQuery::create()->deleteAll(); + + $stmt = $con->prepare("SET foreign_key_checks = 1"); + + $stmt->execute(); + + // default country (France) + $defaultCountry = [64, null]; + + // Store info + + echo "Creating Store information \n"; + + Model\ConfigQuery::write('store_name', 'Thelia V2'); + Model\ConfigQuery::write('store_email', 'test@thelia.net'); + Model\ConfigQuery::write('store_notification_emails', 'test@thelia.net'); + Model\ConfigQuery::write('store_address1', "5 rue Rochon"); + Model\ConfigQuery::write('store_zipcode', "63000"); + Model\ConfigQuery::write('store_city', "Clermont-Ferrand"); + Model\ConfigQuery::write('store_country', $defaultCountry[0]); + + $api = new Thelia\Model\Api(); + + $api + ->setProfileId(null) + ->setApiKey('79E95BD784CADA0C9A578282E') + ->setLabel("test") + ->save(); + + // API + echo "Creating API key\n"; + + $api = new Thelia\Model\Api(); + + $api + ->setProfileId(null) + ->setApiKey('79E95BD784CADA0C9A578282E') + ->setLabel("test") + ->save(); + + // Customer + echo "Creating customers\n"; + $customer = new Thelia\Model\Customer(); + + $customer->createOrUpdate( + 1, + "thelia", + "thelia", + "5 rue rochon", + "", + "", + "0102030405", + "0601020304", + "63000", + "clermont-ferrand", + $defaultCountry[0], + "test@thelia.net", + "azerty", + null, + 0, + null, + 0, + null, + null, + false, + $defaultCountry[1] + ); + for ($j = 0; $j <= 3; $j++) { + $address = new Thelia\Model\Address(); + $country = getRandomCountry(); + $address->setLabel(getRealText(20)) + ->setTitleId(rand(1, 3)) + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setAddress1($faker->streetAddress) + ->setAddress2($faker->streetAddress) + ->setAddress3($faker->streetAddress) + ->setCellphone($faker->phoneNumber) + ->setPhone($faker->phoneNumber) + ->setZipcode($faker->postcode) + ->setCity($faker->city) + ->setCountryId($country[0]) + ->setStateId($country[1]) + ->setCustomer($customer) + ->save() + ; + } + + $admin = new Thelia\Model\Admin(); + $admin + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setLogin('thelia') + ->setPassword('thelia') + ->setLocale('en_US') + ->setEmail('') + ->save(); + + for ($i=0; $i<3; $i++) { + $admin = new Thelia\Model\Admin(); + $admin + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setLogin($faker->firstname) + ->setPassword('azerty') + ->setLocale('en_US') + ->setEmail($faker->email) + ->save(); + } + + for ($i = 0; $i < 50; $i++) { + $customer = new Thelia\Model\Customer(); + $country = getRandomCountry(); + $customer->createOrUpdate( + rand(1, 3), + $faker->firstname, + $faker->lastname, + $faker->streetAddress, + $faker->streetAddress, + $faker->streetAddress, + $faker->phoneNumber, + $faker->phoneNumber, + $faker->postcode, + $faker->city, + $country[0], + $faker->email, + "azerty".$i, + null, + 0, + null, + 0, + null, + null, + false, + $country[1] + ); + + for ($j = 0; $j <= 3; $j++) { + $address = new Thelia\Model\Address(); + $address->setLabel(getRealText(20)) + ->setTitleId(rand(1, 3)) + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setAddress1($faker->streetAddress) + ->setAddress2($faker->streetAddress) + ->setAddress3($faker->streetAddress) + ->setCellphone($faker->phoneNumber) + ->setPhone($faker->phoneNumber) + ->setZipcode($faker->postcode) + ->setCity($faker->city) + ->setCountryId($country[0]) + ->setStateId($country[1]) + ->setCustomer($customer) + ->save() + ; + + } + } + + echo "Creating features\n"; + + //features and features_av + $featureList = array(); + for ($i=0; $i<4; $i++) { + $feature = new Thelia\Model\Feature(); + $feature->setVisible(1); + $feature->setPosition($i); + setI18n($feature); + + $feature->save(); + $featureId = $feature->getId(); + $featureList[$featureId] = array(); + + //hardcode chance to have no av + if ($i === 1 || $i === 3) { + for ($j = 0; $j < rand(1, 5); $j++) { + $featureAv = new Thelia\Model\FeatureAv(); + $featureAv->setFeature($feature); + $featureAv->setPosition($j); + setI18n($featureAv); + + $featureAv->save(); + $featureList[$featureId][] = $featureAv->getId(); + } + } + } + + echo "Creating attributes\n"; + + //attributes and attributes_av + $attributeList = array(); + for ($i=0; $i<4; $i++) { + $attribute = new Thelia\Model\Attribute(); + $attribute->setPosition($i); + setI18n($attribute); + + $attribute->save(); + $attributeId = $attribute->getId(); + $attributeList[$attributeId] = array(); + + for ($j=0; $jsetAttribute($attribute); + $attributeAv->setPosition($j); + setI18n($attributeAv); + + $attributeAv->save(); + $attributeList[$attributeId][] = $attributeAv->getId(); + } + } + + echo "Creating templates\n"; + + $template = new Thelia\Model\Template(); + setI18n($template, array("Name" => 20)); + $template->save(); + + foreach ($attributeList as $attributeId => $attributeAvId) { + $at = new Thelia\Model\AttributeTemplate(); + + $at + ->setTemplate($template) + ->setAttributeId($attributeId) + ->save(); + } + + foreach ($featureList as $featureId => $featureAvId) { + $ft = new Thelia\Model\FeatureTemplate(); + + $ft + ->setTemplate($template) + ->setFeatureId($featureId) + ->save(); + } + + echo "Creating folders and contents\n"; + + //folders and contents + $contentIdList = array(); + for ($i=0; $i<4; $i++) { + $folder = new Thelia\Model\Folder(); + $folder->setParent(0); + $folder->setVisible(1); + $folder->setPosition($i+1); + setI18n($folder); + + $folder->save(); + + $image = new \Thelia\Model\FolderImage(); + $image->setFolderId($folder->getId()); + generate_image($image, 'folder', $folder->getId()); + + $document = new \Thelia\Model\FolderDocument(); + $document->setFolderId($folder->getId()); + generate_document($document, 'folder', $folder->getId()); + + for ($j=0; $j<3; $j++) { + $subfolder = new Thelia\Model\Folder(); + $subfolder->setParent($folder->getId()); + $subfolder->setVisible(1); + $subfolder->setPosition($j+1); + setI18n($subfolder); + + $subfolder->save(); + + $image = new \Thelia\Model\FolderImage(); + $image->setFolderId($subfolder->getId()); + generate_image($image, 'folder', $subfolder->getId()); + + $document = new \Thelia\Model\FolderDocument(); + $document->setFolderId($folder->getId()); + generate_document($document, 'folder', $subfolder->getId()); + + for ($k=0; $k<4; $k++) { + $content = new Thelia\Model\Content(); + $content->addFolder($subfolder); + + $contentFolders = $content->getContentFolders(); + $collection = new \Propel\Runtime\Collection\Collection(); + $collection->prepend($contentFolders[0]->setDefaultFolder(1)); + $content->setContentFolders($collection); + + $content->setVisible(1); + $content->setPosition($k+1); + setI18n($content); + + $content->save(); + $contentId = $content->getId(); + $contentIdList[] = $contentId; + + $image = new \Thelia\Model\ContentImage(); + $image->setContentId($contentId); + generate_image($image, 'content', $contentId); + + $document = new \Thelia\Model\ContentDocument(); + $document->setContentId($contentId); + generate_document($document, 'content', $contentId); + } + } + } + + echo "Creating brands\n"; + + $brandIdList = []; + + for ($k=0; $k<10; $k++) { + $brand = new Thelia\Model\Brand(); + + $brand->setVisible(1); + $brand->setPosition($k+1); + setI18n($brand); + + $brand->save(); + $brandId = $brand->getId(); + $brandIdList[] = $brandId; + + $image = new \Thelia\Model\BrandImage(); + $image->setBrandId($brandId); + generate_image($image, 'brand', $brandId); + + $document = new \Thelia\Model\BrandDocument(); + $document->setBrandId($brandId); + generate_document($document, 'brand', $brandId); + } + + echo "Creating categories and products\n"; + + //categories and products + $productIdList = array(); + $virtualProductList = array(); + $categoryIdList = array(); + for ($i=1; $i<$numberCategories; $i++) { + $category = createCategory($faker, 0, $i, $categoryIdList, $contentIdList); + + for ($j=1; $jgetId(), $j, $categoryIdList, $contentIdList); + + for ($k=0; $ksetAccessory($productIdList[$pick]) + ->setProductId($productId) + ->setPosition($i) + ->save(); + } + + //add random associated content + $alreadyPicked = array(); + for ($i=1; $isetContentId($contentIdList[$pick]) + ->setProductId($productId) + ->setPosition($i) + ->save(); + } + + //associate PSE and stocks to products + $pse_count = rand(1, 7); + for ($pse_idx=0; $pse_idx<$pse_count; $pse_idx++) { + $stock = new \Thelia\Model\ProductSaleElements(); + $stock->setProductId($productId); + $stock->setRef($productId . '_' . $pse_idx . '_' . $faker->randomNumber(8)); + $stock->setQuantity($faker->numberBetween(1, 50)); + $stock->setPromo($faker->numberBetween(0, 1)); + $stock->setNewness($faker->numberBetween(0, 1)); + $stock->setWeight($faker->randomFloat(2, 1, 5)); + $stock->setIsDefault($pse_idx == 0 ? true : false); + $stock->setEanCode(substr(str_shuffle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 13)); + $stock->save(); + + // associate document to virtual product + if (array_key_exists($productId, $virtualProductList)) { + $virtualDocument = new \Thelia\Model\MetaData(); + $virtualDocument + ->setMetaKey('virtual') + ->setElementKey(\Thelia\Model\MetaData::PSE_KEY) + ->setElementId($stock->getId()) + ->setValue($virtualProductList[$productId]) + ->save(); + } + + $price = $faker->randomFloat(2, 20, 250); + $promoPrice = $price * $faker->randomFloat(2, 0, 1); + + $productPrice = new \Thelia\Model\ProductPrice(); + $productPrice->setProductSaleElements($stock); + $productPrice->setCurrency($currency); + $productPrice->setPrice($price); + $productPrice->setPromoPrice($promoPrice); + $productPrice->save(); + + //associate attributes - or not - to PSE + + $alreadyPicked = array(); + $minAttrCount = $pse_count == 1 ? 0 : 1; + + for ($attrIdx=0; $attrIdxsetAttributeId($pick) + ->setAttributeAvId($attributeList[$pick][array_rand($attributeList[$pick], 1)]) + ->setProductSaleElements($stock) + ->save(); + } + } + + //associate features to products + $freeTextCreated = false; + foreach ($featureList as $featureId => $featureAvId) { + $featureProduct = new Thelia\Model\FeatureProduct(); + $featureProduct->setProductId($productId) + ->setFeatureId($featureId); + + if ($freeTextCreated === false && count($featureAvId) === 0) { //set one feature as free text + $featureAv = new Thelia\Model\FeatureAv(); + $featureAv->setFeatureId($featureId); + $featureAv->setPosition(1); + setI18n($featureAv); + $featureAv->save(); + + $featureProduct->setFeatureAvId($featureAv->getId()); + $featureProduct->setFreeTextValue(true); + $freeTextCreated = true; + } elseif (count($featureAvId) > 0) { //got some av + $featureProduct->setFeatureAvId( + $featureAvId[array_rand($featureAvId, 1)] + ); + } else { //no av : no featureProduct + continue; + } + + $featureProduct->save(); + } + } + + echo "Creating orders\n"; + + $colissimo_id = ModuleQuery::create()-> + filterByCode("Colissimo") + ->findOne() + ->getId(); + + $cheque_id = ModuleQuery::create() + ->filterByCode("Cheque") + ->findOne() + ->getId(); + + for ($i=0; $i < 50; ++$i) { + $placedOrder = new \Thelia\Model\Order(); + $country = getRandomCountry(); + + $deliveryOrderAddress = new OrderAddress(); + $deliveryOrderAddress + ->setCustomerTitleId(mt_rand(1, 3)) + ->setCompany(getRealText(15)) + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setAddress1($faker->streetAddress) + ->setAddress2($faker->streetAddress) + ->setAddress3($faker->streetAddress) + ->setPhone($faker->phoneNumber) + ->setZipcode($faker->postcode) + ->setCity($faker->city) + ->setCountryId($country[0]) + ->setStateId($country[1]) + ->save($con) + ; + + $invoiceOrderAddress = new OrderAddress(); + $invoiceOrderAddress + ->setCustomerTitleId(mt_rand(1, 3)) + ->setCompany(getRealText(15)) + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setAddress1($faker->streetAddress) + ->setAddress2($faker->streetAddress) + ->setAddress3($faker->streetAddress) + ->setPhone($faker->phoneNumber) + ->setZipcode($faker->postcode) + ->setCity($faker->city) + ->setCountryId($country[0]) + ->setStateId($country[1]) + ->save($con) + ; + + /** + * Create a cart for the order + */ + $cart = new \Thelia\Model\Cart(); + $cart->save(); + + $currency = \Thelia\Model\CurrencyQuery::create() + ->addAscendingOrderByColumn('RAND()') + ->findOne(); + + $placedOrder + ->setDeliveryOrderAddressId($deliveryOrderAddress->getId()) + ->setInvoiceOrderAddressId($invoiceOrderAddress->getId()) + ->setDeliveryModuleId($colissimo_id) + ->setPaymentModuleId($cheque_id) + ->setStatusId(mt_rand(1, 5)) + ->setCurrencyRate($currency->getRate()) + ->setCurrencyId($currency->getId()) + ->setCustomer( + \Thelia\Model\CustomerQuery::create() + ->addAscendingOrderByColumn('RAND()') + ->findOne() + ) + ->setDiscount(mt_rand(0, 10)) + ->setLang( + \Thelia\Model\LangQuery::create() + ->addAscendingOrderByColumn('RAND()') + ->findOne() + ) + ->setPostage(mt_rand(1, 50)) + ->setCartId($cart->getId()) + ; + + $placedOrder->save($con); + + for ($j=0; $j < mt_rand(1, 10); ++$j) { + $pse = \Thelia\Model\ProductSaleElementsQuery::create() + ->addAscendingOrderByColumn('RAND()') + ->findOne(); + + $product = $pse->getProduct(); + + $orderProduct = new \Thelia\Model\OrderProduct(); + + $orderProduct + ->setOrderId($placedOrder->getId()) + ->setProductRef($product->getRef()) + ->setProductSaleElementsRef($pse->getRef()) + ->setProductSaleElementsId($pse->getId()) + ->setTitle($product->getTitle()) + ->setChapo($product->getChapo()) + ->setDescription($product->getDescription()) + ->setPostscriptum($product->getPostscriptum()) + ->setQuantity(mt_rand(1, 10)) + ->setPrice($price=mt_rand(1, 100)) + ->setPromoPrice(mt_rand(1, $price)) + ->setWasNew($pse->getNewness()) + ->setWasInPromo(rand(0, 1) == 1) + ->setWeight($pse->getWeight()) + ->setTaxRuleTitle(getRealText(20)) + ->setTaxRuleDescription(getRealText(50)) + ->setEanCode($pse->getEanCode()) + ->save($con); + } + + } + + echo "Generating coupons fixtures\n"; + + generateCouponFixtures($thelia); + + echo "Generating sales\n"; + + for($idx = 1; $idx <= 5; $idx++) { + + $sale = new \Thelia\Model\Sale(); + + $start = new \DateTime(); + $end = new \DateTime(); + + $sale + ->setActive(0) + ->setStartDate($start->setTimestamp(strtotime("today - 1 month"))) + ->setEndDate($end->setTimestamp(strtotime("today + 1 month"))) + ->setPriceOffsetType(\Thelia\Model\Sale::OFFSET_TYPE_PERCENTAGE) + ->setDisplayInitialPrice(true) + ; + + setI18n($sale, [ + 'SaleLabel' => 20, 'Title' => 20, 'Chapo' => 30, 'Postscriptum' => 30, 'Description' => 50 + ]); + + $sale->save(); + + $currencies = \Thelia\Model\CurrencyQuery::create()->find(); + + foreach($currencies as $currency) { + $saleOffset = new \Thelia\Model\SaleOffsetCurrency(); + + $saleOffset + ->setCurrencyId($currency->getId()) + ->setSaleId($sale->getId()) + ->setPriceOffsetValue($faker->numberBetween(10, 70)) + ->save() + ; + } + + $products = \Thelia\Model\ProductQuery::create()->addAscendingOrderByColumn('RAND()')->find(); + + $count = $faker->numberBetween(5, 20); + + foreach ($products as $product) { + + if ( --$count < 0) break; + + $saleProduct = new \Thelia\Model\SaleProduct(); + + $saleProduct + ->setSaleId($sale->getId()) + ->setProductId($product->getId()) + ->setAttributeAvId(null) + ->save(); + ; + } + } + + $con->commit(); + + echo "Successfully terminated.\n"; + +} catch (Exception $e) { + echo "error : ".$e->getMessage()."\n"; + if ($e->getPrevious()) echo "Cause: ".$e->getPrevious()->getMessage()."\n"; + echo $e->getTraceAsString(); + + $con->rollBack(); +} + +function createProduct($faker, Thelia\Model\Category $category, $position, $template, $brandIdList, &$productIdList, &$virtualProductList) +{ + $product = new Thelia\Model\Product(); + $product->setRef($category->getId() . '_' . $position . '_' . $faker->randomNumber(8)); + $product->addCategory($category); + $product->setVisible(1); + $productCategories = $product->getProductCategories(); + $collection = new \Propel\Runtime\Collection\Collection(); + $collection->prepend($productCategories[0]->setDefaultCategory(1)); + $product->setProductCategories($collection); + $product->setVirtual((mt_rand(1, 5) > 1) ? 0 : 1); + $product->setVisible(1); + $product->setPosition($position); + $product->setTaxRuleId(1); + $product->setTemplate($template); + $product->setBrandId($brandIdList[array_rand($brandIdList, 1)]); + + setI18n($product); + + $product->save(); + $productId = $product->getId(); + $productIdList[] = $productId; + + $image = new \Thelia\Model\ProductImage(); + $image->setProductId($productId); + generate_image($image, 'product', $productId); + + $document = new \Thelia\Model\ProductDocument(); + $document->setProductId($productId); + generate_document($document, 'product', $productId); + + if ($product->getVirtual() == 1){ + $virtualProductList[$productId] = $document->getId(); + } + + return $product; +} + +function createCategory($faker, $parent, $position, &$categoryIdList, $contentIdList) +{ + $category = new Thelia\Model\Category(); + $category->setParent($parent); + $category->setVisible(1); + $category->setPosition($position); + setI18n($category); + + $category->save(); + $categoryId = $category->getId(); + $categoryIdList[] = $categoryId; + + //add random associated content + $alreadyPicked = array(); + for ($i=1; $isetContentId($contentIdList[$pick]) + ->setCategoryId($categoryId) + ->setPosition($i) + ->save(); + } + + $image = new \Thelia\Model\CategoryImage(); + $image->setCategoryId($categoryId); + generate_image($image, 'category', $categoryId); + + $document = new \Thelia\Model\CategoryDocument(); + $document->setCategoryId($categoryId); + generate_document($document, 'category', $categoryId); + + return $category; +} + +function generate_image($image, $typeobj, $id) +{ + global $faker; + + $image + ->setTitle(getRealText(20)) + ->setDescription(getRealText(250)) + ->setChapo(getRealText(40)) + ->setPostscriptum(getRealText(40)) + ->setFile(sprintf("sample-image-%s.png", $id)) + ->save() + ; + + $palette = new \Imagine\Image\Palette\RGB(); + + // Generate images + $imagine = new Imagine\Gd\Imagine(); + $image = $imagine->create(new Imagine\Image\Box(320, 240), $palette->color('#E9730F')); + + $white = $palette->color('#FFF'); + + $font = $imagine->font(__DIR__.'/faker-assets/FreeSans.ttf', 14, $white); + + $tbox = $font->box("THELIA"); + $image->draw()->text("THELIA", $font, new Imagine\Image\Point((320 - $tbox->getWidth()) / 2, 30)); + + $str = sprintf("%s sample image", ucfirst($typeobj)); + $tbox = $font->box($str); + $image->draw()->text($str, $font, new Imagine\Image\Point((320 - $tbox->getWidth()) / 2, 80)); + + $font = $imagine->font(__DIR__.'/faker-assets/FreeSans.ttf', 18, $white); + + $str = sprintf("%s ID %d", strtoupper($typeobj), $id); + $tbox = $font->box($str); + $image->draw()->text($str, $font, new Imagine\Image\Point((320 - $tbox->getWidth()) / 2, 180)); + + $image->draw() + ->line(new Imagine\Image\Point(0, 0), new Imagine\Image\Point(319, 0), $white) + ->line(new Imagine\Image\Point(319, 0), new Imagine\Image\Point(319, 239), $white) + ->line(new Imagine\Image\Point(319, 239), new Imagine\Image\Point(0,239), $white) + ->line(new Imagine\Image\Point(0, 239), new Imagine\Image\Point(0, 0), $white) + ; + + $image_file = sprintf("%smedia/images/%s/sample-image-%s.png", THELIA_LOCAL_DIR, $typeobj, $id); + + if (! is_dir(dirname($image_file))) mkdir(dirname($image_file), 0777, true); + + $image->save($image_file); +} + +function generate_document($document, $typeobj, $id) +{ + global $faker; + + $document + ->setTitle(getRealText(20)) + ->setDescription(getRealText(250)) + ->setChapo(getRealText(40)) + ->setPostscriptum(getRealText(40)) + ->setFile(sprintf("sample-document-%s.txt", $id)) + ->save() + ; + + $document_file = sprintf("%smedia/documents/%s/sample-document-%s.txt", THELIA_LOCAL_DIR, $typeobj, $id); + + if (! is_dir(dirname($document_file))) mkdir(dirname($document_file), 0777, true); + + file_put_contents($document_file, getRealText(256)); +} + +function getRealText($length, $locale = 'en_US') { + global $localizedFaker, $realTextMode; + + if ($realTextMode) { + $text = $localizedFaker[$locale]->realText($length); + + // Below 20 chars, generate a simple text, without ponctuation nor newlines. + if ($length <= 20) + $text = ucfirst(strtolower(preg_replace("/[^\pL\pM\pN\ ]/", '', $text))); + } else { + $text = $localizedFaker[$locale]->text($length); + } + + // echo "Generated $locale text ($length) : $locale:$text\n"; + + return "$locale:$text"; +} + +function setI18n(&$object, $fields = array('Title' => 20, 'Chapo' => 30, 'Postscriptum' => 30, 'Description' => 50) ) +{ + global $localeList, $localizedFaker; + + foreach ($localeList as $locale) { + + $object->setLocale($locale); + + foreach ($fields as $name => $length) { + $func = "set".ucfirst(strtolower($name)); + + $object->$func(getRealText($length, $locale)); + } + } +} +/** + * Generate Coupon fixtures + */ +function generateCouponFixtures(\Thelia\Core\Thelia $thelia) +{ + /** @var $container ContainerInterface Service Container */ + $container = $thelia->getContainer(); + /** @var FacadeInterface $adapter */ + $adapter = $container->get('thelia.facade'); + + // Coupons + $coupon1 = new Thelia\Model\Coupon(); + $coupon1->setCode('XMAS'); + $coupon1->setType('thelia.coupon.type.remove_x_amount'); + $coupon1->setTitle('Christmas coupon'); + $coupon1->setShortDescription('Coupon for Christmas removing 10€ if your total checkout is more than 40€'); + $coupon1->setDescription('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras at luctus tellus. Integer turpis mauris, aliquet vitae risus tristique, pellentesque vestibulum urna. Vestibulum sodales laoreet lectus dictum suscipit. Praesent vulputate, sem id varius condimentum, quam magna tempor elit, quis venenatis ligula nulla eget libero. Cras egestas euismod tellus, id pharetra leo suscipit quis. Donec lacinia ac lacus et ultricies. Nunc in porttitor neque. Proin at quam congue, consectetur orci sed, congue nulla. Nulla eleifend nunc ligula, nec pharetra elit tempus quis. Vivamus vel mauris sed est dictum blandit. Maecenas blandit dapibus velit ut sollicitudin. In in euismod mauris, consequat viverra magna. Cras velit velit, sollicitudin commodo tortor gravida, tempus varius nulla. + +Donec rhoncus leo mauris, id porttitor ante luctus tempus. Curabitur quis augue feugiat, ullamcorper mauris ac, interdum mi. Quisque aliquam lorem vitae felis lobortis, id interdum turpis mattis. Vestibulum diam massa, ornare congue blandit quis, facilisis at nisl. In tortor metus, venenatis non arcu nec, sollicitudin ornare nisl. Nunc erat risus, varius nec urna at, iaculis lacinia elit. Aenean ut felis tempus, tincidunt odio non, sagittis nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec vitae hendrerit elit. Nunc sit amet gravida risus, euismod lobortis massa. Nam a erat mauris. Nam a malesuada lorem. Nulla id accumsan dolor, sed rhoncus tellus. Quisque dictum felis sed leo auctor, at volutpat lectus viverra. Morbi rutrum, est ac aliquam imperdiet, nibh sem sagittis justo, ac mattis magna lacus eu nulla. + +Duis interdum lectus nulla, nec pellentesque sapien condimentum at. Suspendisse potenti. Sed eu purus tellus. Nunc quis rhoncus metus. Fusce vitae tellus enim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam tempor porttitor erat vitae iaculis. Sed est elit, consequat non ornare vitae, vehicula eget lectus. Etiam consequat sapien mauris, eget consectetur magna imperdiet eget. Nunc sollicitudin luctus velit, in commodo nulla adipiscing fermentum. Fusce nisi sapien, posuere vitae metus sit amet, facilisis sollicitudin dui. Fusce ultricies auctor enim sit amet iaculis. Morbi at vestibulum enim, eget adipiscing eros. + +Praesent ligula lorem, faucibus ut metus quis, fermentum iaculis erat. Pellentesque elit erat, lacinia sed semper ac, sagittis vel elit. Nam eu convallis est. Curabitur rhoncus odio vitae consectetur pellentesque. Nam vitae arcu nec ante scelerisque dignissim vel nec neque. Suspendisse augue nulla, mollis eget dui et, tempor facilisis erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ac diam ipsum. Donec convallis dui ultricies velit auctor, non lobortis nulla ultrices. Morbi vitae dignissim ante, sit amet lobortis tortor. Nunc dapibus condimentum augue, in molestie neque congue non. + +Sed facilisis pellentesque nisl, eu tincidunt erat scelerisque a. Nullam malesuada tortor vel erat volutpat tincidunt. In vehicula diam est, a convallis eros scelerisque ut. Donec aliquet venenatis iaculis. Ut a arcu gravida, placerat dui eu, iaculis nisl. Quisque adipiscing orci sit amet dui dignissim lacinia. Sed vulputate lorem non dolor adipiscing ornare. Morbi ornare id nisl id aliquam. Ut fringilla elit ante, nec lacinia enim fermentum sit amet. Aenean rutrum lorem eu convallis pharetra. Cras malesuada varius metus, vitae gravida velit. Nam a varius ipsum, ac commodo dolor. Phasellus nec elementum elit. Etiam vel adipiscing leo.'); + $coupon1->setEffects(array( + RemoveXAmount::AMOUNT_FIELD_NAME => 10.00, + )); + $coupon1->setIsUsed(true); + $coupon1->setIsEnabled(true); + $date = new \DateTime(); + $coupon1->setExpirationDate($date->setTimestamp(strtotime("today + 3 months"))); + + $condition1 = new MatchForTotalAmount($adapter); + $operators = array( + MatchForTotalAmount::CART_TOTAL => Operators::SUPERIOR, + MatchForTotalAmount::CART_CURRENCY => Operators::EQUAL + ); + $values = array( + MatchForTotalAmount::CART_TOTAL => 40.00, + MatchForTotalAmount::CART_CURRENCY => 'EUR' + ); + $condition1->setValidatorsFromForm($operators, $values); + + $condition2 = new MatchForTotalAmount($adapter); + $operators = array( + MatchForTotalAmount::CART_TOTAL => Operators::INFERIOR, + MatchForTotalAmount::CART_CURRENCY => Operators::EQUAL + ); + $values = array( + MatchForTotalAmount::CART_TOTAL => 400.00, + MatchForTotalAmount::CART_CURRENCY => 'EUR' + ); + $condition2->setValidatorsFromForm($operators, $values); + + $conditions = new ConditionCollection(); + $conditions[] = $condition1; + $conditions[] = $condition2; + /** @var ConditionFactory $conditionFactory */ + $conditionFactory = $container->get('thelia.condition.factory'); + + $serializedConditions = $conditionFactory->serializeConditionCollection($conditions); + $coupon1->setSerializedConditions($serializedConditions); + $coupon1->setMaxUsage(40); + $coupon1->setIsCumulative(true); + $coupon1->setIsRemovingPostage(false); + $coupon1->setIsAvailableOnSpecialOffers(true); + $coupon1->setPerCustomerUsageCount(false); + $coupon1->save(); + + // Coupons + $coupon2 = new Thelia\Model\Coupon(); + $coupon2->setCode('SPRINGBREAK'); + $coupon2->setType('thelia.coupon.type.remove_x_percent'); + $coupon2->setTitle('Springbreak coupon'); + $coupon2->setShortDescription('Coupon for Springbreak removing 10% if you have more than 4 articles in your cart'); + $coupon2->setDescription('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras at luctus tellus. Integer turpis mauris, aliquet vitae risus tristique, pellentesque vestibulum urna. Vestibulum sodales laoreet lectus dictum suscipit. Praesent vulputate, sem id varius condimentum, quam magna tempor elit, quis venenatis ligula nulla eget libero. Cras egestas euismod tellus, id pharetra leo suscipit quis. Donec lacinia ac lacus et ultricies. Nunc in porttitor neque. Proin at quam congue, consectetur orci sed, congue nulla. Nulla eleifend nunc ligula, nec pharetra elit tempus quis. Vivamus vel mauris sed est dictum blandit. Maecenas blandit dapibus velit ut sollicitudin. In in euismod mauris, consequat viverra magna. Cras velit velit, sollicitudin commodo tortor gravida, tempus varius nulla. + +Donec rhoncus leo mauris, id porttitor ante luctus tempus. Curabitur quis augue feugiat, ullamcorper mauris ac, interdum mi. Quisque aliquam lorem vitae felis lobortis, id interdum turpis mattis. Vestibulum diam massa, ornare congue blandit quis, facilisis at nisl. In tortor metus, venenatis non arcu nec, sollicitudin ornare nisl. Nunc erat risus, varius nec urna at, iaculis lacinia elit. Aenean ut felis tempus, tincidunt odio non, sagittis nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec vitae hendrerit elit. Nunc sit amet gravida risus, euismod lobortis massa. Nam a erat mauris. Nam a malesuada lorem. Nulla id accumsan dolor, sed rhoncus tellus. Quisque dictum felis sed leo auctor, at volutpat lectus viverra. Morbi rutrum, est ac aliquam imperdiet, nibh sem sagittis justo, ac mattis magna lacus eu nulla. + +Duis interdum lectus nulla, nec pellentesque sapien condimentum at. Suspendisse potenti. Sed eu purus tellus. Nunc quis rhoncus metus. Fusce vitae tellus enim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam tempor porttitor erat vitae iaculis. Sed est elit, consequat non ornare vitae, vehicula eget lectus. Etiam consequat sapien mauris, eget consectetur magna imperdiet eget. Nunc sollicitudin luctus velit, in commodo nulla adipiscing fermentum. Fusce nisi sapien, posuere vitae metus sit amet, facilisis sollicitudin dui. Fusce ultricies auctor enim sit amet iaculis. Morbi at vestibulum enim, eget adipiscing eros. + +Praesent ligula lorem, faucibus ut metus quis, fermentum iaculis erat. Pellentesque elit erat, lacinia sed semper ac, sagittis vel elit. Nam eu convallis est. Curabitur rhoncus odio vitae consectetur pellentesque. Nam vitae arcu nec ante scelerisque dignissim vel nec neque. Suspendisse augue nulla, mollis eget dui et, tempor facilisis erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ac diam ipsum. Donec convallis dui ultricies velit auctor, non lobortis nulla ultrices. Morbi vitae dignissim ante, sit amet lobortis tortor. Nunc dapibus condimentum augue, in molestie neque congue non. + +Sed facilisis pellentesque nisl, eu tincidunt erat scelerisque a. Nullam malesuada tortor vel erat volutpat tincidunt. In vehicula diam est, a convallis eros scelerisque ut. Donec aliquet venenatis iaculis. Ut a arcu gravida, placerat dui eu, iaculis nisl. Quisque adipiscing orci sit amet dui dignissim lacinia. Sed vulputate lorem non dolor adipiscing ornare. Morbi ornare id nisl id aliquam. Ut fringilla elit ante, nec lacinia enim fermentum sit amet. Aenean rutrum lorem eu convallis pharetra. Cras malesuada varius metus, vitae gravida velit. Nam a varius ipsum, ac commodo dolor. Phasellus nec elementum elit. Etiam vel adipiscing leo.'); + $coupon2->setEffects(array( + RemoveXPercent::INPUT_PERCENTAGE_NAME => 10.00 + )); + $coupon2->setIsUsed(true); + $coupon2->setIsEnabled(true); + $date = new \DateTime(); + $coupon2->setExpirationDate($date->setTimestamp(strtotime("today + 1 months"))); + + $condition1 = new MatchForXArticles($adapter); + $operators = array( + MatchForXArticles::CART_QUANTITY => Operators::SUPERIOR, + ); + $values = array( + MatchForXArticles::CART_QUANTITY => 4, + ); + $condition1->setValidatorsFromForm($operators, $values); + $conditions = new ConditionCollection(); + $conditions[] = $condition1; + + /** @var ConditionFactory $conditionFactory */ + $conditionFactory = $container->get('thelia.condition.factory'); + + $serializedConditions = $conditionFactory->serializeConditionCollection($conditions); + $coupon2->setSerializedConditions($serializedConditions); + $coupon2->setMaxUsage(-1); + $coupon2->setIsCumulative(false); + $coupon2->setIsRemovingPostage(true); + $coupon2->setIsAvailableOnSpecialOffers(true); + $coupon2->setPerCustomerUsageCount(false); + $coupon2->save(); + + // Coupons + $coupon3 = new Thelia\Model\Coupon(); + $coupon3->setCode('OLD'); + $coupon3->setType('thelia.coupon.type.remove_x_percent'); + $coupon3->setTitle('Old coupon'); + $coupon3->setShortDescription('Coupon for Springbreak removing 10% if you have more than 4 articles in your cart'); + $coupon3->setDescription('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras at luctus tellus. Integer turpis mauris, aliquet vitae risus tristique, pellentesque vestibulum urna. Vestibulum sodales laoreet lectus dictum suscipit. Praesent vulputate, sem id varius condimentum, quam magna tempor elit, quis venenatis ligula nulla eget libero. Cras egestas euismod tellus, id pharetra leo suscipit quis. Donec lacinia ac lacus et ultricies. Nunc in porttitor neque. Proin at quam congue, consectetur orci sed, congue nulla. Nulla eleifend nunc ligula, nec pharetra elit tempus quis. Vivamus vel mauris sed est dictum blandit. Maecenas blandit dapibus velit ut sollicitudin. In in euismod mauris, consequat viverra magna. Cras velit velit, sollicitudin commodo tortor gravida, tempus varius nulla. + +Donec rhoncus leo mauris, id porttitor ante luctus tempus. Curabitur quis augue feugiat, ullamcorper mauris ac, interdum mi. Quisque aliquam lorem vitae felis lobortis, id interdum turpis mattis. Vestibulum diam massa, ornare congue blandit quis, facilisis at nisl. In tortor metus, venenatis non arcu nec, sollicitudin ornare nisl. Nunc erat risus, varius nec urna at, iaculis lacinia elit. Aenean ut felis tempus, tincidunt odio non, sagittis nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec vitae hendrerit elit. Nunc sit amet gravida risus, euismod lobortis massa. Nam a erat mauris. Nam a malesuada lorem. Nulla id accumsan dolor, sed rhoncus tellus. Quisque dictum felis sed leo auctor, at volutpat lectus viverra. Morbi rutrum, est ac aliquam imperdiet, nibh sem sagittis justo, ac mattis magna lacus eu nulla. + +Duis interdum lectus nulla, nec pellentesque sapien condimentum at. Suspendisse potenti. Sed eu purus tellus. Nunc quis rhoncus metus. Fusce vitae tellus enim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam tempor porttitor erat vitae iaculis. Sed est elit, consequat non ornare vitae, vehicula eget lectus. Etiam consequat sapien mauris, eget consectetur magna imperdiet eget. Nunc sollicitudin luctus velit, in commodo nulla adipiscing fermentum. Fusce nisi sapien, posuere vitae metus sit amet, facilisis sollicitudin dui. Fusce ultricies auctor enim sit amet iaculis. Morbi at vestibulum enim, eget adipiscing eros. + +Praesent ligula lorem, faucibus ut metus quis, fermentum iaculis erat. Pellentesque elit erat, lacinia sed semper ac, sagittis vel elit. Nam eu convallis est. Curabitur rhoncus odio vitae consectetur pellentesque. Nam vitae arcu nec ante scelerisque dignissim vel nec neque. Suspendisse augue nulla, mollis eget dui et, tempor facilisis erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ac diam ipsum. Donec convallis dui ultricies velit auctor, non lobortis nulla ultrices. Morbi vitae dignissim ante, sit amet lobortis tortor. Nunc dapibus condimentum augue, in molestie neque congue non. + +Sed facilisis pellentesque nisl, eu tincidunt erat scelerisque a. Nullam malesuada tortor vel erat volutpat tincidunt. In vehicula diam est, a convallis eros scelerisque ut. Donec aliquet venenatis iaculis. Ut a arcu gravida, placerat dui eu, iaculis nisl. Quisque adipiscing orci sit amet dui dignissim lacinia. Sed vulputate lorem non dolor adipiscing ornare. Morbi ornare id nisl id aliquam. Ut fringilla elit ante, nec lacinia enim fermentum sit amet. Aenean rutrum lorem eu convallis pharetra. Cras malesuada varius metus, vitae gravida velit. Nam a varius ipsum, ac commodo dolor. Phasellus nec elementum elit. Etiam vel adipiscing leo.'); + $coupon3->setEffects(array( + RemoveXPercent::INPUT_PERCENTAGE_NAME => 10.00, + )); + $coupon3->setIsUsed(false); + $coupon3->setIsEnabled(false); + $date = new \DateTime(); + $coupon3->setExpirationDate($date->setTimestamp(strtotime("today + 2 months"))); + + $condition1 = new MatchForEveryone($adapter); + $operators = array(); + $values = array(); + $condition1->setValidatorsFromForm($operators, $values); + $conditions = new ConditionCollection(); + $conditions[] = $condition1; + + /** @var ConditionFactory $constraintCondition */ + $constraintCondition = $container->get('thelia.condition.factory'); + + $serializedConditions = $constraintCondition->serializeConditionCollection($conditions); + $coupon3->setSerializedConditions($serializedConditions); + $coupon3->setMaxUsage(-1); + $coupon3->setIsCumulative(true); + $coupon3->setIsRemovingPostage(false); + $coupon3->setIsAvailableOnSpecialOffers(false); + $coupon3->setPerCustomerUsageCount(false); + $coupon3->save(); +} + +/** + * get a random country and state + * + * @return array first row is the country id, second row is the state id or null + */ +function getRandomCountry() +{ + global $countryStateList; + + if (count($countryStateList) === 0) { + $countryStateList = CountryQuery::create() + ->joinState('State', \Propel\Runtime\ActiveQuery\Criteria::LEFT_JOIN) + ->select(['Id', 'State.Id']) + ->find() + ->toArray() + ; + $countryStateList = array_map( + function ($item) { + return [$item['Id'], $item['State.Id']]; + }, + $countryStateList + ); + } + + return $countryStateList[mt_rand(0, count($countryStateList) - 1)]; +} + +function usage() +{ + $usage = << + +Options: + + -h + Display this message and exit + + -b + Use this bootstrap file + + -c + Maximum number of categories and sub categories to create (default: 20) + + -p + Maximum number of products to create in a category (default: 20) + + -l + The list of locales (separated with a ,) for which to generate content (default: fr_FR, en_US, es_ES, it_IT, de_DE) + + -r + Use real text or not. real text mode is much more slower than false text mode. + 0 : false text mode + 1 : real text mode (default) + +Examples: + + Generate content in english and french with false text for 5 categories and 10 products + + php faker.php -r 0 -c 5 -p 10 -l 'fr_FR, en_US' + +USAGE; + + echo $usage; +} \ No newline at end of file diff --git a/setup/faker_100categories_1000products_4locales.php b/setup/faker_100categories_1000products_4locales.php new file mode 100644 index 00000000..96a21198 --- /dev/null +++ b/setup/faker_100categories_1000products_4locales.php @@ -0,0 +1,200 @@ +beginTransaction(); + +$currency = \Thelia\Model\CurrencyQuery::create()->filterByCode('EUR')->findOne(); + +try { + $stmt = $con->prepare("SET foreign_key_checks = 0"); + $stmt->execute(); + + $productAssociatedContent = Thelia\Model\ProductAssociatedContentQuery::create() + ->find(); + $productAssociatedContent->delete(); + + $categoryAssociatedContent = Thelia\Model\CategoryAssociatedContentQuery::create() + ->find(); + $categoryAssociatedContent->delete(); + + $attributeCategory = Thelia\Model\AttributeCategoryQuery::create() + ->find(); + $attributeCategory->delete(); + + $featureCategory = Thelia\Model\FeatureCategoryQuery::create() + ->find(); + $featureCategory->delete(); + + $featureProduct = Thelia\Model\FeatureProductQuery::create() + ->find(); + $featureProduct->delete(); + + $attributeCombination = Thelia\Model\AttributeCombinationQuery::create() + ->find(); + $attributeCombination->delete(); + + $feature = Thelia\Model\FeatureQuery::create() + ->find(); + $feature->delete(); + + $feature = Thelia\Model\FeatureI18nQuery::create() + ->find(); + $feature->delete(); + + $featureAv = Thelia\Model\FeatureAvQuery::create() + ->find(); + $featureAv->delete(); + + $featureAv = Thelia\Model\FeatureAvI18nQuery::create() + ->find(); + $featureAv->delete(); + + $attribute = Thelia\Model\AttributeQuery::create() + ->find(); + $attribute->delete(); + + $attribute = Thelia\Model\AttributeI18nQuery::create() + ->find(); + $attribute->delete(); + + $attributeAv = Thelia\Model\AttributeAvQuery::create() + ->find(); + $attributeAv->delete(); + + $attributeAv = Thelia\Model\AttributeAvI18nQuery::create() + ->find(); + $attributeAv->delete(); + + $category = Thelia\Model\CategoryQuery::create() + ->find(); + $category->delete(); + + $category = Thelia\Model\CategoryI18nQuery::create() + ->find(); + $category->delete(); + + $product = Thelia\Model\ProductQuery::create() + ->find(); + $product->delete(); + + $product = Thelia\Model\ProductI18nQuery::create() + ->find(); + $product->delete(); + + $customer = Thelia\Model\CustomerQuery::create() + ->find(); + $customer->delete(); + + $folder = Thelia\Model\FolderQuery::create() + ->find(); + $folder->delete(); + + $folder = Thelia\Model\FolderI18nQuery::create() + ->find(); + $folder->delete(); + + $content = Thelia\Model\ContentQuery::create() + ->find(); + $content->delete(); + + $content = Thelia\Model\ContentI18nQuery::create() + ->find(); + $content->delete(); + + $accessory = Thelia\Model\AccessoryQuery::create() + ->find(); + $accessory->delete(); + + $stock = \Thelia\Model\ProductSaleElementsQuery::create() + ->find(); + $stock->delete(); + + $productPrice = \Thelia\Model\ProductPriceQuery::create() + ->find(); + $productPrice->delete(); + + $stmt = $con->prepare("SET foreign_key_checks = 1"); + $stmt->execute(); + + //categories and products + for ($i=0; $i<100; $i++) { + $category = new Thelia\Model\Category(); + $category->setParent(0); + $category->setVisible(1); + $category->setPosition($i); + setI18n($faker, $category); + + $category->save(); + + for ($j=0; $j<10; $j++) { + $product = new Thelia\Model\Product(); + $product->setRef($category->getId() . '_' . $j . '_' . $faker->randomNumber(8)); + $product->addCategory($category); + $product->setVisible(1); + $product->setPosition($j); + setI18n($faker, $product); + + $product->save(); + } + } + + $con->commit(); +} catch (Exception $e) { + echo "error : ".$e->getMessage()."\n"; + $con->rollBack(); +} + +function setI18n($faker, &$object, $fields = array('Title' => 20, 'Description' => 50) ) +{ + $localeList = array('fr_FR', 'en_US', 'es_ES', 'it_IT', 'de_DE'); + + foreach ($localeList as $locale) { + $object->setLocale($locale); + + foreach ($fields as $name => $length) { + $func = "set$name"; + + $object->$func($locale . ' : ' . $faker->text($length)); + } + } +} diff --git a/setup/faker_add_ecotax.php b/setup/faker_add_ecotax.php new file mode 100644 index 00000000..f46ae956 --- /dev/null +++ b/setup/faker_add_ecotax.php @@ -0,0 +1,153 @@ +boot(); + +$faker = Faker\Factory::create(); + +$con = \Propel\Runtime\Propel::getConnection( + Thelia\Model\Map\ProductTableMap::DATABASE_NAME +); +$con->beginTransaction(); + +// Intialize URL management + +try { + $options = getopt('f::e::'); + + $forceEcotaxFeatureId = $options['f']; + if (null !== $forceEcotaxFeatureId && !filter_var($forceEcotaxFeatureId, FILTER_VALIDATE_INT)) { + exit('[ERROR] bad value for f option\n'); + } + + $forceEcotaxId = $options['e']; + if (null !== $forceEcotaxId && !filter_var($forceEcotaxId, FILTER_VALIDATE_INT)) { + exit('[ERROR] bad value for e option\n'); + } + + echo "Adding Ecotax feature\n"; + $feature = null; + if (null !== $forceEcotaxFeatureId) { + $feature = \Thelia\Model\FeatureQuery::create()->findPk($forceEcotaxFeatureId); + if (null === $feature) { + echo "Feature `$forceEcotaxFeatureId` not found\n"; + } + } + if (null === $feature) { + $feature = new \Thelia\Model\Feature(); + $feature->setVisible(1); + $feature->save(); + echo sprintf("Ecotax feature added with ID \n", $feature->getId()); + } + + $fr = \Thelia\Model\Base\FeatureI18nQuery::create() + ->filterByLocale('fr_FR') + ->filterByFeature($feature) + ->findOne(); + if (null === $fr) { + $fr = new \Thelia\Model\FeatureI18n(); + $fr->setLocale('fr_FR') + ->setFeature($feature); + } + $fr->setTitle('Ecotaxe'); + $fr->save($con); + + $us = \Thelia\Model\Base\FeatureI18nQuery::create() + ->filterByLocale('en_US') + ->filterByFeature($feature) + ->findOne(); + if (null === $us) { + $us = new \Thelia\Model\FeatureI18n(); + $us->setLocale('en_US') + ->setFeature($feature); + } + $us->setTitle('Ecotax'); + $us->save($con); + + echo "Adding ecotax\n"; + + $tax = null; + if (null !== $forceEcotaxId) { + $tax = \Thelia\Model\TaxQuery::create()->findPk($forceEcotaxId); + if (null === $tax) { + echo "Tax `$forceEcotaxId` not found\n"; + } + } + if (null === $tax) { + $tax = new \Thelia\Model\Tax(); + $tax->setType('FeatureFixAmountTaxType') + ->setSerializedRequirements( + base64_encode(sprintf('{"feature":%s}', $feature->getId())) + ); + $tax->save(); + echo sprintf("Ecotax added with ID \n", $tax->getId()); + } + + $fr = \Thelia\Model\Base\TaxI18nQuery::create() + ->filterByLocale('fr_FR') + ->filterByTax($tax) + ->findOne(); + if (null === $fr) { + $fr = new \Thelia\Model\TaxI18n(); + $fr->setLocale('fr_FR') + ->setTax($tax); + } + $fr->setTitle('Ecotaxe'); + $fr->save($con); + + $us = \Thelia\Model\Base\TaxI18nQuery::create() + ->filterByLocale('en_US') + ->filterByTax($tax) + ->findOne(); + if (null === $us) { + $us = new \Thelia\Model\TaxI18n(); + $us->setLocale('en_US') + ->setTax($tax); + } + $us->setTitle('Ecotax'); + $us->save($con); + + $con->commit(); + + echo "Successfully terminated.\n"; + +} catch (Exception $e) { + echo "error : ".$e->getMessage()."\n"; + $con->rollBack(); +} diff --git a/setup/import.php b/setup/import.php new file mode 100644 index 00000000..dea33622 --- /dev/null +++ b/setup/import.php @@ -0,0 +1,736 @@ +. */ +/* */ +/*************************************************************************************/ +use Thelia\Model\ContentFolderQuery; +use Thelia\Model\ProductAssociatedContent; + +if (php_sapi_name() != 'cli') { + throw new \Exception('this script can only be launched with cli sapi'); +} + +$bootstrapToggle = false; +$bootstraped = false; + +// Autoload bootstrap + +foreach ($argv as $arg) { + if ($arg === '-b') { + $bootstrapToggle = true; + + continue; + } + + if ($bootstrapToggle) { + require __DIR__ . DIRECTORY_SEPARATOR . $arg; + + $bootstraped = true; + } +} + +if (!$bootstraped) { + if (isset($bootstrapFile)) { + require $bootstrapFile; + } elseif (is_file($file = __DIR__ . '/../core/vendor/autoload.php')) { + require $file; + } elseif (is_file($file = __DIR__ . '/../../bootstrap.php')) { + // Here we are on a thelia/thelia-project + require $file; + } else { + echo "No autoload file found. Please use the -b argument to include yours"; + exit(1); + } +} + +$thelia = new Thelia\Core\Thelia("dev", true); +$thelia->boot(); + +// Load the translator +$thelia->getContainer()->get("thelia.translator"); + +$faker = Faker\Factory::create(); +// Intialize URL management +$url = new Thelia\Tools\URL(); +$con = \Propel\Runtime\Propel::getConnection( + Thelia\Model\Map\ProductTableMap::DATABASE_NAME +); +$con->beginTransaction(); + +try { + $stmt = $con->prepare("SET foreign_key_checks = 0"); + $stmt->execute(); + clearTables($con); + $stmt = $con->prepare("SET foreign_key_checks = 1"); + $stmt->execute(); + + $material = createMaterials($con); + + $color = createColors($con); + $brands = createBrands($faker, $con); + + $folders = createFolders($faker, $con); + $contents = createContents($faker, $folders, $con); + + $categories = createCategories($faker, $con); + + echo "creating templates\n"; + $template = new \Thelia\Model\Template(); + $template + ->setLocale('fr_FR') + ->setName('template de démo') + ->setLocale('en_US') + ->setName('demo template') + ->save($con); + + $at = new Thelia\Model\AttributeTemplate(); + + $at + ->setTemplate($template) + ->setAttribute($color) + ->save($con); + + $ft = new Thelia\Model\FeatureTemplate(); + + $ft + ->setTemplate($template) + ->setFeature($material) + ->save($con); + echo "end creating templates\n"; + + createProduct($faker, $categories, $brands, $contents, $template, $color, $material, $con); + + createCustomer($faker, $con); + + // set some config key + createConfig($faker, $folders, $contents, $con); + + + $con->commit(); +} catch (Exception $e) { + echo "error : ".$e->getMessage()."\n"; + $con->rollBack(); +} + +function createProduct($faker, $categories, $brands, $contents, $template, $attribute, $feature, $con) +{ + echo "start creating products\n"; + $fileSystem = new \Symfony\Component\Filesystem\Filesystem(); + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/products.csv', "r")) !== FALSE) { + $row=0; + while (($data = fgetcsv($handle, 100000, ";")) !== FALSE) { + $row++; + if($row == 1) continue; + $product = new \Thelia\Model\Product(); + + $product + ->setRef($data[0]) + ->setVisible(1) + ->setTaxRuleId(1) + ->setTemplate($template) + ; + + $productCategories = explode(';', $data[15]); + foreach ($productCategories as $productCategory) { + $productCategory = trim($productCategory); + if (array_key_exists($productCategory, $categories)) { + $product->addCategory($categories[$productCategory]); + } + } + + $brand = $data[11]; + if (array_key_exists($brand, $brands)) { + $product->setBrand($brands[$brand]); + } + + $product + ->setLocale('en_US') + ->setTitle($data[1]) + ->setChapo($data[2]) + ->setDescription($data[4]) + ->setPostscriptum($data[6]) + ->setLocale('fr_FR') + ->setTitle($data[1]) + ->setChapo($data[3]) + ->setDescription($data[5]) + ->setPostscriptum($data[7]) + ->save($con); + + $productCategories = $product->getProductCategories()->getFirst(); + $productCategories->setDefaultCategory(true) + ->save($con); + + // Set the position + $product->setPosition($product->getNextPosition())->save($con); + + $images = explode(';', $data[10]); + + foreach ($images as $image) { + $image = trim($image); + if(empty($image)) continue; + $productImage = new \Thelia\Model\ProductImage(); + $productImage + ->setProduct($product) + ->setFile($image) + ->save($con); + $fileSystem->copy(THELIA_SETUP_DIRECTORY . 'import/images/'.$image, THELIA_LOCAL_DIR . 'media/images/product/'.$image, true); + } + + $pses = explode(";", $data[12]); + + foreach ($pses as $pse) { + if(empty($pse)) continue; + $stock = new \Thelia\Model\ProductSaleElements(); + $stock->setProduct($product); + $stock->setRef($product->getId() . '_' . uniqid('', true)); + $stock->setQuantity($faker->numberBetween(1,50)); + if (!empty($data[9])) { + $stock->setPromo(1); + } else { + $stock->setPromo(0); + } + + $stock->setNewness($faker->numberBetween(0,1)); + $stock->setWeight($faker->randomFloat(2, 1,30)); + $stock->save($con); + + $productPrice = new \Thelia\Model\ProductPrice(); + $productPrice->setProductSaleElements($stock); + $productPrice->setCurrencyId(1); + $productPrice->setPrice($data[8]); + $productPrice->setPromoPrice($data[9]); + $productPrice->save($con); + + $attributeAv = \Thelia\Model\AttributeAvI18nQuery::create() + ->filterByLocale('en_US') + ->filterByTitle($pse) + ->findOne($con); + + $attributeCombination = new \Thelia\Model\AttributeCombination(); + $attributeCombination + ->setAttributeId($attribute->getId()) + ->setAttributeAvId($attributeAv->getId()) + ->setProductSaleElements($stock) + ->save($con); + } + + $productSaleElements = $product->getProductSaleElementss()->getFirst(); + $productSaleElements->setIsDefault(1)->save($con); + + // associated content + $associatedContents = explode(";", $data[14]); + foreach ($associatedContents as $associatedContent) { + $content = new ProductAssociatedContent(); + if ( ! array_key_exists($associatedContent, $contents)){ + continue; + } + + $content + ->setProduct($product) + ->setContent($contents[$associatedContent]) + ->save($con) + ; + } + + // feature + $features = explode(";", $data[13]); + + foreach ($features as $aFeature) { + $featurAv = \Thelia\Model\FeatureAvI18nQuery::create() + ->filterByLocale('en_US') + ->filterByTitle($aFeature) + ->findOne($con); + + $featureProduct = new Thelia\Model\FeatureProduct(); + $featureProduct->setProduct($product) + ->setFeatureId($feature->getId()) + ->setFeatureAvId($featurAv->getId()) + ->save($con) + ; + } + } + } + echo "end creating products\n"; +} + +function createConfig($faker, $folders, $contents, $con){ + + // Store + \Thelia\Model\ConfigQuery::write("store_name", "Thelia"); + \Thelia\Model\ConfigQuery::write("store_description", "E-commerce solution based on Symfony 2"); + \Thelia\Model\ConfigQuery::write("store_email", "Thelia"); + \Thelia\Model\ConfigQuery::write("store_address1", "5 rue Rochon"); + \Thelia\Model\ConfigQuery::write("store_city", "Clermont-Ferrrand"); + \Thelia\Model\ConfigQuery::write("store_phone", "+(33)444053102"); + \Thelia\Model\ConfigQuery::write("store_email", "contact@thelia.net"); + // Contents + \Thelia\Model\ConfigQuery::write("information_folder_id", $folders['Information']->getId()); + \Thelia\Model\ConfigQuery::write("terms_conditions_content_id", $contents["Terms and Conditions"]->getId()); +} + +function createCustomer($faker, $con){ + + echo "Creating customer\n"; + + //customer + $customer = new Thelia\Model\Customer(); + $customer->createOrUpdate( + 1, + "thelia", + "thelia", + "5 rue rochon", + "", + "", + "0102030405", + "0601020304", + "63000", + "Clermont-Ferrand", + 64, + "test@thelia.net", + "thelia" + ); + for ($j = 0; $j <= 2; $j++) { + $address = new Thelia\Model\Address(); + $address->setLabel($faker->text(20)) + ->setTitleId(rand(1,3)) + ->setFirstname($faker->firstname) + ->setLastname($faker->lastname) + ->setAddress1($faker->streetAddress) + ->setAddress2($faker->streetAddress) + ->setAddress3($faker->streetAddress) + ->setCellphone($faker->phoneNumber) + ->setPhone($faker->phoneNumber) + ->setZipcode($faker->postcode) + ->setCity($faker->city) + ->setCountryId(64) + ->setCustomer($customer) + ->save($con) + ; + } + + echo "End creating customer\n"; +} + +function createMaterials($con) +{ + echo "start creating materials feature\n"; + + $feature = null; + $features = array(); + + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/materials.csv', "r")) !== FALSE) { + $row=0; + $feature = new \Thelia\Model\Feature(); + $feature + ->setPosition(1) + ->setLocale('fr_FR') + ->setTitle('Matière') + ->setLocale('en_US') + ->setTitle('Material'); + + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + $row++; + $featureAv = new \Thelia\Model\FeatureAv(); + $featureAv + ->setPosition($row) + ->setLocale('fr_FR') + ->setTitle($data[0]) + ->setLocale('en_US') + ->setTitle($data[1]); + //$featureAv->setFeature($feature); + + $feature->addFeatureAv($featureAv); + } + + $feature->save($con); + + fclose($handle); + } + echo "materials feature created successfully\n"; + + return $feature; +} + + +function createBrands($faker, $con) +{ + echo "start creating brands\n"; + + $fileSystem = new \Symfony\Component\Filesystem\Filesystem(); + + $brands = array(); + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/brand.csv', "r")) !== FALSE) { + $row=0; + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + $row++; + if ($row == 1) continue; + + $brand = new \Thelia\Model\Brand(); + + $brand + ->setVisible(1) + ->setPosition($row-1) + ->setLocale('fr_FR') + ->setTitle(trim($data[0])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(100)) + ->setLocale('en_US') + ->setTitle(trim($data[0])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(100)) + ->save($con); + + $brands[trim($data[0])] = $brand; + + $images = explode(';', $data[1]); + $logoId = null; + foreach ($images as $image) { + $image = trim($image); + if(empty($image)) continue; + $brandImage = new \Thelia\Model\BrandImage(); + $brandImage + ->setBrandId($brand->getId()) + ->setFile($image) + ->save($con); + if ($logoId === null) { + $logoId = $brandImage->getId(); + } + $fileSystem->copy(THELIA_SETUP_DIRECTORY . 'import/images/'.$image, THELIA_LOCAL_DIR . 'media/images/brand/'.$image, true); + } + + if ($logoId !== null){ + $brand->setLogoImageId($logoId); + $brand->save($con); + } + + } + fclose($handle); + } + echo "brands created successfully\n"; + + return $brands; +} + + +function createCategories($faker, $con) +{ + echo "start creating categories\n"; + $categories = array(); + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/categories.csv', "r")) !== FALSE) { + $row=0; + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + $row++; + if($row==1) continue; + $category = new \Thelia\Model\Category(); + $category + ->setVisible(1) + ->setPosition($row-1) + ->setParent(0) + ->setLocale('fr_FR') + ->setTitle(trim($data[0])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(100)) + ->setLocale('en_US') + ->setTitle(trim($data[1])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(100)) + ->save($con); + $categories[trim($data[1])] = $category; + } + fclose($handle); + } + echo "categories created successfully\n"; + + return $categories; +} + +function createFolders($faker, $con) +{ + echo "start creating folders\n"; + + $fileSystem = new \Symfony\Component\Filesystem\Filesystem(); + + $folders = array(); + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/folders.csv', "r")) !== FALSE) { + $row=0; + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + $row++; + if ($row == 1) continue; + + $folder = new \Thelia\Model\Folder(); + + $folder + ->setVisible(1) + ->setPosition($row-1) + ->setLocale('fr_FR') + ->setTitle(trim($data[0])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(100)) + ->setLocale('en_US') + ->setTitle(trim($data[1])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(100)) + ->save($con); + + $folders[trim($data[1])] = $folder; + + $images = explode(';', $data[6]); + foreach ($images as $image) { + $image = trim($image); + if(empty($image)) continue; + $folderImage = new \Thelia\Model\FolderImage(); + $folderImage + ->setFolderId($folder->getId()) + ->setFile($image) + ->save($con); + $fileSystem->copy(THELIA_SETUP_DIRECTORY . 'import/images/'.$image, THELIA_LOCAL_DIR . 'media/images/folder/'.$image, true); + } + } + fclose($handle); + } + echo "Folders created successfully\n"; + + return $folders; +} + + +function createContents($faker, $folders, $con) +{ + echo "start creating contents\n"; + + $fileSystem = new \Symfony\Component\Filesystem\Filesystem(); + + $contents = array(); + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/contents.csv', "r")) !== FALSE) { + $row=0; + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + $row++; + if ($row == 1) continue; + + $content = new \Thelia\Model\Content(); + + $content + ->setVisible(1) + ->setPosition($row-1) + ->setLocale('fr_FR') + ->setTitle(trim($data[0])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(200)) + ->setLocale('en_US') + ->setTitle(trim($data[1])) + ->setChapo($faker->text(20)) + ->setDescription($faker->text(200)); + + // folder + $contentFolders = explode(';', $data[7]); + $defaultFolder = null; + foreach ($contentFolders as $contentFolder) { + $contentFolder = trim($contentFolder); + if (array_key_exists($contentFolder, $folders)) { + $content->addFolder($folders[$contentFolder]); + if (null === $defaultFolder) { + $defaultFolder = $folders[$contentFolder]->getId(); + } + } + } + + $content + ->getContentFolders() + ->getFirst() + ->setDefaultFolder(true) + ->save($con) + ; + + $content->save($con); + + $images = explode(';', $data[6]); + foreach ($images as $image) { + $image = trim($image); + if(empty($image)) continue; + $contentImage = new \Thelia\Model\ContentImage(); + $contentImage + ->setContentId($content->getId()) + ->setFile($image) + ->save($con); + $fileSystem->copy(THELIA_SETUP_DIRECTORY . 'import/images/'.$image, THELIA_LOCAL_DIR . 'media/images/content/'.$image, true); + } + + $contents[trim($data[1])] = $content; + } + fclose($handle); + } + echo "Contents created successfully\n"; + + return $contents; +} + + +function createColors($con) +{ + echo "start creating colors attributes\n"; + if (($handle = fopen(THELIA_SETUP_DIRECTORY . 'import/colors.csv', "r")) !== FALSE) { + $row=0; + $attribute = new \Thelia\Model\Attribute(); + $attribute + ->setPosition(1) + ->setLocale('fr_FR') + ->setTitle('Couleur') + ->setLocale('en_US') + ->setTitle('Colors'); + + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + $row++; + $attributeAv = new \Thelia\Model\AttributeAv(); + $attributeAv + ->setPosition($row) + ->setLocale('fr_FR') + ->setTitle($data[0]) + ->setLocale('en_US') + ->setTitle($data[1]); + + $attribute->addAttributeAv($attributeAv); + } + $attribute->save($con); + fclose($handle); + } + echo "colors attributes created with success\n"; + + return $attribute; +} + +function clearTables($con) +{ + echo "Clearing tables\n"; + + $productAssociatedContent = Thelia\Model\ProductAssociatedContentQuery::create() + ->find($con); + $productAssociatedContent->delete($con); + + $categoryAssociatedContent = Thelia\Model\CategoryAssociatedContentQuery::create() + ->find($con); + $categoryAssociatedContent->delete($con); + + $featureProduct = Thelia\Model\FeatureProductQuery::create() + ->find($con); + $featureProduct->delete($con); + + $attributeCombination = Thelia\Model\AttributeCombinationQuery::create() + ->find($con); + $attributeCombination->delete($con); + + $feature = Thelia\Model\FeatureQuery::create() + ->find($con); + $feature->delete($con); + + $feature = Thelia\Model\FeatureI18nQuery::create() + ->find($con); + $feature->delete($con); + + $featureAv = Thelia\Model\FeatureAvQuery::create() + ->find($con); + $featureAv->delete($con); + + $featureAv = Thelia\Model\FeatureAvI18nQuery::create() + ->find($con); + $featureAv->delete($con); + + $attribute = Thelia\Model\AttributeQuery::create() + ->find($con); + $attribute->delete($con); + + $attribute = Thelia\Model\AttributeI18nQuery::create() + ->find($con); + $attribute->delete($con); + + $attributeAv = Thelia\Model\AttributeAvQuery::create() + ->find($con); + $attributeAv->delete($con); + + $attributeAv = Thelia\Model\AttributeAvI18nQuery::create() + ->find($con); + $attributeAv->delete($con); + + $brand = Thelia\Model\BrandQuery::create() + ->find($con); + $brand->delete($con); + + $brand = Thelia\Model\BrandI18nQuery::create() + ->find($con); + $brand->delete($con); + + $category = Thelia\Model\CategoryQuery::create() + ->find($con); + $category->delete($con); + + $category = Thelia\Model\CategoryI18nQuery::create() + ->find($con); + $category->delete($con); + + $product = Thelia\Model\ProductQuery::create() + ->find($con); + $product->delete($con); + + $product = Thelia\Model\ProductI18nQuery::create() + ->find($con); + $product->delete($con); + + $folder = Thelia\Model\FolderQuery::create() + ->find($con); + $folder->delete($con); + + $folder = Thelia\Model\FolderI18nQuery::create() + ->find($con); + $folder->delete($con); + + $content = Thelia\Model\ContentQuery::create() + ->find($con); + $content->delete($con); + + $content = Thelia\Model\ContentI18nQuery::create() + ->find($con); + $content->delete($con); + + $accessory = Thelia\Model\AccessoryQuery::create() + ->find($con); + $accessory->delete($con); + + $stock = \Thelia\Model\ProductSaleElementsQuery::create() + ->find($con); + $stock->delete($con); + + $productPrice = \Thelia\Model\ProductPriceQuery::create() + ->find($con); + $productPrice->delete($con); + + \Thelia\Model\ProductImageQuery::create()->find($con)->delete($con); + + $customer = \Thelia\Model\CustomerQuery::create() + ->find($con); + $customer->delete($con); + + $sale = \Thelia\Model\SaleQuery::create()->find($con); + $sale->delete($con); + + $saleProduct = \Thelia\Model\SaleProductQuery::create()->find($con); + $saleProduct->delete($con); + + echo "Tables cleared with success\n"; + +} diff --git a/setup/import/brand.csv b/setup/import/brand.csv new file mode 100644 index 00000000..ed94aaaf --- /dev/null +++ b/setup/import/brand.csv @@ -0,0 +1,8 @@ +"NAME";"LOGO" +"MILAN";"BRAND-1.png" +"MAGIS";"BRAND-2.png" +"OXYO";"BRAND-3.png" +"OFFUS";"BRAND-4.png" +"PLINK";"BRAND-5.png" +"PARRY";"BRAND-6.png" +"TOKO";"BRAND-7.png" diff --git a/setup/import/categories.csv b/setup/import/categories.csv new file mode 100644 index 00000000..d5a1d81c --- /dev/null +++ b/setup/import/categories.csv @@ -0,0 +1,5 @@ +"CATEGORIES FR";"CATEGORIES UK";"CHAPO FR";"CHAPO UK";"DESCRIPTIF FR";"DESCRIPTIF UK";"PHOTO" +"Chaises";"Chairs";"";"";"";"";"" +"Tabourets";"Stools";"";"";"";"";"" +"Fauteuils";"Armchairs";"";"";"";"";"" +"Canapés";"Sofas";"";"";"";"";"" diff --git a/setup/import/colors.csv b/setup/import/colors.csv new file mode 100644 index 00000000..9b5ebcb6 --- /dev/null +++ b/setup/import/colors.csv @@ -0,0 +1,13 @@ +"Bleu";"Blue" +"Jaune";"Yellow" +"Orange";"Orange" +"Rose";"Pink" +"Vert";"Green" +"Violet";"Purple" +"Rouge";"Red" +"Gris";"Gray" +"Noir";"Black" +"Beige";"Beige" +"Turquoise";"Turquoise" +"Marron";"Brown" +"Blanc";"White" diff --git a/setup/import/contents.csv b/setup/import/contents.csv new file mode 100644 index 00000000..4ae5a018 --- /dev/null +++ b/setup/import/contents.csv @@ -0,0 +1,12 @@ +"TITLE FR";"TITLE UK";"CHAPO FR";"CHAPO UK";"DESCRIPTIF FR";"DESCRIPTIF UK";"PHOTO","FOLDERS UK" +"A propos";"About us";"";"";"";"";"";"Information" +"Conditions générales de vente";"Terms and Conditions";"";"";"";"";"";"Information" +"Mentions légales";"Imprint";"";"";"";"";"";"Information" +"Livraison";"Delivery";"";"";"";"";"";"Information" +"Garantie";"Warranty";"";"";"";"";"";"Information" +"Nouveau horaire d''ouverture";"New opening times";"";"";"";"";"";"Blog" +"Nouveauté : Scarlett";"New product : Scarlett";"";"";"";"";"";"Blog" +"Obtenez votre bon de réduction";"Claim your voucher";"";"";"";"";"";"Blog" +"Nettoyage du tissu";"Cleaning Tissue";"";"";"";"";"";"Advice" +"Entretien du bois";"Maintenance of wood";"";"";"";"";"";"Advice" +"Entretien du cuir";"Maintenance of leather";"";"";"";"";"";"Advice" \ No newline at end of file diff --git a/setup/import/folders.csv b/setup/import/folders.csv new file mode 100644 index 00000000..1c37d64c --- /dev/null +++ b/setup/import/folders.csv @@ -0,0 +1,4 @@ +"TITLE FR";"TITLE UK";"CHAPO FR";"CHAPO UK";"DESCRIPTIF FR";"DESCRIPTIF UK";"PHOTO" +"Informations";"Information";"";"";"";"";"" +"Blog";"Blog";"";"";"";"";"" +"Conseils";"Advice";"";"";"";"";"" diff --git a/setup/import/images/BRAND-1.png b/setup/import/images/BRAND-1.png new file mode 100644 index 00000000..dfde5d54 Binary files /dev/null and b/setup/import/images/BRAND-1.png differ diff --git a/setup/import/images/BRAND-2.png b/setup/import/images/BRAND-2.png new file mode 100644 index 00000000..cbedcf2f Binary files /dev/null and b/setup/import/images/BRAND-2.png differ diff --git a/setup/import/images/BRAND-3.png b/setup/import/images/BRAND-3.png new file mode 100644 index 00000000..fd413208 Binary files /dev/null and b/setup/import/images/BRAND-3.png differ diff --git a/setup/import/images/BRAND-4.png b/setup/import/images/BRAND-4.png new file mode 100644 index 00000000..931b72a2 Binary files /dev/null and b/setup/import/images/BRAND-4.png differ diff --git a/setup/import/images/BRAND-5.png b/setup/import/images/BRAND-5.png new file mode 100644 index 00000000..6f6023a9 Binary files /dev/null and b/setup/import/images/BRAND-5.png differ diff --git a/setup/import/images/BRAND-6.png b/setup/import/images/BRAND-6.png new file mode 100644 index 00000000..6a4ac4f4 Binary files /dev/null and b/setup/import/images/BRAND-6.png differ diff --git a/setup/import/images/BRAND-7.png b/setup/import/images/BRAND-7.png new file mode 100644 index 00000000..ba4c5b4f Binary files /dev/null and b/setup/import/images/BRAND-7.png differ diff --git a/setup/import/images/PROD001-1.jpg b/setup/import/images/PROD001-1.jpg new file mode 100644 index 00000000..c340872f Binary files /dev/null and b/setup/import/images/PROD001-1.jpg differ diff --git a/setup/import/images/PROD001-2.jpg b/setup/import/images/PROD001-2.jpg new file mode 100644 index 00000000..d1eba51b Binary files /dev/null and b/setup/import/images/PROD001-2.jpg differ diff --git a/setup/import/images/PROD001-3.jpg b/setup/import/images/PROD001-3.jpg new file mode 100644 index 00000000..89f69a76 Binary files /dev/null and b/setup/import/images/PROD001-3.jpg differ diff --git a/setup/import/images/PROD001-4.jpg b/setup/import/images/PROD001-4.jpg new file mode 100644 index 00000000..94eb80ce Binary files /dev/null and b/setup/import/images/PROD001-4.jpg differ diff --git a/setup/import/images/PROD001-5.jpg b/setup/import/images/PROD001-5.jpg new file mode 100644 index 00000000..3036b219 Binary files /dev/null and b/setup/import/images/PROD001-5.jpg differ diff --git a/setup/import/images/PROD002-1.jpg b/setup/import/images/PROD002-1.jpg new file mode 100644 index 00000000..f38d005e Binary files /dev/null and b/setup/import/images/PROD002-1.jpg differ diff --git a/setup/import/images/PROD002-2.jpg b/setup/import/images/PROD002-2.jpg new file mode 100644 index 00000000..61a57c5a Binary files /dev/null and b/setup/import/images/PROD002-2.jpg differ diff --git a/setup/import/images/PROD002-3.jpg b/setup/import/images/PROD002-3.jpg new file mode 100644 index 00000000..845a2603 Binary files /dev/null and b/setup/import/images/PROD002-3.jpg differ diff --git a/setup/import/images/PROD002-4.jpg b/setup/import/images/PROD002-4.jpg new file mode 100644 index 00000000..f9570ca9 Binary files /dev/null and b/setup/import/images/PROD002-4.jpg differ diff --git a/setup/import/images/PROD002-5.jpg b/setup/import/images/PROD002-5.jpg new file mode 100644 index 00000000..bbc71b06 Binary files /dev/null and b/setup/import/images/PROD002-5.jpg differ diff --git a/setup/import/images/PROD002-6.jpg b/setup/import/images/PROD002-6.jpg new file mode 100644 index 00000000..73a1698c Binary files /dev/null and b/setup/import/images/PROD002-6.jpg differ diff --git a/setup/import/images/PROD003-1.jpg b/setup/import/images/PROD003-1.jpg new file mode 100644 index 00000000..f968e29d Binary files /dev/null and b/setup/import/images/PROD003-1.jpg differ diff --git a/setup/import/images/PROD003-2.jpg b/setup/import/images/PROD003-2.jpg new file mode 100644 index 00000000..aed20007 Binary files /dev/null and b/setup/import/images/PROD003-2.jpg differ diff --git a/setup/import/images/PROD003-3.jpg b/setup/import/images/PROD003-3.jpg new file mode 100644 index 00000000..ff5f6a90 Binary files /dev/null and b/setup/import/images/PROD003-3.jpg differ diff --git a/setup/import/images/PROD004-1.jpg b/setup/import/images/PROD004-1.jpg new file mode 100644 index 00000000..f33005c7 Binary files /dev/null and b/setup/import/images/PROD004-1.jpg differ diff --git a/setup/import/images/PROD004-2.jpg b/setup/import/images/PROD004-2.jpg new file mode 100644 index 00000000..d844637a Binary files /dev/null and b/setup/import/images/PROD004-2.jpg differ diff --git a/setup/import/images/PROD005-1.jpg b/setup/import/images/PROD005-1.jpg new file mode 100644 index 00000000..5e2e29de Binary files /dev/null and b/setup/import/images/PROD005-1.jpg differ diff --git a/setup/import/images/PROD005-2.jpg b/setup/import/images/PROD005-2.jpg new file mode 100644 index 00000000..c236abed Binary files /dev/null and b/setup/import/images/PROD005-2.jpg differ diff --git a/setup/import/images/PROD005-3.jpg b/setup/import/images/PROD005-3.jpg new file mode 100644 index 00000000..51697517 Binary files /dev/null and b/setup/import/images/PROD005-3.jpg differ diff --git a/setup/import/images/PROD005-4.jpg b/setup/import/images/PROD005-4.jpg new file mode 100644 index 00000000..4f516550 Binary files /dev/null and b/setup/import/images/PROD005-4.jpg differ diff --git a/setup/import/images/PROD005-5.jpg b/setup/import/images/PROD005-5.jpg new file mode 100644 index 00000000..81c79194 Binary files /dev/null and b/setup/import/images/PROD005-5.jpg differ diff --git a/setup/import/images/PROD005-6.jpg b/setup/import/images/PROD005-6.jpg new file mode 100644 index 00000000..f48cac24 Binary files /dev/null and b/setup/import/images/PROD005-6.jpg differ diff --git a/setup/import/images/PROD006-1.jpg b/setup/import/images/PROD006-1.jpg new file mode 100644 index 00000000..ac75a7ba Binary files /dev/null and b/setup/import/images/PROD006-1.jpg differ diff --git a/setup/import/images/PROD006-2.jpg b/setup/import/images/PROD006-2.jpg new file mode 100644 index 00000000..fb72ae25 Binary files /dev/null and b/setup/import/images/PROD006-2.jpg differ diff --git a/setup/import/images/PROD006-3.jpg b/setup/import/images/PROD006-3.jpg new file mode 100644 index 00000000..bd7f5721 Binary files /dev/null and b/setup/import/images/PROD006-3.jpg differ diff --git a/setup/import/images/PROD006-4.jpg b/setup/import/images/PROD006-4.jpg new file mode 100644 index 00000000..394283e5 Binary files /dev/null and b/setup/import/images/PROD006-4.jpg differ diff --git a/setup/import/images/PROD006-5.jpg b/setup/import/images/PROD006-5.jpg new file mode 100644 index 00000000..d258db93 Binary files /dev/null and b/setup/import/images/PROD006-5.jpg differ diff --git a/setup/import/images/PROD006-6.jpg b/setup/import/images/PROD006-6.jpg new file mode 100644 index 00000000..98281584 Binary files /dev/null and b/setup/import/images/PROD006-6.jpg differ diff --git a/setup/import/images/PROD007-1.jpg b/setup/import/images/PROD007-1.jpg new file mode 100644 index 00000000..fda1d288 Binary files /dev/null and b/setup/import/images/PROD007-1.jpg differ diff --git a/setup/import/images/PROD007-2.jpg b/setup/import/images/PROD007-2.jpg new file mode 100644 index 00000000..a784790c Binary files /dev/null and b/setup/import/images/PROD007-2.jpg differ diff --git a/setup/import/images/PROD007-3.jpg b/setup/import/images/PROD007-3.jpg new file mode 100644 index 00000000..30b5637a Binary files /dev/null and b/setup/import/images/PROD007-3.jpg differ diff --git a/setup/import/images/PROD007-4.jpg b/setup/import/images/PROD007-4.jpg new file mode 100644 index 00000000..00556c66 Binary files /dev/null and b/setup/import/images/PROD007-4.jpg differ diff --git a/setup/import/images/PROD008-1.jpg b/setup/import/images/PROD008-1.jpg new file mode 100644 index 00000000..dc8e0bea Binary files /dev/null and b/setup/import/images/PROD008-1.jpg differ diff --git a/setup/import/images/PROD008-2.jpg b/setup/import/images/PROD008-2.jpg new file mode 100644 index 00000000..173bed1a Binary files /dev/null and b/setup/import/images/PROD008-2.jpg differ diff --git a/setup/import/images/PROD008-3.jpg b/setup/import/images/PROD008-3.jpg new file mode 100644 index 00000000..790d8add Binary files /dev/null and b/setup/import/images/PROD008-3.jpg differ diff --git a/setup/import/images/PROD008-4.jpg b/setup/import/images/PROD008-4.jpg new file mode 100644 index 00000000..ec4af28c Binary files /dev/null and b/setup/import/images/PROD008-4.jpg differ diff --git a/setup/import/images/PROD008-5.jpg b/setup/import/images/PROD008-5.jpg new file mode 100644 index 00000000..91e7ebaa Binary files /dev/null and b/setup/import/images/PROD008-5.jpg differ diff --git a/setup/import/images/PROD009-1.jpg b/setup/import/images/PROD009-1.jpg new file mode 100644 index 00000000..3a143de1 Binary files /dev/null and b/setup/import/images/PROD009-1.jpg differ diff --git a/setup/import/images/PROD009-2.jpg b/setup/import/images/PROD009-2.jpg new file mode 100644 index 00000000..b5ccde66 Binary files /dev/null and b/setup/import/images/PROD009-2.jpg differ diff --git a/setup/import/images/PROD009-3.jpg b/setup/import/images/PROD009-3.jpg new file mode 100644 index 00000000..76d465a4 Binary files /dev/null and b/setup/import/images/PROD009-3.jpg differ diff --git a/setup/import/images/PROD010-1.jpg b/setup/import/images/PROD010-1.jpg new file mode 100644 index 00000000..5f9df3fb Binary files /dev/null and b/setup/import/images/PROD010-1.jpg differ diff --git a/setup/import/images/PROD010-2.jpg b/setup/import/images/PROD010-2.jpg new file mode 100644 index 00000000..3fe50471 Binary files /dev/null and b/setup/import/images/PROD010-2.jpg differ diff --git a/setup/import/images/PROD010-3.jpg b/setup/import/images/PROD010-3.jpg new file mode 100644 index 00000000..867361eb Binary files /dev/null and b/setup/import/images/PROD010-3.jpg differ diff --git a/setup/import/images/PROD010-4.jpg b/setup/import/images/PROD010-4.jpg new file mode 100644 index 00000000..f9681b9b Binary files /dev/null and b/setup/import/images/PROD010-4.jpg differ diff --git a/setup/import/images/PROD011-1.jpg b/setup/import/images/PROD011-1.jpg new file mode 100644 index 00000000..8130598b Binary files /dev/null and b/setup/import/images/PROD011-1.jpg differ diff --git a/setup/import/images/PROD011-2.jpg b/setup/import/images/PROD011-2.jpg new file mode 100644 index 00000000..e37c4baa Binary files /dev/null and b/setup/import/images/PROD011-2.jpg differ diff --git a/setup/import/images/PROD011-3.jpg b/setup/import/images/PROD011-3.jpg new file mode 100644 index 00000000..ba4530c3 Binary files /dev/null and b/setup/import/images/PROD011-3.jpg differ diff --git a/setup/import/images/PROD011-4.jpg b/setup/import/images/PROD011-4.jpg new file mode 100644 index 00000000..b749649d Binary files /dev/null and b/setup/import/images/PROD011-4.jpg differ diff --git a/setup/import/images/PROD012-1.jpg b/setup/import/images/PROD012-1.jpg new file mode 100644 index 00000000..ff885661 Binary files /dev/null and b/setup/import/images/PROD012-1.jpg differ diff --git a/setup/import/images/PROD012-2.jpg b/setup/import/images/PROD012-2.jpg new file mode 100644 index 00000000..c27fd1cb Binary files /dev/null and b/setup/import/images/PROD012-2.jpg differ diff --git a/setup/import/images/PROD013-1.jpg b/setup/import/images/PROD013-1.jpg new file mode 100644 index 00000000..729fe97f Binary files /dev/null and b/setup/import/images/PROD013-1.jpg differ diff --git a/setup/import/images/PROD014-1.jpg b/setup/import/images/PROD014-1.jpg new file mode 100644 index 00000000..384b1939 Binary files /dev/null and b/setup/import/images/PROD014-1.jpg differ diff --git a/setup/import/images/PROD014-2.jpg b/setup/import/images/PROD014-2.jpg new file mode 100644 index 00000000..42de512f Binary files /dev/null and b/setup/import/images/PROD014-2.jpg differ diff --git a/setup/import/images/PROD014-3.jpg b/setup/import/images/PROD014-3.jpg new file mode 100644 index 00000000..0270dc86 Binary files /dev/null and b/setup/import/images/PROD014-3.jpg differ diff --git a/setup/import/images/PROD014-4.jpg b/setup/import/images/PROD014-4.jpg new file mode 100644 index 00000000..e845a883 Binary files /dev/null and b/setup/import/images/PROD014-4.jpg differ diff --git a/setup/import/images/PROD015-1.jpg b/setup/import/images/PROD015-1.jpg new file mode 100644 index 00000000..f99e9e27 Binary files /dev/null and b/setup/import/images/PROD015-1.jpg differ diff --git a/setup/import/images/PROD015-2.jpg b/setup/import/images/PROD015-2.jpg new file mode 100644 index 00000000..b56a1395 Binary files /dev/null and b/setup/import/images/PROD015-2.jpg differ diff --git a/setup/import/images/PROD016-1.jpg b/setup/import/images/PROD016-1.jpg new file mode 100644 index 00000000..3aff2648 Binary files /dev/null and b/setup/import/images/PROD016-1.jpg differ diff --git a/setup/import/images/PROD017-1.jpg b/setup/import/images/PROD017-1.jpg new file mode 100644 index 00000000..1a620ab4 Binary files /dev/null and b/setup/import/images/PROD017-1.jpg differ diff --git a/setup/import/images/PROD017-2.jpg b/setup/import/images/PROD017-2.jpg new file mode 100644 index 00000000..82a20f1f Binary files /dev/null and b/setup/import/images/PROD017-2.jpg differ diff --git a/setup/import/images/PROD017-3.jpg b/setup/import/images/PROD017-3.jpg new file mode 100644 index 00000000..d476eb77 Binary files /dev/null and b/setup/import/images/PROD017-3.jpg differ diff --git a/setup/import/images/PROD017-4.jpg b/setup/import/images/PROD017-4.jpg new file mode 100644 index 00000000..b3a3e470 Binary files /dev/null and b/setup/import/images/PROD017-4.jpg differ diff --git a/setup/import/images/PROD018-1.jpg b/setup/import/images/PROD018-1.jpg new file mode 100644 index 00000000..cefa9992 Binary files /dev/null and b/setup/import/images/PROD018-1.jpg differ diff --git a/setup/import/images/PROD019-1.jpg b/setup/import/images/PROD019-1.jpg new file mode 100644 index 00000000..2e45bb27 Binary files /dev/null and b/setup/import/images/PROD019-1.jpg differ diff --git a/setup/import/images/PROD019-2.jpg b/setup/import/images/PROD019-2.jpg new file mode 100644 index 00000000..9b47f6ea Binary files /dev/null and b/setup/import/images/PROD019-2.jpg differ diff --git a/setup/import/images/PROD019-3.jpg b/setup/import/images/PROD019-3.jpg new file mode 100644 index 00000000..02aa975d Binary files /dev/null and b/setup/import/images/PROD019-3.jpg differ diff --git a/setup/import/images/PROD019-4.jpg b/setup/import/images/PROD019-4.jpg new file mode 100644 index 00000000..fad8bbf5 Binary files /dev/null and b/setup/import/images/PROD019-4.jpg differ diff --git a/setup/import/images/PROD019-5.jpg b/setup/import/images/PROD019-5.jpg new file mode 100644 index 00000000..0e2377b8 Binary files /dev/null and b/setup/import/images/PROD019-5.jpg differ diff --git a/setup/import/images/PROD020-1.jpg b/setup/import/images/PROD020-1.jpg new file mode 100644 index 00000000..14b7ae55 Binary files /dev/null and b/setup/import/images/PROD020-1.jpg differ diff --git a/setup/import/images/PROD021-1.jpg b/setup/import/images/PROD021-1.jpg new file mode 100644 index 00000000..5cd5e27e Binary files /dev/null and b/setup/import/images/PROD021-1.jpg differ diff --git a/setup/import/images/PROD021-2.jpg b/setup/import/images/PROD021-2.jpg new file mode 100644 index 00000000..119afa3b Binary files /dev/null and b/setup/import/images/PROD021-2.jpg differ diff --git a/setup/import/images/PROD021-3.jpg b/setup/import/images/PROD021-3.jpg new file mode 100644 index 00000000..0b4470d3 Binary files /dev/null and b/setup/import/images/PROD021-3.jpg differ diff --git a/setup/import/images/PROD021-4.jpg b/setup/import/images/PROD021-4.jpg new file mode 100644 index 00000000..0cffa4de Binary files /dev/null and b/setup/import/images/PROD021-4.jpg differ diff --git a/setup/import/images/PROD022-1.jpg b/setup/import/images/PROD022-1.jpg new file mode 100644 index 00000000..72eb89cf Binary files /dev/null and b/setup/import/images/PROD022-1.jpg differ diff --git a/setup/import/images/PROD022-2.jpg b/setup/import/images/PROD022-2.jpg new file mode 100644 index 00000000..85292d60 Binary files /dev/null and b/setup/import/images/PROD022-2.jpg differ diff --git a/setup/import/images/PROD022-3.jpg b/setup/import/images/PROD022-3.jpg new file mode 100644 index 00000000..e564ed1b Binary files /dev/null and b/setup/import/images/PROD022-3.jpg differ diff --git a/setup/import/images/PROD022-4.jpg b/setup/import/images/PROD022-4.jpg new file mode 100644 index 00000000..09d39fd3 Binary files /dev/null and b/setup/import/images/PROD022-4.jpg differ diff --git a/setup/import/images/PROD022-5.jpg b/setup/import/images/PROD022-5.jpg new file mode 100644 index 00000000..f4721928 Binary files /dev/null and b/setup/import/images/PROD022-5.jpg differ diff --git a/setup/import/images/PROD023-1.jpg b/setup/import/images/PROD023-1.jpg new file mode 100644 index 00000000..e645f5eb Binary files /dev/null and b/setup/import/images/PROD023-1.jpg differ diff --git a/setup/import/images/PROD023-2.jpg b/setup/import/images/PROD023-2.jpg new file mode 100644 index 00000000..ad438c98 Binary files /dev/null and b/setup/import/images/PROD023-2.jpg differ diff --git a/setup/import/images/PROD023-3.jpg b/setup/import/images/PROD023-3.jpg new file mode 100644 index 00000000..ccafdb7f Binary files /dev/null and b/setup/import/images/PROD023-3.jpg differ diff --git a/setup/import/images/PROD023-4.jpg b/setup/import/images/PROD023-4.jpg new file mode 100644 index 00000000..a2fc5578 Binary files /dev/null and b/setup/import/images/PROD023-4.jpg differ diff --git a/setup/import/images/PROD023-5.jpg b/setup/import/images/PROD023-5.jpg new file mode 100644 index 00000000..bf67ea4b Binary files /dev/null and b/setup/import/images/PROD023-5.jpg differ diff --git a/setup/import/images/PROD023-6.jpg b/setup/import/images/PROD023-6.jpg new file mode 100644 index 00000000..5d037669 Binary files /dev/null and b/setup/import/images/PROD023-6.jpg differ diff --git a/setup/import/images/PROD024-1.jpg b/setup/import/images/PROD024-1.jpg new file mode 100644 index 00000000..7f387420 Binary files /dev/null and b/setup/import/images/PROD024-1.jpg differ diff --git a/setup/import/images/PROD024-2.jpg b/setup/import/images/PROD024-2.jpg new file mode 100644 index 00000000..fcd4bd58 Binary files /dev/null and b/setup/import/images/PROD024-2.jpg differ diff --git a/setup/import/images/PROD024-3.jpg b/setup/import/images/PROD024-3.jpg new file mode 100644 index 00000000..1d0c8dee Binary files /dev/null and b/setup/import/images/PROD024-3.jpg differ diff --git a/setup/import/images/PROD024-4.jpg b/setup/import/images/PROD024-4.jpg new file mode 100644 index 00000000..7ff3957c Binary files /dev/null and b/setup/import/images/PROD024-4.jpg differ diff --git a/setup/import/images/PROD024-5.jpg b/setup/import/images/PROD024-5.jpg new file mode 100644 index 00000000..53a63564 Binary files /dev/null and b/setup/import/images/PROD024-5.jpg differ diff --git a/setup/import/images/PROD025-1.jpg b/setup/import/images/PROD025-1.jpg new file mode 100644 index 00000000..54fa325e Binary files /dev/null and b/setup/import/images/PROD025-1.jpg differ diff --git a/setup/import/images/PROD025-2.jpg b/setup/import/images/PROD025-2.jpg new file mode 100644 index 00000000..fd3ba161 Binary files /dev/null and b/setup/import/images/PROD025-2.jpg differ diff --git a/setup/import/images/PROD025-3.jpg b/setup/import/images/PROD025-3.jpg new file mode 100644 index 00000000..6ec0c96e Binary files /dev/null and b/setup/import/images/PROD025-3.jpg differ diff --git a/setup/import/images/PROD026-1.jpg b/setup/import/images/PROD026-1.jpg new file mode 100644 index 00000000..96bb2b39 Binary files /dev/null and b/setup/import/images/PROD026-1.jpg differ diff --git a/setup/import/images/PROD027-1.jpg b/setup/import/images/PROD027-1.jpg new file mode 100644 index 00000000..9ab63502 Binary files /dev/null and b/setup/import/images/PROD027-1.jpg differ diff --git a/setup/import/images/PROD028-1.jpg b/setup/import/images/PROD028-1.jpg new file mode 100644 index 00000000..1a166e91 Binary files /dev/null and b/setup/import/images/PROD028-1.jpg differ diff --git a/setup/import/images/PROD029-1.jpg b/setup/import/images/PROD029-1.jpg new file mode 100644 index 00000000..e25b56f1 Binary files /dev/null and b/setup/import/images/PROD029-1.jpg differ diff --git a/setup/import/images/PROD030-1.jpg b/setup/import/images/PROD030-1.jpg new file mode 100644 index 00000000..731d8289 Binary files /dev/null and b/setup/import/images/PROD030-1.jpg differ diff --git a/setup/import/images/PROD030-2.jpg b/setup/import/images/PROD030-2.jpg new file mode 100644 index 00000000..15ecbef2 Binary files /dev/null and b/setup/import/images/PROD030-2.jpg differ diff --git a/setup/import/images/PROD030-3.jpg b/setup/import/images/PROD030-3.jpg new file mode 100644 index 00000000..8f3d9eb5 Binary files /dev/null and b/setup/import/images/PROD030-3.jpg differ diff --git a/setup/import/images/PROD030-4.jpg b/setup/import/images/PROD030-4.jpg new file mode 100644 index 00000000..2d402e8d Binary files /dev/null and b/setup/import/images/PROD030-4.jpg differ diff --git a/setup/import/materials.csv b/setup/import/materials.csv new file mode 100644 index 00000000..e934c63e --- /dev/null +++ b/setup/import/materials.csv @@ -0,0 +1,6 @@ +"Tissu";"Tissue" +"Bois";"Wood" +"Métal";"Metal" +"Plastique";"Plastic" +"Cuir";"Leather" +"Verre";"Glass" diff --git a/setup/import/products.csv b/setup/import/products.csv new file mode 100644 index 00000000..1f142000 --- /dev/null +++ b/setup/import/products.csv @@ -0,0 +1,35 @@ +"REF";"TITRE UK";"CHAPO UK";"CHAPO FR";"DESCRIPTIF UK";"DESCRIPTIF FR";"POSTSCRIPTUM UK";"POSTSCRIPTUM FR";"PRIX";"PRIX2";"PHOTO";"BRAND";"COULEUR UK";"MATERIAL UK";"CONTENT UK";"CATEGORIE" +"PROD001";"Horatio";"Contemporary atypical chair";"Chaise contemporaine hors normes";"Its design is based on a very simple idea : atypical aesthetics for an everyday use. You may even choose to combine the various colours ! A specific look that will happily and impertinently fit with your furniture. ";"Son design est issu d'une idée très simple: un esthétique hors du commun pour un usage de tous les jours. On peut même choisir de combiner les différents coloris! Un look qui se mêle avec bonheur et impertinence à votre mobilier. +";"Dimensions : Width : 20'' – Depth: 19'' – Height: 42''";"Dimensions : Larg 52 cm - Prof 50 cm - Haut 108 cm";"223";"199";"PROD001-1.jpg;PROD001-2.jpg;PROD001-3.jpg;PROD001-4.jpg";"MILAN";"blue;pink;red;green;purple";"Plastic";"";"Chairs" +"PROD002";"Travis";"Ergonomic & affordable";"Ergonomique et économique";"Ergonomic, affordable, comfortable, stackable, easily dismantled, this little stool became a cult item. Decorative feature or occasional seat, it suits perfectly any room in the house. ";"Ergonomique, économique, confortable, empilable, démontable, ce petit tabouret est devenu un objet culte. Elément de décor ou siège d'appoint, il a sa place dans toute la maison. +";"Dimensions : Diam. 11'' – Height: 17''";"Dimensions : Diam 30 cm - Haut 45 cm";"25";"19";"PROD002-1.jpg;PROD002-2.jpg;PROD002-3.jpg;PROD002-4.jpg;PROD002-5.jpg;PROD002-6.jpg";"MAGIS";"blue;orange;yellow;pink;purple;green";"Plastic";"";"Stools" +"PROD003";"Stacy";"A successfull mix";"Un mariage réussi";"The ''Stacy'' armchair brings a taste of playfulness in the design's world for more than 20 years ! The successfull mix of French Regence style and ultra modern materials creates a strong charismatic personality. ";"Le fauteuil Stacy apporte une note de fantaisie dans le monde du design depuis plus de 20 ans ! Sa personnalité forte et charismatique s'exprime au travers de cette association de style Régence et de matériaux ultramoderne. ";"Dimensions : Width :44'' – Depth:31'' – Height: 42'' . Sitting : width : 25''– Height : 16'' . Armrests height : 27''";"Dimensions : Larg 114 cm x Prof 80 cm x H 108 cm - Assise : larg 65 cm x H 42 cm - Accoudoirs : H 69 cm";"653";"610";"PROD003-1.jpg;PROD003-2.jpg;PROD003-3.jpg;";"MILAN";"blue;purple;green";"Tissue;Wood";"Cleaning Tissue";"Armchairs" +"PROD004";"Scarlett";"A timeless treasure";"Un trésor intemporel";"Treasured and timeless styling characterizes the luxury ''Scarlett'' Armchair. It will instantly add a dash of refined appeal to any living space. Beneath the luxurious fabric cover is a solid wood frame, ensuring that this piece will be passed on from generation to generation. ";"Un style précieux et intemporel caractérise la luxueuse banquette Scarlett. Elle apporte immédiatement une touche de raffinement à n'importe quel salon. Sous l'étoffe précieuse, un solide châssis bois vous assure que cette pièce traversera les époques et les générations. ";"Dimensions : Width :65'' – Depth:31''– Height: 38''";"Dimensions : Larg 165 cm x Prof 80 cm x H 95 cm";"956";"899";"PROD004-1.jpg;PROD004-2.jpg";"OXYO";"gray;black";"Tissue;Wood";"Cleaning Tissue";"Armchairs" +"PROD005";"Owen";"An eye-catching armchair";"Un fauteuil surprenant";"Get a look at the future – retro style - with our cutout ''Owen'' armchair ! Eye-catching and incredibly fun, this armchair is a must-have for today's hottest living space ! ";"Revisitez le futur avec une note retro grâce à notre fauteuil Owen! Spectaculaire et incroyablement fun, ce fauteuil est incontournable pour un salon moderne et branché ! ";"Dimensions : Width :30'' – Depth:31''– Height: 35''";"Dimensions : Larg 75 cm - Prof 80 cm - Haut 90 cm";"395";"";"PROD005-1.jpg;PROD005-2.jpg;PROD005-3.jpg;PROD005-4.jpg;PROD005-5.jpg;PROD005-6.jpg";"OXYO";"blue;purple;green;pink;red;orange;";"Tissue;Metal";"Cleaning Tissue";"Armchairs" +"PROD006";"Nigel";"A comfortable beauty";"Une beauté confortable";"This comfortable beauty does great solo as a lounger or in a book nook. With the ''Nigel'' sofa, you will get hours of cozy relaxation. This oversized seat is the ultimate lounger but the pure design still keeps it modern and hip. ";"La beauté confortable du sofa Nigel permet tous les solos dans votre salon ou votre bibliothèque. Relaxez vous tranquilement avec le canapé Nigel. Ce siège généreux est l'expression même du fauteuil mais ses lignes pures lui assurent un style moderne et tendance. ";"Dimensions: Width : 48"" - Depth : 32"" - Height : 28"" – 17"" seat Height";"Dimensions : Larg 120 cm – Prof  80 cm – Haut. 70 cm . Hauteur d'assise : 40 cm";"638";"";"PROD006-1.jpg;PROD006-2.jpg;PROD006-3.jpg;PROD006-4.jpg;PROD006-5.jpg;PROD006-6.jpg";"OXYO";"blue;beige;purple;green;pink;turquoise";"Tissue;Metal";"Cleaning Tissue";"Sofas" +"PROD007";"Heathcliff";"A unique style";"Un style unique";"Provide a rich texture to any living space thanks to the tufting and velvet of the ''Heathcliff'' sofa. Arched roll arms and vibrant colours add to the fun and unique style of this sofa. ";"Enrichissez votre intérieur de velours et de textures capitonnées du canapé Heathcliff. Les accoudoirs arrondis en finition cloutée et la gamme de couleurs acidulées apportent un style et une fantaisie unique à ce sofa. ";"Dimensions: Width : 92"" - Depth : 43"" - Height : 36""";"Dimensions : Larg 230 cm – Prof. 110 cm – Haut. 90 cm";"1120";"";"PROD007-1.jpg;PROD007-2.jpg;PROD007-3.jpg;PROD007-4.jpg;";"OFFUS";"turquoise;blue;pink;purple";"Tissue;Wood";"Cleaning Tissue";"Sofas" +"PROD008";"Wilson";"Pure luxury !";"Le luxe à l'état pur !";"Choose our ''Wilson'' armchair and surround yourself in luxury. You will appreciate it's high armrests that will keep you nestled in comfort. Beautiful coloured leather upholstery makes a fashion-forward design statement. ";"Adoptez notre fauteuil Wilson et plongez dans le luxe. Vous apprécierez ses hauts accoudoirs qui vous envelopperont de confort et de douceur. L'habillage en cuir de couleur vive en fait une pièce de design avant-gardiste. ";"Dimensions : Width : 38"" - Depth : 36"" - Height : 34""";"Dimensions : larg 95 cm – Prof. 90 cm – Haut. 90 cm";"489";"";"PROD008-1.jpg;PROD008-2.jpg;PROD008-3.jpg;PROD008-4.jpg;PROD008-5.jpg;";"PLINK";"blue;green;pink;purple;brown;";"Tissue;Wood";"Cleaning Tissue;Maintenance of leather";"Armchairs" +"PROD009";"Zoe";"An exceptional combination";"Une union exceptionnelle";"Contemporary ''Zoe'' armchair is an exceptional combination of function and design. +The seating is generously cushioned for comfort. Contoured, wrap-around back offers optimal support. The brushed stainless steel base ensures stability. +Swivel feature for added function. ";"Zoe est un fauteuil contemporain qui combine de manière exceptionnelle fonctionnalité et design. L'assise est garnie d'un coussin généreux pour plus de confort. Le dossier enveloppant offre un appui optimal. La stabilité de l'ensemble est assurée par une base en inox brossé. Siège pivotant. ";"Dimensions : Width : 30'' – Depth : 27'' – height : 31''";"Dimensions : Larg. 75 cm – Prof. 69 cm – Haut. 80 cm";"520";"";"PROD009-1.jpg;PROD009-2.jpg;PROD009-3.jpg";"PLINK";"blue;purple;orange";"Plastic;Metal";"";"Armchairs" +"PROD010";"Sigmund";"A fun project";"Un projet fou";"The contrast of a vintage couch and modern colours provides a really fun project called ''Sigmund'' ! It will instantly add a dash of impertinence for any hip living place. ";"Le projet fantastique appelé Sigmund provient d'un contraste étonnant entre un canapé vintage et un éventail de couleurs moderne. Ce canapé apportera immédiatement une touche d'impertinence à n'importe quel salon branché. ";"Dimensions: Width : 92"" - Depth : 43"" - Height : 36""";"Dimensions : Larg 230 cm – Prof. 110 cm – Haut. 90 cm";"834";"";"PROD010-1.jpg;PROD010-2.jpg;PROD010-3.jpg;PROD010-4.jpg";"OFFUS";"blue;purple;red;orange";"Tissue;Wood";"Cleaning Tissue";"Armchairs ; Sofas" +"PROD011";"Tina";"The little plastic chair";"La petite chaise en plastique";"This little ''Tina'' plastic chair will become your new red hot favourite thanks to its efficient design. Stackable and made of recyclable material, Tina suits perfectly any room in the house ! ";"L'efficacité du design de cette petite chaise en plastique Tina en fera vite votre favorite. Empilable et recyclable, Tina se glissera parfaitement dans n'importe quelle pièce de votre maison ! ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm ";"75";"";"PROD011-1.jpg;PROD011-2.jpg;PROD011-3.jpg;PROD011-4.jpg";"PARRY";"blue;orange;red;purple";"Plastic";"";"Chairs" +"PROD012";"Victoria";"Pure lines";"Des lignes éûrées";"A successfull combination of Regence style and ultra modern material. The pure lines of the ''Victoria'' armchair together with its translucent brilliance make a fashion-forward design statement. ";"Un mariage réussit du style Régence et de matériaux ultra modernes. Les lignes pures de la chaise Victoria associées à la brillance translucide de sa matière en font une pièce de design avant-gardiste. ";"Dimensions : Width :44'' – Depth:31'' – Height: 42'' . Sitting : width : 25''– Height : 16'' . Armrests height : 27''";"Dimensions : Larg 114 cm x Prof 80 cm x H 108 cm - Assise : larg 65 cm x H 42 cm - Accoudoirs : H 69 cm";"138";"";"PROD012-1.jpg;PROD012-2.jpg";"MILAN";"black";"Plastic";"";"Armchairs" +"PROD013";"Violet";"A beautifull classic";"Une beauté classique";"A new edition of a classic. Beneath a beautiful colorfull leather, a strong walnut wood frame. You will appreciate the luxurious stylish details of the ''Violet'' armless chair. ";"La réédition d'un classique. Sous un superbe cuir aux couleurs chatoyantes, une solide structure en noyer. Vous apprécierez les détails stylistiques luxueux de notre chaise Violet. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";"98";"";"PROD013-1.jpg";"MAGIS";"Gray";"Leather;Wood";"Maintenance of leather";"Chairs" +"PROD014";"Sally";"Contemporary atypical chair";"Chaise contemporaine hors normes";"Contemporary atypical chair. The atypical sitting of the ''Sally '' chair will nestled you in confort. Play with the vibrant colours range to create a unique dining room. ";"Chaise contemporaine hors normes. L'assise surprenante de la chaise Sally vous enveloppera de confort. Amusez vous avec l'éventail de couleurs lumineuses pour créer une salle à manger unique. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";"112";"";"PROD014-1.jpg;PROD014-2.jpg;PROD014-3.jpg;PROD014-4.jpg";"PARRY";"blue;purple;orange;yellow";"Leather;Metal";"";"Chairs" +"PROD015";"Oliver";"Comfort & Design";"Confort et Design";"Surround yourself in ultra modern luxury with the ''Oliver'' armchair and get a look at the future ! Eye-catching, this unique combination of comfort and design is a must-have for today's book nook. ";"Abandonnez vous à un univers de luxe ultra moderne avec le fauteuil Oliver et voyagez dans le futur ! Cette combinaison unique de confort et de design est spectaculaire. Un élément incontournable pour votre bibliothèque. ";"Dimensions : Width : 30'' – Depth : 27'' – height : 31''";"Dimensions : Larg. 75 cm – Prof. 69 cm – Haut. 80 cm";"340";"";"PROD015-1.jpg;PROD015-2.jpg;";"MAGIS";"white;black";"Tissue;Plastic";"Cleaning Tissue";"Armchairs;Chairs" +"PROD016";"Lexie";"A modern style";"Un style moderne";"Demonstrate your flair for modern style with our ''Lexie'' chair in your dining room. A rectangular cushioned back offers a contemporary feel, while the comfortable seat provides complete comfort. ";"Montrez que vous avez le sens de la modernité en choisissant la chaise ''Lexie'' pour votre salle à manger. Le coussin rectangulaire sur le dossier apporte une touche contemporaine. L'assise généreuse apporte un confort complet. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 40''";"Dimensions : larg. 50 cm – Prof. 60 cm – Haut. 100 cm";"159";"";"PROD016-1.jpg";"PLINK";"Beige";"Tissue;Wood";"Cleaning Tissue;Maintenance of wood";"Chairs" +"PROD017";"Flynn";"A touch of retro vibe";"Un petit air rétro";"If your destination is up-to-date décor with a touch of retro vibe, look no further than our ''Flynn'' sofa. Sleek, low track arms and high tapering legs give this piece a mid-century flavor. The vibrant tones of the woven upholstery will easily blend with any interior décor. ";"Si vous recherchez une décoration actuelle avec une touche rétro, n'allez pas plus loin et opter pour notre canapé ''Flynn''. Ce canapé a un petit air des années 50 grâce à ses accoudoirs bas, ses pieds allongés et ses lignes pures. Les couleurs chatoyantes de son revêtement en laine lui permettent de se fondre dans tous les intérieurs. ";"Dimensions : Width : 89'' – Depth : 37'' – Height : 36''";"Dimensions : Larg. 225 cm – Prof. 95 cm – Haut. 90 cm";"1299";"";"PROD017-1.jpg;PROD017-2.jpg;PROD017-3.jpg;PROD017-4.jpg";"OFFUS";"blue;green;red;purple";"Tissue;Metal";"Cleaning Tissue";"Sofas" +"PROD018";"Emily";"A old-world feel";"Une touche d'histoire";"Our ''Emily'' armlesschair adds a touch of a old-world feel to your space. Perfect for when defining the seating space in a larger room. A medium wood finish sets off the delicate embellishments at the base, while the luxurous upholstery keeps the look fresh. The cushions guarantee that this is a chair worth relaxing in, not just admiring from afar. ";"La chaise ''Emily'' apporte une touche d'histoire à votre intérieur. Elle est parfaite pour structurer votre espace, notamment dans une grande pièce. Les finitions bois font la part belle à de délicates arabesques, tandis que le luxueux revêtement apporte un look frais. Cette chaise n'est pas destinée à la figuration grâce à la mousse confortable de l'assise. ";"Dimensions : Width : 33'' – Depth : 27'' – Height : 40''";"Dimensions : Larg. 85 cm – Prof. 69 cm – Haut. 100 cm";"690";"";"PROD018-1.jpg";"PARRY";"red";"Tissue;Wood";"Cleaning Tissue";"Armchairs" +"PROD019";"Edgar";"A special spot";"Un endroit à part";"A special spot for reading, lounging or chatting, our '' Edgar '' armchair has no reservations when it comes to style. The design starts with mid-century modern elements like lean arms, while the brushed stainless steel base ensures stability. Swivel feature for added function. ";"Un endroit spécial où lire, rêver ou discuter, notre fauteuil ''Edgar'' n'a pas de limite quand il s'agit de style. Son design part d'éléments contemporains comme ses accoudoirs bas et fins, tandis que sa base en inox brossé assure la stabilité de l'ensemble. Siège pivotant. ";"Dimensions : Width : 33'' – Depth : 27'' – Height : 40''";"Dimensions: Larg. 85 cm – Prof. 69 cm – Haut. 100 cm";"275";"";"PROD019-1.jpg;PROD019-2.jpg;PROD019-3.jpg;PROD019-4.jpg;PROD019-5.jpg";"TOKO";"blue;yellow;orange;pink;purple";"Tissue;Metal";"Cleaning Tissue";"Armchairs" +"PROD020";"Pamela";"Clean lines";"Des lignes pures";"By making our ''Pamela'' chair a centerpiece of your dining area, you'll demonstrate your eye for clean lines and comfortable seating. The contemporary touches of this chair are provided by the light brown wool, a flared seat back and slightly curved wood back legs. The color of the uphostery is the perfect complement to the wood finish of the chair legs. ";"Choisissez notre chaise '' Pamela'' comme pièce maitresse de votre salle à manger et faites la démonstration de votre maitrise des lignes épurées et du confort d'assise. L'allure contemporaine de cette chaise provient de la laine beige, du dossier légèrement évasé et des pieds en bois arrières délicatement incurvés. La couleur du revêtement fait parfaitement écho à la finition bois des pieds. Dimensions : larg. 50 cm – Prof. 60 cm – Haut. 100 cm";"Dimensions : Width : 19'' – Depth : 23'' – Height : 40''";"Dimensions : Width : 19'' – Depth : 23'' – Height : 40''";"189";"";"PROD020-1.jpg";"OFFUS";"brown";"Tissue;Wood";"Cleaning Tissue";"Chairs" +"PROD021";"Courtney";"Mil madness";"Douce folie";"Add a dash of mild madness to your kitchen ! Eye-catching, this ''Courtney'' armless chair is a must-have for hip dining area.";"Mettez une touche de douce folie dans votre cuisine ! Surprenante, notre chaise ''Courtney'' est incontournable pour un coin repas branché. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm ";"89";"";"PROD021-1.jpg;PROD021-2.jpg;PROD021-3.jpg;PROD021-4.jpg";"TOKO";"blue;orange;green;purple";"Plastic;Glass";"";"Chairs" +"PROD022";"Barbara";"An amazing look";"Un look détonnant";"An amazing look for our ''Barbara'' chair ! A cut-out oval in the back provides a distinctive character, while the lively range of colours and the mat finish makes a big style statement. Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Un look hors du commun pour la chaise ''Barbara'' ! L'ouverture oval du dossier apporte une personnalité toute particulière tandis que la large gamme de couleurs vives et le rendu mat provoque un vrai effet de style. Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm ";"Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm ";"122";"";"PROD022-1.jpg;PROD022-2.jpg;PROD022-3.jpg;PROD022-4.jpg;PROD022-5.jpg";"MAGIS";"blue;turquoise;yellow;orange;red";"Plastic;Metal";"";"Chairs" +"PROD023";"Haley";"An armless chair coming from outer space !";"Une chaise cosmique !";"This ''Haley'' amazing chair is as light as paper but sturdy as steel. Play with the vibrant colours range to create a unique dining area. ";"La chaise ''Haley'' est étonnante : légère comme le papier mais solide comme l'acier. Jouez avec la gamme de couleurs vibrantes pour composer un espace repas unique.";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm ";"93";"";"PROD023-1.jpg;PROD023-2.jpg;PROD023-3.jpg;PROD023-4.jpg;PROD023-5.jpg;PROD023-6.jpg";"MILAN";"purple;green;pink;red;orange;turquoise";"Plastic";"";"Chairs" +"PROD024";"Kyle";"A modern silhouette";"Un look moderne";"The modern silhouette of the ''Kyle'' sofa features cantilevered legs in a mirror chrome finish and pillow armrests. The button-tufted seat and back cushions highlight the detailed craftsmanship. ";"Le canapé ''Kyle'' offre une silhouette moderne grâce à ses pieds chromés en porte-à-faux et ses accoudoirs moelleux. L'assise et le dossier capitonnés mettent en valeur le travail précis de l'artisan.";"Dimensions: Width : 92"" - Depth : 43"" - Height : 36""";"Dimensions : Larg 230 cm – Prof. 110 cm – Haut. 90 cm";"1799";"";"PROD024-1.jpg;PROD024-2.jpg;PROD024-3.jpg;PROD024-4.jpg;PROD024-5.jpg";"TOKO";"blue;pink;red;green;purple";"Tissue;Metal";"Cleaning Tissue";"Sofas" +"PROD025";"Kenny";"A fresh take on a classic chair ";"Un classique revisité";"Chic design elements and a lovely pattern bring cool interest to this ''Kenny'' chair. The well-lofted seat cushion offers ultimate comfort and support.";"Des éléments de design élégants et un motif chic apporte un nouvel intérêt à notre chaise ''Kenny''. Un coussin d'assise bien positionné offre un confort suprême.";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";"299";"";"PROD025-1.jpg;PROD025-2.jpg;PROD025-3.jpg";"PLINK";"blue;purple;green";"Tissue;Wood";"Cleaning Tissue";"Chairs" +"PROD026";"Stuart";"A masterpiece of furniture design";"Une pièce de designer !";"Get the on-trend look of modern masterpieces of furniture design with our ''Stuart'' chair. Paying homage to the classic design, this piece has an architecturally inspired silhouette with its sculptural wood frame and the clean lines of seat and back cushions. The crisp white hue will blend easily with a range of color schemes. ";"Offrez vous le look branché d'une grande pièce de designer avec la chaise ''Stuart''. Rendant hommage aux classiques du Design, cette chaise a une silhouette inspirée de l'architecture par son cadre bois sculptural et par les lignes pures de son assise et de son dossier. La fraiche nuance de blanc se fondera facilement dans toutes les harmonies de couleurs.";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";"189";"";"PROD026-1.jpg";"PLINK";"white";"Tissue;Wood";"Cleaning Tissue";"Chairs" +"PROD027";"Marie-Claire";"A naturally appealing";"Une sobre élégance";"There's no denying the naturally appealing of our Marie-Claire chair! Its organic feeling is enhanced by the pretty wood veneers and faux leather upholstery, adding rustic charm and comfort.";"On ne peut nier l'élégance sobre de notre chaise Marie-Claire. Son allure naturelle est rehaussée par les finitions bois et le revêtement imitation cuir ajoute à son charme rustique et son confort.";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";"104";"";"PROD027-1.jpg";"TOKO";"green";"Tissue;Wood";"Cleaning Tissue";"Chairs" +"PROD028";"Leela";"Contemporary fun chair";"Une fantaisie contemporaine";"At once contemporary and chic, The ''Leela'' chair makes your strong sense of personal style evident. Stylish, easy-clean, leather-like upholstery makes the cut-out in the back more stunning in the light of its vibrant yellow.";"Tout à la fois chic et contemporaine, la chaise ''Leela'' rend votre sens du style évident. Le revêtement en similicuir, facile d'entretien met en valeur l'ouverture du dossier par son jaune lumineux.";"Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm ";"144";"";"PROD028-1.jpg";"MILAN";"yellow";"Leather;Metal";"";"Chairs;Armchairs" +"PROD029";"Nibbler";"A modern bar stool";"Un tabouret de bar moderne";"If you're looking for a chic, counter height stool that features clean lines and a modern sensibility, look no further than our ''Nibbler'' stool. A chrome-finished base, oval footrest and adjustable, gas-lift mechanism add to its modern look.";"Si vous recherchez un tabouret haut et chic, n'allez pas plus loin que notre tabouret ''Nibbler'' avec ses lignes pures et sa modernité. Une base chromée, un repose-pieds oval ajustable et un mécanisme à gaz ajoute à son look moderne.";"Dimensions : Width : 19'' – Depth : 18'' – Height : 29''";"Dimensions : Larg 50 cm – Prof. 45 cm – Haut. 75 cm";"78";"";"PROD029-1.jpg";"MAGIS";"black";"Plastic;Metal";"";"Stools" +"PROD030";"Ron";"Get a look at the futur";"Une incursion dans le futur";"Get a look at the future — retro style — with our ''Ron'' bar stool! The contemporary design of the seating with a cut-out oval in the back for distinctive character, while the lively range of colours and high gloss make a big style statement. A chrome-finished base, oval footrest and adjustable, gas-lift mechanism add to the fresh look. Eye-catching and fun, the ''ron'' stool is a must-have for today's hottest dining area and bars. ";"Revisitez le futur avec une note retro grâce au tabouret de bar ''Ron''! Le design contemporain de ce siège grâce à l'ouverture ovale dans son dossier et une large gamme de couleurs vives. Son rendu glossy lui donne un style tout particulier. Une base chromée, un repose-pieds oval ajustable et un mécanisme à gaz ajoute à son look moderne. Surprenant et joyeux, le tabouret ''Ron'' est un incontournable des coin repas et des bars les plus branchés";"Dimensions : Width : 19'' – Depth : 18'' – Height : 29''";"Dimensions : Larg 50 cm – Prof. 45 cm – Haut. 75 cm";"96";"";"PROD030-1.jpg;PROD030-2.jpg;PROD030-3.jpg;PROD030-4.jpg;";"OFFUS";"blue;yellow;orange;purple";"Plastic;Metal";"";"Stools" diff --git a/setup/insert.sql b/setup/insert.sql new file mode 100644 index 00000000..de530e6f --- /dev/null +++ b/setup/insert.sql @@ -0,0 +1,7694 @@ +INSERT INTO `lang`(`id`,`title`,`code`,`locale`,`url`,`date_format`,`time_format`,`datetime_format`,`decimal_separator`,`thousands_separator`,`decimals`,`active`,`visible`,`by_default`,`created_at`,`updated_at`)VALUES +(1, 'Français', 'fr', 'fr_FR', '', 'd/m/Y', 'H:i:s', 'd/m/Y H:i:s', ',', ' ', '2', '1', '1', '0', NOW(), NOW()), +(2, 'English', 'en', 'en_US', '', 'm-d-Y', 'h:i:s', 'm-d-Y h:i:s', '.', ' ', '2', '1', '1', '1', NOW(), NOW()), +(3, 'Castellano', 'es', 'es_ES', '', 'm-d-Y', 'h:i:s', 'm-d-Y h:i:s', ',', '.', '2', '1', '1', '0', NOW(), NOW()), +(4, 'Italiano', 'it', 'it_IT', '', 'd/m/Y', 'H:i:s', 'd/m/y H:i:s', ',', ' ', '2', '1', '1', '0', NOW(), NOW()), +(5, 'Russian', 'ru', 'ru_RU', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', '0', '0', '0', NOW(), NOW()), +(6, 'Czech', 'cs', 'cs_CZ', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', '0', '0', '0', NOW(), NOW()), +(7, 'Deutsch', 'de', 'de_DE', '', 'd-m-Y', 'H:i:s', 'd-m-Y H:i:s', ',', '.', '2', '0', '0', '0', NOW(), NOW()); + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(1, 'check-available-stock', '1', 0, 0, NOW(), NOW()), +(2, 'active-front-template', 'default', 0, 0, NOW(), NOW()), +(3, 'active-admin-template', 'default', 0, 0, NOW(), NOW()), +(4, 'active-pdf-template', 'default', 0, 0, NOW(), NOW()), +(5, 'active-mail-template', 'default', 0, 0, NOW(), NOW()), +(6, 'rewriting_enable', '0', 0, 0, NOW(), NOW()), +(7, 'imagine_graphic_driver', 'gd', 0, 0, NOW(), NOW()), +(8, 'default_images_quality_percent', '75', 0, 0, NOW(), NOW()), +(9, 'original_image_delivery_mode', 'symlink', 0, 0, NOW(), NOW()), +(10, 'original_document_delivery_mode', 'symlink', 0, 0, NOW(), NOW()), +(11, 'images_library_path', 'local/media/images', 0, 0, NOW(), NOW()), +(12, 'documents_library_path', 'local/media/documents', 0, 0, NOW(), NOW()), +(13, 'image_cache_dir_from_web_root', 'cache/images', 0, 0, NOW(), NOW()), +(14, 'document_cache_dir_from_web_root', 'cache/documents', 0, 0, NOW(), NOW()), +(15, 'page_not_found_view', '404.html', 0, 0, NOW(), NOW()), +(16, 'obsolete_rewriten_url_view', 'obsolete-rewritten-url', 0, 0, NOW(), NOW()), +(17, 'use_tax_free_amounts', 0, 0, 0, NOW(), NOW()), +(18, 'process_assets', '0', 0, 0, NOW(), NOW()), +(19, 'thelia_admin_remember_me_cookie_name', 'tarmcn', 0, 0, NOW(), NOW()), +(20, 'thelia_admin_remember_me_cookie_expiration', 2592000, 0, 0, NOW(), NOW()), +(21, 'thelia_customer_remember_me_cookie_name', 'tcrmcn', 0, 0, NOW(), NOW()), +(22, 'thelia_customer_remember_me_cookie_expiration', 31536000, 0, 0, NOW(), NOW()), +(23, 'url_site','', 0, 0, NOW(), NOW()), +(24, 'pdf_invoice_file', 'invoice', 0, 0, NOW(), NOW()), +(25, 'pdf_delivery_file', 'delivery', 0, 0, NOW(), NOW()), +(26, 'unknown-flag-path','assets/img/flags/unknown.png', 0, 0, NOW(), NOW()), +(27, 'html_output_trim_level','1', 0, 0, NOW(), NOW()), +(28, 'default_available_stock', '100', 0, 0, NOW(), NOW()), +(29, 'information_folder_id', '', 0, 0, NOW(), NOW()), +(30, 'terms_conditions_content_id', '', 0, 0, NOW(), NOW()), +(31, 'allow_negative_stock', '0', 0, 0, NOW(), NOW()), +(32, 'cart.use_persistent_cookie', '1', 0, 0, NOW(), NOW()), +(33, 'cart.cookie_name', 'thelia_cart', 0, 0, NOW(), NOW()), +(34, 'cart.cookie_lifetime', '31536060', 0, 0, NOW(), NOW()), +(35, 'session_config.lifetime', '0', 0, 0, NOW(), NOW()), +(36, 'session_config.default', '1', 1, 1, NOW(), NOW()), +(37, 'default_lang_without_translation', '1', 1, 1, NOW(), NOW()), +(38, 'store_name','', 0, 1, NOW(), NOW()), +(39, 'store_description','', 0, 1, NOW(), NOW()), +(40, 'store_email','', 0, 1, NOW(), NOW()), +(41, 'store_notification_emails','', 0, 1, NOW(), NOW()), +(42, 'one_domain_foreach_lang','0', 1, 1, NOW(), NOW()), +(43, 'thelia_version','2.3.1', 1, 1, NOW(), NOW()), +(44, 'thelia_major_version','2', 1, 1, NOW(), NOW()), +(45, 'thelia_minus_version','3', 1, 1, NOW(), NOW()), +(46, 'thelia_release_version','1', 1, 1, NOW(), NOW()), +(47, 'thelia_extra_version','', 1, 1, NOW(), NOW()), +(48, 'front_cart_country_cookie_name','fcccn', 1, 1, NOW(), NOW()), +(49, 'front_cart_country_cookie_expires','2592000', 1, 1, NOW(), NOW()), +(50, 'sitemap_ttl','7200', 1, 1, NOW(), NOW()), +(51, 'feed_ttl','7200', 1, 1, NOW(), NOW()), +(52, 'form_firewall_bruteforce_time_to_wait', '10', 0, 0, NOW(), NOW()), +(53, 'form_firewall_time_to_wait', '60', 0, 0, NOW(), NOW()), +(54, 'form_firewall_bruteforce_attempts', '10', 0, 0, NOW(), NOW()), +(55, 'form_firewall_attempts', '6', 0, 0, NOW(), NOW()), +(56, 'form_firewall_active', '1', 0, 0, NOW(), NOW()), +(57, 'allow_slash_ended_uri', '1', 0, 0, NOW(), NOW()), +(58, 'error_message.show', '1', 0, 0, NOW(), NOW()), +(59, 'error_message.page_name', 'error.html', 0, 0, NOW(), NOW()), +(60, 'customer_change_email', '0', 0, 0, NOW(), NOW()), +(61, 'customer_confirm_email', '1', 0, 0, NOW(), NOW()), +(62, 'form.secret', 'ThisIsNotASecret', 0, 0, NOW(), NOW()), +(63, 'minimum_admin_password_length', '4', 0, 0, NOW(), NOW()), +(64, 'enable_lost_admin_password_recovery', '1', 0, 0, NOW(), NOW()), +(65, 'notify_newsletter_subscription', '1', 0, 0, NOW(), NOW()), +(66, 'number_default_results_per_page.product_list', '20', 0, 0, NOW(), NOW()), +(67, 'number_default_results_per_page.order_list', '20', 0, 0, NOW(), NOW()), +(68, 'number_default_results_per_page.customer_list', '20', 0, 0, NOW(), NOW()) +; + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +(1, 'Carousel', 1, 0, 1, 'Carousel\\Carousel', NOW(), NOW()), +(2, 'Colissimo', 2, 0, 1, 'Colissimo\\Colissimo', NOW(), NOW()), +(3, 'Cheque', 3, 0, 1, 'Cheque\\Cheque', NOW(), NOW()), +(4, 'Front', 1, 1, 2, 'Front\\Front', NOW(), NOW()), +(5, 'Tinymce', 1, 0, 16, 'Tinymce\\Tinymce', NOW(), NOW()), +(6, 'HookNavigation', 1, 1, 11, 'HookNavigation\\HookNavigation', NOW(), NOW()), +(7, 'HookCurrency', 1, 1, 3, 'HookCurrency\\HookCurrency', NOW(), NOW()), +(8, 'HookLang', 1, 1, 4, 'HookLang\\HookLang', NOW(), NOW()), +(9, 'HookSearch', 1, 1, 5, 'HookSearch\\HookSearch', NOW(), NOW()), +(10, 'HookCustomer', 1, 1, 6, 'HookCustomer\\HookCustomer', NOW(), NOW()), +(11, 'HookCart', 1, 1, 7, 'HookCart\\HookCart', NOW(), NOW()), +(12, 'HookAnalytics', 1, 1, 8, 'HookAnalytics\\HookAnalytics', NOW(), NOW()), +(13, 'HookContact', 1, 1, 9, 'HookContact\\HookContact', NOW(), NOW()), +(14, 'HookLinks', 1, 1, 10, 'HookLinks\\HookLinks', NOW(), NOW()), +(15, 'HookNewsletter', 1, 1, 12, 'HookNewsletter\\HookNewsletter', NOW(), NOW()), +(16, 'HookSocial', 1, 1, 13, 'HookSocial\\HookSocial', NOW(), NOW()), +(17, 'HookProductsNew', 1, 1, 14, 'HookProductsNew\\HookProductsNew', NOW(), NOW()), +(18, 'HookProductsOffer', 1, 1, 15, 'HookProductsOffer\\HookProductsOffer', NOW(), NOW()), +(19, 'TheliaSmarty', 1, 1, 16, 'TheliaSmarty\\TheliaSmarty', NOW(), NOW()), +(20, 'VirtualProductControl', 1, 1, 17, 'VirtualProductControl\\VirtualProductControl', NOW(), NOW()), +(21, 'HookAdminHome', 1, 1, 18, 'HookAdminHome\\HookAdminHome', NOW(), NOW()) +; + +-- Insert front hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(1, 'order-invoice.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(2, 'order-invoice.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(3, 'order-invoice.payment-extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(4, 'order-invoice.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(5, 'order-invoice.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(6, 'order-invoice.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(7, 'order-invoice.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(8, 'order-payment-gateway.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(9, 'order-payment-gateway.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(10, 'order-payment-gateway.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(11, 'order-payment-gateway.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(12, 'order-payment-gateway.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(13, 'sitemap.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(14, 'currency.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(15, 'currency.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(16, 'currency.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(17, 'currency.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(18, 'currency.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(19, 'login.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(20, 'login.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(21, 'login.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(22, 'login.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(23, 'login.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(24, 'login.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(25, 'login.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(26, 'login.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(27, 'login.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(28, 'account-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(29, 'account-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(30, 'account-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(31, 'account-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(32, 'account-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(33, 'account-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(34, 'account-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(35, 'cart.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(36, 'cart.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(37, 'cart.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(38, 'cart.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(39, 'cart.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(40, 'contact.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(41, 'contact.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(42, 'contact.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(43, 'contact.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(44, 'contact.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(45, 'contact.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(46, 'contact.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(47, 'order-placed.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(48, 'order-placed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(49, 'order-placed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(50, 'order-placed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(51, 'search.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(52, 'search.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(53, 'search.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(54, 'register.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(55, 'register.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(56, 'register.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(57, 'register.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(58, 'register.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(59, 'register.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(60, 'register.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(61, 'password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(62, 'password.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(63, 'password.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(64, 'password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(65, 'password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(66, 'password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(67, 'password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(68, 'language.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(69, 'language.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(70, 'language.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(71, 'language.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(72, 'language.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(73, 'contact.success', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(74, 'newsletter.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(75, 'newsletter.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(76, 'newsletter.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(77, 'newsletter.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(78, 'newsletter.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(79, 'badresponseorder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(80, 'badresponseorder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(81, 'badresponseorder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(82, 'content.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(83, 'content.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(84, 'content.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(85, 'content.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(86, 'content.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(87, 'content.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(88, 'content.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(89, 'main.head-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(90, 'main.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(91, 'main.head-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(92, 'main.body-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(93, 'main.header-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(94, 'main.navbar-secondary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(95, 'main.navbar-primary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(96, 'main.header-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(97, 'main.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(98, 'main.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(99, 'main.footer-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(100, 'main.footer-body', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(101, 'main.footer-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(102, 'main.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(103, 'main.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(104, 'main.body-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(105, '404.content', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(106, '404.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(107, '404.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(108, '404.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(109, 'order-delivery.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(110, 'order-delivery.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(111, 'order-delivery.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(112, 'order-delivery.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(113, 'order-delivery.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(114, 'order-delivery.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(115, 'order-delivery.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(116, 'address-create.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(117, 'address-create.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(118, 'address-create.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(119, 'address-create.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(120, 'address-create.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(121, 'address-create.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(122, 'address-create.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(123, 'folder.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(124, 'folder.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(125, 'folder.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(126, 'folder.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(127, 'folder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(128, 'folder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(129, 'folder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(130, 'order-failed.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(131, 'order-failed.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(132, 'order-failed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(133, 'order-failed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(134, 'order-failed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(135, 'category.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(136, 'category.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(137, 'category.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(138, 'category.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(139, 'category.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(140, 'category.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(141, 'category.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(142, 'address-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(143, 'address-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(144, 'address-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(145, 'address-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(146, 'address-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(147, 'address-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(148, 'address-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(149, 'home.body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(150, 'home.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(151, 'home.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(152, 'home.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(153, 'account-password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(154, 'account-password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(155, 'account-password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(156, 'account-password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(157, 'account-password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(158, 'product.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(159, 'product.gallery', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(160, 'product.details-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(161, 'product.details-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(162, 'product.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(163, 'product.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(164, 'product.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(165, 'product.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(166, 'product.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(167, 'account.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(168, 'account.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(169, 'account.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(170, 'account.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(171, 'account.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(172, 'viewall.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(173, 'viewall.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(174, 'viewall.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(175, 'viewall.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(176, 'viewall.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(177, 'singleproduct.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(178, 'singleproduct.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(179, 'category.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(180, 'category.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(181, 'category.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(182, 'content.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(183, 'content.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(184, 'content.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(185, 'order-delivery.extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(186, 'order-delivery.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(187, 'category.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(188, 'category.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(189, 'content.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(190, 'content.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(191, 'folder.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(192, 'folder.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(193, 'brand.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(194, 'brand.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(195, 'brand.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(196, 'brand.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(197, 'brand.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(198, 'brand.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(199, 'brand.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(200, 'brand.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(201, 'brand.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(202, 'brand.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(203, 'brand.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(204, 'brand.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(205, 'account-order.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(206, 'account-order.information', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(207, 'account-order.after-information', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(208, 'account-order.delivery-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(209, 'account-order.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(210, 'account-order.invoice-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(211, 'account-order.invoice-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(212, 'account-order.after-addresses', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(213, 'account-order.products-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(214, 'account-order.product-extra', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(215, 'account-order.products-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(216, 'account-order.after-products', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(217, 'account-order.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(218, 'account-order.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(219, 'account-order.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(220, 'account-order.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(221, 'account.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(222, 'account-order.product', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(223, 'mini-cart', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(224, 'sale.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(225, 'sale.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(226, 'sale.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(227, 'sale.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(228, 'sale.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(229, 'sale.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(230, 'sale.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(231, 'sale.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(232, 'sale.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(233, 'account-order.invoice-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(234, 'account-order.delivery-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(235, 'newsletter-unsubscribe.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(236, 'newsletter-unsubscribe.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(237, 'newsletter-unsubscribe.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(238, 'newsletter-unsubscribe.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(239, 'newsletter-unsubscribe.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +-- Insert admin hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(1000, 'category.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1001, 'content.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1002, 'folder.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1003, 'order.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1004, 'product.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1005, 'features-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1006, 'features-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1007, 'feature.value-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1008, 'feature.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1009, 'product.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1010, 'coupon.create-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1011, 'taxes.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1012, 'tax-rule.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1013, 'tools.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1014, 'tools.col1-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1015, 'tools.col1-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1016, 'tools.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1017, 'tools.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1018, 'messages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1019, 'messages.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1020, 'messages.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1021, 'messages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1022, 'message.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1023, 'message.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1024, 'messages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1025, 'taxes-rules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1026, 'taxes-rules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1027, 'tax.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1028, 'tax.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1029, 'tax-rule.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1030, 'tax-rule.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1031, 'taxes-rules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1032, 'exports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1033, 'exports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1034, 'exports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1035, 'exports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1036, 'export.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1037, 'product.folders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1038, 'product.folders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1039, 'product.details-pricing-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1040, 'product.details-details-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1041, 'product.details-promotion-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1042, 'product.before-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1043, 'product.combinations-list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1044, 'product.after-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1045, 'product.combination-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1046, 'modules.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1047, 'modules.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1048, 'currency.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1049, 'category.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1050, 'category.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1051, 'category.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1052, 'document.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1053, 'customer.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1054, 'customers.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1055, 'customers.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1056, 'customers.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1057, 'customer.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1058, 'customer.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1059, 'customer.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1060, 'customers.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1061, 'product.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1062, 'product.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1063, 'product.accessories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1064, 'product.accessories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1065, 'product.categories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1066, 'product.categories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1067, 'product.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1068, 'product.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1069, 'product.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1070, 'product.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1071, 'template.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1072, 'template.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1073, 'template.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1074, 'template.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1075, 'templates.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1076, 'templates.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1077, 'templates.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1078, 'templates.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1079, 'template.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1080, 'template.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1081, 'templates.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1082, 'configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1083, 'configuration.catalog-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1084, 'configuration.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1085, 'configuration.shipping-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1086, 'configuration.shipping-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1087, 'configuration.system-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1088, 'configuration.system-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1089, 'configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1090, 'configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1091, 'index.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1092, 'index.middle', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1093, 'index.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1094, 'orders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1095, 'orders.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1096, 'orders.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1097, 'orders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1098, 'orders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1099, 'shipping-zones.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1100, 'shipping-zones.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1101, 'shipping-zones.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1102, 'shipping-zones.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1103, 'shipping-zones.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1104, 'content.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1105, 'home.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1106, 'home.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1107, 'home.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1108, 'modules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1109, 'modules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1110, 'modules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1111, 'languages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1112, 'languages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1113, 'language.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1114, 'languages.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1115, 'languages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1116, 'zone.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1117, 'shipping-zones.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1118, 'system.logs-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1119, 'search.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1120, 'search.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1121, 'search.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1122, 'administrators.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1123, 'administrators.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1124, 'administrator.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1125, 'administrator.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1126, 'administrator.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1127, 'administrators.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1128, 'module-hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1129, 'shipping-configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1130, 'shipping-configuration.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1131, 'shipping-configuration.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1132, 'shipping-configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1133, 'shipping-configuration.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1134, 'shipping-configuration.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1135, 'shipping-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1136, 'features.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1137, 'features.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1138, 'features.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1139, 'features.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1140, 'feature.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1141, 'feature.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1142, 'feature.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1143, 'feature.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1144, 'features.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1145, 'module.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1146, 'module-hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1147, 'module-hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1148, 'module-hook.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1149, 'shipping-configuration.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1150, 'shipping-configuration.country-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1151, 'shipping-configuration.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1152, 'mailing-system.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1153, 'mailing-system.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1154, 'mailing-system.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1155, 'categories.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1156, 'categories.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1157, 'categories.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1158, 'categories.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1159, 'products.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1160, 'products.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1161, 'products.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1162, 'categories.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1163, 'categories.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1164, 'category.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1165, 'product.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1166, 'category.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1167, 'product.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1168, 'categories.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1169, 'variables.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1170, 'variables.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1171, 'variables.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1172, 'variables.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1173, 'variable.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1174, 'variable.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1175, 'variables.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1176, 'order.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1177, 'order.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1178, 'config-store.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1179, 'translations.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1180, 'folders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1181, 'folders.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1182, 'folders.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1183, 'folders.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1184, 'contents.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1185, 'contents.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1186, 'contents.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1187, 'folders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1188, 'folder.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1189, 'content.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1190, 'folder.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1191, 'content.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1192, 'folders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1193, 'template.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1194, 'tax.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1195, 'hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1196, 'countries.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1197, 'countries.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1198, 'countries.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1199, 'countries.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1200, 'country.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1201, 'country.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1202, 'countries.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1203, 'currencies.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1204, 'currencies.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1205, 'currencies.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1206, 'currencies.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1207, 'currency.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1208, 'currency.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1209, 'currencies.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1210, 'customer.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1211, 'customer.address-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1212, 'customer.address-update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1213, 'customer.address-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1214, 'customer.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1215, 'attributes-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1216, 'attributes-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1217, 'attribute-value.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1218, 'attribute.id-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1219, 'attribute.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1220, 'profiles.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1221, 'profiles.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1222, 'profile.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1223, 'profile.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1224, 'profiles.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1225, 'country.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1226, 'profile.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1227, 'variable.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1228, 'coupon.update-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1229, 'coupon.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1230, 'coupon.list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1231, 'coupon.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1232, 'coupon.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1233, 'coupon.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1234, 'coupon.list-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1235, 'module.configuration', 2, 1, 0, 1, 1, 1, NOW(), NOW()), +(1236, 'module.config-js', 2, 1, 0, 1, 1, 1, NOW(), NOW()), +(1237, 'message.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1238, 'image.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1239, 'attributes.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1240, 'attributes.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1241, 'attributes.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1242, 'attributes.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1243, 'attribute.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1244, 'attribute.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1245, 'attribute.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1246, 'attribute.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1247, 'attributes.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1248, 'admin-logs.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1249, 'admin-logs.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1250, 'admin-logs.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1251, 'folder.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1252, 'hooks.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1253, 'hooks.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1254, 'hooks.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1255, 'hooks.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1256, 'hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1257, 'hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1258, 'hooks.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1259, 'main.head-css', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1260, 'main.before-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1261, 'main.inside-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1262, 'main.after-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1263, 'main.before-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1264, 'main.in-top-menu-items', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1265, 'main.after-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1266, 'main.before-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1267, 'main.in-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1268, 'main.after-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1269, 'main.footer-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1270, 'main.topbar-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1271, 'main.topbar-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1272, 'main.top-menu-customer', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1273, 'main.top-menu-order', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1274, 'main.top-menu-catalog', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1275, 'main.top-menu-content', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1276, 'main.top-menu-tools', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1277, 'main.top-menu-modules', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1278, 'main.top-menu-configuration', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1279, 'brand.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1280, 'home.block', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1281, 'brands.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1282, 'brands.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1283, 'brands.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1284, 'brands.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1285, 'brand.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1286, 'brand.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1287, 'brand.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1288, 'imports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1289, 'imports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1290, 'imports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1291, 'imports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1292, 'import.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1293, 'brand.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1294, 'customer.orders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1295, 'customer.orders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1296, 'sales.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1297, 'sales.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1298, 'sales.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1299, 'sales.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1300, 'sale.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1301, 'sale.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1302, 'sales.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1303, 'product.combinations-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1304, 'main.before-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1305, 'main.after-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1306, 'category.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1307, 'product.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1308, 'folder.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1309, 'content.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1310, 'brand.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1311, 'order-edit.bill-delivery-address', 2, 1, 0, 1, 1, 1, NOW(), NOW()), +(1312, 'product.modification.form_top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1313, 'product.modification.form_bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1314, 'brand.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1315, 'sale.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1316, 'api.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1317, 'api.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1318, 'api.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1319, 'coupon.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1320, 'order.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1321, 'profile.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1322, 'profile.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1323, 'import.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1324, 'import.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1325, 'export.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1326, 'export.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1327, 'category-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1328, 'category-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1329, 'brand-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1330, 'brand-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1331, 'attribute-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1332, 'attribute-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1333, 'currency-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1334, 'currency-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1335, 'country-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1336, 'country-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1337, 'content-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1338, 'content-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1339, 'feature-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1340, 'feature-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1341, 'document-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1342, 'document-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1343, 'customer-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1344, 'customer-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1345, 'image-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1346, 'image-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1347, 'hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1348, 'hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1349, 'folder-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1350, 'folder-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1351, 'module-hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1352, 'module-hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1353, 'module-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1354, 'module-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1355, 'message-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1356, 'message-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1357, 'profile-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1358, 'profile-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1359, 'product-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1360, 'product-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1361, 'order-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1362, 'order-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1363, 'shipping-zones-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1364, 'shipping-zones-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1365, 'shipping-configuration-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1366, 'shipping-configuration-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1367, 'sale-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1368, 'sale-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1369, 'variables-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1370, 'variables-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1371, 'template-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1372, 'template-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1373, 'tax-rule-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1374, 'tax-rule-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1375, 'tax-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1376, 'tax-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1377, 'order-edit.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1378, 'tab-seo.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1379, 'tab-seo.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1380, 'tab-image.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1381, 'tab-image.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1382, 'tab-document.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1383, 'tab-document.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1384, 'export.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1385, 'export.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1386, 'order-edit.customer-information-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1387, 'order-edit.payment-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1388, 'order-edit.delivery-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1389, 'tab-seo.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1390, 'order-edit.order-product-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1391, 'order-edit.order-product-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1392, 'administrators.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1393, 'administrators.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1394, 'advanced-configuration', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1395, 'advanced-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1396, 'brand.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1397, 'brand.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1398, 'category.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1399, 'category.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1400, 'content.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1401, 'content.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1402, 'folder.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1403, 'folder.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1404, 'product.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1405, 'product.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1406, 'state-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1407, 'state-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1408, 'state.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1409, 'states.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1410, 'states.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1411, 'states.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1412, 'states.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1413, 'state.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1414, 'state.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1415, 'states.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()); + +-- Insert pdf hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(2001, 'invoice.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2002, 'invoice.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2003, 'invoice.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2004, 'invoice.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2005, 'invoice.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2006, 'invoice.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), +(2007, 'invoice.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2008, 'invoice.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), +(2009, 'invoice.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2010, 'invoice.after-products', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2011, 'invoice.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2012, 'delivery.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2013, 'delivery.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2014, 'delivery.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2015, 'delivery.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2016, 'delivery.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2017, 'delivery.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), +(2018, 'delivery.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2019, 'delivery.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), +(2020, 'delivery.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2021, 'delivery.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2022, 'order-placed.additional-payment-info', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(2023, 'wysiwyg.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2024, 'order-edit.cart-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2025, 'order-edit.cart-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2026, 'order-edit.bill-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2027, 'order-edit.bill-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2028, 'order-edit.before-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2029, 'order-edit.before-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2030, 'order-edit.after-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2031, 'order-edit.after-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2032, 'invoice.after-payment-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2033, 'invoice.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2034, 'delivery.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2035, 'invoice.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2036, 'delivery.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +-- Insert email hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(3000, 'email-html.layout.css', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3001, 'email-html.layout.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3002, 'email-html.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3003, 'email-html.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3004, 'email-html.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3005, 'email-html.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3006, 'email-html.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3007, 'email-html.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3008, 'email-html.order-confirmation.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3009, 'email-html.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3010, 'email-html.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3011, 'email-html.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3012, 'email-html.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3013, 'email-html.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3014, 'email-html.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3015, 'email-txt.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3016, 'email-txt.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3017, 'email-txt.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3018, 'email-txt.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3019, 'email-txt.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3020, 'email-txt.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3021, 'email-txt.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3022, 'email-txt.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3023, 'email-txt.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3024, 'email-txt.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3025, 'email-txt.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3026, 'email-txt.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `customer_title`(`id`, `by_default`, `position`, `created_at`, `updated_at`) VALUES +(1, 1, 1, NOW(), NOW()), +(2, 0, 2, NOW(), NOW()), +(3, 0, 3, NOW(), NOW()); + +INSERT INTO `currency` (`id`, `code`, `symbol`, `format`, `rate`, `visible`, `position`, `by_default`, `created_at`, `updated_at`) +VALUES +(1, 'EUR', '€', '%n %s','1.00', 1, 1, '1', NOW(), NOW()), +(2, 'USD', '$', '%s%n', '1.26', 1, 2, '0', NOW(), NOW()), +(3, 'GBP', '£', '%s%n','0.89', 1, 3, '0', NOW(), NOW()), +(4, 'CHF', 'CHF', '%n %s', '1.34183', 0, 4, '0', NOW(), NOW()), +(5, 'MXN', '$', '%n %s', '17.1304', 0, 5, '0', NOW(), NOW()), +(6, 'PLN', 'zł', '%n %s', '3.84510', 0, 6, '0', NOW(), NOW()), +(7, 'CNY', '¥', '%s %n', '9.13916', 0, 7, '0', NOW(), NOW()), +(8, 'NOK', 'kr', '%n %s', '7.97791', 0, 8, '0', NOW(), NOW()), +(9, 'MDL', 'MDL', '%n %s', '16.1774', 0, 9, '0', NOW(), NOW()), +(10, 'PYG', 'Gs', '%n %s', '6547.98', 0, 10, '0', NOW(), NOW()), +(11, 'ARS', 'ARS', '%n %s', '5.39', 0, 11, '0', NOW(), NOW()), +(12, 'BYR', 'р.', '%n%s', '1.000000', 0, 12, '0', NOW(), NOW()), +(13, 'FJD', '$', '%s%n', '2.57483', 0, 13, '0', NOW(), NOW()), +(14, 'RSD', 'RSD', '%n %s', '115.680000', 0, 14, '0', NOW(), NOW()), +(15, 'SEK', 'kr', '%n %s', '9.14651', 0, 15, '0', NOW(), NOW()), +(16, 'HRK', 'kn', '%n %s', '1.000000', 0, 16, '0', NOW(), NOW()), +(17, 'DKK', 'kr', '%n %s', '7.45201', 0, 17, '0', NOW(), NOW()), +(18, 'NGN', '₦', '%s %n', '1.000000', 0, 18, '0', NOW(), NOW()), +(19, 'HKD', '$', '%n %s', '11.0512', 0, 19, '0', NOW(), NOW()), +(20, 'CAD', 'CAD$', '%s%n', '1.40054', 0, 20, '0', NOW(), NOW()), +(21, 'SAR', '﷼', '%n %s', '5.10682', 0, 21, '0', NOW(), NOW()), +(22, 'CZK', 'Kč', '%n %s', '1', 0, 22, '0', NOW(), NOW()), +(23, 'CRC', '₡', '%s %n', '560', 0, 23, '0', NOW(), NOW()), +(24, 'AZN', 'AZN', '%n %s', '1.09237', 0, 24, '0', NOW(), NOW()), +(25, 'IDR', 'Rp‎', '%n %s', '12177.63', 0, 25, '0', NOW(), NOW()), +(26, 'PKR', '₨', '%n %s', '117.289', 0, 26, '0', NOW(), NOW()), +(27, 'BRL', 'R$', '%s %n', '2.31583', 0, 27, '0', NOW(), NOW()), +(28, 'VND', '₫', '%n %s', '26505.85', 0, 28, '0', NOW(), NOW()), +(29, 'PHP', 'PHP', '%s %n', '1.000000', 0, 29, '0', NOW(), NOW()), +(30, 'GTQ', 'Q', '%n %s', '11.0988', 0, 30, '0', NOW(), NOW()), +(31, 'TRY', 'TL', '%n %s', '1.97638', 0, 31, '0', NOW(), NOW()), +(32, 'JPY', '¥', '%s %n', '113.786', 0, 32, '0', NOW(), NOW()), +(33, 'RUB', 'руб', '%n %s', '41.7632', 0, 33, '0', NOW(), NOW()), +(34, 'PEN', 'S/.', '%s %n', '2.784499', 0, 34, '0', NOW(), NOW()), +(35, 'EGP', '£', '%s %n', '7.77518', 0, 35, '0', NOW(), NOW()), +(36, 'GEL', 'ლ', '%n %s', '2.46684', 0, 36, '0', NOW(), NOW()), +(37, 'BOB', '$b', '%n %s', '9.57620', 0, 37, '0', NOW(), NOW()), +(38, 'AED', 'AED', '%s %n', '1.000000', 0, 38, '0', NOW(), NOW()), +(39, 'THB', '฿', '%n %s', '41.4441', 0, 39, '0', NOW(), NOW()), +(40, 'ILS', '₪‎', '%n%s', '4.97713', 0, 40, '0', NOW(), NOW()), +(41, 'MYR', 'RM', '%s%n', '1.000000', 0, 41, '0', NOW(), NOW()), +(42, 'VEF', 'Bs', '%n %s', '5.84819', 0, 42, '0', NOW(), NOW()), +(43, 'HUF', 'Ft‎', '%n %s', '276.334', 0, 43, '0', NOW(), NOW()), +(44, 'KES', 'KSh', '%s %n', '1.000000', 0, 44, '0', NOW(), NOW()), +(45, 'UAH', '₴', '%n %s', '1', 0, 45, '0', NOW(), NOW()), +(46, 'TND', 'DT', '%n%s', '1.000000', 0, 46, '0', NOW(), NOW()), +(47, 'BGN', 'лв', '%n %s', '1.95580', 0, 47, '0', NOW(), NOW()), +(48, 'INR', '₹', '%s %n', '60.748205', 0, 48, '0', NOW(), NOW()); + +INSERT INTO `area` (`id`, `name`, `postage`, `created_at`, `updated_at`) VALUES +(1, 'France', NULL, NOW(), NOW()), +(2, 'A Zone', NULL, NOW(), NOW()), +(3, 'B Zone', NULL, NOW(), NOW()), +(4, 'C Zone', NULL, NOW(), NOW()), +(5, 'France OM1', NULL, NOW(), NOW()), +(6, 'France OM2', NULL, NOW(), NOW()), +(7, 'Europe', NULL, NOW(), NOW()), +(8, 'North America', NULL, NOW(), NOW()), +(9, 'Asia', NULL, NOW(), NOW()), +(10, 'Africa', NULL, NOW(), NOW()), +(11, 'Oceania', NULL, NOW(), NOW()), +(12, 'South America', NULL, NOW(), NOW()), +(13, 'Europe (non-EU)', NULL, NOW(), NOW()), +(14, 'Central America/Antilla', NULL, NOW(), NOW()); + +INSERT INTO `area_delivery_module` (`id`, `area_id`, `delivery_module_id`, `created_at`, `updated_at`) VALUES +(1, 1, 2, NOW(), NOW()), +(2, 2, 2, NOW(), NOW()), +(3, 3, 2, NOW(), NOW()), +(4, 4, 2, NOW(), NOW()), +(5, 5, 2, NOW(), NOW()), +(6, 6, 2, NOW(), NOW()); + +INSERT INTO `country` (`id`, `visible`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `has_states`, `need_zip_code`, `zip_code_format`, `created_at`, `updated_at`) VALUES +(1, 1, '4', 'AF', 'AFG', 0, 0, '0', '0', '', NOW(), NOW()), +(2, 1, '710', 'ZA', 'ZAF', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(3, 1, '8', 'AL', 'ALB', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(4, 1, '12', 'DZ', 'DZA', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(5, 1, '276', 'DE', 'DEU', 0, 0, '0', '1', '', NOW(), NOW()), +(6, 1, '20', 'AD', 'AND', 0, 0, '0', '1', 'CNNN', NOW(), NOW()), +(7, 1, '24', 'AO', 'AGO', 0, 0, '0', '0', '', NOW(), NOW()), +(8, 1, '28', 'AG', 'ATG', 0, 0, '0', '1', '', NOW(), NOW()), +(9, 1, '682', 'SA', 'SAU', 0, 0, '0', '1', '', NOW(), NOW()), +(10, 1, '32', 'AR', 'ARG', 0, 0, '1', '1', 'LNNNN', NOW(), NOW()), +(11, 1, '51', 'AM', 'ARM', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(12, 1, '36', 'AU', 'AUS', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(13, 1, '40', 'AT', 'AUT', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(14, 1, '31', 'AZ', 'AZE', 0, 0, '0', '1', 'CNNNN', NOW(), NOW()), +(15, 1, '44', 'BS', 'BHS', 0, 0, '0', '1', '', NOW(), NOW()), +(16, 1, '48', 'BH', 'BHR', 0, 0, '0', '1', '', NOW(), NOW()), +(17, 1, '50', 'BD', 'BGD', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(18, 1, '52', 'BB', 'BRB', 0, 0, '0', '1', 'CNNNNN', NOW(), NOW()), +(19, 1, '585', 'PW', 'PLW', 0, 0, '0', '1', '', NOW(), NOW()), +(20, 1, '56', 'BE', 'BEL', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(21, 1, '84', 'BL', 'BLZ', 0, 0, '0', '1', '', NOW(), NOW()), +(22, 1, '204', 'BJ', 'BEN', 0, 0, '0', '0', '', NOW(), NOW()), +(23, 1, '64', 'BT', 'BTN', 0, 0, '0', '1', '', NOW(), NOW()), +(24, 1, '112', 'BY', 'BLR', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(25, 1, '104', 'MM', 'MMR', 0, 0, '0', '1', '', NOW(), NOW()), +(26, 1, '68', 'BO', 'BOL', 0, 0, '0', '1', '', NOW(), NOW()), +(27, 1, '70', 'BA', 'BIH', 0, 0, '0', '1', '', NOW(), NOW()), +(28, 1, '72', 'BW', 'BWA', 0, 0, '0', '1', '', NOW(), NOW()), +(29, 1, '76', 'BR', 'BRA', 0, 0, '0', '1', 'NNNNN-NNN', NOW(), NOW()), +(30, 1, '96', 'BN', 'BRN', 0, 0, '0', '1', 'LLNNNN', NOW(), NOW()), +(31, 1, '100', 'BG', 'BGR', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(32, 1, '854', 'BF', 'BFA', 0, 0, '0', '1', '', NOW(), NOW()), +(33, 1, '108', 'BI', 'BDI', 0, 0, '0', '1', '', NOW(), NOW()), +(34, 1, '116', 'KH', 'KHM', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(35, 1, '120', 'CM', 'CMR', 0, 0, '0', '1', '', NOW(), NOW()), +(37, 1, '132', 'CV', 'CPV', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(38, 1, '152', 'CL', 'CHL', 0, 0, '0', '1', 'NNN-NNNN', NOW(), NOW()), +(39, 1, '156', 'CN', 'CHN', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(40, 1, '196', 'CY', 'CYP', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(41, 1, '170', 'CO', 'COL', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(42, 1, '174', 'KM', 'COM', 0, 0, '0', '1', '', NOW(), NOW()), +(43, 1, '178', 'CG', 'COG', 0, 0, '0', '1', '', NOW(), NOW()), +(44, 1, '184', 'CK', 'COK', 0, 0, '0', '1', '', NOW(), NOW()), +(45, 1, '408', 'KP', 'PRK', 0, 0, '0', '1', '', NOW(), NOW()), +(46, 1, '410', 'KR', 'KOR', 0, 0, '0', '1', 'NNN-NNN', NOW(), NOW()), +(47, 1, '188', 'CR', 'CRI', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(48, 1, '384', 'CI', 'CIV', 0, 0, '0', '1', '', NOW(), NOW()), +(49, 1, '191', 'HR', 'HRV', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(50, 1, '192', 'CU', 'CUB', 0, 0, '0', '1', '', NOW(), NOW()), +(51, 1, '208', 'DK', 'DNK', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(52, 1, '262', 'DJ', 'DJI', 0, 0, '0', '1', '', NOW(), NOW()), +(53, 1, '212', 'DM', 'DMA', 0, 0, '0', '1', '', NOW(), NOW()), +(54, 1, '818', 'EG', 'EGY', 0, 0, '0', '0', '', NOW(), NOW()), +(55, 1, '784', 'AE', 'ARE', 0, 0, '0', '1', '', NOW(), NOW()), +(56, 1, '218', 'EC', 'ECU', 0, 0, '0', '1', 'CNNNNNN', NOW(), NOW()), +(57, 1, '232', 'ER', 'ERI', 0, 0, '0', '1', '', NOW(), NOW()), +(58, 1, '724', 'ES', 'ESP', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(59, 1, '233', 'EE', 'EST', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(61, 1, '231', 'ET', 'ETH', 0, 0, '0', '1', '', NOW(), NOW()), +(62, 1, '242', 'FJ', 'FJI', 0, 0, '0', '1', '', NOW(), NOW()), +(63, 1, '246', 'FI', 'FIN', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(64, 1, '250', 'FR', 'FRA', 1, 1, '0', '1', 'NNNNN', NOW(), NOW()), +(65, 1, '266', 'GA', 'GAB', 0, 0, '0', '1', '', NOW(), NOW()), +(66, 1, '270', 'GM', 'GMB', 0, 0, '0', '1', '', NOW(), NOW()), +(67, 1, '268', 'GE', 'GEO', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(68, 1, '288', 'GH', 'GHA', 0, 0, '0', '1', '', NOW(), NOW()), +(69, 1, '300', 'GR', 'GRC', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(70, 1, '308', 'GD', 'GRD', 0, 0, '0', '1', '', NOW(), NOW()), +(71, 1, '320', 'GT', 'GTM', 0, 0, '0', '1', '', NOW(), NOW()), +(72, 1, '324', 'GN', 'GIN', 0, 0, '0', '1', '', NOW(), NOW()), +(73, 1, '624', 'GW', 'GNB', 0, 0, '0', '1', '', NOW(), NOW()), +(74, 1, '226', 'GQ', 'GNQ', 0, 0, '0', '1', '', NOW(), NOW()), +(75, 1, '328', 'GY', 'GUY', 0, 0, '0', '1', '', NOW(), NOW()), +(76, 1, '332', 'HT', 'HTI', 0, 0, '0', '1', '', NOW(), NOW()), +(77, 1, '340', 'HN', 'HND', 0, 0, '0', '1', '', NOW(), NOW()), +(78, 1, '348', 'HU', 'HUN', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(79, 1, '356', 'IN', 'IND', 0, 0, '0', '1', 'NNN NNN', NOW(), NOW()), +(80, 1, '360', 'ID', 'IDN', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(81, 1, '364', 'IR', 'IRN', 0, 0, '0', '1', 'NNNNN-NNNNN', NOW(), NOW()), +(82, 1, '368', 'IQ', 'IRQ', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(83, 1, '372', 'IE', 'IRL', 0, 0, '0', '0', '', NOW(), NOW()), +(84, 1, '352', 'IS', 'ISL', 0, 0, '0', '1', 'NNN', NOW(), NOW()), +(85, 1, '376', 'IL', 'ISR', 0, 0, '0', '1', 'NNNNNNN', NOW(), NOW()), +(86, 1, '380', 'IT', 'ITA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(87, 1, '388', 'JM', 'JAM', 0, 0, '0', '1', '', NOW(), NOW()), +(88, 1, '392', 'JP', 'JPN', 0, 0, '1', '1', 'NNN-NNNN', NOW(), NOW()), +(89, 1, '400', 'JO', 'JOR', 0, 0, '0', '1', '', NOW(), NOW()), +(90, 1, '398', 'KZ', 'KAZ', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(91, 1, '404', 'KE', 'KEN', 0, 0, '0', '1', '', NOW(), NOW()), +(92, 1, '417', 'KG', 'KGZ', 0, 0, '0', '1', '', NOW(), NOW()), +(93, 1, '296', 'KI', 'KIR', 0, 0, '0', '1', '', NOW(), NOW()), +(94, 1, '414', 'KW', 'KWT', 0, 0, '0', '1', '', NOW(), NOW()), +(95, 1, '418', 'LA', 'LAO', 0, 0, '0', '1', '', NOW(), NOW()), +(96, 1, '426', 'LS', 'LSO', 0, 0, '0', '1', '', NOW(), NOW()), +(97, 1, '428', 'LV', 'LVA', 0, 0, '0', '1', 'C-NNNN', NOW(), NOW()), +(98, 1, '422', 'LB', 'LBN', 0, 0, '0', '1', '', NOW(), NOW()), +(99, 1, '430', 'LR', 'LBR', 0, 0, '0', '1', '', NOW(), NOW()), +(100, 1, '343', 'LY', 'LBY', 0, 0, '0', '1', '', NOW(), NOW()), +(101, 1, '438', 'LI', 'LIE', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(102, 1, '440', 'LT', 'LTU', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(103, 1, '442', 'LU', 'LUX', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(104, 1, '807', 'MK', 'MKD', 0, 0, '0', '1', '', NOW(), NOW()), +(105, 1, '450', 'MG', 'MDG', 0, 0, '0', '1', '', NOW(), NOW()), +(106, 1, '458', 'MY', 'MYS', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(107, 1, '454', 'MW', 'MWI', 0, 0, '0', '1', '', NOW(), NOW()), +(108, 1, '462', 'MV', 'MDV', 0, 0, '0', '1', '', NOW(), NOW()), +(109, 1, '466', 'ML', 'MLI', 0, 0, '0', '1', '', NOW(), NOW()), +(110, 1, '470', 'MT', 'MLT', 0, 0, '0', '1', 'LLL NNNN', NOW(), NOW()), +(111, 1, '504', 'MA', 'MAR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(112, 1, '584', 'MH', 'MHL', 0, 0, '0', '1', '', NOW(), NOW()), +(113, 1, '480', 'MU', 'MUS', 0, 0, '0', '1', '', NOW(), NOW()), +(114, 1, '478', 'MR', 'MRT', 0, 0, '0', '1', '', NOW(), NOW()), +(115, 1, '484', 'MX', 'MEX', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(116, 1, '583', 'FM', 'FSM', 0, 0, '0', '1', '', NOW(), NOW()), +(117, 1, '498', 'MD', 'MDA', 0, 0, '0', '1', 'C-NNNN', NOW(), NOW()), +(118, 1, '492', 'MC', 'MCO', 0, 0, '0', '1', '980NN', NOW(), NOW()), +(119, 1, '496', 'MN', 'MNG', 0, 0, '0', '1', '', NOW(), NOW()), +(120, 1, '508', 'MZ', 'MOZ', 0, 0, '0', '1', '', NOW(), NOW()), +(121, 1, '516', 'NA', 'NAM', 0, 0, '0', '1', '', NOW(), NOW()), +(122, 1, '520', 'NR', 'NRU', 0, 0, '0', '1', '', NOW(), NOW()), +(123, 1, '524', 'NP', 'NPL', 0, 0, '0', '1', '', NOW(), NOW()), +(124, 1, '558', 'NI', 'NIC', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(125, 1, '562', 'NE', 'NER', 0, 0, '0', '1', '', NOW(), NOW()), +(126, 1, '566', 'NG', 'NGA', 0, 0, '0', '1', '', NOW(), NOW()), +(127, 1, '570', 'NU', 'NIU', 0, 0, '0', '1', '', NOW(), NOW()), +(128, 1, '578', 'NO', 'NOR', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(129, 1, '554', 'NZ', 'NZL', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(130, 1, '512', 'OM', 'OMN', 0, 0, '0', '1', '', NOW(), NOW()), +(131, 1, '800', 'UG', 'UGA', 0, 0, '0', '1', '', NOW(), NOW()), +(132, 1, '860', 'UZ', 'UZB', 0, 0, '0', '1', '', NOW(), NOW()), +(133, 1, '586', 'PK', 'PAK', 0, 0, '0', '1', '', NOW(), NOW()), +(134, 1, '591', 'PA', 'PAN', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(135, 1, '598', 'PG', 'PNG', 0, 0, '0', '1', '', NOW(), NOW()), +(136, 1, '600', 'PY', 'PRY', 0, 0, '0', '1', '', NOW(), NOW()), +(137, 1, '528', 'NL', 'NLD', 0, 0, '0', '1', 'NNNN LL', NOW(), NOW()), +(138, 1, '604', 'PE', 'PER', 0, 0, '0', '1', '', NOW(), NOW()), +(139, 1, '608', 'PH', 'PHL', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(140, 1, '616', 'PL', 'POL', 0, 0, '0', '1', 'NN-NNN', NOW(), NOW()), +(141, 1, '620', 'PT', 'PRT', 0, 0, '0', '1', 'NNNN-NNN', NOW(), NOW()), +(142, 1, '634', 'QA', 'QAT', 0, 0, '0', '1', '', NOW(), NOW()), +(143, 1, '140', 'CF', 'CAF', 0, 0, '0', '1', '', NOW(), NOW()), +(144, 1, '214', 'DO', 'DOM', 0, 0, '0', '1', '', NOW(), NOW()), +(145, 1, '203', 'CZ', 'CZE', 0, 0, '0', '1', 'NNN NN', NOW(), NOW()), +(146, 1, '642', 'RO', 'ROU', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(147, 1, '826', 'GB', 'GBR', 0, 0, '0', '1', '', NOW(), NOW()), +(148, 1, '643', 'RU', 'RUS', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(149, 1, '646', 'RW', 'RWA', 0, 0, '0', '1', '', NOW(), NOW()), +(150, 1, '659', 'KN', 'KNA', 0, 0, '0', '1', '', NOW(), NOW()), +(151, 1, '662', 'LC', 'LCA', 0, 0, '0', '1', '', NOW(), NOW()), +(152, 1, '674', 'SM', 'SMR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(153, 1, '670', 'VC', 'VCT', 0, 0, '0', '1', '', NOW(), NOW()), +(154, 1, '90', 'SB', 'SLB', 0, 0, '0', '1', '', NOW(), NOW()), +(155, 1, '222', 'SV', 'SLV', 0, 0, '0', '1', '', NOW(), NOW()), +(156, 1, '882', 'WS', 'WSM', 0, 0, '0', '1', '', NOW(), NOW()), +(157, 1, '678', 'ST', 'STP', 0, 0, '0', '1', '', NOW(), NOW()), +(158, 1, '686', 'SN', 'SEN', 0, 0, '0', '1', '', NOW(), NOW()), +(159, 1, '690', 'SC', 'SYC', 0, 0, '0', '1', '', NOW(), NOW()), +(160, 1, '694', 'SL', 'SLE', 0, 0, '0', '1', '', NOW(), NOW()), +(161, 1, '702', 'SG', 'SGP', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(162, 1, '703', 'SK', 'SVK', 0, 0, '0', '1', 'NNN NN', NOW(), NOW()), +(163, 1, '705', 'SI', 'SVN', 0, 0, '0', '1', 'C-NNNN', NOW(), NOW()), +(164, 1, '706', 'SO', 'SOM', 0, 0, '0', '1', '', NOW(), NOW()), +(165, 1, '729', 'SD', 'SDN', 0, 0, '0', '1', '', NOW(), NOW()), +(166, 1, '144', 'LK', 'LKA', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(167, 1, '752', 'SE', 'SWE', 0, 0, '0', '1', 'NNN NN', NOW(), NOW()), +(168, 1, '756', 'CH', 'CHE', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(169, 1, '740', 'SR', 'SUR', 0, 0, '0', '1', '', NOW(), NOW()), +(170, 1, '748', 'SZ', 'SWZ', 0, 0, '0', '1', '', NOW(), NOW()), +(171, 1, '760', 'SY', 'SYR', 0, 0, '0', '1', '', NOW(), NOW()), +(172, 1, '762', 'TJ', 'TJK', 0, 0, '0', '1', '', NOW(), NOW()), +(173, 1, '834', 'TZ', 'TZA', 0, 0, '0', '1', '', NOW(), NOW()), +(174, 1, '148', 'TD', 'TCD', 0, 0, '0', '1', '', NOW(), NOW()), +(175, 1, '764', 'TH', 'THA', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(176, 1, '768', 'TG', 'TGO', 0, 0, '0', '1', '', NOW(), NOW()), +(177, 1, '776', 'TO', 'TON', 0, 0, '0', '1', '', NOW(), NOW()), +(178, 1, '780', 'TT', 'TTO', 0, 0, '0', '1', '', NOW(), NOW()), +(179, 1, '788', 'TN', 'TUN', 0, 0, '0', '1', '', NOW(), NOW()), +(180, 1, '795', 'TM', 'TKM', 0, 0, '0', '1', '', NOW(), NOW()), +(181, 1, '792', 'TR', 'TUR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(182, 1, '798', 'TV', 'TUV', 0, 0, '0', '1', '', NOW(), NOW()), +(183, 1, '804', 'UA', 'UKR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(184, 1, '858', 'UY', 'URY', 0, 0, '0', '1', '', NOW(), NOW()), +(185, 1, '336', 'VA', 'VAT', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(186, 1, '548', 'VU', 'VUT', 0, 0, '0', '1', '', NOW(), NOW()), +(187, 1, '862', 'VE', 'VEN', 0, 0, '0', '1', '', NOW(), NOW()), +(188, 1, '704', 'VN', 'VNM', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(189, 1, '887', 'YE', 'YEM', 0, 0, '0', '1', '', NOW(), NOW()), +(191, 1, '180', 'CD', 'COD', 0, 0, '0', '1', '', NOW(), NOW()), +(192, 1, '894', 'ZM', 'ZMB', 0, 0, '0', '1', '', NOW(), NOW()), +(193, 1, '716', 'ZW', 'ZWE', 0, 0, '0', '1', '', NOW(), NOW()), +(196, 1, '840', 'US', 'USA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(246, 1, '124', 'CA', 'CAN', 0, 0, '1', '1', 'LNL NLN', NOW(), NOW()), +(259, 1, '312', 'GP', 'GLP', 0, 0, '0', '1', '', NOW(), NOW()), +(260, 1, '254', 'GF', 'GUF', 0, 0, '0', '1', '', NOW(), NOW()), +(261, 1, '474', 'MQ', 'MTQ', 0, 0, '0', '1', '', NOW(), NOW()), +(262, 1, '175', 'YT', 'MYT', 0, 0, '0', '1', '', NOW(), NOW()), +(263, 1, '638', 'RE', 'REU', 0, 0, '0', '1', '', NOW(), NOW()), +(264, 1, '666', 'PM', 'SPM', 0, 0, '0', '1', '', NOW(), NOW()), +(265, 1, '540', 'NC', 'NCL', 0, 0, '0', '1', '', NOW(), NOW()), +(266, 1, '258', 'PF', 'PYF', 0, 0, '0', '1', '', NOW(), NOW()), +(267, 1, '876', 'WF', 'WLF', 0, 0, '0', '1', '', NOW(), NOW()), +(269, 1, '344', 'HK', 'HKG', 0, 0, '0', '0', '', NOW(), NOW()), +(270, 1, '652', 'BL', 'BLM', 0, 0, '0', '0', '', NOW(), NOW()), +(271, 1, '663', 'MF', 'MAF', 0, 0, '0', '0', '', NOW(), NOW()), +(272, 1, '260', 'TF', 'ATF', 0, 0, '0', '0', '', NOW(), NOW()); + +INSERT INTO `state` (`id`, `visible`, `isocode`, `country_id`, `created_at`, `updated_at`) VALUES +(1, 1, 'AL', '196', NOW(), NOW()), +(2, 1, 'AK', '196', NOW(), NOW()), +(3, 1, 'AZ', '196', NOW(), NOW()), +(4, 1, 'AR', '196', NOW(), NOW()), +(5, 1, 'CA', '196', NOW(), NOW()), +(6, 1, 'CO', '196', NOW(), NOW()), +(7, 1, 'CT', '196', NOW(), NOW()), +(8, 1, 'DE', '196', NOW(), NOW()), +(9, 1, 'FL', '196', NOW(), NOW()), +(10, 1, 'GA', '196', NOW(), NOW()), +(11, 1, 'HI', '196', NOW(), NOW()), +(12, 1, 'ID', '196', NOW(), NOW()), +(13, 1, 'IL', '196', NOW(), NOW()), +(14, 1, 'IN', '196', NOW(), NOW()), +(15, 1, 'IA', '196', NOW(), NOW()), +(16, 1, 'KS', '196', NOW(), NOW()), +(17, 1, 'KY', '196', NOW(), NOW()), +(18, 1, 'LA', '196', NOW(), NOW()), +(19, 1, 'ME', '196', NOW(), NOW()), +(20, 1, 'MD', '196', NOW(), NOW()), +(21, 1, 'MA', '196', NOW(), NOW()), +(22, 1, 'MI', '196', NOW(), NOW()), +(23, 1, 'MN', '196', NOW(), NOW()), +(24, 1, 'MS', '196', NOW(), NOW()), +(25, 1, 'MO', '196', NOW(), NOW()), +(26, 1, 'MT', '196', NOW(), NOW()), +(27, 1, 'NE', '196', NOW(), NOW()), +(28, 1, 'NV', '196', NOW(), NOW()), +(29, 1, 'NH', '196', NOW(), NOW()), +(30, 1, 'NJ', '196', NOW(), NOW()), +(31, 1, 'NM', '196', NOW(), NOW()), +(32, 1, 'NY', '196', NOW(), NOW()), +(33, 1, 'NC', '196', NOW(), NOW()), +(34, 1, 'ND', '196', NOW(), NOW()), +(35, 1, 'OH', '196', NOW(), NOW()), +(36, 1, 'OK', '196', NOW(), NOW()), +(37, 1, 'OR', '196', NOW(), NOW()), +(38, 1, 'PA', '196', NOW(), NOW()), +(39, 1, 'RI', '196', NOW(), NOW()), +(40, 1, 'SC', '196', NOW(), NOW()), +(41, 1, 'SD', '196', NOW(), NOW()), +(42, 1, 'TN', '196', NOW(), NOW()), +(43, 1, 'TX', '196', NOW(), NOW()), +(44, 1, 'UT', '196', NOW(), NOW()), +(45, 1, 'VT', '196', NOW(), NOW()), +(46, 1, 'VA', '196', NOW(), NOW()), +(47, 1, 'WA', '196', NOW(), NOW()), +(48, 1, 'WV', '196', NOW(), NOW()), +(49, 1, 'WI', '196', NOW(), NOW()), +(50, 1, 'WY', '196', NOW(), NOW()), +(51, 1, 'PR', '196', NOW(), NOW()), +(52, 1, 'VI', '196', NOW(), NOW()), +(53, 1, 'DC', '196', NOW(), NOW()), +(54, 1, 'AGS', '115', NOW(), NOW()), +(55, 1, 'BCN', '115', NOW(), NOW()), +(56, 1, 'BCS', '115', NOW(), NOW()), +(57, 1, 'CAM', '115', NOW(), NOW()), +(58, 1, 'CHP', '115', NOW(), NOW()), +(59, 1, 'CHH', '115', NOW(), NOW()), +(60, 1, 'COA', '115', NOW(), NOW()), +(61, 1, 'COL', '115', NOW(), NOW()), +(62, 1, 'DIF', '115', NOW(), NOW()), +(63, 1, 'DUR', '115', NOW(), NOW()), +(64, 1, 'GUA', '115', NOW(), NOW()), +(65, 1, 'GRO', '115', NOW(), NOW()), +(66, 1, 'HID', '115', NOW(), NOW()), +(67, 1, 'JAL', '115', NOW(), NOW()), +(68, 1, 'MEX', '115', NOW(), NOW()), +(69, 1, 'MIC', '115', NOW(), NOW()), +(70, 1, 'MOR', '115', NOW(), NOW()), +(71, 1, 'NAY', '115', NOW(), NOW()), +(72, 1, 'NLE', '115', NOW(), NOW()), +(73, 1, 'OAX', '115', NOW(), NOW()), +(74, 1, 'PUE', '115', NOW(), NOW()), +(75, 1, 'QUE', '115', NOW(), NOW()), +(76, 1, 'ROO', '115', NOW(), NOW()), +(77, 1, 'SLP', '115', NOW(), NOW()), +(78, 1, 'SIN', '115', NOW(), NOW()), +(79, 1, 'SON', '115', NOW(), NOW()), +(80, 1, 'TAB', '115', NOW(), NOW()), +(81, 1, 'TAM', '115', NOW(), NOW()), +(82, 1, 'TLA', '115', NOW(), NOW()), +(83, 1, 'VER', '115', NOW(), NOW()), +(84, 1, 'YUC', '115', NOW(), NOW()), +(85, 1, 'ZAC', '115', NOW(), NOW()), +(86, 1, 'ON', '246', NOW(), NOW()), +(87, 1, 'QC', '246', NOW(), NOW()), +(88, 1, 'BC', '246', NOW(), NOW()), +(89, 1, 'AB', '246', NOW(), NOW()), +(90, 1, 'MB', '246', NOW(), NOW()), +(91, 1, 'SK', '246', NOW(), NOW()), +(92, 1, 'NS', '246', NOW(), NOW()), +(93, 1, 'NB', '246', NOW(), NOW()), +(94, 1, 'NL', '246', NOW(), NOW()), +(95, 1, 'PE', '246', NOW(), NOW()), +(96, 1, 'NT', '246', NOW(), NOW()), +(97, 1, 'YT', '246', NOW(), NOW()), +(98, 1, 'NU', '246', NOW(), NOW()), +(99, 1, 'B', '10', NOW(), NOW()), +(100, 1, 'K', '10', NOW(), NOW()), +(101, 1, 'H', '10', NOW(), NOW()), +(102, 1, 'U', '10', NOW(), NOW()), +(103, 1, 'C', '10', NOW(), NOW()), +(104, 1, 'X', '10', NOW(), NOW()), +(105, 1, 'W', '10', NOW(), NOW()), +(106, 1, 'E', '10', NOW(), NOW()), +(107, 1, 'P', '10', NOW(), NOW()), +(108, 1, 'Y', '10', NOW(), NOW()), +(109, 1, 'L', '10', NOW(), NOW()), +(110, 1, 'F', '10', NOW(), NOW()), +(111, 1, 'M', '10', NOW(), NOW()), +(112, 1, 'N', '10', NOW(), NOW()), +(113, 1, 'Q', '10', NOW(), NOW()), +(114, 1, 'R', '10', NOW(), NOW()), +(115, 1, 'A', '10', NOW(), NOW()), +(116, 1, 'J', '10', NOW(), NOW()), +(117, 1, 'D', '10', NOW(), NOW()), +(118, 1, 'Z', '10', NOW(), NOW()), +(119, 1, 'S', '10', NOW(), NOW()), +(120, 1, 'G', '10', NOW(), NOW()), +(121, 1, 'V', '10', NOW(), NOW()), +(122, 1, 'T', '10', NOW(), NOW()), +(123, 1, 'AG', '86', NOW(), NOW()), +(124, 1, 'AL', '86', NOW(), NOW()), +(125, 1, 'AN', '86', NOW(), NOW()), +(126, 1, 'AO', '86', NOW(), NOW()), +(127, 1, 'AR', '86', NOW(), NOW()), +(128, 1, 'AP', '86', NOW(), NOW()), +(129, 1, 'AT', '86', NOW(), NOW()), +(130, 1, 'AV', '86', NOW(), NOW()), +(131, 1, 'BA', '86', NOW(), NOW()), +(132, 1, 'BT', '86', NOW(), NOW()), +(133, 1, 'BL', '86', NOW(), NOW()), +(134, 1, 'BN', '86', NOW(), NOW()), +(135, 1, 'BG', '86', NOW(), NOW()), +(136, 1, 'BI', '86', NOW(), NOW()), +(137, 1, 'BO', '86', NOW(), NOW()), +(138, 1, 'BZ', '86', NOW(), NOW()), +(139, 1, 'BS', '86', NOW(), NOW()), +(140, 1, 'BR', '86', NOW(), NOW()), +(141, 1, 'CA', '86', NOW(), NOW()), +(142, 1, 'CL', '86', NOW(), NOW()), +(143, 1, 'CB', '86', NOW(), NOW()), +(144, 1, 'CI', '86', NOW(), NOW()), +(145, 1, 'CE', '86', NOW(), NOW()), +(146, 1, 'CT', '86', NOW(), NOW()), +(147, 1, 'CZ', '86', NOW(), NOW()), +(148, 1, 'CH', '86', NOW(), NOW()), +(149, 1, 'CO', '86', NOW(), NOW()), +(150, 1, 'CS', '86', NOW(), NOW()), +(151, 1, 'CR', '86', NOW(), NOW()), +(152, 1, 'KR', '86', NOW(), NOW()), +(153, 1, 'CN', '86', NOW(), NOW()), +(154, 1, 'EN', '86', NOW(), NOW()), +(155, 1, 'FM', '86', NOW(), NOW()), +(156, 1, 'FE', '86', NOW(), NOW()), +(157, 1, 'FI', '86', NOW(), NOW()), +(158, 1, 'FG', '86', NOW(), NOW()), +(159, 1, 'FC', '86', NOW(), NOW()), +(160, 1, 'FR', '86', NOW(), NOW()), +(161, 1, 'GE', '86', NOW(), NOW()), +(162, 1, 'GO', '86', NOW(), NOW()), +(163, 1, 'GR', '86', NOW(), NOW()), +(164, 1, 'IM', '86', NOW(), NOW()), +(165, 1, 'IS', '86', NOW(), NOW()), +(166, 1, 'AQ', '86', NOW(), NOW()), +(167, 1, 'SP', '86', NOW(), NOW()), +(168, 1, 'LT', '86', NOW(), NOW()), +(169, 1, 'LE', '86', NOW(), NOW()), +(170, 1, 'LC', '86', NOW(), NOW()), +(171, 1, 'LI', '86', NOW(), NOW()), +(172, 1, 'LO', '86', NOW(), NOW()), +(173, 1, 'LU', '86', NOW(), NOW()), +(174, 1, 'MC', '86', NOW(), NOW()), +(175, 1, 'MN', '86', NOW(), NOW()), +(176, 1, 'MS', '86', NOW(), NOW()), +(177, 1, 'MT', '86', NOW(), NOW()), +(178, 1, 'VS', '86', NOW(), NOW()), +(179, 1, 'ME', '86', NOW(), NOW()), +(180, 1, 'MI', '86', NOW(), NOW()), +(181, 1, 'MO', '86', NOW(), NOW()), +(182, 1, 'MB', '86', NOW(), NOW()), +(183, 1, 'NA', '86', NOW(), NOW()), +(184, 1, 'NO', '86', NOW(), NOW()), +(185, 1, 'NU', '86', NOW(), NOW()), +(186, 1, 'OG', '86', NOW(), NOW()), +(187, 1, 'OT', '86', NOW(), NOW()), +(188, 1, 'OR', '86', NOW(), NOW()), +(189, 1, 'PD', '86', NOW(), NOW()), +(190, 1, 'PA', '86', NOW(), NOW()), +(191, 1, 'PR', '86', NOW(), NOW()), +(192, 1, 'PV', '86', NOW(), NOW()), +(193, 1, 'PG', '86', NOW(), NOW()), +(194, 1, 'PU', '86', NOW(), NOW()), +(195, 1, 'PE', '86', NOW(), NOW()), +(196, 1, 'PC', '86', NOW(), NOW()), +(197, 1, 'PI', '86', NOW(), NOW()), +(198, 1, 'PT', '86', NOW(), NOW()), +(199, 1, 'PN', '86', NOW(), NOW()), +(200, 1, 'PZ', '86', NOW(), NOW()), +(201, 1, 'PO', '86', NOW(), NOW()), +(202, 1, 'RG', '86', NOW(), NOW()), +(203, 1, 'RA', '86', NOW(), NOW()), +(204, 1, 'RC', '86', NOW(), NOW()), +(205, 1, 'RE', '86', NOW(), NOW()), +(206, 1, 'RI', '86', NOW(), NOW()), +(207, 1, 'RN', '86', NOW(), NOW()), +(208, 1, 'RM', '86', NOW(), NOW()), +(209, 1, 'RO', '86', NOW(), NOW()), +(210, 1, 'SA', '86', NOW(), NOW()), +(211, 1, 'SS', '86', NOW(), NOW()), +(212, 1, 'SV', '86', NOW(), NOW()), +(213, 1, 'SI', '86', NOW(), NOW()), +(214, 1, 'SR', '86', NOW(), NOW()), +(215, 1, 'SO', '86', NOW(), NOW()), +(216, 1, 'TA', '86', NOW(), NOW()), +(217, 1, 'TE', '86', NOW(), NOW()), +(218, 1, 'TR', '86', NOW(), NOW()), +(219, 1, 'TO', '86', NOW(), NOW()), +(220, 1, 'TP', '86', NOW(), NOW()), +(221, 1, 'TN', '86', NOW(), NOW()), +(222, 1, 'TV', '86', NOW(), NOW()), +(223, 1, 'TS', '86', NOW(), NOW()), +(224, 1, 'UD', '86', NOW(), NOW()), +(225, 1, 'VA', '86', NOW(), NOW()), +(226, 1, 'VE', '86', NOW(), NOW()), +(227, 1, 'VB', '86', NOW(), NOW()), +(228, 1, 'VC', '86', NOW(), NOW()), +(229, 1, 'VR', '86', NOW(), NOW()), +(230, 1, 'VV', '86', NOW(), NOW()), +(231, 1, 'VI', '86', NOW(), NOW()), +(232, 1, 'VT', '86', NOW(), NOW()), +(233, 1, 'AC', '80', NOW(), NOW()), +(234, 1, 'BA', '80', NOW(), NOW()), +(235, 1, 'BB', '80', NOW(), NOW()), +(236, 1, 'BT', '80', NOW(), NOW()), +(237, 1, 'BE', '80', NOW(), NOW()), +(238, 1, 'JT', '80', NOW(), NOW()), +(239, 1, 'KT', '80', NOW(), NOW()), +(240, 1, 'ST', '80', NOW(), NOW()), +(241, 1, 'JI', '80', NOW(), NOW()), +(242, 1, 'KI', '80', NOW(), NOW()), +(243, 1, 'NT', '80', NOW(), NOW()), +(244, 1, 'GO', '80', NOW(), NOW()), +(245, 1, 'JK', '80', NOW(), NOW()), +(246, 1, 'JA', '80', NOW(), NOW()), +(247, 1, 'LA', '80', NOW(), NOW()), +(248, 1, 'MA', '80', NOW(), NOW()), +(249, 1, 'MU', '80', NOW(), NOW()), +(250, 1, 'SA', '80', NOW(), NOW()), +(251, 1, 'SU', '80', NOW(), NOW()), +(252, 1, 'PA', '80', NOW(), NOW()), +(253, 1, 'RI', '80', NOW(), NOW()), +(254, 1, 'KR', '80', NOW(), NOW()), +(255, 1, 'SG', '80', NOW(), NOW()), +(256, 1, 'KS', '80', NOW(), NOW()), +(257, 1, 'SN', '80', NOW(), NOW()), +(258, 1, 'SS', '80', NOW(), NOW()), +(259, 1, 'JB', '80', NOW(), NOW()), +(260, 1, 'KB', '80', NOW(), NOW()), +(261, 1, 'NB', '80', NOW(), NOW()), +(262, 1, 'PB', '80', NOW(), NOW()), +(263, 1, 'SR', '80', NOW(), NOW()), +(264, 1, 'SB', '80', NOW(), NOW()), +(265, 1, 'YO', '80', NOW(), NOW()), +(266, 1, '23', '88', NOW(), NOW()), +(267, 1, '05', '88', NOW(), NOW()), +(268, 1, '02', '88', NOW(), NOW()), +(269, 1, '12', '88', NOW(), NOW()), +(270, 1, '38', '88', NOW(), NOW()), +(271, 1, '18', '88', NOW(), NOW()), +(272, 1, '40', '88', NOW(), NOW()), +(273, 1, '07', '88', NOW(), NOW()), +(274, 1, '21', '88', NOW(), NOW()), +(275, 1, '10', '88', NOW(), NOW()), +(276, 1, '34', '88', NOW(), NOW()), +(277, 1, '01', '88', NOW(), NOW()), +(278, 1, '28', '88', NOW(), NOW()), +(279, 1, '08', '88', NOW(), NOW()), +(280, 1, '17', '88', NOW(), NOW()), +(281, 1, '03', '88', NOW(), NOW()), +(282, 1, '37', '88', NOW(), NOW()), +(283, 1, '46', '88', NOW(), NOW()), +(284, 1, '14', '88', NOW(), NOW()), +(285, 1, '39', '88', NOW(), NOW()), +(286, 1, '43', '88', NOW(), NOW()), +(287, 1, '26', '88', NOW(), NOW()), +(288, 1, '24', '88', NOW(), NOW()), +(289, 1, '04', '88', NOW(), NOW()), +(290, 1, '45', '88', NOW(), NOW()), +(291, 1, '20', '88', NOW(), NOW()), +(292, 1, '42', '88', NOW(), NOW()), +(293, 1, '29', '88', NOW(), NOW()), +(294, 1, '15', '88', NOW(), NOW()), +(295, 1, '44', '88', NOW(), NOW()), +(296, 1, '33', '88', NOW(), NOW()), +(297, 1, '47', '88', NOW(), NOW()), +(298, 1, '27', '88', NOW(), NOW()), +(299, 1, '41', '88', NOW(), NOW()), +(300, 1, '11', '88', NOW(), NOW()), +(301, 1, '25', '88', NOW(), NOW()), +(302, 1, '32', '88', NOW(), NOW()), +(303, 1, '22', '88', NOW(), NOW()), +(304, 1, '09', '88', NOW(), NOW()), +(305, 1, '36', '88', NOW(), NOW()), +(306, 1, '13', '88', NOW(), NOW()), +(307, 1, '31', '88', NOW(), NOW()), +(308, 1, '16', '88', NOW(), NOW()), +(309, 1, '30', '88', NOW(), NOW()), +(310, 1, '06', '88', NOW(), NOW()), +(311, 1, '35', '88', NOW(), NOW()), +(312, 1, '19', '88', NOW(), NOW()); + +INSERT INTO `country_area` (`country_id`, `area_id`, `created_at`, `updated_at`) VALUES +(1, 4, NOW(), NOW()), +(2, 4, NOW(), NOW()), +(3, 3, NOW(), NOW()), +(4, 3, NOW(), NOW()), +(5, 2, NOW(), NOW()), +(6, 1, NOW(), NOW()), +(7, 4, NOW(), NOW()), +(8, 4, NOW(), NOW()), +(9, 4, NOW(), NOW()), +(10, 4, NOW(), NOW()), +(11, 3, NOW(), NOW()), +(12, 4, NOW(), NOW()), +(13, 2, NOW(), NOW()), +(14, 3, NOW(), NOW()), +(15, 4, NOW(), NOW()), +(16, 4, NOW(), NOW()), +(17, 4, NOW(), NOW()), +(18, 4, NOW(), NOW()), +(19, 3, NOW(), NOW()), +(20, 4, NOW(), NOW()), +(21, 4, NOW(), NOW()), +(22, 4, NOW(), NOW()), +(24, 3, NOW(), NOW()), +(25, 4, NOW(), NOW()), +(26, 4, NOW(), NOW()), +(27, 3, NOW(), NOW()), +(28, 4, NOW(), NOW()), +(29, 4, NOW(), NOW()), +(30, 4, NOW(), NOW()), +(31, 3, NOW(), NOW()), +(32, 4, NOW(), NOW()), +(33, 4, NOW(), NOW()), +(34, 4, NOW(), NOW()), +(35, 4, NOW(), NOW()), +(37, 4, NOW(), NOW()), +(38, 4, NOW(), NOW()), +(39, 4, NOW(), NOW()), +(40, 2, NOW(), NOW()), +(41, 4, NOW(), NOW()), +(42, 4, NOW(), NOW()), +(43, 4, NOW(), NOW()), +(44, 4, NOW(), NOW()), +(45, 4, NOW(), NOW()), +(46, 4, NOW(), NOW()), +(47, 4, NOW(), NOW()), +(48, 4, NOW(), NOW()), +(49, 2, NOW(), NOW()), +(50, 4, NOW(), NOW()), +(51, 2, NOW(), NOW()), +(52, 4, NOW(), NOW()), +(53, 4, NOW(), NOW()), +(54, 4, NOW(), NOW()), +(55, 4, NOW(), NOW()), +(56, 4, NOW(), NOW()), +(57, 4, NOW(), NOW()), +(58, 2, NOW(), NOW()), +(59, 2, NOW(), NOW()), +(61, 4, NOW(), NOW()), +(62, 4, NOW(), NOW()), +(63, 2, NOW(), NOW()), +(64, 1, NOW(), NOW()), +(65, 4, NOW(), NOW()), +(66, 4, NOW(), NOW()), +(67, 3, NOW(), NOW()), +(68, 4, NOW(), NOW()), +(69, 2, NOW(), NOW()), +(70, 4, NOW(), NOW()), +(71, 4, NOW(), NOW()), +(72, 4, NOW(), NOW()), +(73, 4, NOW(), NOW()), +(74, 4, NOW(), NOW()), +(75, 4, NOW(), NOW()), +(76, 4, NOW(), NOW()), +(77, 4, NOW(), NOW()), +(78, 2, NOW(), NOW()), +(79, 4, NOW(), NOW()), +(80, 4, NOW(), NOW()), +(81, 4, NOW(), NOW()), +(82, 4, NOW(), NOW()), +(83, 2, NOW(), NOW()), +(84, 3, NOW(), NOW()), +(85, 4, NOW(), NOW()), +(86, 2, NOW(), NOW()), +(87, 4, NOW(), NOW()), +(88, 4, NOW(), NOW()), +(89, 4, NOW(), NOW()), +(90, 4, NOW(), NOW()), +(91, 4, NOW(), NOW()), +(92, 4, NOW(), NOW()), +(93, 4, NOW(), NOW()), +(94, 4, NOW(), NOW()), +(95, 4, NOW(), NOW()), +(96, 4, NOW(), NOW()), +(97, 2, NOW(), NOW()), +(98, 4, NOW(), NOW()), +(99, 4, NOW(), NOW()), +(100, 4, NOW(), NOW()), +(101, 2, NOW(), NOW()), +(102, 2, NOW(), NOW()), +(103, 2, NOW(), NOW()), +(104, 3, NOW(), NOW()), +(105, 4, NOW(), NOW()), +(106, 4, NOW(), NOW()), +(107, 4, NOW(), NOW()), +(108, 4, NOW(), NOW()), +(109, 4, NOW(), NOW()), +(110, 2, NOW(), NOW()), +(111, 3, NOW(), NOW()), +(112, 4, NOW(), NOW()), +(113, 4, NOW(), NOW()), +(114, 4, NOW(), NOW()), +(115, 4, NOW(), NOW()), +(117, 3, NOW(), NOW()), +(118, 1, NOW(), NOW()), +(119, 4, NOW(), NOW()), +(120, 4, NOW(), NOW()), +(121, 4, NOW(), NOW()), +(122, 4, NOW(), NOW()), +(123, 4, NOW(), NOW()), +(124, 4, NOW(), NOW()), +(125, 4, NOW(), NOW()), +(126, 4, NOW(), NOW()), +(128, 3, NOW(), NOW()), +(129, 4, NOW(), NOW()), +(130, 4, NOW(), NOW()), +(131, 4, NOW(), NOW()), +(132, 4, NOW(), NOW()), +(133, 4, NOW(), NOW()), +(134, 4, NOW(), NOW()), +(135, 4, NOW(), NOW()), +(136, 4, NOW(), NOW()), +(137, 2, NOW(), NOW()), +(138, 4, NOW(), NOW()), +(139, 4, NOW(), NOW()), +(140, 2, NOW(), NOW()), +(141, 2, NOW(), NOW()), +(142, 4, NOW(), NOW()), +(143, 4, NOW(), NOW()), +(144, 4, NOW(), NOW()), +(145, 2, NOW(), NOW()), +(146, 2, NOW(), NOW()), +(147, 2, NOW(), NOW()), +(148, 4, NOW(), NOW()), +(149, 4, NOW(), NOW()), +(150, 4, NOW(), NOW()), +(151, 4, NOW(), NOW()), +(152, 2, NOW(), NOW()), +(153, 4, NOW(), NOW()), +(154, 4, NOW(), NOW()), +(156, 4, NOW(), NOW()), +(157, 4, NOW(), NOW()), +(158, 4, NOW(), NOW()), +(159, 4, NOW(), NOW()), +(160, 4, NOW(), NOW()), +(161, 4, NOW(), NOW()), +(162, 2, NOW(), NOW()), +(163, 2, NOW(), NOW()), +(164, 4, NOW(), NOW()), +(165, 4, NOW(), NOW()), +(166, 4, NOW(), NOW()), +(167, 2, NOW(), NOW()), +(168, 2, NOW(), NOW()), +(169, 4, NOW(), NOW()), +(170, 4, NOW(), NOW()), +(171, 4, NOW(), NOW()), +(172, 4, NOW(), NOW()), +(173, 4, NOW(), NOW()), +(174, 4, NOW(), NOW()), +(175, 4, NOW(), NOW()), +(176, 4, NOW(), NOW()), +(177, 4, NOW(), NOW()), +(178, 4, NOW(), NOW()), +(179, 3, NOW(), NOW()), +(180, 4, NOW(), NOW()), +(181, 3, NOW(), NOW()), +(182, 4, NOW(), NOW()), +(183, 2, NOW(), NOW()), +(184, 4, NOW(), NOW()), +(185, 2, NOW(), NOW()), +(186, 4, NOW(), NOW()), +(187, 4, NOW(), NOW()), +(188, 4, NOW(), NOW()), +(189, 4, NOW(), NOW()), +(191, 4, NOW(), NOW()), +(192, 4, NOW(), NOW()), +(193, 4, NOW(), NOW()), +(196, 4, NOW(), NOW()), +(246, 4, NOW(), NOW()), +(259, 5, NOW(), NOW()), +(260, 5, NOW(), NOW()), +(261, 5, NOW(), NOW()), +(262, 5, NOW(), NOW()), +(263, 5, NOW(), NOW()), +(264, 5, NOW(), NOW()), +(265, 6, NOW(), NOW()), +(266, 6, NOW(), NOW()), +(267, 6, NOW(), NOW()), +(269, 4, NOW(), NOW()), +(270, 5, NOW(), NOW()), +(271, 5, NOW(), NOW()), +(272, 6, NOW(), NOW()), +(1, 9, NOW(), NOW()), +(2, 10, NOW(), NOW()), +(3, 13, NOW(), NOW()), +(4, 10, NOW(), NOW()), +(5, 7, NOW(), NOW()), +(6, 13, NOW(), NOW()), +(7, 10, NOW(), NOW()), +(8, 8, NOW(), NOW()), +(9, 9, NOW(), NOW()), +(10, 12, NOW(), NOW()), +(11, 9, NOW(), NOW()), +(12, 11, NOW(), NOW()), +(13, 7, NOW(), NOW()), +(14, 9, NOW(), NOW()), +(15, 8, NOW(), NOW()), +(16, 9, NOW(), NOW()), +(17, 9, NOW(), NOW()), +(18, 8, NOW(), NOW()), +(19, 11, NOW(), NOW()), +(20, 7, NOW(), NOW()), +(21, 14, NOW(), NOW()), +(22, 10, NOW(), NOW()), +(23, 9, NOW(), NOW()), +(24, 13, NOW(), NOW()), +(25, 9, NOW(), NOW()), +(26, 12, NOW(), NOW()), +(27, 7, NOW(), NOW()), +(28, 10, NOW(), NOW()), +(29, 12, NOW(), NOW()), +(30, 9, NOW(), NOW()), +(31, 7, NOW(), NOW()), +(32, 10, NOW(), NOW()), +(33, 10, NOW(), NOW()), +(34, 9, NOW(), NOW()), +(35, 10, NOW(), NOW()), +(37, 10, NOW(), NOW()), +(38, 12, NOW(), NOW()), +(39, 9, NOW(), NOW()), +(40, 7, NOW(), NOW()), +(41, 12, NOW(), NOW()), +(42, 10, NOW(), NOW()), +(43, 10, NOW(), NOW()), +(44, 11, NOW(), NOW()), +(45, 9, NOW(), NOW()), +(46, 9, NOW(), NOW()), +(47, 14, NOW(), NOW()), +(48, 10, NOW(), NOW()), +(49, 13, NOW(), NOW()), +(50, 14, NOW(), NOW()), +(51, 7, NOW(), NOW()), +(52, 10, NOW(), NOW()), +(53, 14, NOW(), NOW()), +(54, 10, NOW(), NOW()), +(55, 9, NOW(), NOW()), +(56, 12, NOW(), NOW()), +(57, 10, NOW(), NOW()), +(58, 7, NOW(), NOW()), +(59, 7, NOW(), NOW()), +(61, 10, NOW(), NOW()), +(62, 11, NOW(), NOW()), +(63, 7, NOW(), NOW()), +(64, 7, NOW(), NOW()), +(65, 10, NOW(), NOW()), +(66, 10, NOW(), NOW()), +(67, 9, NOW(), NOW()), +(68, 10, NOW(), NOW()), +(69, 7, NOW(), NOW()), +(70, 14, NOW(), NOW()), +(71, 14, NOW(), NOW()), +(72, 10, NOW(), NOW()), +(73, 10, NOW(), NOW()), +(74, 10, NOW(), NOW()), +(75, 12, NOW(), NOW()), +(76, 14, NOW(), NOW()), +(77, 14, NOW(), NOW()), +(78, 7, NOW(), NOW()), +(79, 9, NOW(), NOW()), +(80, 9, NOW(), NOW()), +(81, 9, NOW(), NOW()), +(82, 9, NOW(), NOW()), +(83, 7, NOW(), NOW()), +(84, 13, NOW(), NOW()), +(85, 9, NOW(), NOW()), +(86, 7, NOW(), NOW()), +(87, 14, NOW(), NOW()), +(88, 9, NOW(), NOW()), +(89, 9, NOW(), NOW()), +(90, 9, NOW(), NOW()), +(91, 10, NOW(), NOW()), +(92, 9, NOW(), NOW()), +(93, 11, NOW(), NOW()), +(94, 9, NOW(), NOW()), +(95, 9, NOW(), NOW()), +(96, 10, NOW(), NOW()), +(97, 7, NOW(), NOW()), +(98, 9, NOW(), NOW()), +(99, 10, NOW(), NOW()), +(100, 10, NOW(), NOW()), +(101, 7, NOW(), NOW()), +(102, 7, NOW(), NOW()), +(103, 7, NOW(), NOW()), +(104, 13, NOW(), NOW()), +(105, 10, NOW(), NOW()), +(106, 9, NOW(), NOW()), +(107, 10, NOW(), NOW()), +(108, 9, NOW(), NOW()), +(109, 10, NOW(), NOW()), +(110, 7, NOW(), NOW()), +(111, 10, NOW(), NOW()), +(112, 11, NOW(), NOW()), +(113, 10, NOW(), NOW()), +(114, 10, NOW(), NOW()), +(115, 8, NOW(), NOW()), +(116, 11, NOW(), NOW()), +(117, 13, NOW(), NOW()), +(118, 13, NOW(), NOW()), +(119, 9, NOW(), NOW()), +(120, 10, NOW(), NOW()), +(121, 10, NOW(), NOW()), +(122, 11, NOW(), NOW()), +(123, 9, NOW(), NOW()), +(124, 14, NOW(), NOW()), +(125, 10, NOW(), NOW()), +(126, 10, NOW(), NOW()), +(127, 11, NOW(), NOW()), +(128, 13, NOW(), NOW()), +(129, 11, NOW(), NOW()), +(130, 9, NOW(), NOW()), +(131, 10, NOW(), NOW()), +(132, 9, NOW(), NOW()), +(133, 9, NOW(), NOW()), +(134, 14, NOW(), NOW()), +(135, 11, NOW(), NOW()), +(136, 12, NOW(), NOW()), +(137, 7, NOW(), NOW()), +(138, 12, NOW(), NOW()), +(139, 9, NOW(), NOW()), +(140, 7, NOW(), NOW()), +(141, 7, NOW(), NOW()), +(142, 9, NOW(), NOW()), +(143, 10, NOW(), NOW()), +(144, 14, NOW(), NOW()), +(145, 7, NOW(), NOW()), +(146, 7, NOW(), NOW()), +(147, 7, NOW(), NOW()), +(148, 13, NOW(), NOW()), +(149, 10, NOW(), NOW()), +(150, 14, NOW(), NOW()), +(151, 14, NOW(), NOW()), +(152, 13, NOW(), NOW()), +(153, 14, NOW(), NOW()), +(154, 11, NOW(), NOW()), +(155, 14, NOW(), NOW()), +(156, 11, NOW(), NOW()), +(157, 10, NOW(), NOW()), +(158, 10, NOW(), NOW()), +(159, 10, NOW(), NOW()), +(160, 10, NOW(), NOW()), +(161, 9, NOW(), NOW()), +(162, 7, NOW(), NOW()), +(163, 7, NOW(), NOW()), +(164, 10, NOW(), NOW()), +(165, 10, NOW(), NOW()), +(166, 9, NOW(), NOW()), +(167, 7, NOW(), NOW()), +(168, 13, NOW(), NOW()), +(169, 14, NOW(), NOW()), +(170, 10, NOW(), NOW()), +(171, 9, NOW(), NOW()), +(172, 9, NOW(), NOW()), +(173, 10, NOW(), NOW()), +(174, 10, NOW(), NOW()), +(175, 9, NOW(), NOW()), +(176, 10, NOW(), NOW()), +(177, 11, NOW(), NOW()), +(178, 12, NOW(), NOW()), +(179, 10, NOW(), NOW()), +(180, 9, NOW(), NOW()), +(181, 13, NOW(), NOW()), +(182, 11, NOW(), NOW()), +(183, 7, NOW(), NOW()), +(184, 12, NOW(), NOW()), +(185, 13, NOW(), NOW()), +(186, 11, NOW(), NOW()), +(187, 12, NOW(), NOW()), +(188, 9, NOW(), NOW()), +(189, 9, NOW(), NOW()), +(191, 10, NOW(), NOW()), +(192, 10, NOW(), NOW()), +(193, 10, NOW(), NOW()), +(196, 8, NOW(), NOW()), +(246, 8, NOW(), NOW()), +(259, 14, NOW(), NOW()), +(260, 12, NOW(), NOW()), +(261, 14, NOW(), NOW()), +(262, 10, NOW(), NOW()), +(263, 10, NOW(), NOW()), +(264, 14, NOW(), NOW()), +(265, 11, NOW(), NOW()), +(266, 11, NOW(), NOW()), +(267, 11, NOW(), NOW()), +(269, 9, NOW(), NOW()); + +INSERT INTO `tax` (`id`, `type`, `serialized_requirements`, `created_at`, `updated_at`) +VALUES +(1, 'Thelia\\TaxEngine\\TaxType\\PricePercentTaxType', 'eyJwZXJjZW50IjoiMjAifQ==', NOW(), NOW()), +(2, 'Thelia\\TaxEngine\\TaxType\\PricePercentTaxType', 'eyJwZXJjZW50IjoiMTAifQ==', NOW(), NOW()); + + +INSERT INTO `tax_rule` (`id`, `is_default`, `created_at`, `updated_at`) +VALUES +(1, 1, NOW(), NOW()), +(2, 0, NOW(), NOW()); + +INSERT INTO `tax_rule_country` (`tax_rule_id`, `country_id`, `tax_id`, `position`, `created_at`, `updated_at`) +VALUES +(1, 64, 1, 1, NOW(), NOW()), +(2, 64, 2, 1, NOW(), NOW()); + +INSERT INTO `order_status`(`id`, `code`, `created_at`, `updated_at`) VALUES +(1, 'not_paid', NOW(), NOW()), +(2, 'paid', NOW(), NOW()), +(3, 'processing', NOW(), NOW()), +(4, 'sent', NOW(), NOW()), +(5, 'canceled', NOW(), NOW()), +(6, 'refunded', NOW(), NOW()); + +/** +generated with command : php Thelia thelia:generate-resources --output sql +*/ +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(1, 'admin.address', NOW(), NOW()), +(2, 'admin.configuration.administrator', NOW(), NOW()), +(3, 'admin.configuration.area', NOW(), NOW()), +(4, 'admin.configuration.attribute', NOW(), NOW()), +(5, 'admin.category', NOW(), NOW()), +(6, 'admin.configuration', NOW(), NOW()), +(7, 'admin.content', NOW(), NOW()), +(8, 'admin.configuration.country', NOW(), NOW()), +(9, 'admin.coupon', NOW(), NOW()), +(10, 'admin.configuration.currency', NOW(), NOW()), +(11, 'admin.customer', NOW(), NOW()), +(12, 'admin.configuration.feature', NOW(), NOW()), +(13, 'admin.folder', NOW(), NOW()), +(14, 'admin.configuration.language', NOW(), NOW()), +(15, 'admin.configuration.mailing-system', NOW(), NOW()), +(16, 'admin.configuration.message', NOW(), NOW()), +(17, 'admin.module', NOW(), NOW()), +(18, 'admin.order', NOW(), NOW()), +(19, 'admin.product', NOW(), NOW()), +(20, 'admin.configuration.profile', NOW(), NOW()), +(21, 'admin.configuration.shipping-zone', NOW(), NOW()), +(22, 'admin.configuration.tax', NOW(), NOW()), +(23, 'admin.configuration.template', NOW(), NOW()), +(24, 'admin.configuration.system-log', NOW(), NOW()), +(25, 'admin.cache', NOW(), NOW()), +(26, 'admin.home', NOW(), NOW()), +(27, 'admin.configuration.store', NOW(), NOW()), +(28, 'admin.configuration.variable', NOW(), NOW()), +(29, 'admin.configuration.admin-logs', NOW(), NOW()), +(30, 'admin.configuration.system-logs', NOW(), NOW()), +(31, 'admin.configuration.advanced', NOW(), NOW()), +(32, 'admin.configuration.translations', NOW(), NOW()), +(33, 'admin.export', NOW(), NOW()), +(34, 'admin.tools', NOW(), NOW()), +(35, 'admin.brand', NOW(), NOW()), +(36, 'admin.hook', NOW(), NOW()), +(37, 'admin.module-hook', NOW(), NOW()), +(38, 'admin.sales', NOW(), NOW()), +(39, 'admin.administrator', NOW(), NOW()), +(40, 'admin.configuration.category', NOW(), NOW()), +(41, 'admin.configuration.shipping-configuration', NOW(), NOW()), +(42, 'admin.configuration.tax-rule', NOW(), NOW()), +(43, 'admin.hooks', NOW(), NOW()), +(44, 'admin.import', NOW(), NOW()), +(45, 'admin.modules', NOW(), NOW()), +(46, 'admin.profile', NOW(), NOW()), +(47, 'admin.search', NOW(), NOW()), +(48, 'admin.configuration.api', NOW(), NOW()), +(49, 'admin.customer.title', NOW(), NOW()) +; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES +(1, 'order_confirmation', NULL, NULL, 'order_confirmation.txt', NULL, 'order_confirmation.html', NOW(), NOW()), +(2, 'lost_password', NULL, NULL, 'password.txt', NULL, 'password.html', NOW(), NOW()), +(3, 'order_notification', NULL, NULL, 'order_notification.txt', NULL, 'order_notification.html', NOW(), NOW()), +(4, 'customer_account_changed', 0, NULL, 'account_changed_by_admin.txt', NULL, 'account_changed_by_admin.html', NOW(), NOW()), +(5, 'customer_account_created', 0, NULL, 'account_created_by_admin.txt', NULL, 'account_created_by_admin.html', NOW(), NOW()), +(6, 'new_admin_password', NULL, NULL, 'admin_password.txt', NULL, 'admin_password.html', NOW(), NOW()), +(7, 'newsletter_subscription_confirmation', NULL, NULL, 'newsletter_subscription_confirmation.txt', NULL, 'newsletter_subscription_confirmation.html', NOW(), NOW()) +; + +/** +I18n +*/ + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES + (1, 'de_DE', 'Verfügbaren Lagerbestand prüfen (1) oder ignorieren (0) beim Anzeigen und Änderung der bestellte Menge', NULL, NULL, NULL), + (2, 'de_DE', 'Name der aktiven Front Office Template', NULL, NULL, NULL), + (3, 'de_DE', 'Name der aktiven Back Office Template', NULL, NULL, NULL), + (4, 'de_DE', 'Name der aktiven PDF Template', NULL, NULL, NULL), + (5, 'de_DE', 'Name der aktiven E-Mail Template', NULL, NULL, NULL), + (6, 'de_DE', 'Aktivieren (1) oder deaktivieren (0) URL Überschreibung', NULL, NULL, NULL), + (7, 'de_DE', 'Name des Grafik-Treibers, der von der Imagine-Bibliothek verwendet wird (siehe https://imagine.readthedocs.org)', NULL, NULL, NULL), + (8, 'de_DE', 'Die Standardqualität (in%) der erzeugten Bilder', NULL, NULL, NULL), + (9, 'de_DE', 'Wie werden die Originalbilder (volle Auflösung) im Webspace ausgeliefert (symlink or copy)', NULL, NULL, NULL), + (10, 'de_DE', 'Wie werden Dokumentdateien im Webspace (Symlink oder Kopie) ausgeliefert', NULL, NULL, NULL), + (11, 'de_DE', 'Pfad zu dem Verzeichnis, in dem Bilder gespeichert sind', NULL, NULL, NULL), + (12, 'de_DE', 'Pfad zu dem Verzeichnis, in dem Dokumente gespeichert sind', NULL, NULL, NULL), + (13, 'de_DE', 'Der Pfad zum Bild-Cache-Verzeichnis in dem Web-Space', NULL, NULL, NULL), + (14, 'de_DE', 'Der Pfad zum Dokument-Cache-Verzeichnis in dem Web-Space', NULL, NULL, NULL), + (15, 'de_DE', 'Name der Seite 404 (unauffindbar) in dem aktuellen Modell (mit der Dateinamenerweiterung 404.html zum Beispiel)', NULL, NULL, NULL), + (16, 'de_DE', 'Name des Templates zurückgegeben, wenn eine veraltete (oder inaktive) Produkt-URL aufgerufen wird', NULL, NULL, NULL), + (17, 'de_DE', 'Anzeigt und verwendet Preise mit (0) oder ohne (1) Taxen', NULL, NULL, NULL), + (18, 'de_DE', 'Template Assets automatisch bei Codeänderungen kompilieren? (1 = ja, 0 = nein)', NULL, NULL, NULL), + (19, 'de_DE', 'Name des Cookies \"Remember me\" für die Administratoren', NULL, NULL, NULL), + (20, 'de_DE', 'Ablaufzeit in Sekunden des Cookies \"Remember me\" für die Administratoren', NULL, NULL, NULL), + (21, 'de_DE', 'Name des Cookies \"Remember me\" für die Kunden', NULL, NULL, NULL), + (22, 'de_DE', 'Ablaufzeit in Sekunden des Cookies \"Remember me\" für die Kunden', NULL, NULL, NULL), + (23, 'de_DE', 'Shops Basis-URL (zum Beispiel http://www.yourshopdomain.com)', NULL, NULL, NULL), + (24, 'de_DE', 'Name der Rechnungsansicht in der aktuellen PDF-Vorlage (ohne Erweiterung)', NULL, NULL, NULL), + (25, 'de_DE', 'Name der Lieferung Sicht in der aktuellen PDF-Vorlage (ohne Erweiterung)', NULL, NULL, NULL), + (26, 'de_DE', 'Der Pfad (relativ zu der Standard-Backoffice-Vorlage) zu dem verwendetes Bild wenn kein Flagge-Bild für ein Land gefunden werden kann', NULL, NULL, NULL), + (27, 'de_DE', 'Whitespace trim Ebene des generierten HTML-Codes (0 = aus, 1 = Mittel, 2 = Maximum)', NULL, NULL, NULL), + (28, 'de_DE', 'Standart verfügbaren Bestand wenn check-available-stock gleich 0.', NULL, NULL, NULL), + (29, 'de_DE', 'Die ID des Ordners mit Ihren Informations-Seiten: AGB, Impressum, ...', NULL, NULL, NULL), + (30, 'de_DE', 'Ihr \'Allgemeine Geschäftsbedingungen \' ID.', NULL, NULL, NULL), + (31, 'de_DE', 'Negativen Lagerbestand erlauben (1) oder nicht (0)', NULL, NULL, NULL), + (32, 'de_DE', 'Ein dauerhaftes Cookie verwenden, um den Kundes-Warenkorb zu merken', NULL, NULL, NULL), + (33, 'de_DE', 'Name der Warenkorb-Cookie', NULL, NULL, NULL), + (34, 'de_DE', 'Dauer der Warenkorb-Cookie in dem Kunden-Browser, in Sekunden', NULL, NULL, NULL), + (35, 'de_DE', 'Dauer der Session-Cookie in dem Kunden-Browser, in Sekunden', NULL, NULL, NULL), + (36, 'de_DE', 'Die Session Standartkonfiguration lassen', NULL, NULL, NULL), + (37, 'de_DE', 'Standartsprache ohne Übersetzung', NULL, NULL, NULL), + (52, 'de_DE', '[Firewall/Bruteforce] Wartezeit zwischen X Versuche', NULL, NULL, NULL), + (53, 'de_DE', '[Firewall] Wartezeit zwischen X Versuche', NULL, NULL, NULL), + (54, 'de_DE', '[Firewall/Bruteforce] Anzahl der erlaubten Versuche', NULL, NULL, NULL), + (55, 'de_DE', '[Firewall] Anzahl der erlaubten Versuche', NULL, NULL, NULL), + (56, 'de_DE', '[Firewall] Firewall aktivieren', NULL, NULL, NULL), + (57, 'de_DE', 'URI mit Slash beendet erlauben', NULL, NULL, NULL), + (58, 'de_DE', 'Fehlermeldung zeigen anstatt einer weißen Seite im Falle eines eines Serverfehlers', NULL, NULL, NULL), + (59, 'de_DE', 'Dateiname der Fehlerseite', NULL, NULL, NULL), + (60, 'de_DE', 'Den Kunden erlauben ihre E-Mail-Adresse zu ändern. 1 für Ja, 0 für Nein', NULL, NULL, NULL), + (61, 'de_DE', 'Den Kunden fragen, ihre E-Mail-Adresse zu bestätigen. 1 für Jan, 0 für Nein', NULL, NULL, NULL), + (62, 'de_DE', 'Geheimer Schlüssel für Formular CSRF-token', NULL, NULL, NULL), + (63, 'de_DE', NULL, NULL, NULL, NULL), + (64, 'de_DE', NULL, NULL, NULL, NULL), + (65, 'de_DE', NULL, NULL, NULL, NULL), + (66, 'de_DE', NULL, NUll, NULL, NULL), + (67, 'de_DE', NULL, NUll, NULL, NULL), + (68, 'de_DE', NULL, NUll, NULL, NULL), + (1, 'en_US', 'Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity', NULL, NULL, NULL), + (2, 'en_US', 'Name of the active front-office template', NULL, NULL, NULL), + (3, 'en_US', 'Name of the active back-office template', NULL, NULL, NULL), + (4, 'en_US', 'Name of the active PDF template', NULL, NULL, NULL), + (5, 'en_US', 'Name of the active mailing template', NULL, NULL, NULL), + (6, 'en_US', 'Enable (1) or disable (0) URL rewriting', NULL, NULL, NULL), + (7, 'en_US', 'Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)', NULL, NULL, NULL), + (8, 'en_US', 'The default quality (in %) of the generated images', NULL, NULL, NULL), + (9, 'en_US', 'How original (full resolution) images are delivered in the web space (symlink or copy)', NULL, NULL, NULL), + (10, 'en_US', 'How document files are delivered in the web space (symlink or copy)', NULL, NULL, NULL), + (11, 'en_US', 'Path to the directory where images are stored', NULL, NULL, NULL), + (12, 'en_US', 'Path to the directory where documents are stored', NULL, NULL, NULL), + (13, 'en_US', 'The path to the image cache directory in the web space', NULL, NULL, NULL), + (14, 'en_US', 'The path to the document cache directory in the web space', NULL, NULL, NULL), + (15, 'en_US', 'File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)', NULL, NULL, NULL), + (16, 'en_US', 'Name of the template view returned when an obsolete (or inactive) product URL is invoked', NULL, NULL, NULL), + (17, 'en_US', 'Display and process prices with (0) or without (1) taxes.', NULL, NULL, NULL), + (18, 'en_US', 'Compile templates assets automatically upon asset source change (1 = yes, 0 = no)', NULL, NULL, NULL), + (19, 'en_US', '\"Remember me\" cookie name for administration users', NULL, NULL, NULL), + (20, 'en_US', '\"Remember me\" cookie expiration time, in seconds, for administration users', NULL, NULL, NULL), + (21, 'en_US', '\"Remember me\" cookie name for customer users', NULL, NULL, NULL), + (22, 'en_US', '\"Remember me\" cookie expiration time, in seconds, for customer users', NULL, NULL, NULL), + (23, 'en_US', 'Base URL of the shop (e.g. http://www.yourshopdomain.com)', NULL, NULL, NULL), + (24, 'en_US', 'Name of the invoice view in the current PDF template (without extension)', NULL, NULL, NULL), + (25, 'en_US', 'Name of the delivery view in the current PDF template (without extension)', NULL, NULL, NULL), + (26, 'en_US', 'The path (relative to the default back-office template) to the image used when no flag image can be found for a country', NULL, NULL, NULL), + (27, 'en_US', 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)', NULL, NULL, NULL), + (28, 'en_US', 'Default available stock when check-available-stock is set to 0.', NULL, NULL, NULL), + (29, 'en_US', 'The ID of the folder containing your information pages : terms, imprint, ...', NULL, NULL, NULL), + (30, 'en_US', 'The ID of the \'Terms & Conditions\' content.', NULL, NULL, NULL), + (31, 'en_US', 'Allow negative product stock (1) or not (0)', NULL, NULL, NULL), + (32, 'en_US', 'Use a persistent cookie to keep track of customer cart', NULL, NULL, NULL), + (33, 'en_US', 'Name of the cart cookie', NULL, NULL, NULL), + (34, 'en_US', 'Life time of the cart cookie in the customer browser, in seconds', NULL, NULL, NULL), + (35, 'en_US', 'Life time of the session cookie in the customer browser, in seconds', NULL, NULL, NULL), + (36, 'en_US', 'Leave the default configuration of session', NULL, NULL, NULL), + (37, 'en_US', 'Default lang without translation', NULL, NULL, NULL), + (52, 'en_US', '[Firewall/Bruteforce] Time to wait between X attempts', NULL, NULL, NULL), + (53, 'en_US', '[Firewall] Time to wait between X attempts', NULL, NULL, NULL), + (54, 'en_US', '[Firewall/Bruteforce] Number of allowed attemps', NULL, NULL, NULL), + (55, 'en_US', '[Firewall] Number of allowed attemps', NULL, NULL, NULL), + (56, 'en_US', '[Firewall] Activate the firewall', NULL, NULL, NULL), + (57, 'en_US', 'Allow slash ended uri', NULL, NULL, NULL), + (58, 'en_US', 'Show error message instead of a white page on a server error', NULL, NULL, NULL), + (59, 'en_US', 'Filename of the error page', NULL, NULL, NULL), + (60, 'en_US', 'Allow customers to change their email. 1 for yes, 0 for no', NULL, NULL, NULL), + (61, 'en_US', 'Ask the customers to confirm their email, 1 for yes, 0 for no', NULL, NULL, NULL), + (62, 'en_US', 'Secret key for form CSRF token', NULL, NULL, NULL), + (63, 'en_US', 'The minimum length required for an administrator password', NULL, NULL, NULL), + (64, 'en_US', 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)', NULL, NULL, NULL), + (65, 'en_US', 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)', NULL, NULL, NULL), + (66, 'en_US', 'Number by default of results per page for product list', NUll, NULL, NULL), + (67, 'en_US', 'Number by default of results per page for order list', NUll, NULL, NULL), + (68, 'en_US', 'Number by default of results per page for customer list', NUll, NULL, NULL), + (1, 'es_ES', 'Comprobar disponibilidad de stock de producto (1) o ignorar (0) cuando se muestra o cambia cantidad en pedido', NULL, NULL, NULL), + (2, 'es_ES', 'Nombre de la plantilla activa de recepción', NULL, NULL, NULL), + (3, 'es_ES', 'Nombe de la plantilla del administrador activo', NULL, NULL, NULL), + (4, 'es_ES', 'Nombre de la plantilla PDF activa', NULL, NULL, NULL), + (5, 'es_ES', 'Nombre de la plantilla de correo activa', NULL, NULL, NULL), + (6, 'es_ES', 'Activar(1) o desactivar(0) reescritura de URL', NULL, NULL, NULL), + (7, 'es_ES', 'Nombre del controlador gráfico usado por la Librería Imagine (ver https://imagine.readthedocs.org)', NULL, NULL, NULL), + (8, 'es_ES', 'La calidad por defecto (en %) de las imágenes generadas', NULL, NULL, NULL), + (9, 'es_ES', 'Cómo se entregan imágenes originales (resolución completa) en el espacio de la web (enlace o copia)', NULL, NULL, NULL), + (10, 'es_ES', 'Cómo los documento son enviados en el espacio de la web (enlace o copia)', NULL, NULL, NULL), + (11, 'es_ES', 'Ruta al directorio donde las imágenes estén guardadas', NULL, NULL, NULL), + (12, 'es_ES', 'Ruta al directorio donde los documentos estén guardados', NULL, NULL, NULL), + (13, 'es_ES', 'La ruta de acceso para el directorio de caché de imagen en el espacio web', NULL, NULL, NULL), + (14, 'es_ES', 'La ruta al directorio de caché de documentos en el espacio web', NULL, NULL, NULL), + (15, 'es_ES', 'Nombre de archivo de la vista 404 (no encontrado) en la plantilla actual (con la extensión, ej: 404.html)', NULL, NULL, NULL), + (16, 'es_ES', 'Nombre de la plantilla regresada cuando se llama una URL obsoleta (o inactiva) de un producto', NULL, NULL, NULL), + (17, 'es_ES', 'Mostrar y procesar precios con (0) o sin (1) impuestos.', NULL, NULL, NULL), + (18, 'es_ES', 'Compilar las plantillas automáticamente en cada cambio de código fuente (1 = sí, 2 = no)', NULL, NULL, NULL), + (19, 'es_ES', 'Nombre de la cookie \"Recordarme\" para los usuarios de administración', NULL, NULL, NULL), + (20, 'es_ES', 'Fecha de caducidad de cookie \"recuerdame\", en segundos, para los usuarios de la administración', NULL, NULL, NULL), + (21, 'es_ES', 'Nombre de la cookie \"Recordarme\" para los usuarios cliente', NULL, NULL, NULL), + (22, 'es_ES', 'Fecha de caducidad de cookie \"Acuérdate de mi\", en segundos, para los usuarios cliente', NULL, NULL, NULL), + (23, 'es_ES', 'Base URL de la tienda (por ejemplo http://www.yourshopdomain.com)', NULL, NULL, NULL), + (24, 'es_ES', 'Nombre de la vista para la factura en la plantilla PDF actual (sin extensión)', NULL, NULL, NULL), + (25, 'es_ES', 'Nombre de la vista de entrega en la plantilla PDF actual (sin extensión)', NULL, NULL, NULL), + (26, 'es_ES', 'La ruta (relativa a la plantilla de back office por defecto) a la imagen que se utiliza cuando no se puede encontrar ninguna imagen de la bandera para un país', NULL, NULL, NULL), + (27, 'es_ES', 'Espacio en blanco del ajuste nivel del código HTML generado (0 = ninguna, 1 = medio, 2 = máximo)', NULL, NULL, NULL), + (28, 'es_ES', 'Cuando check-available-stock es 0 stock disponible por defecto.', NULL, NULL, NULL), + (29, 'es_ES', 'El ID de la carpeta que contiene sus páginas de información: términos, impresión,...', NULL, NULL, NULL), + (30, 'es_ES', 'El ID de los contenidos de \'Términos y condiciones\'.', NULL, NULL, NULL), + (31, 'es_ES', 'Permitir valores negativos producto (1) o no (0)', NULL, NULL, NULL), + (32, 'es_ES', 'Usa una \'cookie\' persistente para mantener el trayecto del carrito del cliente', NULL, NULL, NULL), + (33, 'es_ES', 'Nombre de la cookie del carrito', NULL, NULL, NULL), + (34, 'es_ES', 'Tiempo de vida de la cookie del carro en el navegador del cliente, en segundos', NULL, NULL, NULL), + (35, 'es_ES', 'Tiempo de vida de la cookie de la sesión en el navegador del cliente, en segundos', NULL, NULL, NULL), + (36, 'es_ES', 'Abandonde la configuración predeterminada de la sesión', NULL, NULL, NULL), + (37, 'es_ES', 'Lenguaje por defecto sin traducción', NULL, NULL, NULL), + (52, 'es_ES', '[Firewall/Bruteforce] Tiempo de espera entre X intentos', NULL, NULL, NULL), + (53, 'es_ES', '[Firewall] Tiempo de espera entre X intentos', NULL, NULL, NULL), + (54, 'es_ES', '[Firewall/Bruteforce] Número de intentos permitidos', NULL, NULL, NULL), + (55, 'es_ES', '[Firewall] Número de intentos permitidos', NULL, NULL, NULL), + (56, 'es_ES', '[Firewall] Activar el firewall', NULL, NULL, NULL), + (57, 'es_ES', 'Permitir barra de fín de url', NULL, NULL, NULL), + (58, 'es_ES', 'Mostrar mensaje de error en lugar de una página en blanco cuando ocurre un error de servidor', NULL, NULL, NULL), + (59, 'es_ES', 'Nombre de archivo de la página de error', NULL, NULL, NULL), + (60, 'es_ES', 'Permitir a los clientes cambiar su correo electrónico. 1 para sí, 0 para no', NULL, NULL, NULL), + (61, 'es_ES', 'Preguntar al cliente para confirmar su correo electrónico, 1 para sí, 0 no', NULL, NULL, NULL), + (62, 'es_ES', 'Clave secreta para el token CSRF del formulario', NULL, NULL, NULL), + (63, 'es_ES', 'La longitud mínima de la contraseña de administrador', NULL, NULL, NULL), + (64, 'es_ES', 'Permite a un administrador recrear una contraseña perdida (1 = sí, 0 = no)', NULL, NULL, NULL), + (65, 'es_ES', 'Enviar un correo de confirmación a los suscriptores del boletín (1 = sí, 0 = no)', NULL, NULL, NULL), + (66, 'es_ES', 'Número predeterminado de resultados por página para la lista de productos', NUll, NULL, NULL), + (67, 'es_ES', 'Número predeterminado de resultados por página para la lista de pedidos', NUll, NULL, NULL), + (68, 'es_ES', 'Número predeterminado de resultados por página para la lista de clientes', NUll, NULL, NULL), + (1, 'fr_FR', 'Vérifier la présence de produits en stock (1) ou l\'ignorer (0) lors de l\'affichage et la modification des quantités commandées', NULL, NULL, NULL), + (2, 'fr_FR', 'Nom du modèle de front-office actif', NULL, NULL, NULL), + (3, 'fr_FR', 'Nom du modèle de back-office actif', NULL, NULL, NULL), + (4, 'fr_FR', 'Nom du modèle PDF actif', NULL, NULL, NULL), + (5, 'fr_FR', 'Nom du modèle d\'e-mail actif', NULL, NULL, NULL), + (6, 'fr_FR', 'Activer (1) ou désactiver (0) la réécriture d\'URL', NULL, NULL, NULL), + (7, 'fr_FR', 'Nom du pilote graphique utilisé par la bibliothèque Imagine (voir https://imagine.readthedocs.org)', NULL, NULL, NULL), + (8, 'fr_FR', 'La qualité par défaut (en %) dans les images générées', NULL, NULL, NULL), + (9, 'fr_FR', 'Comment les images originales (pleine résolution) sont-elles fournises dans l\'espace web (lien symbolique ou copie)', NULL, NULL, NULL), + (10, 'fr_FR', 'Comment les documents sont-ils fournis dans l\'espace web (lien symbolique ou copie)', NULL, NULL, NULL), + (11, 'fr_FR', 'Chemin vers le répertoire où les images sont stockées', NULL, NULL, NULL), + (12, 'fr_FR', 'Chemin vers le répertoire où sont stockés les documents', NULL, NULL, NULL), + (13, 'fr_FR', 'Chemin vers le répertoire de cache d\'images dans l\'espace web', NULL, NULL, NULL), + (14, 'fr_FR', 'Chemin d\'accès au répertoire de cache de documents dans l\'espace web', NULL, NULL, NULL), + (15, 'fr_FR', 'Nom de la page 404 (introuvable) dans le modèle actuel (avec l\'extension, par exemple, 404.html)', NULL, NULL, NULL), + (16, 'fr_FR', 'Nom de la page du modèle retournée lorsqu\'une URL obsolète (ou inactive) est invoquée', NULL, NULL, NULL), + (17, 'fr_FR', 'Affiche et traite les prix avec(0) ou sans (1) les taxes', NULL, NULL, NULL), + (18, 'fr_FR', 'Compiler les resources du modèle actif à chaque changement (1 = oui, 2 = non)', NULL, NULL, NULL), + (19, 'fr_FR', 'Nom du cookie \"Remember me\" pour les utilisateurs d\'administration', NULL, NULL, NULL), + (20, 'fr_FR', 'Délai d\'expiration du cookie \"Remember me\", en secondes, pour les utilisateurs d\'administration', NULL, NULL, NULL), + (21, 'fr_FR', 'Nom du cookie \"Remember me\" pour les clients', NULL, NULL, NULL), + (22, 'fr_FR', 'Délai d\'expiration du cookie \"Remember me\", en secondes, pour les clients', NULL, NULL, NULL), + (23, 'fr_FR', 'URL de base pour la boutique (par exemple http://www.yourshopdomain.com)', NULL, NULL, NULL), + (24, 'fr_FR', 'Nom de la vue de la facture dans le modèle PDF en cours (sans extension)', NULL, NULL, NULL), + (25, 'fr_FR', 'Nom de la vue de la livraison dans le modèle PDF en cours (sans extension)', NULL, NULL, NULL), + (26, 'fr_FR', 'Le chemin (par rapport au modèle de back-office par défaut) vers l\'image utilisée lorsque aucune image de drapeau ne peut être trouvée pour un pays', NULL, NULL, NULL), + (27, 'fr_FR', 'Niveau de découpe des espaces dans le code HTML généré (0 = aucun, 1 = moyen, 2 = maximum)', NULL, NULL, NULL), + (28, 'fr_FR', 'Stock disponible par défaut quand check-available-stock est à 0.', NULL, NULL, NULL), + (29, 'fr_FR', 'L\'ID du dossier contenant vos pages d\'informations : CGV, mentions légales, ...', NULL, NULL, NULL), + (30, 'fr_FR', 'L\'ID du contenu de vos \'CGV\'.', NULL, NULL, NULL), + (31, 'fr_FR', 'Autoriser un stock négatif sur les produits (1) ou pas (0, défaut)', NULL, NULL, NULL), + (32, 'fr_FR', 'Utiliser un cookie persistant pour mémoriser le panier du client', NULL, NULL, NULL), + (33, 'fr_FR', 'Nom du cookie de stockage du panier', NULL, NULL, NULL), + (34, 'fr_FR', 'Durée de vie du cookie du panier dans le navigateur du client, en secondes', NULL, NULL, NULL), + (35, 'fr_FR', 'Durée de vie du cookie de la session dans le navigateur du client, en secondes', NULL, NULL, NULL), + (36, 'fr_FR', 'Laisser la configuration par défaut de la session', NULL, NULL, NULL), + (37, 'fr_FR', 'Langue par défaut sans traduction', NULL, NULL, NULL), + (52, 'fr_FR', '[Pare-feu/Bruteforce] Temps à attendre entre X essais', NULL, NULL, NULL), + (53, 'fr_FR', '[Pare-feu] Temps à attendre entre X essais', NULL, NULL, NULL), + (54, 'fr_FR', '[Pare-feu/Bruteforce] Nombre de tentatives autorisées', NULL, NULL, NULL), + (55, 'fr_FR', '[Pare-feu] Nombre de tentatives autorisées', NULL, NULL, NULL), + (56, 'fr_FR', '[Pare-feu] Activer le pare-feu', NULL, NULL, NULL), + (57, 'fr_FR', 'Autoriser les URI terminées par un slash', NULL, NULL, NULL), + (58, 'fr_FR', 'Afficher un message d\'erreur à la place d\'une page blanche lors d\'une erreur serveur', NULL, NULL, NULL), + (59, 'fr_FR', 'Nom du fichier de la page d\'erreur', NULL, NULL, NULL), + (60, 'fr_FR', 'Permettre aux utilisateurs de changer leur email. 1 pour oui, 0 pour non', NULL, NULL, NULL), + (61, 'fr_FR', 'Demander aux clients de confirmer leur email. 1 pour oui, 0 pour non', NULL, NULL, NULL), + (62, 'fr_FR', 'Clé secrète pour le jeton CSRF des formulaires', NULL, NULL, NULL), + (63, 'fr_FR', 'La longueur minimale requise pour un mot de passe administrateur', NULL, NULL, NULL), + (64, 'fr_FR', 'Permettre à un administrateur de recréer un mot de passe perdu (1 = Oui, 0 = non)', NULL, NULL, NULL), + (65, 'fr_FR', 'Envoyer un email de confirmation aux abonnés de la newsletter (1 = Oui, 0 = non)', NULL, NULL, NULL), + (66, 'fr_FR', 'Nombre par défaut de résultats par page pour la liste des produits', NUll, NULL, NULL), + (67, 'fr_FR', 'Nombre par défaut de résultats par page pour la liste des commandes', NUll, NULL, NULL), + (68, 'fr_FR', 'Nombre par défaut de résultats par page pour la liste des clients', NUll, NULL, NULL) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES + (1, 'de_DE', 'Ein Bilder-Karussel auf Ihre Startseite', NULL, NULL, NULL), + (2, 'de_DE', '72Std Lieferung ', NULL, NULL, NULL), + (3, 'de_DE', 'Per Cheque bezahlen', NULL, NULL, NULL), + (4, 'de_DE', 'Front office Modul ', NULL, NULL, NULL), + (5, 'de_DE', 'TinyMCE WYSIWYG Editor', NULL, NULL, NULL), + (6, 'de_DE', 'Menü Block', NULL, NULL, NULL), + (7, 'de_DE', 'Währungensblock', NULL, NULL, NULL), + (8, 'de_DE', 'Sprachen Block', NULL, NULL, NULL), + (9, 'de_DE', 'Suche-Block', NULL, NULL, NULL), + (10, 'de_DE', 'Kundenkonto-Block', NULL, NULL, NULL), + (11, 'de_DE', 'Warenkorb Block', NULL, NULL, NULL), + (12, 'de_DE', 'Google Analytics Block', NULL, NULL, NULL), + (13, 'de_DE', 'Kontakt-Block', NULL, NULL, NULL), + (14, 'de_DE', 'Links Block', NULL, NULL, NULL), + (15, 'de_DE', 'Newsletter Block', NULL, NULL, NULL), + (16, 'de_DE', 'Social Networks Block', NULL, NULL, NULL), + (17, 'de_DE', 'Neue Produkte Block', NULL, NULL, NULL), + (18, 'de_DE', 'Sonderangebot-Block', NULL, NULL, NULL), + (19, 'de_DE', 'Smarty Template Engine Integration', NULL, NULL, NULL), + (20, 'de_DE', 'Steuerung für virtuelle Produkte', NULL, NULL, NULL), + (1, 'en_US', 'An image carousel on your home page', NULL, NULL, NULL), + (2, 'en_US', '72h delivery', NULL, NULL, NULL), + (3, 'en_US', 'Pay by cheque', NULL, NULL, NULL), + (4, 'en_US', 'Front office integration', NULL, NULL, NULL), + (5, 'en_US', 'TinyMCE WYSIWYG editor', NULL, NULL, NULL), + (6, 'en_US', 'Navigation block', NULL, NULL, NULL), + (7, 'en_US', 'Currency block', NULL, NULL, NULL), + (8, 'en_US', 'Languages block', NULL, NULL, NULL), + (9, 'en_US', 'Search block', NULL, NULL, NULL), + (10, 'en_US', 'Customer account block', NULL, NULL, NULL), + (11, 'en_US', 'Cart block', NULL, NULL, NULL), + (12, 'en_US', 'Google Analytics block', NULL, NULL, NULL), + (13, 'en_US', 'Contact block', NULL, NULL, NULL), + (14, 'en_US', 'Links block', NULL, NULL, NULL), + (15, 'en_US', 'Newsletter block', NULL, NULL, NULL), + (16, 'en_US', 'Social Networks block', NULL, NULL, NULL), + (17, 'en_US', 'New Products block', NULL, NULL, NULL), + (18, 'en_US', 'Products offer block', NULL, NULL, NULL), + (19, 'en_US', 'Smarty template engine integration', NULL, NULL, NULL), + (20, 'en_US', 'Virtual Product Controller', NULL, NULL, NULL), + (1, 'es_ES', 'Un carrusel de imágenes en la página de inicio', NULL, NULL, NULL), + (2, 'es_ES', 'entrega 72h', NULL, NULL, NULL), + (3, 'es_ES', 'Pagar con Cheque', NULL, NULL, NULL), + (4, 'es_ES', 'Front office integración', NULL, NULL, NULL), + (5, 'es_ES', 'Editor TinyMCE WYSIWYG', NULL, NULL, NULL), + (6, 'es_ES', 'Bloque de navegación', NULL, NULL, NULL), + (7, 'es_ES', 'Bloque de monedas', NULL, NULL, NULL), + (8, 'es_ES', 'Bloque de idiomas', NULL, NULL, NULL), + (9, 'es_ES', 'Bloque de búsqueda', NULL, NULL, NULL), + (10, 'es_ES', 'Bloque de cuenta de cliente', NULL, NULL, NULL), + (11, 'es_ES', 'Bloque de carrito', NULL, NULL, NULL), + (12, 'es_ES', 'Bloque Google Analytics', NULL, NULL, NULL), + (13, 'es_ES', 'Bloque de contacto', NULL, NULL, NULL), + (14, 'es_ES', 'Bloque de enlaces', NULL, NULL, NULL), + (15, 'es_ES', 'Bloque del boletín de noticias', NULL, NULL, NULL), + (16, 'es_ES', 'Bloque de Redes Sociales', NULL, NULL, NULL), + (17, 'es_ES', 'Bloque de nuevos productos', NULL, NULL, NULL), + (18, 'es_ES', 'Bloque de oferta de productos', NULL, NULL, NULL), + (19, 'es_ES', 'Integración del motor de plantillas Smarty', NULL, NULL, NULL), + (20, 'es_ES', 'Controlador de producto virtual', NULL, NULL, NULL), + (1, 'fr_FR', 'Un carrousel d\'images sur votre page d\'accueil', NULL, NULL, NULL), + (2, 'fr_FR', 'Livraison par colissimo en 72h', NULL, NULL, NULL), + (3, 'fr_FR', 'Payer par chèque', NULL, NULL, NULL), + (4, 'fr_FR', 'Module Front office', NULL, NULL, NULL), + (5, 'fr_FR', 'Editeur visuel TinyMCE', NULL, NULL, NULL), + (6, 'fr_FR', 'Bloc menu', NULL, NULL, NULL), + (7, 'fr_FR', 'Bloc des devises', NULL, NULL, NULL), + (8, 'fr_FR', 'Bloc des langues', NULL, NULL, NULL), + (9, 'fr_FR', 'Bloc de recherche', NULL, NULL, NULL), + (10, 'fr_FR', 'Bloc compte client', NULL, NULL, NULL), + (11, 'fr_FR', 'Bloc panier', NULL, NULL, NULL), + (12, 'fr_FR', 'Bloc Google Analytics', NULL, NULL, NULL), + (13, 'fr_FR', 'Bloc contact', NULL, NULL, NULL), + (14, 'fr_FR', 'Bloc liens', NULL, NULL, NULL), + (15, 'fr_FR', 'Bloc newsletter', NULL, NULL, NULL), + (16, 'fr_FR', 'Bloc réseaux sociaux', NULL, NULL, NULL), + (17, 'fr_FR', 'Bloc nouveaux produits', NULL, NULL, NULL), + (18, 'fr_FR', 'Bloc promotions', NULL, NULL, NULL), + (19, 'fr_FR', 'Intégration du moteur de template Smarty', NULL, NULL, NULL), + (20, 'fr_FR', 'Contôle de produit virtuel', NULL, NULL, NULL) +; + +-- Insert I18n front hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES + (1, 'de_DE', 'Bezahlungsmethode - oben', NULL, NULL), + (2, 'de_DE', 'Bezahlungsmethode - Lieferadresse', NULL, NULL), + (3, 'de_DE', 'Bezahlungsmethode - extra payment zone', NULL, NULL), + (4, 'de_DE', 'Bezahlungsmethode - unten', NULL, NULL), + (5, 'de_DE', 'Bezahlungsmethode - nach der Initialisierung von Javascript', NULL, NULL), + (6, 'de_DE', 'Bezahlungsmethode - CSS-Stylesheet', NULL, NULL), + (7, 'de_DE', 'Bezahlungsmethode - Nach Integration von JavaScript', NULL, NULL), + (8, 'de_DE', 'Zahlung-Gateway - Hauptbereich', NULL, NULL), + (9, 'de_DE', 'Zahlung-Gateway - Javascript', NULL, NULL), + (10, 'de_DE', 'Zahlung-Gateway - nach der Initialisierung von Javascript', NULL, NULL), + (11, 'de_DE', 'Zahlung-Gateway - CSS-Stylesheet', NULL, NULL), + (12, 'de_DE', 'Zahlung-Gateway - Nach Integration von JavaScript', NULL, NULL), + (13, 'de_DE', 'Sitemap - unten', NULL, NULL), + (14, 'de_DE', 'Währungswahl-Seite - oben', NULL, NULL), + (15, 'de_DE', 'Währungswahl-Seite - unten', NULL, NULL), + (16, 'de_DE', 'Währungswahl-Seite - CSS-Stylesheet', NULL, NULL), + (17, 'de_DE', 'Währungswahl-Seite - Nach Integration von JavaScript', NULL, NULL), + (18, 'de_DE', 'Währungswahl-Seite - nach der Initialisierung von Javascript', NULL, NULL), + (19, 'de_DE', 'Anmeldeseite - oben', NULL, NULL), + (20, 'de_DE', 'Anmeldeseite - oben an dem Hauptbereich', NULL, NULL), + (21, 'de_DE', 'Anmeldeseite - oben im Formular', NULL, NULL), + (22, 'de_DE', 'Anmeldeseite - unten an dem Formular', NULL, NULL), + (23, 'de_DE', 'Anmeldeseite - unten an dem Hauptbereich', NULL, NULL), + (24, 'de_DE', 'Anmeldeseite - unten', NULL, NULL), + (25, 'de_DE', 'Anmeldeseite - CSS-Stylesheet', NULL, NULL), + (26, 'de_DE', 'Anmeldeseite - Nach Integration von JavaScript', NULL, NULL), + (27, 'de_DE', 'Anmeldeseite - nach der Initialisierung von Javascript', NULL, NULL), + (28, 'de_DE', 'Kundenkonto Änderung - oben', NULL, NULL), + (29, 'de_DE', 'Kundenkonto Änderung - oben im Formular', NULL, NULL), + (30, 'de_DE', 'Kundenkonto Änderung - unten an dem Formular', NULL, NULL), + (31, 'de_DE', 'Kundenkonto Änderung - unten', NULL, NULL), + (32, 'de_DE', 'Kundenkonto Änderung - CSS-Stylesheet', NULL, NULL), + (33, 'de_DE', 'Kundenkonto Änderung - Nach Integration von JavaScript', NULL, NULL), + (34, 'de_DE', 'Kundenkonto Änderung - nach der Initialisierung von Javascript', NULL, NULL), + (35, 'de_DE', 'Warenkorb - oben ', NULL, NULL), + (36, 'de_DE', 'Warenkorb - unten', NULL, NULL), + (37, 'de_DE', 'Warenkorb - Nach Integration von JavaScript', NULL, NULL), + (38, 'de_DE', 'Warenkorb - CSS-Stylesheet', NULL, NULL), + (39, 'de_DE', 'Warenkorb - Initialisierung von Javascript', NULL, NULL), + (40, 'de_DE', 'Kontaktseite - oben', NULL, NULL), + (41, 'de_DE', 'Kontaktseite - oben an dem Formular', NULL, NULL), + (42, 'de_DE', 'Kontaktseite - unten an dem Formular', NULL, NULL), + (43, 'de_DE', 'Kontaktseite - unten', NULL, NULL), + (44, 'de_DE', 'Kontaktseite - CSS-Stylesheet', NULL, NULL), + (45, 'de_DE', 'Kontaktseite - Nach Integration von JavaScript', NULL, NULL), + (46, 'de_DE', 'Kontaktseite - nach der Initialisierung von Javascript', NULL, NULL), + (47, 'de_DE', 'Erteilten Auftrag - Hauptbereich', NULL, NULL), + (48, 'de_DE', 'Erteilten Auftrag - CSS-Stylesheet', NULL, NULL), + (49, 'de_DE', 'Erteilten Auftrag - nach Integration von JavaScript', NULL, NULL), + (50, 'de_DE', 'Erteilten Auftrag - nach der Initialisierung von Javascript', NULL, NULL), + (51, 'de_DE', 'Suche-Seite - CSS-Stylesheet', NULL, NULL), + (52, 'de_DE', 'Suche-Seite - Nach Integration von JavaScript', NULL, NULL), + (53, 'de_DE', 'Suche-Seite - nach der Initialisierung von Javascript', NULL, NULL), + (54, 'de_DE', 'Konto-Erstellung - oben', NULL, NULL), + (55, 'de_DE', 'Konto-Erstellung - oben im Formular', NULL, NULL), + (56, 'de_DE', 'Konto-Erstellung - unten an dem Formular', NULL, NULL), + (57, 'de_DE', 'Konto-Erstellung - unten', NULL, NULL), + (58, 'de_DE', 'Konto-Erstellung - CSS-Stylesheet', NULL, NULL), + (59, 'de_DE', 'Konto-Erstellung - Nach Integration von JavaScript', NULL, NULL), + (60, 'de_DE', 'Konto-Erstellung - nach der Initialisierung von Javascript', NULL, NULL), + (61, 'de_DE', 'Passwort verloren - oben', NULL, NULL), + (62, 'de_DE', 'Passwort verloren - oben im Formular', NULL, NULL), + (63, 'de_DE', 'Passwort verloren - unten an dem Formular', NULL, NULL), + (64, 'de_DE', 'Passwort verloren - unten', NULL, NULL), + (65, 'de_DE', 'Passwort verloren - CSS-Stylesheet', NULL, NULL), + (66, 'de_DE', 'Passwort verloren - Nach Integration von JavaScript', NULL, NULL), + (67, 'de_DE', 'Passwort verloren - Initialisierung von Javascript', NULL, NULL), + (68, 'de_DE', 'Sprachwahl Seite - oben', NULL, NULL), + (69, 'de_DE', 'Sprachwahl Seite - unten', NULL, NULL), + (70, 'de_DE', 'Sprachwahl Seite - CSS-Stylesheet', NULL, NULL), + (71, 'de_DE', 'Sprachwahl Seite - Nach Integration von JavaScript', NULL, NULL), + (72, 'de_DE', 'Sprachwahl Seite - nach der Initialisierung von Javascript', NULL, NULL), + (73, 'de_DE', 'Kontaktseite - wenn erfolgreich', NULL, NULL), + (74, 'de_DE', 'Newletter-Seite - oben', NULL, NULL), + (75, 'de_DE', 'Newletter-Seite - unten', NULL, NULL), + (76, 'de_DE', 'Newletter-Seite - CSS-Stylesheet', NULL, NULL), + (77, 'de_DE', 'Newletter-Seite - Nach Integration von JavaScript', NULL, NULL), + (78, 'de_DE', 'Newletter-Seite - nach der Initialisierung von Javascript', NULL, NULL), + (79, 'de_DE', 'Bezahlungs-Fehlschlagen - CSS-Stylesheet', NULL, NULL), + (80, 'de_DE', 'Bezahlungs-Fehlschlagen - Nach Integration von JavaScript', NULL, NULL), + (81, 'de_DE', 'Bezahlungs-Fehlschlagen - Initialisierung von Javascript', NULL, NULL), + (82, 'de_DE', 'Inhaltseite - oben', NULL, NULL), + (83, 'de_DE', 'Inhaltseite - oben an dem Hauptbereich', NULL, NULL), + (84, 'de_DE', 'Inhaltseite - unten an dem Hauptbereich', NULL, NULL), + (85, 'de_DE', 'Inhaltseite - unten', NULL, NULL), + (86, 'de_DE', 'Inhaltseite - CSS-Stylesheet', NULL, NULL), + (87, 'de_DE', 'Inhaltseite - Nach Integration von JavaScript', NULL, NULL), + (88, 'de_DE', 'Inhaltseite - nach der Initialisierung von Javascript', NULL, NULL), + (89, 'de_DE', 'HTML Struktur - nach der Eröffnung des Head-Tag', NULL, NULL), + (90, 'de_DE', 'HTML Struktur - CSS-Stylesheet', NULL, NULL), + (91, 'de_DE', 'HTML Struktur - vor dem Ende des Head-Tag', NULL, NULL), + (92, 'de_DE', 'HTML Struktur - nach der Eröffnung des Body-Tag', NULL, NULL), + (93, 'de_DE', 'HTML Struktur - oben an dem Header', NULL, NULL), + (94, 'de_DE', 'HTML Struktur - Sekundärenavigation', NULL, NULL), + (95, 'de_DE', 'HTML Struktur - Hauptnavigation', NULL, NULL), + (96, 'de_DE', 'HTML Struktur - unten an dem Header', NULL, NULL), + (97, 'de_DE', 'HTML Struktur - vor dem Hauptinhaltsbereich', NULL, NULL), + (98, 'de_DE', 'HTML Struktur - nach dem Hauptinhaltsbereich', NULL, NULL), + (99, 'de_DE', 'HTML Struktur - oben an dem Footer', NULL, NULL), + (100, 'de_DE', 'HTML Struktur - Footer Body', NULL, NULL), + (101, 'de_DE', 'HTML Struktur - unten an dem Footer', NULL, NULL), + (102, 'de_DE', 'HTML Struktur - Nach Integration von JavaScript', NULL, NULL), + (103, 'de_DE', 'HTML Struktur - Initialisierung von Javascript', NULL, NULL), + (104, 'de_DE', 'HTML Struktur - vor dem Ende des Body-Tag', NULL, NULL), + (105, 'de_DE', 'Seite nicht gefunden - Inhalts-Bereich', NULL, NULL), + (106, 'de_DE', 'Seite nicht gefunden - CSS-Stylesheet', NULL, NULL), + (107, 'de_DE', 'Seite nicht gefunden - Nach Integration von JavaScript', NULL, NULL), + (108, 'de_DE', 'Seite nicht gefunden - nach der Initialisierung von Javascript', NULL, NULL), + (109, 'de_DE', 'Lieferwahl - oben', NULL, NULL), + (110, 'de_DE', 'Lieferwahl - oben an dem Formular', NULL, NULL), + (111, 'de_DE', 'Lieferwahl - unten an dem Formular', NULL, NULL), + (112, 'de_DE', 'Lieferwahl - unten', NULL, NULL), + (113, 'de_DE', 'Lieferwahl - nach der Initialisierung von Javascript', NULL, NULL), + (114, 'de_DE', 'Lieferwahl - CSS-Stylesheet', NULL, NULL), + (115, 'de_DE', 'Lieferwahl - Nach Integration von JavaScript', NULL, NULL), + (116, 'de_DE', 'Adresse Erstellung - oben', NULL, NULL), + (117, 'de_DE', 'Adresse Erstellung - oben im Formular', NULL, NULL), + (118, 'de_DE', 'Adresse Erstellung - unten im Formular', NULL, NULL), + (119, 'de_DE', 'Adresse Erstellung - unten', NULL, NULL), + (120, 'de_DE', 'Adresse Erstellung - CSS-Stylesheet', NULL, NULL), + (121, 'de_DE', 'Adresse Erstellung - nach der Integration von Javascript', NULL, NULL), + (122, 'de_DE', 'Adresse Erstellung - nach der Initialisierung von Javascript', NULL, NULL), + (123, 'de_DE', 'Ordnerseite - oben', NULL, NULL), + (124, 'de_DE', 'Ordnerseite - oben an dem Hauptbereich', NULL, NULL), + (125, 'de_DE', 'Ordnerseite - unten an dem Hauptbereich', NULL, NULL), + (126, 'de_DE', 'Ordnerseite - unten', NULL, NULL), + (127, 'de_DE', 'Ordnerseite - CSS-Stylesheet', NULL, NULL), + (128, 'de_DE', 'Ordnerseite - Nach Integration von JavaScript', NULL, NULL), + (129, 'de_DE', 'Ordnerseite - nach der Initialisierung von Javascript', NULL, NULL), + (130, 'de_DE', 'Fehlschlag der Bestellung - oben', NULL, NULL), + (131, 'de_DE', 'Fehlschlag der Bestellung - unten', NULL, NULL), + (132, 'de_DE', 'Fehlschlag der Bestellung - CSS-Stylesheet', NULL, NULL), + (133, 'de_DE', 'Fehlschlag der Bestellung - Nach Integration von JavaScript', NULL, NULL), + (134, 'de_DE', 'Fehlschlag der Bestellung - nach der Initialisierung von Javascript', NULL, NULL), + (135, 'de_DE', 'Kategorieseite - oben', NULL, NULL), + (136, 'de_DE', 'Kategorieseite - oben an dem Hauptbereich', NULL, NULL), + (137, 'de_DE', 'Kategorieseite - unten an dem Hauptbereich', NULL, NULL), + (138, 'de_DE', 'Kategorieseite - unten', NULL, NULL), + (139, 'de_DE', 'Kategorieseite - CSS-Stylesheet', NULL, NULL), + (140, 'de_DE', 'Kategorieseite - Nach Integration von JavaScript', NULL, NULL), + (141, 'de_DE', 'Kategorieseite - nach der Initialisierung von Javascript', NULL, NULL), + (142, 'de_DE', 'Adresseänderung - oben', NULL, NULL), + (143, 'de_DE', 'Adressänderung - oben im Formular', NULL, NULL), + (144, 'de_DE', 'Adresseänderung - unten im Formular', NULL, NULL), + (145, 'de_DE', 'Adresseänderung - unten', NULL, NULL), + (146, 'de_DE', 'Adresseänderung - CSS-Stylesheet', NULL, NULL), + (147, 'de_DE', 'Adresseänderung - nach der Integration von Javascript', NULL, NULL), + (148, 'de_DE', 'Adresseänderung - nach der Initialisierung von Javascript', NULL, NULL), + (149, 'de_DE', 'Startseite - Hauptbereich', NULL, NULL), + (150, 'de_DE', 'Startseite - CSS-Stylesheet', NULL, NULL), + (151, 'de_DE', 'Startseite - Nach Integration von JavaScript', NULL, NULL), + (152, 'de_DE', 'Startseite - nach der Initialisierung von Javascript', NULL, NULL), + (153, 'de_DE', 'Passwort Änderung - oben', NULL, NULL), + (154, 'de_DE', 'Passwort Änderung - unten', NULL, NULL), + (155, 'de_DE', 'Passwort Änderung - CSS-Stylesheet', NULL, NULL), + (156, 'de_DE', 'Passwort Änderung - Nach Integration von JavaScript', NULL, NULL), + (157, 'de_DE', 'Passwort Änderung - nach der Initialisierung von Javascript', NULL, NULL), + (158, 'de_DE', 'Produktseite - oben', NULL, NULL), + (159, 'de_DE', 'Produktseite - Bilder-Gallerie', NULL, NULL), + (160, 'de_DE', 'Produktseite - oben dem Details-Bereich', NULL, NULL), + (161, 'de_DE', 'Produktseite - unten dem Details-Bereich', NULL, NULL), + (162, 'de_DE', 'Produktseite - erweitere Informationen', NULL, NULL), + (163, 'de_DE', 'Produktseite - unten', NULL, NULL), + (164, 'de_DE', 'Produktseite - CSS-Stylesheet', NULL, NULL), + (165, 'de_DE', 'Produktseite - Nach Integration von JavaScript', NULL, NULL), + (166, 'de_DE', 'Produktseite - nach der Initialisierung von Javascript', NULL, NULL), + (167, 'de_DE', 'Kundenkonto - oben', NULL, NULL), + (168, 'de_DE', 'Kundenkonto - unten', NULL, NULL), + (169, 'de_DE', 'Kundenkonto - CSS-Stylesheet', NULL, NULL), + (170, 'de_DE', 'Kundenkonto - Nach Integration von JavaScript', NULL, NULL), + (171, 'de_DE', 'Kundenkonto - nach der Initialisierung von Javascript', NULL, NULL), + (172, 'de_DE', 'Alle Produkte - oben', NULL, NULL), + (173, 'de_DE', 'Alle Produkte - unten', NULL, NULL), + (174, 'de_DE', 'Alle Produkte - CSS-Stylesheet', NULL, NULL), + (175, 'de_DE', 'Alle Produkte - nach der Integration von Javascript', NULL, NULL), + (176, 'de_DE', 'Alle Produkte - nach der Initialisierung von Javascript', NULL, NULL), + (177, 'de_DE', 'Produkt-Loop - oben', NULL, NULL), + (178, 'de_DE', 'Produkt-Loop - unten', NULL, NULL), + (179, 'de_DE', 'Kategorieseite - oben an der Sidebar', NULL, NULL), + (180, 'de_DE', 'Kategorieseite - Sidebars Body', NULL, NULL), + (181, 'de_DE', 'Kategorieseite - unten an der Sidebar', NULL, NULL), + (182, 'de_DE', 'Inhaltseite - oben an der Sidebar', NULL, NULL), + (183, 'de_DE', 'Inhaltseite - Sidebars Body', NULL, NULL), + (184, 'de_DE', 'Inhaltseite - unten an der Sidebar', NULL, NULL), + (185, 'de_DE', 'Lieferwahl - Erweiteren Bereich', NULL, NULL), + (186, 'de_DE', 'Lieferwahl - Javascript', NULL, NULL), + (187, 'de_DE', 'Kategorieseite - vor dem Hauptinhaltsbereich', NULL, NULL), + (188, 'de_DE', 'Kategorieseite - nach dem Hauptinhaltsbereich', NULL, NULL), + (189, 'de_DE', 'Inhaltseite- vor dem Hauptinhaltsbereich', NULL, NULL), + (190, 'de_DE', 'Inhaltseite - nach dem Hauptinhaltsbereich', NULL, NULL), + (191, 'de_DE', 'Ordnerseite - vor dem Hauptinhaltsbereich', NULL, NULL), + (192, 'de_DE', 'Ordnerseite - nach dem Hauptinhaltsbereich', NULL, NULL), + (193, 'de_DE', 'Marken Seite - oben', NULL, NULL), + (194, 'de_DE', 'Marken Seite - unten', NULL, NULL), + (195, 'de_DE', 'Marken Seite - oben des Hauptbereichs', NULL, NULL), + (196, 'de_DE', 'Marken Seite - unten des Hauptbereichs', NULL, NULL), + (197, 'de_DE', 'Marken Seite - vor dem Hauptinhaltsbereich', NULL, NULL), + (198, 'de_DE', 'Marken Seite - Nach dem Hauptinhalt Bereich', NULL, NULL), + (199, 'de_DE', 'Marken Seite - CSS-Stylesheet', NULL, NULL), + (200, 'de_DE', 'Marken Seite - Nach der Integration von Javascript', NULL, NULL), + (201, 'de_DE', 'Marken Seite - Javascript Initialisation', NULL, NULL), + (202, 'de_DE', 'Marken Seite - oben der Sidebar', NULL, NULL), + (203, 'de_DE', 'Marken Seite - Sidebars Body', NULL, NULL), + (204, 'de_DE', 'Marken Seite - unten der Sidebar', NULL, NULL), + (205, 'de_DE', 'Bestellungsdetails - oben', NULL, NULL), + (206, 'de_DE', 'Bestellungsdetails - weitere Informationen', NULL, NULL), + (207, 'de_DE', 'Bestellungsdetails - nach den allgemeinen Informationen', NULL, NULL), + (208, 'de_DE', 'Bestellungsdetails - weitere Informationen für den Versand', NULL, NULL), + (209, 'de_DE', 'Bestellungsdetails - Lieferadresse', NULL, NULL), + (210, 'de_DE', 'Bestellungsdetails - weitere Informationen für die Rechnung', NULL, NULL), + (211, 'de_DE', 'Bestellungsdetails - Rechnungsadresse', NULL, NULL), + (212, 'de_DE', 'Bestellungsdetails - Nach den Adressen', NULL, NULL), + (213, 'de_DE', 'Bestellungsdetails - vor der Produktliste', NULL, NULL), + (214, 'de_DE', 'Bestellungsdetails - weitere Informationen für ein Produkt', NULL, NULL), + (215, 'de_DE', 'Bestellungsdetails - nach der Produktliste', NULL, NULL), + (216, 'de_DE', 'Bestellungsdetails - nach den Produkten', NULL, NULL), + (217, 'de_DE', 'Bestellungsdetails - unten', NULL, NULL), + (218, 'de_DE', 'Bestellungsdetails - CSS-Stylesheet', NULL, NULL), + (219, 'de_DE', 'Bestellungsdetails - nach Integration von JavaScript', NULL, NULL), + (220, 'de_DE', 'Bestellungsdetails - Initialisierung von Javascript', NULL, NULL), + (221, 'de_DE', 'Kundenkonto - Erweitere Informationen', NULL, NULL), + (222, 'de_DE', 'Bestelldaten - nach einem Produkt', NULL, NULL), + (223, 'de_DE', 'Mini-Warenkorb', NULL, NULL), + (224, 'de_DE', NULL, NULL, NULL), + (225, 'de_DE', NULL, NULL, NULL), + (226, 'de_DE', NULL, NULL, NULL), + (227, 'de_DE', NULL, NULL, NULL), + (228, 'de_DE', NULL, NULL, NULL), + (229, 'de_DE', NULL, NULL, NULL), + (230, 'de_DE', NULL, NULL, NULL), + (231, 'de_DE', NULL, NULL, NULL), + (232, 'de_DE', NULL, NULL, NULL), + (233, 'de_DE', NULL, NULL, NULL), + (234, 'de_DE', NULL, NULL, NULL), + (235, 'de_DE', NULL, NULL, NULL), + (236, 'de_DE', NULL, NULL, NULL), + (237, 'de_DE', NULL, NULL, NULL), + (238, 'de_DE', NULL, NULL, NULL), + (239, 'de_DE', NULL, NULL, NULL), + (1, 'en_US', 'Invoice choice - at the top', NULL, NULL), + (2, 'en_US', 'Invoice choice - delivery address', NULL, NULL), + (3, 'en_US', 'Invoice choice - extra payment zone', NULL, NULL), + (4, 'en_US', 'Invoice choice - at the bottom', NULL, NULL), + (5, 'en_US', 'Invoice choice - after javascript initialisation', NULL, NULL), + (6, 'en_US', 'Invoice choice - CSS stylesheet', NULL, NULL), + (7, 'en_US', 'Invoice choice - after javascript include', NULL, NULL), + (8, 'en_US', 'Payment gateway - main area', NULL, NULL), + (9, 'en_US', 'Payment gateway - javascript', NULL, NULL), + (10, 'en_US', 'Payment gateway - after javascript initialisation', NULL, NULL), + (11, 'en_US', 'Payment gateway - CSS stylesheet', NULL, NULL), + (12, 'en_US', 'Payment gateway - after javascript include', NULL, NULL), + (13, 'en_US', 'Sitemap - at the bottom', NULL, NULL), + (14, 'en_US', 'Curency selection page - at the top', NULL, NULL), + (15, 'en_US', 'Curency selection page - at the bottom', NULL, NULL), + (16, 'en_US', 'Curency selection page - CSS stylesheet', NULL, NULL), + (17, 'en_US', 'Curency selection page - after javascript include', NULL, NULL), + (18, 'en_US', 'Curency selection page - after javascript initialisation', NULL, NULL), + (19, 'en_US', 'Login page - at the top', NULL, NULL), + (20, 'en_US', 'Login page - at the top of the main area', NULL, NULL), + (21, 'en_US', 'Login page - at the top of the form', NULL, NULL), + (22, 'en_US', 'Login page - at the bottom of the form', NULL, NULL), + (23, 'en_US', 'Login page - at the bottom of the main area', NULL, NULL), + (24, 'en_US', 'Login page - at the bottom', NULL, NULL), + (25, 'en_US', 'Login page - CSS stylesheet', NULL, NULL), + (26, 'en_US', 'Login page - after javascript include', NULL, NULL), + (27, 'en_US', 'Login page - after javascript initialisation', NULL, NULL), + (28, 'en_US', 'Update customer account - at the top', NULL, NULL), + (29, 'en_US', 'Update customer account - at the top of the form', NULL, NULL), + (30, 'en_US', 'Update customer account - at the bottom of the form', NULL, NULL), + (31, 'en_US', 'Update customer account - at the bottom', NULL, NULL), + (32, 'en_US', 'Update customer account - CSS stylesheet', NULL, NULL), + (33, 'en_US', 'Update customer account - after javascript include', NULL, NULL), + (34, 'en_US', 'Update customer account - after javascript initialisation', NULL, NULL), + (35, 'en_US', 'Cart - at the top', NULL, NULL), + (36, 'en_US', 'Cart - at the bottom', NULL, NULL), + (37, 'en_US', 'Cart - after javascript include', NULL, NULL), + (38, 'en_US', 'Cart - CSS stylesheet', NULL, NULL), + (39, 'en_US', 'Cart - javascript initialization', NULL, NULL), + (40, 'en_US', 'Contact page - at the top', NULL, NULL), + (41, 'en_US', 'Contact page - at the top of the form', NULL, NULL), + (42, 'en_US', 'Contact page - at the bottom of the form', NULL, NULL), + (43, 'en_US', 'Contact page - at the bottom', NULL, NULL), + (44, 'en_US', 'Contact page - CSS stylesheet', NULL, NULL), + (45, 'en_US', 'Contact page - after javascript include', NULL, NULL), + (46, 'en_US', 'Contact page - after javascript initialisation', NULL, NULL), + (47, 'en_US', 'Placed order - main area', NULL, NULL), + (48, 'en_US', 'Placed order - CSS stylesheet', NULL, NULL), + (49, 'en_US', 'Placed order - after javascript include', NULL, NULL), + (50, 'en_US', 'Placed order - after javascript initialisation', NULL, NULL), + (51, 'en_US', 'Search page - CSS stylesheet', NULL, NULL), + (52, 'en_US', 'Search page - after javascript include', NULL, NULL), + (53, 'en_US', 'Search page - after javascript initialisation', NULL, NULL), + (54, 'en_US', 'Register - at the top', NULL, NULL), + (55, 'en_US', 'Register - at the top of the form', NULL, NULL), + (56, 'en_US', 'Register - at the bottom of the form', NULL, NULL), + (57, 'en_US', 'Register - at the bottom', NULL, NULL), + (58, 'en_US', 'Register - CSS stylesheet', NULL, NULL), + (59, 'en_US', 'Register - after javascript include', NULL, NULL), + (60, 'en_US', 'Register - after javascript initialisation', NULL, NULL), + (61, 'en_US', 'Lost password - at the top', NULL, NULL), + (62, 'en_US', 'Lost password - at the top of the form', NULL, NULL), + (63, 'en_US', 'Lost password - at the bottom of the form', NULL, NULL), + (64, 'en_US', 'Lost password - at the bottom', NULL, NULL), + (65, 'en_US', 'Lost password - CSS stylesheet', NULL, NULL), + (66, 'en_US', 'Lost password - after javascript include', NULL, NULL), + (67, 'en_US', 'Lost password - javascript initialization', NULL, NULL), + (68, 'en_US', 'language selection page - at the top', NULL, NULL), + (69, 'en_US', 'language selection page - at the bottom', NULL, NULL), + (70, 'en_US', 'language selection page - CSS stylesheet', NULL, NULL), + (71, 'en_US', 'language selection page - after javascript include', NULL, NULL), + (72, 'en_US', 'language selection page - after javascript initialisation', NULL, NULL), + (73, 'en_US', 'Contact page - if successful response', NULL, NULL), + (74, 'en_US', 'Newsletter page - at the top', NULL, NULL), + (75, 'en_US', 'Newsletter page - at the bottom', NULL, NULL), + (76, 'en_US', 'Newsletter page - CSS stylesheet', NULL, NULL), + (77, 'en_US', 'Newsletter page - after javascript include', NULL, NULL), + (78, 'en_US', 'Newsletter page - after javascript initialisation', NULL, NULL), + (79, 'en_US', 'Payment failed - CSS stylesheet', NULL, NULL), + (80, 'en_US', 'Payment failed - after javascript include', NULL, NULL), + (81, 'en_US', 'Payment failed - javascript initialization', NULL, NULL), + (82, 'en_US', 'Content page - at the top', NULL, NULL), + (83, 'en_US', 'Content page - at the top of the main area', NULL, NULL), + (84, 'en_US', 'Content page - at the bottom of the main area', NULL, NULL), + (85, 'en_US', 'Content page - at the bottom', NULL, NULL), + (86, 'en_US', 'Content page - CSS stylesheet', NULL, NULL), + (87, 'en_US', 'Content page - after javascript include', NULL, NULL), + (88, 'en_US', 'Content page - after javascript initialisation', NULL, NULL), + (89, 'en_US', 'HTML layout - after the opening of the head tag', NULL, NULL), + (90, 'en_US', 'HTML layout - CSS stylesheet', NULL, NULL), + (91, 'en_US', 'HTML layout - before the end of the head tag', NULL, NULL), + (92, 'en_US', 'HTML layout - after the opening of the body tag', NULL, NULL), + (93, 'en_US', 'HTML layout - at the top of the header', NULL, NULL), + (94, 'en_US', 'HTML layout - secondary navigation', NULL, NULL), + (95, 'en_US', 'HTML layout - primary navigation', NULL, NULL), + (96, 'en_US', 'HTML layout - at the bottom of the header', NULL, NULL), + (97, 'en_US', 'HTML layout - before the main content area', NULL, NULL), + (98, 'en_US', 'HTML layout - after the main content area', NULL, NULL), + (99, 'en_US', 'HTML layout - at the top of the footer', NULL, NULL), + (100, 'en_US', 'HTML layout - footer body', NULL, NULL), + (101, 'en_US', 'HTML layout - bottom of the footer', NULL, NULL), + (102, 'en_US', 'HTML layout - after javascript include', NULL, NULL), + (103, 'en_US', 'HTML layout - javascript initialization', NULL, NULL), + (104, 'en_US', 'HTML layout - before the end body tag', NULL, NULL), + (105, 'en_US', 'Page 404 - content area', NULL, NULL), + (106, 'en_US', 'Page 404 - CSS stylesheet', NULL, NULL), + (107, 'en_US', 'Page 404 - after javascript include', NULL, NULL), + (108, 'en_US', 'Page 404 - after javascript initialisation', NULL, NULL), + (109, 'en_US', 'Delivery choice - at the top', NULL, NULL), + (110, 'en_US', 'Delivery choice - at the top of the form', NULL, NULL), + (111, 'en_US', 'Delivery choice - at the bottom of the form', NULL, NULL), + (112, 'en_US', 'Delivery choice - at the bottom', NULL, NULL), + (113, 'en_US', 'Delivery choice - after javascript initialisation', NULL, NULL), + (114, 'en_US', 'Delivery choice - CSS stylesheet', NULL, NULL), + (115, 'en_US', 'Delivery choice - after javascript include', NULL, NULL), + (116, 'en_US', 'Address creation - at the top', NULL, NULL), + (117, 'en_US', 'Address creation - at the top of the form', NULL, NULL), + (118, 'en_US', 'Address creation - at the bottom of the form', NULL, NULL), + (119, 'en_US', 'Address creation - at the bottom', NULL, NULL), + (120, 'en_US', 'Address creation - CSS stylesheet', NULL, NULL), + (121, 'en_US', 'Address creation - after javascript include', NULL, NULL), + (122, 'en_US', 'Address creation - after javascript initialisation', NULL, NULL), + (123, 'en_US', 'Folder page - at the top', NULL, NULL), + (124, 'en_US', 'Folder page - at the top of the main area', NULL, NULL), + (125, 'en_US', 'Folder page - at the bottom of the main area', NULL, NULL), + (126, 'en_US', 'Folder page - at the bottom', NULL, NULL), + (127, 'en_US', 'Folder page - CSS stylesheet', NULL, NULL), + (128, 'en_US', 'Folder page - after javascript include', NULL, NULL), + (129, 'en_US', 'Folder page - after javascript initialisation', NULL, NULL), + (130, 'en_US', 'Order failed - at the top', NULL, NULL), + (131, 'en_US', 'Order failed - at the bottom', NULL, NULL), + (132, 'en_US', 'Order failed - CSS stylesheet', NULL, NULL), + (133, 'en_US', 'Order failed - after javascript include', NULL, NULL), + (134, 'en_US', 'Order failed - after javascript initialisation', NULL, NULL), + (135, 'en_US', 'Category page - at the top', NULL, NULL), + (136, 'en_US', 'Category page - at the top of the main area', NULL, NULL), + (137, 'en_US', 'Category page - at the bottom of the main area', NULL, NULL), + (138, 'en_US', 'Category page - at the bottom', NULL, NULL), + (139, 'en_US', 'Category page - CSS stylesheet', NULL, NULL), + (140, 'en_US', 'Category page - after javascript include', NULL, NULL), + (141, 'en_US', 'Category page - after javascript initialisation', NULL, NULL), + (142, 'en_US', 'Address update - at the top', NULL, NULL), + (143, 'en_US', 'Address update - at the top of the form', NULL, NULL), + (144, 'en_US', 'Address update - at the bottom of the form', NULL, NULL), + (145, 'en_US', 'Address update - at the bottom', NULL, NULL), + (146, 'en_US', 'Address update - CSS stylesheet', NULL, NULL), + (147, 'en_US', 'Address update - after javascript include', NULL, NULL), + (148, 'en_US', 'Address update - after javascript initialisation', NULL, NULL), + (149, 'en_US', 'Home page - main area', NULL, NULL), + (150, 'en_US', 'Home page - CSS stylesheet', NULL, NULL), + (151, 'en_US', 'Home page - after javascript include', NULL, NULL), + (152, 'en_US', 'Home page - after javascript initialisation', NULL, NULL), + (153, 'en_US', 'Change password - at the top', NULL, NULL), + (154, 'en_US', 'Change password - at the bottom', NULL, NULL), + (155, 'en_US', 'Change password - CSS stylesheet', NULL, NULL), + (156, 'en_US', 'Change password - after javascript include', NULL, NULL), + (157, 'en_US', 'Change password - after javascript initialisation', NULL, NULL), + (158, 'en_US', 'Product page - at the top', NULL, NULL), + (159, 'en_US', 'Product page - photo gallery', NULL, NULL), + (160, 'en_US', 'Product page - at the top of the detail', NULL, NULL), + (161, 'en_US', 'Product page - at the bottom of the detail area', NULL, NULL), + (162, 'en_US', 'Product page - additional information', NULL, NULL), + (163, 'en_US', 'Product page - at the bottom', NULL, NULL), + (164, 'en_US', 'Product page - CSS stylesheet', NULL, NULL), + (165, 'en_US', 'Product page - after javascript include', NULL, NULL), + (166, 'en_US', 'Product page - after javascript initialisation', NULL, NULL), + (167, 'en_US', 'customer account - at the top', NULL, NULL), + (168, 'en_US', 'customer account - at the bottom', NULL, NULL), + (169, 'en_US', 'customer account - CSS stylesheet', NULL, NULL), + (170, 'en_US', 'customer account - after javascript include', NULL, NULL), + (171, 'en_US', 'customer account - after javascript initialisation', NULL, NULL), + (172, 'en_US', 'All Products - at the top', NULL, NULL), + (173, 'en_US', 'All Products - at the bottom', NULL, NULL), + (174, 'en_US', 'All Products - CSS stylesheet', NULL, NULL), + (175, 'en_US', 'All Products - after javascript include', NULL, NULL), + (176, 'en_US', 'All Products - after javascript initialisation', NULL, NULL), + (177, 'en_US', 'Product loop - at the top', NULL, NULL), + (178, 'en_US', 'Product loop - at the bottom', NULL, NULL), + (179, 'en_US', 'Category page - at the top of the sidebar', NULL, NULL), + (180, 'en_US', 'Category page - the body of the sidebar', NULL, NULL), + (181, 'en_US', 'Category page - at the bottom of the sidebar', NULL, NULL), + (182, 'en_US', 'Content page - at the top of the sidebar', NULL, NULL), + (183, 'en_US', 'Content page - the body of the sidebar', NULL, NULL), + (184, 'en_US', 'Content page - at the bottom of the sidebar', NULL, NULL), + (185, 'en_US', 'Delivery choice - extra area', NULL, NULL), + (186, 'en_US', 'Delivery choice - javascript', NULL, NULL), + (187, 'en_US', 'Category page - before the main content area', NULL, NULL), + (188, 'en_US', 'Category page - after the main content area', NULL, NULL), + (189, 'en_US', 'Content page - before the main content area', NULL, NULL), + (190, 'en_US', 'Content page - after the main content area', NULL, NULL), + (191, 'en_US', 'Folder page - before the main content area', NULL, NULL), + (192, 'en_US', 'Folder page - after the main content area', NULL, NULL), + (193, 'en_US', 'Brands page - at the top', NULL, NULL), + (194, 'en_US', 'Brands page - at the bottom', NULL, NULL), + (195, 'en_US', 'Brands page - at the top of the main area', NULL, NULL), + (196, 'en_US', 'Brands page - at the bottom of the main area', NULL, NULL), + (197, 'en_US', 'Brands page - before the main content area', NULL, NULL), + (198, 'en_US', 'Brands page - after the main content area', NULL, NULL), + (199, 'en_US', 'Brands page - CSS stylesheet', NULL, NULL), + (200, 'en_US', 'Brands page - after javascript include', NULL, NULL), + (201, 'en_US', 'Brands page - javascript initialization', NULL, NULL), + (202, 'en_US', 'Brands page - at the top of the sidebar', NULL, NULL), + (203, 'en_US', 'Brands page - the body of the sidebar', NULL, NULL), + (204, 'en_US', 'Brands page - at the bottom of the sidebar', NULL, NULL), + (205, 'en_US', 'Order details - at the top', NULL, NULL), + (206, 'en_US', 'Order details - additional information', NULL, NULL), + (207, 'en_US', 'Order details - after global information', NULL, NULL), + (208, 'en_US', 'Order details - additional delivery information', NULL, NULL), + (209, 'en_US', 'Order details - delivery address', NULL, NULL), + (210, 'en_US', 'Order details - additional invoice information', NULL, NULL), + (211, 'en_US', 'Order details - invoice address', NULL, NULL), + (212, 'en_US', 'Order details - after addresses', NULL, NULL), + (213, 'en_US', 'Order details - before products list', NULL, NULL), + (214, 'en_US', 'Order details - additional product information', NULL, NULL), + (215, 'en_US', 'Order details - after products list', NULL, NULL), + (216, 'en_US', 'Order details - after products', NULL, NULL), + (217, 'en_US', 'Order details - at the bottom', NULL, NULL), + (218, 'en_US', 'Order details - CSS stylesheet', NULL, NULL), + (219, 'en_US', 'Order details - after javascript include', NULL, NULL), + (220, 'en_US', 'Order details - javascript initialization', NULL, NULL), + (221, 'en_US', 'Customer account - additional information', NULL, NULL), + (222, 'en_US', 'Order details - after product', NULL, NULL), + (223, 'en_US', 'Mini cart', NULL, NULL), + (224, 'en_US', 'Sale - at the top', NULL, NULL), + (225, 'en_US', 'Sale - at the bottom', NULL, NULL), + (226, 'en_US', 'Sale - at the top of the main area', NULL, NULL), + (227, 'en_US', 'Sale - at the bottom of the main area', NULL, NULL), + (228, 'en_US', 'Sale - before the main content area', NULL, NULL), + (229, 'en_US', 'Sale - after the main content area', NULL, NULL), + (230, 'en_US', 'Sale - CSS stylesheet', NULL, NULL), + (231, 'en_US', 'Sale - after javascript include', NULL, NULL), + (232, 'en_US', 'Sale - javascript initialization', NULL, NULL), + (233, 'en_US', 'Order details - after invoice address', NULL, NULL), + (234, 'en_US', 'Order details - after delivery address', NULL, NULL), + (235, 'en_US', 'Newsletter unsubscribe page - at the top', NULL, NULL), + (236, 'en_US', 'Newsletter unsubscribe page - at the bottom', NULL, NULL), + (237, 'en_US', 'Newsletter unsubscribe page - CSS stylesheet', NULL, NULL), + (238, 'en_US', 'Newsletter unsubscribe page - after javascript include', NULL, NULL), + (239, 'en_US', 'Newsletter unsubscribe page - after javascript initialisation', NULL, NULL), + (1, 'es_ES', 'Opción de factura - en la parte superior', NULL, NULL), + (2, 'es_ES', 'Opción de factura - dirección de envío', NULL, NULL), + (3, 'es_ES', 'Opción de factura - zona de pago extra', NULL, NULL), + (4, 'es_ES', 'Opción de factura - en la parte inferior de la factura', NULL, NULL), + (5, 'es_ES', 'Opción de factura - después de la inicialización de javascript', NULL, NULL), + (6, 'es_ES', 'Opción de factura - hoja de estilos CSS', NULL, NULL), + (7, 'es_ES', 'Opción de factura - después de incluir javascript', NULL, NULL), + (8, 'es_ES', 'Pasarela de pago - área principal', NULL, NULL), + (9, 'es_ES', 'Pasarela de pago - JavaScript', NULL, NULL), + (10, 'es_ES', 'Pasarela de pago - después de inicializar JavaScript', NULL, NULL), + (11, 'es_ES', 'Pasarela de pago - Hoja de estilos CSS', NULL, NULL), + (12, 'es_ES', 'Pasarela de pago - después de incluir JavaScript', NULL, NULL), + (13, 'es_ES', 'Mapa de sitio - en la base', NULL, NULL), + (14, 'es_ES', 'Página de selección de divisa - en la parte superior', NULL, NULL), + (15, 'es_ES', 'Página de selección de divisa - en la parte inferior', NULL, NULL), + (16, 'es_ES', 'Página de selección de divisa - hoja de estilos CSS', NULL, NULL), + (17, 'es_ES', 'Página de selección de divisa - después de inclusión javascript', NULL, NULL), + (18, 'es_ES', 'Página de selección de divisa - después de la inicialización de javascript', NULL, NULL), + (19, 'es_ES', 'Página de inicio de sesión - en la parte superior', NULL, NULL), + (20, 'es_ES', 'Página de inicio de sesión - en la parte superior del área principal', NULL, NULL), + (21, 'es_ES', 'Página de inicio de sesión - en la parte superior del formulario', NULL, NULL), + (22, 'es_ES', 'Página de inicio de sesión - en la parte inferior del formulario', NULL, NULL), + (23, 'es_ES', 'Página de inicio de sesión - en la parte inferior del área principal', NULL, NULL), + (24, 'es_ES', 'Página de inicio de sesión - en la parte inferior', NULL, NULL), + (25, 'es_ES', 'Página de inicio de sesión - hoja de estilos CSS', NULL, NULL), + (26, 'es_ES', 'Página de inicio de sesión - después de incluir JavaScript', NULL, NULL), + (27, 'es_ES', 'Página de inicio de sesión - después de la inicialización de JavaScript', NULL, NULL), + (28, 'es_ES', 'Actualización de cuenta de cliente - encabezado', NULL, NULL), + (29, 'es_ES', 'Actualización de cuenta de cliente - encabezado del formulario', NULL, NULL), + (30, 'es_ES', 'Actualización de cuenta de cliente - al pie del formulario', NULL, NULL), + (31, 'es_ES', 'Actualización de cuenta de cliente - al pie', NULL, NULL), + (32, 'es_ES', 'Actualización de cuenta del cliente - Hoja de estilos CSS', NULL, NULL), + (33, 'es_ES', 'Actualización de cuenta del cliente - después de incluir JavaScript', NULL, NULL), + (34, 'es_ES', 'Actualización de cuenta de cliente - después de inicializar JavaScript', NULL, NULL), + (35, 'es_ES', 'Carrito - En la parte superior', NULL, NULL), + (36, 'es_ES', 'Carrito - En la parte inferior', NULL, NULL), + (37, 'es_ES', 'Carro - después de inclusión javascript', NULL, NULL), + (38, 'es_ES', 'Carrito - hoja de estilos CSS', NULL, NULL), + (39, 'es_ES', 'Carro - inicialización de javascript', NULL, NULL), + (40, 'es_ES', 'Página de contacto - en la parte superior', NULL, NULL), + (41, 'es_ES', 'Página de contacto - en la parte superior del formulario', NULL, NULL), + (42, 'es_ES', 'Página de contacto - en la parte inferior del formulario', NULL, NULL), + (43, 'es_ES', 'Página de contacto - en la parte inferior', NULL, NULL), + (44, 'es_ES', 'Página de contacto - hoja de estilos CSS', NULL, NULL), + (45, 'es_ES', 'Página de contacto - después del include de javascript', NULL, NULL), + (46, 'es_ES', 'Página de contacto - después de la inicialización de javascript', NULL, NULL), + (47, 'es_ES', 'Orden registrada - área principal', NULL, NULL), + (48, 'es_ES', 'Orden registrada - Hoja de estilo CSS', NULL, NULL), + (49, 'es_ES', 'Orden registrada - después del javascript include', NULL, NULL), + (50, 'es_ES', 'Orden registrada - después de la inicialización de Javascript', NULL, NULL), + (51, 'es_ES', 'Página de búsqueda - Hoja de Estilos en Cascada', NULL, NULL), + (52, 'es_ES', 'Página de búsqueda - después de incluir JavaScript', NULL, NULL), + (53, 'es_ES', 'Página de búsqueda - después de inicializar JavaScript', NULL, NULL), + (54, 'es_ES', 'Registro - en la parte superior', NULL, NULL), + (55, 'es_ES', 'Registro - en la parte superior del formulario', NULL, NULL), + (56, 'es_ES', 'Registro - en la parte inferior del formulario', NULL, NULL), + (57, 'es_ES', 'Registro - en la parte inferior', NULL, NULL), + (58, 'es_ES', 'Registro - hoja de estilos CSS', NULL, NULL), + (59, 'es_ES', 'Registro - después de incluir JavaScript', NULL, NULL), + (60, 'es_ES', 'Registro - después de la inicialización de JavaScript', NULL, NULL), + (61, 'es_ES', 'Contraseña perdida - en la parte superior', NULL, NULL), + (62, 'es_ES', 'Contraseña perdida - en la parte superior del formulario', NULL, NULL), + (63, 'es_ES', 'Contraseña perdida - en la parte inferior del formulario', NULL, NULL), + (64, 'es_ES', 'Contraseña perdida - en la parte inferior', NULL, NULL), + (65, 'es_ES', 'Contraseña perdida - hoja de estilos CSS', NULL, NULL), + (66, 'es_ES', 'Contraseña perdida - después de incluir javascript', NULL, NULL), + (67, 'es_ES', 'Contraseña perdida - inicialización de JavaScript', NULL, NULL), + (68, 'es_ES', 'página de selección de idioma - en la parte superior', NULL, NULL), + (69, 'es_ES', 'página de selección de idioma - en la parte inferior', NULL, NULL), + (70, 'es_ES', 'página de selección de idioma - hoja de estilos CSS', NULL, NULL), + (71, 'es_ES', 'página de selección de idioma - después de incluir JavaScript', NULL, NULL), + (72, 'es_ES', 'página de selección de idioma - después de la inicialización de JavaScript', NULL, NULL), + (73, 'es_ES', 'Página de contacto - si la respuesta es exitosa', NULL, NULL), + (74, 'es_ES', 'Página del boletín de noticias - en la parte superior', NULL, NULL), + (75, 'es_ES', 'Página del boletín de noticias - en la parte inferior', NULL, NULL), + (76, 'es_ES', 'Página del boletín de noticias - hoja de estilos CSS', NULL, NULL), + (77, 'es_ES', 'Página del boletín de noticias - después de incluir JavaScript', NULL, NULL), + (78, 'es_ES', 'Página del boletín de noticias - después de la inicialización de JavaScript', NULL, NULL), + (79, 'es_ES', 'Pago erróneo - Hoja de Estilos CSS', NULL, NULL), + (80, 'es_ES', 'Pago erróneo - después de incluir JavaScript', NULL, NULL), + (81, 'es_ES', 'Pago erróneo - inicialización de JavaScript', NULL, NULL), + (82, 'es_ES', 'Página de contacto - en la parte superior', NULL, NULL), + (83, 'es_ES', 'Página de contenido - en la parte superior de la zona principal', NULL, NULL), + (84, 'es_ES', 'Página de contenido - en la parte inferior de la zona principal', NULL, NULL), + (85, 'es_ES', 'Página de contacto - en la parte inferior', NULL, NULL), + (86, 'es_ES', 'Página de contacto - hoja de estilos CSS', NULL, NULL), + (87, 'es_ES', 'Página de contacto - después del include de javascript', NULL, NULL), + (88, 'es_ES', 'Página de contacto - después de la inicialización de javascript', NULL, NULL), + (89, 'es_ES', 'Diseño HTML - después de la etiqueta head de apertura', NULL, NULL), + (90, 'es_ES', 'Diseño HTML - hojas de estilo CSS', NULL, NULL), + (91, 'es_ES', 'Diseño HTML - antes de la etiqueta head de cierre', NULL, NULL), + (92, 'es_ES', 'Diseño HTML - después de la etiqueta body de apertura', NULL, NULL), + (93, 'es_ES', 'Diseño HTML - en la parte superior de la cabecera', NULL, NULL), + (94, 'es_ES', 'Diseño HTML - navegación secundaria', NULL, NULL), + (95, 'es_ES', 'Diseño HTML - navegación principal', NULL, NULL), + (96, 'es_ES', 'Diseño HTML - en la parte inferior de la cabecera', NULL, NULL), + (97, 'es_ES', 'Diseño HTML - antes el área de contenido principal', NULL, NULL), + (98, 'es_ES', 'Diseño HTML - después del área de contenido principal', NULL, NULL), + (99, 'es_ES', 'Diseño HTML - en la parte superior del pie de página', NULL, NULL), + (100, 'es_ES', 'Diseño HTML - cuerpo del pie de página', NULL, NULL), + (101, 'es_ES', 'Diseño HTML - parte inferior del pie de página', NULL, NULL), + (102, 'es_ES', 'Diseño HTML - después de incluir javascript', NULL, NULL), + (103, 'es_ES', 'Diseño HTML - inicialización de JavaScript', NULL, NULL), + (104, 'es_ES', 'Diseño HTML - antes de la etiqueta body de cierre', NULL, NULL), + (105, 'es_ES', 'Página 404 - área de contenido', NULL, NULL), + (106, 'es_ES', 'Página 404 - CSS Hoja de estilos', NULL, NULL), + (107, 'es_ES', 'Página 404 - después de incluir JavaScript', NULL, NULL), + (108, 'es_ES', 'Página 404 - después de inicializar JavaScript', NULL, NULL), + (109, 'es_ES', 'Opción de entrega - en la cabecera', NULL, NULL), + (110, 'es_ES', 'Opción de entrega - en la cabecera del formulario', NULL, NULL), + (111, 'es_ES', 'Opción de entrega - en el pie del formulario', NULL, NULL), + (112, 'es_ES', 'Elección de entrega - en el pie', NULL, NULL), + (113, 'es_ES', 'Opción de entrega - despues de inicializar el javascript', NULL, NULL), + (114, 'es_ES', 'Opción de entrega - CSS', NULL, NULL), + (115, 'es_ES', 'Opción de entrega - después de incluir el javascript', NULL, NULL), + (116, 'es_ES', 'Creación de dirección - en la parte superior', NULL, NULL), + (117, 'es_ES', 'Creación de dirección - en la parte superior del formulario', NULL, NULL), + (118, 'es_ES', 'Creación de dirección - en la parte inferior del formulario', NULL, NULL), + (119, 'es_ES', 'Creación de dirección - en la parte inferior', NULL, NULL), + (120, 'es_ES', 'Creación de dirección - hoja de estilos CSS', NULL, NULL), + (121, 'es_ES', 'Creación de dirección- después del include javascript', NULL, NULL), + (122, 'es_ES', 'Creación de dirección - después de la inicialización de javascript', NULL, NULL), + (123, 'es_ES', 'Carpeta de página - en la parte superior', NULL, NULL), + (124, 'es_ES', 'Carpeta de página - en la parte superior del área principal', NULL, NULL), + (125, 'es_ES', 'Carpeta de página - al final del área principal', NULL, NULL), + (126, 'es_ES', 'Carpeta de página - al final', NULL, NULL), + (127, 'es_ES', 'Página de la carpeta - hoja de estilos CSS', NULL, NULL), + (128, 'es_ES', 'Carpeta de página - después de incluir JavaScript', NULL, NULL), + (129, 'es_ES', 'Carpeta de página - después de inicialización de JavaScript', NULL, NULL), + (130, 'es_ES', 'Pedido erróneo - al tope', NULL, NULL), + (131, 'es_ES', 'Pedido erróneo - al pie', NULL, NULL), + (132, 'es_ES', 'Pedido erróneo - Hoja de Estilos CSS', NULL, NULL), + (133, 'es_ES', 'Pedido erróneo - después de incluir JavaScript', NULL, NULL), + (134, 'es_ES', 'Pedido erróneo - después de la inicialización de JavaScript', NULL, NULL), + (135, 'es_ES', 'Página de la categoría - en la parte superior', NULL, NULL), + (136, 'es_ES', 'Página de categoría - en la parte superior de la zona principal', NULL, NULL), + (137, 'es_ES', 'Página de la categoría - en la parte inferior de la zona principal', NULL, NULL), + (138, 'es_ES', 'Página de la categoría - en la parte inferior', NULL, NULL), + (139, 'es_ES', 'Página de la categoría - hoja de estilos CSS', NULL, NULL), + (140, 'es_ES', 'Página de la categoría - después de inclusión javascript', NULL, NULL), + (141, 'es_ES', 'Página de la categoría - después de la inicialización de javascript', NULL, NULL), + (142, 'es_ES', 'Actualizar dirección - en la parte superior', NULL, NULL), + (143, 'es_ES', 'Actualizar dirección - en la parte superior del formulario', NULL, NULL), + (144, 'es_ES', 'Actualización de dirección - en la parte inferior del formulario', NULL, NULL), + (145, 'es_ES', 'Actualización de dirección - en la parte inferior', NULL, NULL), + (146, 'es_ES', 'Actualización de dirección - hoja de estilos CSS', NULL, NULL), + (147, 'es_ES', 'Actualización de dirección - tras el include javascript', NULL, NULL), + (148, 'es_ES', 'Actualización de dirección - después de la inicialización de javascript', NULL, NULL), + (149, 'es_ES', 'Página de inicio - Área Principal', NULL, NULL), + (150, 'es_ES', 'Página de inicio - hoja de estilos CSS', NULL, NULL), + (151, 'es_ES', 'Página de inicio - después de incluir JavaScript', NULL, NULL), + (152, 'es_ES', 'Página de inicio - después de la inicialización de JavaScript', NULL, NULL), + (153, 'es_ES', 'Cambiar contraseña - en la parte superior', NULL, NULL), + (154, 'es_ES', 'Cambiar contraseña - en la parte inferior', NULL, NULL), + (155, 'es_ES', 'Cambiar contraseña - hoja de estilos CSS', NULL, NULL), + (156, 'es_ES', 'Cambiar contraseña - después de inclusión javascript', NULL, NULL), + (157, 'es_ES', 'Cambiar contraseña - después de la inicialización de javascript', NULL, NULL), + (158, 'es_ES', 'Página de producto - en la parte superior', NULL, NULL), + (159, 'es_ES', 'Página de producto - Galería de fotos', NULL, NULL), + (160, 'es_ES', 'Página de producto - en la parte superior del detalle', NULL, NULL), + (161, 'es_ES', 'Página de producto - en la parte inferior del área de detalle', NULL, NULL), + (162, 'es_ES', 'Página de producto - información adicional', NULL, NULL), + (163, 'es_ES', 'Página de producto - en la parte inferior', NULL, NULL), + (164, 'es_ES', 'Página de producto - hoja de estilos CSS', NULL, NULL), + (165, 'es_ES', 'Página de producto - después de incluir JavaScript', NULL, NULL), + (166, 'es_ES', 'Página de producto - después de la inicialización de Javascript', NULL, NULL), + (167, 'es_ES', 'cuenta de cliente - en la parte superior', NULL, NULL), + (168, 'es_ES', 'cuenta de cliente - en la parte inferior', NULL, NULL), + (169, 'es_ES', 'cuenta de cliente - hoja de estilos CSS', NULL, NULL), + (170, 'es_ES', 'cuenta de cliente - después de incluir JavaScript', NULL, NULL), + (171, 'es_ES', 'cuenta de cliente - después de la inicialización de JavaScript', NULL, NULL), + (172, 'es_ES', 'Todos los productos - en la parte superior', NULL, NULL), + (173, 'es_ES', 'Todos los productos - en la parte inferior', NULL, NULL), + (174, 'es_ES', 'Todos los productos - hoja de estilos CSS', NULL, NULL), + (175, 'es_ES', 'Todos los productos - después de include javascript', NULL, NULL), + (176, 'es_ES', 'Todos los productos - después de la inicialización de javascript', NULL, NULL), + (177, 'es_ES', 'Ciclo del producto - en la parte superior', NULL, NULL), + (178, 'es_ES', 'Ciclo del producto - en la parte inferior', NULL, NULL), + (179, 'es_ES', 'Página de categoría - en la parte inferior de la barra lateral', NULL, NULL), + (180, 'es_ES', 'Página de categoría - el cuerpo de la barra lateral', NULL, NULL), + (181, 'es_ES', 'Página de la categoría - en la parte inferior de la barra lateral', NULL, NULL), + (182, 'es_ES', 'Página de contenido - en la parte superior de la barra lateral', NULL, NULL), + (183, 'es_ES', 'Página de contenido - cuerpo de la barra lateral', NULL, NULL), + (184, 'es_ES', 'Página de contenido - en la parte inferior de la barra lateral', NULL, NULL), + (185, 'es_ES', 'Opción de entrega - área extra', NULL, NULL), + (186, 'es_ES', 'Opción de entrega - javascript', NULL, NULL), + (187, 'es_ES', 'Página de categoría - antes el área de contenido principal', NULL, NULL), + (188, 'es_ES', 'Página de la categoría - después el área de contenido principal', NULL, NULL), + (189, 'es_ES', 'Página de contenido - antes del área de contenido principal', NULL, NULL), + (190, 'es_ES', 'Página de contenido - después del área de contenido principal', NULL, NULL), + (191, 'es_ES', 'Carpeta de página - antes del área de contenido principal', NULL, NULL), + (192, 'es_ES', 'Carpeta de página - después del área de contenido principal', NULL, NULL), + (193, 'es_ES', 'Página de las marcas - en la parte superior', NULL, NULL), + (194, 'es_ES', 'Página de las marcas - en la parte inferior', NULL, NULL), + (195, 'es_ES', 'Página de las marcas - en la parte inferior del área principal', NULL, NULL), + (196, 'es_ES', 'Página de las marcas - en la parte inferior del área principal', NULL, NULL), + (197, 'es_ES', 'Página de marcas - antes del área de contenido principal', NULL, NULL), + (198, 'es_ES', 'Página de marcas - después el área de contenido principal', NULL, NULL), + (199, 'es_ES', 'Página de marcas - hoja de estilos CSS', NULL, NULL), + (200, 'es_ES', 'Página de marcas - después de inclusión de javascript', NULL, NULL), + (201, 'es_ES', 'Página de marcas - inicialización de javascript', NULL, NULL), + (202, 'es_ES', 'Página de las marcas - en la parte inferior de la barra lateral', NULL, NULL), + (203, 'es_ES', 'Página de marcas - el cuerpo de la barra lateral', NULL, NULL), + (204, 'es_ES', 'Página de las marcas - en la parte inferior de la barra lateral', NULL, NULL), + (205, 'es_ES', 'Detalles de la orden - en la parte superior', NULL, NULL), + (206, 'es_ES', 'Detalles de la Orden - información adicional', NULL, NULL), + (207, 'es_ES', 'Detalles de la orden - después de la información global', NULL, NULL), + (208, 'es_ES', 'Detalles de la Orden - información adicional del envío', NULL, NULL), + (209, 'es_ES', 'Pedir detalles - dirección de envío', NULL, NULL), + (210, 'es_ES', 'Detalles de la Orden - información adicional de la factura', NULL, NULL), + (211, 'es_ES', 'Detalles de la orden - dirección de factura', NULL, NULL), + (212, 'es_ES', 'Detalles de la Orden - después de direcciones', NULL, NULL), + (213, 'es_ES', 'Detalles de la orden - antes de lista de productos', NULL, NULL), + (214, 'es_ES', 'Detalles de la Orden - información adicional del producto', NULL, NULL), + (215, 'es_ES', 'Detalles de la orden - después de la lista de productos', NULL, NULL), + (216, 'es_ES', 'Detalles de la orden - después de los productos', NULL, NULL), + (217, 'es_ES', 'Detalles de la orden - en la parte inferior', NULL, NULL), + (218, 'es_ES', 'Detalles de la Orden - hoja de estilos CSS', NULL, NULL), + (219, 'es_ES', 'Detalles de la orden - después de incluir JavaScript', NULL, NULL), + (220, 'es_ES', 'Detalles de la Orden - inicialización de JavaScript', NULL, NULL), + (221, 'es_ES', 'Cuenta de cliente - información adicional', NULL, NULL), + (222, 'es_ES', 'Detalles de la orden - después del producto', NULL, NULL), + (223, 'es_ES', 'Mini tarjeta', NULL, NULL), + (224, 'es_ES', 'Venta - encabezado', NULL, NULL), + (225, 'es_ES', 'Venta - al pie', NULL, NULL), + (226, 'es_ES', 'Venta - encabezado del área principal', NULL, NULL), + (227, 'es_ES', 'Venta - al pie del área principal', NULL, NULL), + (228, 'es_ES', 'Venta - antes del área de contenido principal', NULL, NULL), + (229, 'es_ES', 'Venta - después del área de contenido principal', NULL, NULL), + (230, 'es_ES', 'Venta - Hoja de estilos CSS', NULL, NULL), + (231, 'es_ES', 'Venta - después de incluir JavaScript', NULL, NULL), + (232, 'es_ES', 'Venta - inicialización de JavaScript', NULL, NULL), + (233, 'es_ES', 'Detalles de pedido - después de la dirección de facturación', NULL, NULL), + (234, 'es_ES', 'Detalles de pedido - después de la dirección de entrega', NULL, NULL), + (235, 'es_ES', 'Página de baja del boletín - en la parte superior', NULL, NULL), + (236, 'es_ES', 'Página de baja del boletín - al pie', NULL, NULL), + (237, 'es_ES', 'Página de baja del boletín - Hoja de estilos CSS', NULL, NULL), + (238, 'es_ES', 'Página de baja del boletín - después de incluir JavaScript', NULL, NULL), + (239, 'es_ES', 'Página de baja del boletín - después de la inicialización de JavaScript', NULL, NULL), + (1, 'fr_FR', 'Choix du mode de paiement - en haut', NULL, NULL), + (2, 'fr_FR', 'Choix du mode de paiement - adresse de livraison', NULL, NULL), + (3, 'fr_FR', 'Choix du mode de paiement - zone de paiement supplémentaire', NULL, NULL), + (4, 'fr_FR', 'Choix du mode de paiement - en bas', NULL, NULL), + (5, 'fr_FR', 'Choix du mode de paiement - après l\'initialisation du JavaScript', NULL, NULL), + (6, 'fr_FR', 'Choix du mode de paiement - feuille de style CSS', NULL, NULL), + (7, 'fr_FR', 'Choix du mode de paiement - après l\'inclusion du JavaScript', NULL, NULL), + (8, 'fr_FR', 'Passerelle de paiement - zone principale', NULL, NULL), + (9, 'fr_FR', 'Passerelle de paiement - javascript', NULL, NULL), + (10, 'fr_FR', 'Passerelle de paiement - après l\'initialisation du JavaScript', NULL, NULL), + (11, 'fr_FR', 'Passerelle de paiement - feuille de style CSS', NULL, NULL), + (12, 'fr_FR', 'Passerelle de paiement - après l\'inclusion du JavaScript', NULL, NULL), + (13, 'fr_FR', 'Sitemap - en bas', NULL, NULL), + (14, 'fr_FR', 'Page du choix de la device - en haut', NULL, NULL), + (15, 'fr_FR', 'Page du choix de la device - en bas', NULL, NULL), + (16, 'fr_FR', 'Page du choix de la device - feuille de style CSS', NULL, NULL), + (17, 'fr_FR', 'Page du choix de la device - après l\'inclusion du JavaScript', NULL, NULL), + (18, 'fr_FR', 'Page du choix de la device - après l\'initialisation du JavaScript', NULL, NULL), + (19, 'fr_FR', 'Page de connexion - en haut', NULL, NULL), + (20, 'fr_FR', 'Page de connexion - en haut de la zone principal', NULL, NULL), + (21, 'fr_FR', 'Page de connexion - en haut du formulaire', NULL, NULL), + (22, 'fr_FR', 'Page de connexion - en bas du formulaire', NULL, NULL), + (23, 'fr_FR', 'Page de connexion - en bas de la zone principal', NULL, NULL), + (24, 'fr_FR', 'Page de connexion - en bas', NULL, NULL), + (25, 'fr_FR', 'Page de connexion - feuille de style CSS', NULL, NULL), + (26, 'fr_FR', 'Page de connexion - après l\'inclusion du JavaScript', NULL, NULL), + (27, 'fr_FR', 'Page de connexion - après l\'initialisation du JavaScript', NULL, NULL), + (28, 'fr_FR', 'Modification compte client - en haut', NULL, NULL), + (29, 'fr_FR', 'Modification compte client - en haut du formulaire', NULL, NULL), + (30, 'fr_FR', 'Modification compte client - en bas du formulaire', NULL, NULL), + (31, 'fr_FR', 'Modification compte client - en bas', NULL, NULL), + (32, 'fr_FR', 'Modification compte client - feuille de style CSS', NULL, NULL), + (33, 'fr_FR', 'Modification compte client - après l\'inclusion du JavaScript', NULL, NULL), + (34, 'fr_FR', 'Modification compte client - après l\'initialisation du JavaScript', NULL, NULL), + (35, 'fr_FR', 'Panier - en haut', NULL, NULL), + (36, 'fr_FR', 'Panier - en bas', NULL, NULL), + (37, 'fr_FR', 'Panier - après l\'inclusion du JavaScript', NULL, NULL), + (38, 'fr_FR', 'Panier - feuille de style CSS', NULL, NULL), + (39, 'fr_FR', 'Panier - initialisation du JavaScript', NULL, NULL), + (40, 'fr_FR', 'Page contact - en haut', NULL, NULL), + (41, 'fr_FR', 'Page contact - en haut du formulaire', NULL, NULL), + (42, 'fr_FR', 'Page contact - en bas du formulaire', NULL, NULL), + (43, 'fr_FR', 'Page contact - en bas', NULL, NULL), + (44, 'fr_FR', 'Page contact - feuille de style CSS', NULL, NULL), + (45, 'fr_FR', 'Page contact - après l\'inclusion du JavaScript', NULL, NULL), + (46, 'fr_FR', 'Page contact - après l\'initialisation du JavaScript', NULL, NULL), + (47, 'fr_FR', 'Commande terminée - zone principale', NULL, NULL), + (48, 'fr_FR', 'Commande terminée - feuille de style CSS', NULL, NULL), + (49, 'fr_FR', 'Commande terminée - après l\'inclusion du JavaScript', NULL, NULL), + (50, 'fr_FR', 'Commande terminée - après l\'initialisation du JavaScript', NULL, NULL), + (51, 'fr_FR', 'Page de recherche - feuille de style CSS', NULL, NULL), + (52, 'fr_FR', 'Page de recherche - après l\'inclusion du JavaScript', NULL, NULL), + (53, 'fr_FR', 'Page de recherche - après l\'initialisation du JavaScript', NULL, NULL), + (54, 'fr_FR', 'Création de compte - en haut', NULL, NULL), + (55, 'fr_FR', 'Création de compte - en haut du formulaire', NULL, NULL), + (56, 'fr_FR', 'Création de compte - en bas du formulaire', NULL, NULL), + (57, 'fr_FR', 'Création de compte - en bas', NULL, NULL), + (58, 'fr_FR', 'Création de compte - feuille de style CSS', NULL, NULL), + (59, 'fr_FR', 'Création de compte - après l\'inclusion du JavaScript', NULL, NULL), + (60, 'fr_FR', 'Création de compte - après l\'initialisation du JavaScript', NULL, NULL), + (61, 'fr_FR', 'Mot de passe perdu - en haut', NULL, NULL), + (62, 'fr_FR', 'Mot de passe perdu - en haut du formulaire', NULL, NULL), + (63, 'fr_FR', 'Mot de passe perdu - en bas du formulaire', NULL, NULL), + (64, 'fr_FR', 'Mot de passe perdu - en bas', NULL, NULL), + (65, 'fr_FR', 'Mot de passe perdu - feuille de style CSS', NULL, NULL), + (66, 'fr_FR', 'Mot de passe perdu - après l\'inclusion du JavaScript', NULL, NULL), + (67, 'fr_FR', 'Mot de passe perdu - initialisation du JavaScript', NULL, NULL), + (68, 'fr_FR', 'Page du choix du langage - en haut', NULL, NULL), + (69, 'fr_FR', 'Page du choix du langage - en bas', NULL, NULL), + (70, 'fr_FR', 'Page du choix du langage - feuille de style CSS', NULL, NULL), + (71, 'fr_FR', 'Page du choix du langage - après l\'inclusion du JavaScript', NULL, NULL), + (72, 'fr_FR', 'Page du choix du langage - après l\'initialisation du JavaScript', NULL, NULL), + (73, 'fr_FR', 'Page contact - en cas de succès', NULL, NULL), + (74, 'fr_FR', 'Page newsletter - en haut', NULL, NULL), + (75, 'fr_FR', 'Page newsletter - en bas', NULL, NULL), + (76, 'fr_FR', 'Page newsletter - feuille de style CSS', NULL, NULL), + (77, 'fr_FR', 'Page newsletter - après l\'inclusion du JavaScript', NULL, NULL), + (78, 'fr_FR', 'Page newsletter - après l\'initialisation du JavaScript', NULL, NULL), + (79, 'fr_FR', 'Échec du paiement - feuille de style CSS', NULL, NULL), + (80, 'fr_FR', 'Echec du paiement - après l\'inclusion du JavaScript', NULL, NULL), + (81, 'fr_FR', 'Echec du paiement - initialisation du JavaScript', NULL, NULL), + (82, 'fr_FR', 'Page de contenu - en haut', NULL, NULL), + (83, 'fr_FR', 'Page de contenu - en haut de la zone principal', NULL, NULL), + (84, 'fr_FR', 'Page de contenu - en bas de la zone principal', NULL, NULL), + (85, 'fr_FR', 'Page de contenu - en bas', NULL, NULL), + (86, 'fr_FR', 'Page de contenu - feuille de style CSS', NULL, NULL), + (87, 'fr_FR', 'Page de contenu - après l\'inclusion du JavaScript', NULL, NULL), + (88, 'fr_FR', 'Page de contenu - après l\'initialisation du JavaScript', NULL, NULL), + (89, 'fr_FR', 'Structure HTML - après l\'ouverture de la balise head', NULL, NULL), + (90, 'fr_FR', 'Structure HTML - feuille de style CSS', NULL, NULL), + (91, 'fr_FR', 'Structure HTML - avant la fin de la balise head', NULL, NULL), + (92, 'fr_FR', 'Structure HTML - après l\'ouverture de la balise body', NULL, NULL), + (93, 'fr_FR', 'Structure HTML - en haut du header', NULL, NULL), + (94, 'fr_FR', 'Structure HTML - navigation secondaire', NULL, NULL), + (95, 'fr_FR', 'Structure HTML - navigation principale', NULL, NULL), + (96, 'fr_FR', 'Structure HTML - en bas du header', NULL, NULL), + (97, 'fr_FR', 'Structure HTML - au dessus de la zone de contenu principale', NULL, NULL), + (98, 'fr_FR', 'Structure HTML - en dessous de la zone de contenu principale', NULL, NULL), + (99, 'fr_FR', 'Structure HTML - en haut du pied de page', NULL, NULL), + (100, 'fr_FR', 'Structure HTML - corps du pied de page', NULL, NULL), + (101, 'fr_FR', 'Structure HTML - en bas du pied de page', NULL, NULL), + (102, 'fr_FR', 'Structure HTML - après l\'inclusion du JavaScript', NULL, NULL), + (103, 'fr_FR', 'Structure HTML - initialisation du JavaScript', NULL, NULL), + (104, 'fr_FR', 'Structure HTML - avant la fin de la balise body', NULL, NULL), + (105, 'fr_FR', 'Page introuvable - zone de contenu', NULL, NULL), + (106, 'fr_FR', 'Page introuvable - feuille de style CSS', NULL, NULL), + (107, 'fr_FR', 'Page introuvable - après l\'inclusion du JavaScript', NULL, NULL), + (108, 'fr_FR', 'Page introuvable - après l\'initialisation du JavaScript', NULL, NULL), + (109, 'fr_FR', 'Choix du transporteur - en haut', NULL, NULL), + (110, 'fr_FR', 'Choix du transporteur - en haut du formulaire', NULL, NULL), + (111, 'fr_FR', 'Choix du transporteur - en bas du formulaire', NULL, NULL), + (112, 'fr_FR', 'Choix du transporteur - en bas', NULL, NULL), + (113, 'fr_FR', 'Choix du transporteur - après l\'initialisation du JavaScript', NULL, NULL), + (114, 'fr_FR', 'Choix du transporteur - feuille de style CSS', NULL, NULL), + (115, 'fr_FR', 'Choix du transporteur - après l\'inclusion du JavaScript', NULL, NULL), + (116, 'fr_FR', 'Création d\'adresse - en haut', NULL, NULL), + (117, 'fr_FR', 'Création d\'adresse - en haut du formulaire', NULL, NULL), + (118, 'fr_FR', 'Création d\'adresse - en bas du formulaire', NULL, NULL), + (119, 'fr_FR', 'Création d\'adresse - en bas', NULL, NULL), + (120, 'fr_FR', 'Création d\'adresse - feuille de style CSS', NULL, NULL), + (121, 'fr_FR', 'Création d\'adresse - après l\'inclusion du JavaScript', NULL, NULL), + (122, 'fr_FR', 'Création d\'adresse - après l\'initialisation du JavaScript', NULL, NULL), + (123, 'fr_FR', 'Page dossier - en haut', NULL, NULL), + (124, 'fr_FR', 'Page dossier - en haut de la zone principale', NULL, NULL), + (125, 'fr_FR', 'Page dossier - en bas de la zone principale', NULL, NULL), + (126, 'fr_FR', 'Page dossier - en bas', NULL, NULL), + (127, 'fr_FR', 'Page dossier - feuille de style CSS', NULL, NULL), + (128, 'fr_FR', 'Page dossier - après l\'inclusion du JavaScript', NULL, NULL), + (129, 'fr_FR', 'Page dossier - après l\'initialisation du JavaScript', NULL, NULL), + (130, 'fr_FR', 'Échec de la commande - en haut', NULL, NULL), + (131, 'fr_FR', 'Échec de la commande - en bas', NULL, NULL), + (132, 'fr_FR', 'Échec de la commande - feuille de style CSS', NULL, NULL), + (133, 'fr_FR', 'Echec de la commande - après l\'inclusion du JavaScript', NULL, NULL), + (134, 'fr_FR', 'Echec de la commande - après l\'initialisation du JavaScript', NULL, NULL), + (135, 'fr_FR', 'Page catégorie - en haut', NULL, NULL), + (136, 'fr_FR', 'Page catégorie - en haut de la zone principal', NULL, NULL), + (137, 'fr_FR', 'Page catégorie - en bas de la zone principal', NULL, NULL), + (138, 'fr_FR', 'Page catégorie - en bas', NULL, NULL), + (139, 'fr_FR', 'Page catégorie - feuille de style CSS', NULL, NULL), + (140, 'fr_FR', 'Page catégorie - après l\'inclusion du JavaScript', NULL, NULL), + (141, 'fr_FR', 'Page catégorie - après l\'initialisation du JavaScript', NULL, NULL), + (142, 'fr_FR', 'Modification d\'adresse - en haut', NULL, NULL), + (143, 'fr_FR', 'Modification d\'adresse - en haut du formulaire', NULL, NULL), + (144, 'fr_FR', 'Modification d\'adresse - en bas du formulaire', NULL, NULL), + (145, 'fr_FR', 'Modification d\'adresse - en bas', NULL, NULL), + (146, 'fr_FR', 'Modification d\'adresse - feuille de style CSS', NULL, NULL), + (147, 'fr_FR', 'Modification d\'adresse - après l\'inclusion du JavaScript', NULL, NULL), + (148, 'fr_FR', 'Modification d\'adresse - après l\'initialisation du JavaScript', NULL, NULL), + (149, 'fr_FR', 'Page d\'accueil - zone principale', NULL, NULL), + (150, 'fr_FR', 'Page d\'accueil - feuille de style CSS', NULL, NULL), + (151, 'fr_FR', 'Page d\'accueil - après l\'inclusion du JavaScript', NULL, NULL), + (152, 'fr_FR', 'Page d\'accueil - après l\'initialisation du JavaScript', NULL, NULL), + (153, 'fr_FR', 'Changement de mot de passe - en haut', NULL, NULL), + (154, 'fr_FR', 'Changement de mot de passe - en bas', NULL, NULL), + (155, 'fr_FR', 'Changement de mot de passe - feuille de style CSS', NULL, NULL), + (156, 'fr_FR', 'Changement de mot de passe - après l\'inclusion du JavaScript', NULL, NULL), + (157, 'fr_FR', 'Changement de mot de passe - après l\'initialisation du JavaScript', NULL, NULL), + (158, 'fr_FR', 'Page produit - en haut', NULL, NULL), + (159, 'fr_FR', 'Page produit - galerie photos', NULL, NULL), + (160, 'fr_FR', 'Page produit - en haut de la zone détail', NULL, NULL), + (161, 'fr_FR', 'Page produit - en dessous de la zone de détail', NULL, NULL), + (162, 'fr_FR', 'Page produit - informations additionnelles', NULL, NULL), + (163, 'fr_FR', 'Page produit - en bas', NULL, NULL), + (164, 'fr_FR', 'Page produit - feuille de style CSS', NULL, NULL), + (165, 'fr_FR', 'Page produit - après l\'inclusion du JavaScript', NULL, NULL), + (166, 'fr_FR', 'Page produit - après l\'initialisation du JavaScript', NULL, NULL), + (167, 'fr_FR', 'Compte client - en haut', NULL, NULL), + (168, 'fr_FR', 'Compte client - en bas', NULL, NULL), + (169, 'fr_FR', 'Compte client - feuille de style CSS', NULL, NULL), + (170, 'fr_FR', 'Compte client - après l\'inclusion du JavaScript', NULL, NULL), + (171, 'fr_FR', 'Compte client - après l\'initialisation du JavaScript', NULL, NULL), + (172, 'fr_FR', 'Tous les produits - en haut', NULL, NULL), + (173, 'fr_FR', 'Tous les produits - en bas', NULL, NULL), + (174, 'fr_FR', 'Tous les produits - feuille de style CSS', NULL, NULL), + (175, 'fr_FR', 'Tous les produits - après l\'inclusion du JavaScript', NULL, NULL), + (176, 'fr_FR', 'Tous les produits - après l\'initialisation du JavaScript', NULL, NULL), + (177, 'fr_FR', 'Boucle produit - en haut', NULL, NULL), + (178, 'fr_FR', 'Boucle produit - en bas', NULL, NULL), + (179, 'fr_FR', 'Page catégorie - en haut de la sidebar', NULL, NULL), + (180, 'fr_FR', 'Page catégorie - le corps de la sidebar', NULL, NULL), + (181, 'fr_FR', 'Page catégorie - en bas de la sidebar', NULL, NULL), + (182, 'fr_FR', 'Page de contenu - en haut de la sidebar', NULL, NULL), + (183, 'fr_FR', 'Page de contenu - le corps de la sidebar', NULL, NULL), + (184, 'fr_FR', 'Page de contenu - en bas de la sidebar', NULL, NULL), + (185, 'fr_FR', 'Choix du transporteur - zone supplémentaire', NULL, NULL), + (186, 'fr_FR', 'Choix du transporteur - javascript', NULL, NULL), + (187, 'fr_FR', 'Page catégorie - au dessus de la zone de contenu principale', NULL, NULL), + (188, 'fr_FR', 'Page catégorie - en dessous de la zone de contenu principale', NULL, NULL), + (189, 'fr_FR', 'Page de contenu - au dessus de la zone de contenu principale', NULL, NULL), + (190, 'fr_FR', 'Page de contenu - en dessous de la zone de contenu principale', NULL, NULL), + (191, 'fr_FR', 'Page dossier - au dessus de la zone de contenu principale', NULL, NULL), + (192, 'fr_FR', 'Page dossier - en dessous de la zone de contenu principale', NULL, NULL), + (193, 'fr_FR', 'Page des marques - en haut', NULL, NULL), + (194, 'fr_FR', 'Page des marques - en bas', NULL, NULL), + (195, 'fr_FR', 'Page des marques - en haut de la zone principal', NULL, NULL), + (196, 'fr_FR', 'Page des marques - en bas de la zone principal', NULL, NULL), + (197, 'fr_FR', 'Page des marques - au dessus de la zone de contenu principale', NULL, NULL), + (198, 'fr_FR', 'Page des marques - en dessous de la zone de contenu principale', NULL, NULL), + (199, 'fr_FR', 'Page des marques - feuille de style CSS', NULL, NULL), + (200, 'fr_FR', 'Page des marques - après l\'inclusion du JavaScript', NULL, NULL), + (201, 'fr_FR', 'Page des marques - initialisation du JavaScript', NULL, NULL), + (202, 'fr_FR', 'Page des marques - en haut de la sidebar', NULL, NULL), + (203, 'fr_FR', 'Page des marques - le corps de la sidebar', NULL, NULL), + (204, 'fr_FR', 'Page des marques - en bas de la sidebar', NULL, NULL), + (205, 'fr_FR', 'Détail d\'une commande - en haut', NULL, NULL), + (206, 'fr_FR', 'Détail d\'une commande - informations additionnelles', NULL, NULL), + (207, 'fr_FR', 'Détail d\'une commande - après les informations générales', NULL, NULL), + (208, 'fr_FR', 'Détail d\'une commande - informations additionnelles pour l\'expédition', NULL, NULL), + (209, 'fr_FR', 'Détail d\'une commande - adresse de livraison', NULL, NULL), + (210, 'fr_FR', 'Détail d\'une commande - informations additionnelles pour la facturation', NULL, NULL), + (211, 'fr_FR', 'Détail d\'une commande - adresse de facturation', NULL, NULL), + (212, 'fr_FR', 'Détail d\'une commande - Après les adresses', NULL, NULL), + (213, 'fr_FR', 'Détail d\'une commande - avant la liste des produits', NULL, NULL), + (214, 'fr_FR', 'Détail d\'une commande - informations additionnelles pour un produit', NULL, NULL), + (215, 'fr_FR', 'Détail d\'une commande - après la liste des produits', NULL, NULL), + (216, 'fr_FR', 'Détail d\'une commande - Après les produits', NULL, NULL), + (217, 'fr_FR', 'Détail d\'une commande - en bas', NULL, NULL), + (218, 'fr_FR', 'Détail d\'une commande - feuille de style CSS', NULL, NULL), + (219, 'fr_FR', 'Détail d\'une commande - après l\'inclusion du JavaScript', NULL, NULL), + (220, 'fr_FR', 'Détail d\'une commande - initialisation du JavaScript', NULL, NULL), + (221, 'fr_FR', 'Compte client - informations additionnelles', NULL, NULL), + (222, 'fr_FR', 'Détail d\'une commande - Après un produit', NULL, NULL), + (223, 'fr_FR', 'Mini panier', NULL, NULL), + (224, 'fr_FR', 'Promotion - en haut', NULL, NULL), + (225, 'fr_FR', 'Promotion - en bas', NULL, NULL), + (226, 'fr_FR', 'Promotion - en haut de la zone principal', NULL, NULL), + (227, 'fr_FR', 'Promotion - en bas de la zone principal', NULL, NULL), + (228, 'fr_FR', 'Promotion - au dessous de la zone de contenu principale', NULL, NULL), + (229, 'fr_FR', 'Promotion - en dessous de la zone de contenu principale', NULL, NULL), + (230, 'fr_FR', 'Promotion - feuille de style CSS', NULL, NULL), + (231, 'fr_FR', 'Promotion - après l\'inclusion du JavaScript', NULL, NULL), + (232, 'fr_FR', 'Promotion - initialisation du JavaScript', NULL, NULL), + (233, 'fr_FR', 'Détail d\'une commande - après l\'adresse de facturation', NULL, NULL), + (234, 'fr_FR', 'Détails d\'une commande - après l\'adresse de livraison', NULL, NULL), + (235, 'fr_FR', 'Désabonnement newsletter - en haut', NULL, NULL), + (236, 'fr_FR', 'Désabonnement newsletter - en bas', NULL, NULL), + (237, 'fr_FR', 'Désabonnement newsletter - feuille de style CSS', NULL, NULL), + (238, 'fr_FR', 'Désabonnement newsletter - après l\'inclusion du JavaScript', NULL, NULL), + (239, 'fr_FR', 'Désabonnement newsletter - après l\'initialisation du JavaScript', NULL, NULL) +; + +-- Insert I18n admin hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES + (1000, 'de_DE', 'Kategorie - Inhalt', NULL, NULL), + (1001, 'de_DE', 'Inhalt - Inhalt', NULL, NULL), + (1002, 'de_DE', 'Ordner - Inhalt', NULL, NULL), + (1003, 'de_DE', 'Bestellung - Inhalt', NULL, NULL), + (1004, 'de_DE', 'Produkt - Inhalt', NULL, NULL), + (1005, 'de_DE', 'Karakteristiken-Angaben - Tabellenkopf', NULL, NULL), + (1006, 'de_DE', 'Karakteristiken-Angaben - Tabellenzeile', NULL, NULL), + (1007, 'de_DE', 'Karakteristik - Angabe-Erstellungsformular', NULL, NULL), + (1008, 'de_DE', 'Karakteristik - JavaScript Änderung', NULL, NULL), + (1009, 'de_DE', 'Produkt - JavaScript Änderung', NULL, NULL), + (1010, 'de_DE', 'Gutschein - JavaScript erstellen', NULL, NULL), + (1011, 'de_DE', 'Taxes - Änderungs-Formular', NULL, NULL), + (1012, 'de_DE', 'Taxregel - JavaScript Änderung', NULL, NULL), + (1013, 'de_DE', 'Tools - oben', NULL, NULL), + (1014, 'de_DE', 'Tools - oben der Spalte', NULL, NULL), + (1015, 'de_DE', 'Tools - unten der Spalte 1', NULL, NULL), + (1016, 'de_DE', 'Tools - unten', NULL, NULL), + (1017, 'de_DE', 'Tools - JavaScript', NULL, NULL), + (1018, 'de_DE', 'Nachrichten - oben', NULL, NULL), + (1019, 'de_DE', 'Nachrichten - Tabellenkopf', NULL, NULL), + (1020, 'de_DE', 'Nachrichten - Tabellenzeile', NULL, NULL), + (1021, 'de_DE', 'Nachrichten - unten', NULL, NULL), + (1022, 'de_DE', 'Nachricht - Erstellungsformular', NULL, NULL), + (1023, 'de_DE', 'Nachricht - Löschungsformular', NULL, NULL), + (1024, 'de_DE', 'Nachrichten - JavaScript', NULL, NULL), + (1025, 'de_DE', 'Taxeregeln - oben', NULL, NULL), + (1026, 'de_DE', 'Taxeregeln - unten', NULL, NULL), + (1027, 'de_DE', 'Taxe - Erstellungsformular', NULL, NULL), + (1028, 'de_DE', 'Taxe - Löschungsformular', NULL, NULL), + (1029, 'de_DE', 'Taxregel - Erstellungsformular', NULL, NULL), + (1030, 'de_DE', 'Taxregel - Löschungsformular', NULL, NULL), + (1031, 'de_DE', 'Taxeregeln - JavaScript', NULL, NULL), + (1032, 'de_DE', 'Exporte - oben', NULL, NULL), + (1033, 'de_DE', 'Exporte - unten einer Kategorie', NULL, NULL), + (1034, 'de_DE', 'Exporte - unten der Spalte 1', NULL, NULL), + (1035, 'de_DE', 'Exporte - JavaScript', NULL, NULL), + (1036, 'de_DE', 'Export - JavaScript', NULL, NULL), + (1037, 'de_DE', 'Produkt - Ordner Tabellenkopf', NULL, NULL), + (1038, 'de_DE', 'Produkt - Ordner Tabellenzeile', NULL, NULL), + (1039, 'de_DE', 'Produkt - Preisedetails Formular', NULL, NULL), + (1040, 'de_DE', 'Produkt - Bestandänderung Formular', NULL, NULL), + (1041, 'de_DE', 'Produkt - Sonderangebotdetails Formular', NULL, NULL), + (1042, 'de_DE', 'Produkt - vor den Kombinationen', NULL, NULL), + (1043, 'de_DE', 'Produkt - Kombinationsliste-Bildunterschrift', NULL, NULL), + (1044, 'de_DE', 'Produkt - nach den Kombinationen', NULL, NULL), + (1045, 'de_DE', 'Produkt - Kombinations-Löschungsformular', NULL, NULL), + (1046, 'de_DE', 'Modulen - Tabellenkopf', NULL, NULL), + (1047, 'de_DE', 'Modulen - Tabellenzeile', NULL, NULL), + (1048, 'de_DE', 'Währung - JavaScript Änderung', NULL, NULL), + (1049, 'de_DE', 'Kategorie - Inhalts Tabellenkopf', NULL, NULL), + (1050, 'de_DE', 'Kategorie - Inhalts Tabellenzeile', NULL, NULL), + (1051, 'de_DE', 'Kategorie - JavaScript Änderung', NULL, NULL), + (1052, 'de_DE', 'Dokument - JavaScript Änderung', NULL, NULL), + (1053, 'de_DE', 'Kunde - oben', NULL, NULL), + (1054, 'de_DE', 'Kunden - Bildunterschrift', NULL, NULL), + (1055, 'de_DE', 'Kunden - Tabellenkopf', NULL, NULL), + (1056, 'de_DE', 'Kunden - Zeile', NULL, NULL), + (1057, 'de_DE', 'Kunde - unten', NULL, NULL), + (1058, 'de_DE', 'Kunde - Erstellungsformular', NULL, NULL), + (1059, 'de_DE', 'Kunde - Löschungsformular', NULL, NULL), + (1060, 'de_DE', 'Kunden - JavaScript', NULL, NULL), + (1061, 'de_DE', 'Produkt - Inhalte Tabellenkopf', NULL, NULL), + (1062, 'de_DE', 'Produkt - Inhalte Tabellenzeile', NULL, NULL), + (1063, 'de_DE', 'Produkt - Zubehör Tabellenkopf', NULL, NULL), + (1064, 'de_DE', 'Produkt - Zubehör Tabellenzeile', NULL, NULL), + (1065, 'de_DE', 'Produkt - Kategorien Tabellenkopf', NULL, NULL), + (1066, 'de_DE', 'Produkt - Kategorien Tabellenzeile', NULL, NULL), + (1067, 'de_DE', 'Produkt - Deklination Tabellenkopf', NULL, NULL), + (1068, 'de_DE', 'Produkt - Deklination Tabellenzeile', NULL, NULL), + (1069, 'de_DE', 'Produkt - Charakteristiken Tabellenkopf', NULL, NULL), + (1070, 'de_DE', 'Produkt - Charakteristiken Tabellenzeile', NULL, NULL), + (1071, 'de_DE', 'Template - Tabellenkopf attributs', NULL, NULL), + (1072, 'de_DE', 'Template - Tabellenzeile attributs', NULL, NULL), + (1073, 'de_DE', 'Template - Charakteristiken Tabellenkopf', NULL, NULL), + (1074, 'de_DE', 'Template - Charakteristiken Tabellenzeile', NULL, NULL), + (1075, 'de_DE', 'Templates - oben', NULL, NULL), + (1076, 'de_DE', 'Templates - Tabellenkopf', NULL, NULL), + (1077, 'de_DE', 'Templates - Tabellenzeile', NULL, NULL), + (1078, 'de_DE', 'Templates - unten', NULL, NULL), + (1079, 'de_DE', 'Template - Erstellungsformular', NULL, NULL), + (1080, 'de_DE', 'Template - Löschungsformular', NULL, NULL), + (1081, 'de_DE', 'Templates - JavaScript', NULL, NULL), + (1082, 'de_DE', 'Konfiguration - oben', NULL, NULL), + (1083, 'de_DE', 'Konfiguration - oben an dem Katalogsbereich', NULL, NULL), + (1084, 'de_DE', 'Konfiguration - unten an dem katalog', NULL, NULL), + (1085, 'de_DE', 'Konfiguration - oben an der Lieferzone', NULL, NULL), + (1086, 'de_DE', 'Konfiguration - unten an der Lieferzone', NULL, NULL), + (1087, 'de_DE', 'Konfiguration - oben an dem Systembereich', NULL, NULL), + (1088, 'de_DE', 'Konfiguration - unten an dem Systembereich', NULL, NULL), + (1089, 'de_DE', 'Konfiguration - unten', NULL, NULL), + (1090, 'de_DE', 'Konfiguration - JavaScript', NULL, NULL), + (1091, 'de_DE', 'Dashboard - oben', NULL, NULL), + (1092, 'de_DE', 'Dashboard - in der Mitte', NULL, NULL), + (1093, 'de_DE', 'Dashboard - unten', NULL, NULL), + (1094, 'de_DE', 'Bestellungen - oben', NULL, NULL), + (1095, 'de_DE', 'Bestellungen - Tabellenkopf', NULL, NULL), + (1096, 'de_DE', 'Bestellungen - Tabellenzeile', NULL, NULL), + (1097, 'de_DE', 'Bestellungen - unten', NULL, NULL), + (1098, 'de_DE', 'Bestellungen - JavaScript', NULL, NULL), + (1099, 'de_DE', 'Lieferzone - oben', NULL, NULL), + (1100, 'de_DE', 'Lieferzone - Tabellenkopf', NULL, NULL), + (1101, 'de_DE', 'Lieferzone - Tabellenzeile', NULL, NULL), + (1102, 'de_DE', 'Lieferzone - unten', NULL, NULL), + (1103, 'de_DE', 'Lieferzone - JavaScript', NULL, NULL), + (1104, 'de_DE', 'Inhalt - JavaScript Änderung', NULL, NULL), + (1105, 'de_DE', 'Accueil - oben', NULL, NULL), + (1106, 'de_DE', 'Accueil - unten', NULL, NULL), + (1107, 'de_DE', 'Accueil - JavaScript', NULL, NULL), + (1108, 'de_DE', 'Modulen - oben', NULL, NULL), + (1109, 'de_DE', 'Modulen - unten', NULL, NULL), + (1110, 'de_DE', 'Modulen - JavaScript', NULL, NULL), + (1111, 'de_DE', 'Sprachen - oben', NULL, NULL), + (1112, 'de_DE', 'Sprachen - unten', NULL, NULL), + (1113, 'de_DE', 'Sprache - Erstellungsformular', NULL, NULL), + (1114, 'de_DE', 'Sprachen - Löschungsformular', NULL, NULL), + (1115, 'de_DE', 'Sprachen - JavaScript', NULL, NULL), + (1116, 'de_DE', 'Zone - Löschungsformular', NULL, NULL), + (1117, 'de_DE', 'Lieferzone - JavaScript Änderung', NULL, NULL), + (1118, 'de_DE', 'System - JavaScript Logs', NULL, NULL), + (1119, 'de_DE', 'Suche - oben', NULL, NULL), + (1120, 'de_DE', 'Suche - unten', NULL, NULL), + (1121, 'de_DE', 'Suche - JavaScript', NULL, NULL), + (1122, 'de_DE', 'Administratoren - oben', NULL, NULL), + (1123, 'de_DE', 'Administratoren - unten', NULL, NULL), + (1124, 'de_DE', 'Administrator - Erstellungsformular', NULL, NULL), + (1125, 'de_DE', 'Administrator - Änderungsformular', NULL, NULL), + (1126, 'de_DE', 'Administrator - Löschungsformular', NULL, NULL), + (1127, 'de_DE', 'Administratoren - JavaScript', NULL, NULL), + (1128, 'de_DE', 'Modul Hook - JavaScript Änderung', NULL, NULL), + (1129, 'de_DE', 'Versandkonfiguration - oben', NULL, NULL), + (1130, 'de_DE', 'Versandkonfiguration - Tabellenkopf', NULL, NULL), + (1131, 'de_DE', 'Versandkonfiguration - Tabellenzeile', NULL, NULL), + (1132, 'de_DE', 'Versandkonfiguration - unten', NULL, NULL), + (1133, 'de_DE', 'Versandkonfiguration - Erstellungsformular', NULL, NULL), + (1134, 'de_DE', 'Versandkonfiguration - Löschungsformular', NULL, NULL), + (1135, 'de_DE', 'Versandkonfiguration - JavaScript', NULL, NULL), + (1136, 'de_DE', 'Karakteristiken - oben', NULL, NULL), + (1137, 'de_DE', 'Karakteristiken - Tabellenkopf', NULL, NULL), + (1138, 'de_DE', 'Karakteristiken - Tabellenzeile', NULL, NULL), + (1139, 'de_DE', 'Karakteristiken - unten', NULL, NULL), + (1140, 'de_DE', 'Karakteristik - Erstellungsformular', NULL, NULL), + (1141, 'de_DE', 'Karakteristik - Löschungsformular', NULL, NULL), + (1142, 'de_DE', 'Karakteristik - zu allen hinzufügen Formular', NULL, NULL), + (1143, 'de_DE', 'Karakteristik - multipel Löschungsformular', NULL, NULL), + (1144, 'de_DE', 'Karakteristiken - JavaScript', NULL, NULL), + (1145, 'de_DE', 'Modul - JavaScript Änderung', NULL, NULL), + (1146, 'de_DE', 'Modul Hook - Erstellungsformular', NULL, NULL), + (1147, 'de_DE', 'Modul Hook - Löschungsformular', NULL, NULL), + (1148, 'de_DE', 'Modul Hook - JavaScript', NULL, NULL), + (1149, 'de_DE', 'Versandkonfiguration - Änderung', NULL, NULL), + (1150, 'de_DE', 'Versandkonfiguration - Länder Löschungsfomular', NULL, NULL), + (1151, 'de_DE', 'Versandkonfiguration - JavaScript Änderung', NULL, NULL), + (1152, 'de_DE', 'E-Mail Sendung - oben', NULL, NULL), + (1153, 'de_DE', 'E-Mail Sendung - unten', NULL, NULL), + (1154, 'de_DE', 'E-Mail Sendung - JavaScript', NULL, NULL), + (1155, 'de_DE', 'Kategorien - oben', NULL, NULL), + (1156, 'de_DE', 'Kategorien - Bildunterschrift', NULL, NULL), + (1157, 'de_DE', 'Kategorien - Kopfzeile', NULL, NULL), + (1158, 'de_DE', 'Kategorien - Zeile', NULL, NULL), + (1159, 'de_DE', 'Produkte - Bildunterschrift', NULL, NULL), + (1160, 'de_DE', 'Produkte - Header', NULL, NULL), + (1161, 'de_DE', 'Produkte - Zeile', NULL, NULL), + (1162, 'de_DE', 'Kategorien - unten', NULL, NULL), + (1163, 'de_DE', 'Kategorien - unten an dem Katalog', NULL, NULL), + (1164, 'de_DE', 'Kategorie - Erstellungsformular', NULL, NULL), + (1165, 'de_DE', 'Produkt - Erstellungsformular', NULL, NULL), + (1166, 'de_DE', 'Kategorie - Löschungsformular', NULL, NULL), + (1167, 'de_DE', 'Produkt - Löschungsformular', NULL, NULL), + (1168, 'de_DE', 'Kategorien - JavaScript', NULL, NULL), + (1169, 'de_DE', 'Variablen - oben', NULL, NULL), + (1170, 'de_DE', 'Variablen - Tabellenkopf', NULL, NULL), + (1171, 'de_DE', 'Variablen - Tabellenzeile', NULL, NULL), + (1172, 'de_DE', 'Variablen - unten', NULL, NULL), + (1173, 'de_DE', 'Variable - Erstellungsformular', NULL, NULL), + (1174, 'de_DE', 'Variable - Löschungsformular', NULL, NULL), + (1175, 'de_DE', 'Variablen - JavaScript', NULL, NULL), + (1176, 'de_DE', 'Bestellung - Produktliste', NULL, NULL), + (1177, 'de_DE', 'Bestellung - JavaScript Änderung', NULL, NULL), + (1178, 'de_DE', 'Shop Informationen - JavaScript', NULL, NULL), + (1179, 'de_DE', 'Übersetzungen - JavaScript', NULL, NULL), + (1180, 'de_DE', 'Ordner - oben', NULL, NULL), + (1181, 'de_DE', 'Ordner - Bildunterschrift', NULL, NULL), + (1182, 'de_DE', 'Ordner - Header', NULL, NULL), + (1183, 'de_DE', 'Ordner - Zeile', NULL, NULL), + (1184, 'de_DE', 'Inhalte - Bildunterschrift', NULL, NULL), + (1185, 'de_DE', 'Inhalte - Kopfzeile', NULL, NULL), + (1186, 'de_DE', 'Inhalte - Zeile', NULL, NULL), + (1187, 'de_DE', 'Ordner - unten', NULL, NULL), + (1188, 'de_DE', 'Ordner - Erstellungsformular', NULL, NULL), + (1189, 'de_DE', 'Inhalt - Erstellungsformular', NULL, NULL), + (1190, 'de_DE', 'Ordner - Löschungsformular', NULL, NULL), + (1191, 'de_DE', 'Inhalt - Löschungsformular', NULL, NULL), + (1192, 'de_DE', 'Ordner - JavaScript', NULL, NULL), + (1193, 'de_DE', 'Template - JavaScript Änderung', NULL, NULL), + (1194, 'de_DE', 'Taxe - JavaScript Änderung', NULL, NULL), + (1195, 'de_DE', 'Hook - JavaScript Änderung', NULL, NULL), + (1196, 'de_DE', 'Länder - oben', NULL, NULL), + (1197, 'de_DE', 'Länder - Tabellenkopf', NULL, NULL), + (1198, 'de_DE', 'Länder - Tabellenzeile', NULL, NULL), + (1199, 'de_DE', 'Länder - unten', NULL, NULL), + (1200, 'de_DE', 'Land - Erstellungsformular', NULL, NULL), + (1201, 'de_DE', 'Land - Löschungsformular', NULL, NULL), + (1202, 'de_DE', 'Länder - JavaScript', NULL, NULL), + (1203, 'de_DE', 'Währungen - oben', NULL, NULL), + (1204, 'de_DE', 'Währungen - Tabellenkopf', NULL, NULL), + (1205, 'de_DE', 'Währungen - Tabellenzeile', NULL, NULL), + (1206, 'de_DE', 'Währungen - unten', NULL, NULL), + (1207, 'de_DE', 'Währung - Erstellungsformular', NULL, NULL), + (1208, 'de_DE', 'Währung - Löschungsformular', NULL, NULL), + (1209, 'de_DE', 'Währungen - JavaScript', NULL, NULL), + (1210, 'de_DE', 'Kunde - Modification', NULL, NULL), + (1211, 'de_DE', 'Kunde - Adresse-Erstellungsformular', NULL, NULL), + (1212, 'de_DE', 'Kunde - Adresse-Änderungsformular', NULL, NULL), + (1213, 'de_DE', 'Kunde - Adresse-Löschungsformular', NULL, NULL), + (1214, 'de_DE', 'Kunde - JavaScript Änderung', NULL, NULL), + (1215, 'de_DE', 'Deklinationenangaben - Tabellenkopf', NULL, NULL), + (1216, 'de_DE', 'Deklinationenangaben - Tabellenzeile', NULL, NULL), + (1217, 'de_DE', 'Deklinationsangabe - Erstellungsformular', NULL, NULL), + (1218, 'de_DE', 'Deklination - ID Löschungsformular', NULL, NULL), + (1219, 'de_DE', 'Deklination - JavaScript Änderung', NULL, NULL), + (1220, 'de_DE', 'Profile - oben', NULL, NULL), + (1221, 'de_DE', 'Profile - unten', NULL, NULL), + (1222, 'de_DE', 'Profil - Erstellungsformular', NULL, NULL), + (1223, 'de_DE', 'Profil - Löschungsformular', NULL, NULL), + (1224, 'de_DE', 'Profile - JavaScript', NULL, NULL), + (1225, 'de_DE', 'Land - JavaScript Änderung', NULL, NULL), + (1226, 'de_DE', 'Profil - JavaScript Änderung', NULL, NULL), + (1227, 'de_DE', 'Variable - JavaScript Änderung', NULL, NULL), + (1228, 'de_DE', 'Gutschein - JavaScript Änderung', NULL, NULL), + (1229, 'de_DE', 'Gutschein - oben', NULL, NULL), + (1230, 'de_DE', 'Gutschein - Bildunterschrift', NULL, NULL), + (1231, 'de_DE', 'Gutschein - Tabellenkopf', NULL, NULL), + (1232, 'de_DE', 'Gutschein - Tabellenzeile', NULL, NULL), + (1233, 'de_DE', 'Gutschein - unten', NULL, NULL), + (1234, 'de_DE', 'Gutschein - JavaScript den Listen', NULL, NULL), + (1235, 'de_DE', 'Modul - Konfiguration', NULL, NULL), + (1236, 'de_DE', 'Modul - JavaScript Konfiguration', NULL, NULL), + (1237, 'de_DE', 'Nachricht - JavaScript Änderung', NULL, NULL), + (1238, 'de_DE', 'Bild - JavaScript Änderung', NULL, NULL), + (1239, 'de_DE', 'Deklinationen - oben', NULL, NULL), + (1240, 'de_DE', 'Deklinationen - Tabellenkopf', NULL, NULL), + (1241, 'de_DE', 'Deklinationen - Tabellenzeile', NULL, NULL), + (1242, 'de_DE', 'Deklinationen - unten', NULL, NULL), + (1243, 'de_DE', 'Deklination - Erstellungsformular', NULL, NULL), + (1244, 'de_DE', 'Deklination - Löschungsformular', NULL, NULL), + (1245, 'de_DE', 'Deklination - zu allen hinzufügen Formular', NULL, NULL), + (1246, 'de_DE', 'Deklination - multipel Löschungsformular', NULL, NULL), + (1247, 'de_DE', 'Deklinationen - JavaScript', NULL, NULL), + (1248, 'de_DE', 'Logs - oben', NULL, NULL), + (1249, 'de_DE', 'Logs - unten', NULL, NULL), + (1250, 'de_DE', 'Protokolle - JavaScript', NULL, NULL), + (1251, 'de_DE', 'Ordner - JavaScript Änderung', NULL, NULL), + (1252, 'de_DE', 'Hooks - oben', NULL, NULL), + (1253, 'de_DE', 'Hooks - Tabellenkopf', NULL, NULL), + (1254, 'de_DE', 'Hooks - Tabellenzeile', NULL, NULL), + (1255, 'de_DE', 'Hooks - unten', NULL, NULL), + (1256, 'de_DE', 'Hook - Erstellungsformular', NULL, NULL), + (1257, 'de_DE', 'Hook - Löschungsformular', NULL, NULL), + (1258, 'de_DE', 'Hooks - JavaScript', NULL, NULL), + (1259, 'de_DE', 'Layout - CSS', NULL, NULL), + (1260, 'de_DE', 'Layout - vor der Titelleiste', NULL, NULL), + (1261, 'de_DE', 'Layout - in der Titelleiste', NULL, NULL), + (1262, 'de_DE', 'Layout - nach der Titelleiste', NULL, NULL), + (1263, 'de_DE', 'Layout - vor dem Top Menü', NULL, NULL), + (1264, 'de_DE', 'Layout - in Top-Menü Elementen', NULL, NULL), + (1265, 'de_DE', 'Layout - nach dem Top Menü', NULL, NULL), + (1266, 'de_DE', 'Layout - vor dem Footer', NULL, NULL), + (1267, 'de_DE', 'Layout - Im Footer', NULL, NULL), + (1268, 'de_DE', 'Layout - nach dem Footer', NULL, NULL), + (1269, 'de_DE', 'Layout - JavaScript', NULL, NULL), + (1270, 'de_DE', 'Layout - oben an der Titelleiste', NULL, NULL), + (1271, 'de_DE', 'Layout - unten an der Titelleiste', NULL, NULL), + (1272, 'de_DE', 'Layout - im Kundes-Menü', NULL, NULL), + (1273, 'de_DE', 'Layout - im Bestellungsmenü', NULL, NULL), + (1274, 'de_DE', 'Layout - im Katalogs-Menü', NULL, NULL), + (1275, 'de_DE', 'Layout - im Ordners-Menü', NULL, NULL), + (1276, 'de_DE', 'Layout - im Tools-Menü', NULL, NULL), + (1277, 'de_DE', 'Layout - im Moduls-Menü', NULL, NULL), + (1278, 'de_DE', 'Layout - im konfigurations-Menü', NULL, NULL), + (1279, 'de_DE', 'Marke - JavaScript Änderung', NULL, NULL), + (1280, 'de_DE', 'Accueil - Block', NULL, NULL), + (1281, 'de_DE', 'Marken - oben', NULL, NULL), + (1282, 'de_DE', 'Marken - Tabellenkopf', NULL, NULL), + (1283, 'de_DE', 'Marken - Tabellzeilen', NULL, NULL), + (1284, 'de_DE', 'Marken - unten', NULL, NULL), + (1285, 'de_DE', 'Marke - Erstellungsformular', NULL, NULL), + (1286, 'de_DE', 'Marke - Löschungsformular', NULL, NULL), + (1287, 'de_DE', 'Marke - JavaScript', NULL, NULL), + (1288, 'de_DE', 'Exporte - oben', NULL, NULL), + (1289, 'de_DE', 'Exporte - unten einer Kategorie', NULL, NULL), + (1290, 'de_DE', 'Exporte - unten der Spalte 1', NULL, NULL), + (1291, 'de_DE', 'Exporte - JavaScript', NULL, NULL), + (1292, 'de_DE', 'Export - JavaScript', NULL, NULL), + (1293, 'de_DE', 'Marke - Inhalt', NULL, NULL), + (1294, 'de_DE', 'Kunde - Bestellungs-Tabellenkopf', NULL, NULL), + (1295, 'de_DE', 'Kunde - Bestellungs-Tabellenzeile', NULL, NULL), + (1296, 'de_DE', 'Sonderangebote - oben', NULL, NULL), + (1297, 'de_DE', 'Sonderangebote - Tabellenkopf', NULL, NULL), + (1298, 'de_DE', 'Sonderangebote - Tabellenzeile', NULL, NULL), + (1299, 'de_DE', 'Sonderangebote - unten', NULL, NULL), + (1300, 'de_DE', 'Sonderangebot - Erstellungsformular', NULL, NULL), + (1301, 'de_DE', 'Sonderangebot - Löschungsformular', NULL, NULL), + (1302, 'de_DE', 'Sonderangebote - JavaScript', NULL, NULL), + (1303, 'de_DE', 'Produkt - unten einer Produkt-Kombination', NULL, NULL), + (1304, 'de_DE', 'Layout - vor dem Hauptinhaltsbereich', NULL, NULL), + (1305, 'de_DE', 'Admin layout - Nach dem Hauptinhalt', NULL, NULL), + (1306, 'de_DE', 'Kategorie - Tab', NULL, NULL), + (1307, 'de_DE', 'Produkt - Tab', NULL, NULL), + (1308, 'de_DE', 'Ordner - Tab', NULL, NULL), + (1309, 'de_DE', 'Inhalt - Tab', NULL, NULL), + (1310, 'de_DE', 'Marke - Tab', NULL, NULL), + (1311, 'de_DE', 'Bestellungs-Änderung - Lieferadresse', NULL, NULL), + (1312, 'de_DE', 'Produktseite - oben im Formular', NULL, NULL), + (1313, 'de_DE', 'Produktseite - unten an dem Formular', NULL, NULL), + (1314, 'de_DE', 'Brand edit Seite - im Formular', NULL, NULL), + (1315, 'de_DE', 'Sonderangebot Änderungsseite - javascript last call block', NULL, NULL), + (1316, 'de_DE', 'API Seite - oben', NULL, NULL), + (1317, 'de_DE', 'API Seite - unten', NULL, NULL), + (1318, 'de_DE', 'API Seite - Löschungsformular', NULL, NULL), + (1319, 'de_DE', 'Gutschein-Seite - Löschungsformular', NULL, NULL), + (1320, 'de_DE', 'Bestellung - Tab', NULL, NULL), + (1321, 'de_DE', 'Profil - Tabellenkopf', '', ''), + (1322, 'de_DE', 'Profil - Tabellenzeile', '', ''), + (1323, 'de_DE', 'Import - Tabellenkopf', '', ''), + (1324, 'de_DE', 'Import - Tabellenzeile', '', ''), + (1325, 'de_DE', 'Export - Tabellenkopf', '', ''), + (1326, 'de_DE', 'Export - Tabellenzeile', '', ''), + (1327, 'de_DE', 'Kategorie Bearbeitung - oben', '', ''), + (1328, 'de_DE', 'Kategorie Bearbeitung - unten', '', ''), + (1329, 'de_DE', 'Marke Bearbeitung - oben', '', ''), + (1330, 'de_DE', 'Marke Bearbeitung - unten', '', ''), + (1331, 'de_DE', 'Deklination Bearbeitung - oben', '', ''), + (1332, 'de_DE', 'Deklination Bearbeitung - unten', '', ''), + (1333, 'de_DE', 'Währung Bearbeitung - oben', '', ''), + (1334, 'de_DE', 'Währung Bearbeitung - unten', '', ''), + (1335, 'de_DE', 'Währung Bearbeitung - oben', '', ''), + (1336, 'de_DE', 'Währung Bearbeitung - unten', '', ''), + (1337, 'de_DE', 'Inhalt Bearbeitung - oben', '', ''), + (1338, 'de_DE', 'Inhalt Bearbeitung - unten', '', ''), + (1339, 'de_DE', 'Charakteristik Bearbeitung - oben', '', ''), + (1340, 'de_DE', 'Charakteristik Bearbeitung - unten', '', ''), + (1341, 'de_DE', 'Dokument Bearbeitung - oben', '', ''), + (1342, 'de_DE', 'Dokument Bearbeitung - unten', '', ''), + (1343, 'de_DE', 'Kunde Bearbeitung - oben', '', ''), + (1344, 'de_DE', 'Kunde Bearbeitung - unten', '', ''), + (1345, 'de_DE', 'Bild Bearbeitung - oben', '', ''), + (1346, 'de_DE', 'Bild Bearbeitung - unten', '', ''), + (1347, 'de_DE', 'Hook Bearbeitung - oben', '', ''), + (1348, 'de_DE', 'Hook Bearbeitung - unten', '', ''), + (1349, 'de_DE', 'Ordner Bearbeitung - oben', '', ''), + (1350, 'de_DE', 'Ordner Bearbeitung - unten', '', ''), + (1351, 'de_DE', 'Modul-Hook Bearbeitung - oben', '', ''), + (1352, 'de_DE', 'Modul-Hook Bearbeitung - unten', '', ''), + (1353, 'de_DE', 'Modul Bearbeitung - oben', '', ''), + (1354, 'de_DE', 'Modul Bearbeitung - unten', '', ''), + (1355, 'de_DE', 'Nachricht Bearbeitung - oben', '', ''), + (1356, 'de_DE', 'Nachricht Bearbeitung - unten', '', ''), + (1357, 'de_DE', 'Profil Bearbeitung - oben', '', ''), + (1358, 'de_DE', 'Profil Bearbeitung - unten', '', ''), + (1359, 'de_DE', 'Produkt Bearbeitung - oben', '', ''), + (1360, 'de_DE', 'Produkt Bearbeitung - unten', '', ''), + (1361, 'de_DE', 'Bestellung Bearbeitung - oben', '', ''), + (1362, 'de_DE', 'Bestellung Bearbeitung - unten', '', ''), + (1363, 'de_DE', 'Transporteur Lieferzonen Bearbeitung - oben', '', ''), + (1364, 'de_DE', 'Transporteur Lieferzonen Bearbeitung - unten', '', ''), + (1365, 'de_DE', 'Lieferzone Bearbeitung - oben', '', ''), + (1366, 'de_DE', 'Lieferzone Bearbeitung - unten', '', ''), + (1367, 'de_DE', 'Sonderangebot Bearbeitung - oben', '', ''), + (1368, 'de_DE', 'Sonderangebot Bearbeitung - unten', '', ''), + (1369, 'de_DE', 'Variable Bearbeitung - oben', '', ''), + (1370, 'de_DE', 'Variable Bearbeitung - unten', '', ''), + (1371, 'de_DE', 'Template Bearbeitung - oben', '', ''), + (1372, 'de_DE', 'Template Bearbeitung - unten', '', ''), + (1373, 'de_DE', 'Taxregel Bearbeitung - oben', '', ''), + (1374, 'de_DE', 'Taxregel Bearbeitung - unten', '', ''), + (1375, 'de_DE', 'Taxe Bearbeitung - oben', '', ''), + (1376, 'de_DE', 'Taxe Bearbeitung - unten', '', ''), + (1377, 'de_DE', 'Bestellungs Bearbeitung - unter die Produktdaten', '', ''), + (1378, 'de_DE', 'SEO Tab - oben', '', ''), + (1379, 'de_DE', 'SEO Tab - unten', '', ''), + (1380, 'de_DE', 'Bild Tab - oben', '', ''), + (1381, 'de_DE', 'Bild Tab - unten', '', ''), + (1382, 'de_DE', 'Dokument Tab - oben', '', ''), + (1383, 'de_DE', 'Dokument Tab - unten', '', ''), + (1384, 'de_DE', 'Export modal or page - oben', '', ''), + (1385, 'de_DE', 'Export modal or page - unten', '', ''), + (1386, 'de_DE', 'Bestellung - Kunde Informationen unten', '', ''), + (1387, 'de_DE', 'Bestellung - Zahlungsmodul unten', '', ''), + (1388, 'de_DE', 'Bestellung - Liefermodul unten', '', ''), + (1389, 'de_DE', 'Registerkarte SEO - Update-Formular', '', ''), + (1390, 'de_DE', 'Bestellung bearbeiten - Produkttabelle Header', '', ''), + (1391, 'de_DE', 'Bestellung bearbeiten - Produkttabelle Zeile', '', ''), + (1392, 'de_DE', 'Administratoren - Header', '', ''), + (1393, 'de_DE', 'Administratoren - Zeile', '', ''), + (1394, 'de_DE', 'Erweiterte Konfiguration', '', ''), + (1395, 'de_DE', 'Erweiterte Konfiguration - JavaScript', '', ''), + (1396, 'de_DE', 'Marke bearbeiten - Rechte Spalte oben', NULL, NULL), + (1397, 'de_DE', 'Marke bearbeiten - Rechte Spalte unten', NULL, NULL), + (1398, 'de_DE', NULL, NULL, NULL), + (1399, 'de_DE', NULL, NULL, NULL), + (1400, 'de_DE', 'Inhalt bearbeiten - Rechte Spalte oben', NULL, NULL), + (1401, 'de_DE', 'Inhalt bearbeiten - Rechte Spalte unten', NULL, NULL), + (1402, 'de_DE', 'Ordner bearbeiten - Rechte Spalte oben', NULL, NULL), + (1403, 'de_DE', 'Ordner bearbeiten - Rechte Spalte unten', NULL, NULL), + (1404, 'de_DE', NULL, NULL, NULL), + (1405, 'de_DE', NULL, NULL, NULL), + (1406, 'de_DE', NULL, '', ''), + (1407, 'de_DE', NULL, '', ''), + (1408, 'de_DE', NULL, '', ''), + (1409, 'de_DE', NULL, '', ''), + (1410, 'de_DE', NULL, '', ''), + (1411, 'de_DE', NULL, '', ''), + (1412, 'de_DE', NULL, '', ''), + (1413, 'de_DE', NULL, '', ''), + (1414, 'de_DE', NULL, '', ''), + (1415, 'de_DE', NULL, '', ''), + (1000, 'en_US', 'Category - content', NULL, NULL), + (1001, 'en_US', 'Content - content', NULL, NULL), + (1002, 'en_US', 'Folder - content', NULL, NULL), + (1003, 'en_US', 'Order - content', NULL, NULL), + (1004, 'en_US', 'Product - content', NULL, NULL), + (1005, 'en_US', 'Features value - table header', NULL, NULL), + (1006, 'en_US', 'Features value - table row', NULL, NULL), + (1007, 'en_US', 'Feature - Value create form', NULL, NULL), + (1008, 'en_US', 'Feature - Edit JavaScript', NULL, NULL), + (1009, 'en_US', 'Product - Edit JavaScript', NULL, NULL), + (1010, 'en_US', 'Coupon - create JavaScript', NULL, NULL), + (1011, 'en_US', 'Taxes - update form', NULL, NULL), + (1012, 'en_US', 'tax rule - Edit JavaScript', NULL, NULL), + (1013, 'en_US', 'Tools - at the top', NULL, NULL), + (1014, 'en_US', 'Tools - at the top of the column', NULL, NULL), + (1015, 'en_US', 'Tools - at the bottom of column 1', NULL, NULL), + (1016, 'en_US', 'Tools - bottom', NULL, NULL), + (1017, 'en_US', 'Tools - JavaScript', NULL, NULL), + (1018, 'en_US', 'Messages - at the top', NULL, NULL), + (1019, 'en_US', 'Messages - table header', NULL, NULL), + (1020, 'en_US', 'Messages - table row', NULL, NULL), + (1021, 'en_US', 'Messages - bottom', NULL, NULL), + (1022, 'en_US', 'Message - create form', NULL, NULL), + (1023, 'en_US', 'Message - delete form', NULL, NULL), + (1024, 'en_US', 'Messages - JavaScript', NULL, NULL), + (1025, 'en_US', 'Taxes rules - at the top', NULL, NULL), + (1026, 'en_US', 'Taxes rules - bottom', NULL, NULL), + (1027, 'en_US', 'Tax - create form', NULL, NULL), + (1028, 'en_US', 'Tax - delete form', NULL, NULL), + (1029, 'en_US', 'tax rule - create form', NULL, NULL), + (1030, 'en_US', 'tax rule - delete form', NULL, NULL), + (1031, 'en_US', 'Taxes rules - JavaScript', NULL, NULL), + (1032, 'en_US', 'Exports - at the top', NULL, NULL), + (1033, 'en_US', 'Exports - at the bottom of a category', NULL, NULL), + (1034, 'en_US', 'Exports - at the bottom of column 1', NULL, NULL), + (1035, 'en_US', 'Exports - JavaScript', NULL, NULL), + (1036, 'en_US', 'Export - JavaScript', NULL, NULL), + (1037, 'en_US', 'Product - folders table header', NULL, NULL), + (1038, 'en_US', 'Product - folders table row', NULL, NULL), + (1039, 'en_US', 'Product - details pricing form', NULL, NULL), + (1040, 'en_US', 'Product - stock edit form', NULL, NULL), + (1041, 'en_US', 'Product - details promotion form', NULL, NULL), + (1042, 'en_US', 'Product - before combinations', NULL, NULL), + (1043, 'en_US', 'Product - combinations list caption', NULL, NULL), + (1044, 'en_US', 'Product - after combinations', NULL, NULL), + (1045, 'en_US', 'Product - combination delete form', NULL, NULL), + (1046, 'en_US', 'Modules - table header', NULL, NULL), + (1047, 'en_US', 'Modules - table row', NULL, NULL), + (1048, 'en_US', 'Currency - Edit JavaScript', NULL, NULL), + (1049, 'en_US', 'Category - contents table header', NULL, NULL), + (1050, 'en_US', 'Category - contents table row', NULL, NULL), + (1051, 'en_US', 'Category - Edit JavaScript', NULL, NULL), + (1052, 'en_US', 'Document - Edit JavaScript', NULL, NULL), + (1053, 'en_US', 'Customer - at the top', NULL, NULL), + (1054, 'en_US', 'Customers - caption', NULL, NULL), + (1055, 'en_US', 'Customers - header', NULL, NULL), + (1056, 'en_US', 'Customers - row', NULL, NULL), + (1057, 'en_US', 'Customer - bottom', NULL, NULL), + (1058, 'en_US', 'Customer - create form', NULL, NULL), + (1059, 'en_US', 'Customer - delete form', NULL, NULL), + (1060, 'en_US', 'Customers - JavaScript', NULL, NULL), + (1061, 'en_US', 'Product - contents table header', NULL, NULL), + (1062, 'en_US', 'Product - contents table row', NULL, NULL), + (1063, 'en_US', 'Product - accessories table header', NULL, NULL), + (1064, 'en_US', 'Product - accessories table row', NULL, NULL), + (1065, 'en_US', 'Product - categories table header', NULL, NULL), + (1066, 'en_US', 'Product - categories table row', NULL, NULL), + (1067, 'en_US', 'Product - attributes table header', NULL, NULL), + (1068, 'en_US', 'Product - attributes table row', NULL, NULL), + (1069, 'en_US', 'Product - features-table-header', NULL, NULL), + (1070, 'en_US', 'Product - features table row', NULL, NULL), + (1071, 'en_US', 'Template - attributes table header', NULL, NULL), + (1072, 'en_US', 'Template - attributes table row', NULL, NULL), + (1073, 'en_US', 'Template - features-table-header', NULL, NULL), + (1074, 'en_US', 'Template - features table row', NULL, NULL), + (1075, 'en_US', 'Templates - at the top', NULL, NULL), + (1076, 'en_US', 'Templates - table header', NULL, NULL), + (1077, 'en_US', 'Templates - table row', NULL, NULL), + (1078, 'en_US', 'Templates - bottom', NULL, NULL), + (1079, 'en_US', 'Template - create form', NULL, NULL), + (1080, 'en_US', 'Template - delete form', NULL, NULL), + (1081, 'en_US', 'Templates - JavaScript', NULL, NULL), + (1082, 'en_US', 'Configuration - at the top', NULL, NULL), + (1083, 'en_US', 'Configuration - at the top of the catalog area', NULL, NULL), + (1084, 'en_US', 'Configuration - at the bottom of the catalog', NULL, NULL), + (1085, 'en_US', 'Configuration - at the top of the shipping area', NULL, NULL), + (1086, 'en_US', 'Configuration - at the bottom of the shipping area', NULL, NULL), + (1087, 'en_US', 'Configuration - at the top of the system area', NULL, NULL), + (1088, 'en_US', 'Configuration - at the bottom of the system area', NULL, NULL), + (1089, 'en_US', 'Configuration - bottom', NULL, NULL), + (1090, 'en_US', 'Configuration - JavaScript', NULL, NULL), + (1091, 'en_US', 'Dashboard - at the top', NULL, NULL), + (1092, 'en_US', 'Dashboard - middle', NULL, NULL), + (1093, 'en_US', 'Dashboard - bottom', NULL, NULL), + (1094, 'en_US', 'Orders - at the top', NULL, NULL), + (1095, 'en_US', 'Orders - table header', NULL, NULL), + (1096, 'en_US', 'Orders - table row', NULL, NULL), + (1097, 'en_US', 'Orders - bottom', NULL, NULL), + (1098, 'en_US', 'Orders - JavaScript', NULL, NULL), + (1099, 'en_US', 'Delivery zone - at the top', NULL, NULL), + (1100, 'en_US', 'Delivery zone - table header', NULL, NULL), + (1101, 'en_US', 'Delivery zone - table row', NULL, NULL), + (1102, 'en_US', 'Delivery zone - bottom', NULL, NULL), + (1103, 'en_US', 'Delivery zone - JavaScript', NULL, NULL), + (1104, 'en_US', 'Content - Edit JavaScript', NULL, NULL), + (1105, 'en_US', 'Home - at the top', NULL, NULL), + (1106, 'en_US', 'Home - bottom', NULL, NULL), + (1107, 'en_US', 'Home - JavaScript', NULL, NULL), + (1108, 'en_US', 'Modules - at the top', NULL, NULL), + (1109, 'en_US', 'Modules - bottom', NULL, NULL), + (1110, 'en_US', 'Modules - JavaScript', NULL, NULL), + (1111, 'en_US', 'Languages - at the top', NULL, NULL), + (1112, 'en_US', 'Languages - bottom', NULL, NULL), + (1113, 'en_US', 'Language - create form', NULL, NULL), + (1114, 'en_US', 'Languages - delete form', NULL, NULL), + (1115, 'en_US', 'Languages - JavaScript', NULL, NULL), + (1116, 'en_US', 'Zone - delete form', NULL, NULL), + (1117, 'en_US', 'Delivery zone - Edit JavaScript', NULL, NULL), + (1118, 'en_US', 'System - logs JavaScript', NULL, NULL), + (1119, 'en_US', 'Search - at the top', NULL, NULL), + (1120, 'en_US', 'Search - bottom', NULL, NULL), + (1121, 'en_US', 'Search - JavaScript', NULL, NULL), + (1122, 'en_US', 'Administrators - at the top', NULL, NULL), + (1123, 'en_US', 'Administrators - bottom', NULL, NULL), + (1124, 'en_US', 'Administrator - create form', NULL, NULL), + (1125, 'en_US', 'Administrator - update form', NULL, NULL), + (1126, 'en_US', 'Administrator - delete form', NULL, NULL), + (1127, 'en_US', 'Administrators - JavaScript', NULL, NULL), + (1128, 'en_US', 'Module hook - Edit JavaScript', NULL, NULL), + (1129, 'en_US', 'Shipping configuration - at the top', NULL, NULL), + (1130, 'en_US', 'Shipping configuration - table header', NULL, NULL), + (1131, 'en_US', 'Shipping configuration - table row', NULL, NULL), + (1132, 'en_US', 'Shipping configuration - bottom', NULL, NULL), + (1133, 'en_US', 'Shipping configuration - create form', NULL, NULL), + (1134, 'en_US', 'Shipping configuration - delete form', NULL, NULL), + (1135, 'en_US', 'Shipping configuration - JavaScript', NULL, NULL), + (1136, 'en_US', 'Features - at the top', NULL, NULL), + (1137, 'en_US', 'Features - table header', NULL, NULL), + (1138, 'en_US', 'Features - table row', NULL, NULL), + (1139, 'en_US', 'Features - bottom', NULL, NULL), + (1140, 'en_US', 'Feature - create form', NULL, NULL), + (1141, 'en_US', 'Feature - delete form', NULL, NULL), + (1142, 'en_US', 'Feature - add to all form', NULL, NULL), + (1143, 'en_US', 'Feature - remove to all form', NULL, NULL), + (1144, 'en_US', 'Features - JavaScript', NULL, NULL), + (1145, 'en_US', 'Module - Edit JavaScript', NULL, NULL), + (1146, 'en_US', 'Module hook - create form', NULL, NULL), + (1147, 'en_US', 'Module hook - delete form', NULL, NULL), + (1148, 'en_US', 'Module hook - JavaScript', NULL, NULL), + (1149, 'en_US', 'Shipping configuration - Edit', NULL, NULL), + (1150, 'en_US', 'Shipping configuration - country delete form', NULL, NULL), + (1151, 'en_US', 'Shipping configuration - Edit JavaScript', NULL, NULL), + (1152, 'en_US', 'Mailing system - at the top', NULL, NULL), + (1153, 'en_US', 'Mailing system - bottom', NULL, NULL), + (1154, 'en_US', 'Mailing system - JavaScript', NULL, NULL), + (1155, 'en_US', 'Categories - at the top', NULL, NULL), + (1156, 'en_US', 'Categories - caption', NULL, NULL), + (1157, 'en_US', 'Categories - header', NULL, NULL), + (1158, 'en_US', 'Categories - row', NULL, NULL), + (1159, 'en_US', 'Products - caption', NULL, NULL), + (1160, 'en_US', 'Products - header', NULL, NULL), + (1161, 'en_US', 'Products - row', NULL, NULL), + (1162, 'en_US', 'Categories - bottom', NULL, NULL), + (1163, 'en_US', 'Categories - at the bottom of the catalog', NULL, NULL), + (1164, 'en_US', 'Category - create form', NULL, NULL), + (1165, 'en_US', 'Product - create form', NULL, NULL), + (1166, 'en_US', 'Category - delete form', NULL, NULL), + (1167, 'en_US', 'Product - delete form', NULL, NULL), + (1168, 'en_US', 'Categories - JavaScript', NULL, NULL), + (1169, 'en_US', 'Variables - at the top', NULL, NULL), + (1170, 'en_US', 'Variables - table header', NULL, NULL), + (1171, 'en_US', 'Variables - table row', NULL, NULL), + (1172, 'en_US', 'Variables - bottom', NULL, NULL), + (1173, 'en_US', 'Variable - create form', NULL, NULL), + (1174, 'en_US', 'Variable - delete form', NULL, NULL), + (1175, 'en_US', 'Variables - JavaScript', NULL, NULL), + (1176, 'en_US', 'Order - product list', NULL, NULL), + (1177, 'en_US', 'Order - Edit JavaScript', NULL, NULL), + (1178, 'en_US', 'Store Information - JavaScript', NULL, NULL), + (1179, 'en_US', 'Translations - JavaScript', NULL, NULL), + (1180, 'en_US', 'Folder - at the top', NULL, NULL), + (1181, 'en_US', 'Folder - caption', NULL, NULL), + (1182, 'en_US', 'Folder - header', NULL, NULL), + (1183, 'en_US', 'Folder - row', NULL, NULL), + (1184, 'en_US', 'Contents - caption', NULL, NULL), + (1185, 'en_US', 'Contents - header', NULL, NULL), + (1186, 'en_US', 'Contents - row', NULL, NULL), + (1187, 'en_US', 'Folder - bottom', NULL, NULL), + (1188, 'en_US', 'Folder - create form', NULL, NULL), + (1189, 'en_US', 'Content - create form', NULL, NULL), + (1190, 'en_US', 'Folder - delete form', NULL, NULL), + (1191, 'en_US', 'Content - delete form', NULL, NULL), + (1192, 'en_US', 'Folder - JavaScript', NULL, NULL), + (1193, 'en_US', 'Template - Edit JavaScript', NULL, NULL), + (1194, 'en_US', 'Tax - Edit JavaScript', NULL, NULL), + (1195, 'en_US', 'Hook - Edit JavaScript', NULL, NULL), + (1196, 'en_US', 'Countries - at the top', NULL, NULL), + (1197, 'en_US', 'Countries - table header', NULL, NULL), + (1198, 'en_US', 'Countries - table row', NULL, NULL), + (1199, 'en_US', 'Countries - bottom', NULL, NULL), + (1200, 'en_US', 'Country - create form', NULL, NULL), + (1201, 'en_US', 'Country - delete form', NULL, NULL), + (1202, 'en_US', 'Countries - JavaScript', NULL, NULL), + (1203, 'en_US', 'Currencies - at the top', NULL, NULL), + (1204, 'en_US', 'Currencies - table header', NULL, NULL), + (1205, 'en_US', 'Currencies - table row', NULL, NULL), + (1206, 'en_US', 'Currencies - bottom', NULL, NULL), + (1207, 'en_US', 'Currency - create form', NULL, NULL), + (1208, 'en_US', 'Currency - delete form', NULL, NULL), + (1209, 'en_US', 'Currencies - JavaScript', NULL, NULL), + (1210, 'en_US', 'Customer - Edit', NULL, NULL), + (1211, 'en_US', 'Customer - address create form', NULL, NULL), + (1212, 'en_US', 'Customer - address update form', NULL, NULL), + (1213, 'en_US', 'Customer - address delete form', NULL, NULL), + (1214, 'en_US', 'Customer - Edit JavaScript', NULL, NULL), + (1215, 'en_US', 'Attributes value - table header', NULL, NULL), + (1216, 'en_US', 'Attributes value - table row', NULL, NULL), + (1217, 'en_US', 'Attribute value - create form', NULL, NULL), + (1218, 'en_US', 'Attribut - id delete form', NULL, NULL), + (1219, 'en_US', 'Attribut - Edit JavaScript', NULL, NULL), + (1220, 'en_US', 'Profiles - at the top', NULL, NULL), + (1221, 'en_US', 'Profiles - bottom', NULL, NULL), + (1222, 'en_US', 'Profile - create form', NULL, NULL), + (1223, 'en_US', 'Profile - delete form', NULL, NULL), + (1224, 'en_US', 'Profiles - JavaScript', NULL, NULL), + (1225, 'en_US', 'Country - Edit JavaScript', NULL, NULL), + (1226, 'en_US', 'Profile - Edit JavaScript', NULL, NULL), + (1227, 'en_US', 'Variable - Edit JavaScript', NULL, NULL), + (1228, 'en_US', 'Coupon - update JavaScript', NULL, NULL), + (1229, 'en_US', 'Coupon - at the top', NULL, NULL), + (1230, 'en_US', 'Coupon - list caption', NULL, NULL), + (1231, 'en_US', 'Coupon - table header', NULL, NULL), + (1232, 'en_US', 'Coupon - table row', NULL, NULL), + (1233, 'en_US', 'Coupon - bottom', NULL, NULL), + (1234, 'en_US', 'Coupon - list JavaScript', NULL, NULL), + (1235, 'en_US', 'Module - configuration', NULL, NULL), + (1236, 'en_US', 'Module - configuration JavaScript', NULL, NULL), + (1237, 'en_US', 'Message - Edit JavaScript', NULL, NULL), + (1238, 'en_US', 'Image - Edit JavaScript', NULL, NULL), + (1239, 'en_US', 'Attributes - at the top', NULL, NULL), + (1240, 'en_US', 'Attributes - table header', NULL, NULL), + (1241, 'en_US', 'Attributes - table row', NULL, NULL), + (1242, 'en_US', 'Attributes - bottom', NULL, NULL), + (1243, 'en_US', 'Attribut - create form', NULL, NULL), + (1244, 'en_US', 'Attribut - delete form', NULL, NULL), + (1245, 'en_US', 'Attribut - add to all form', NULL, NULL), + (1246, 'en_US', 'Attribut - remove to all form', NULL, NULL), + (1247, 'en_US', 'Attributes - JavaScript', NULL, NULL), + (1248, 'en_US', 'Logs - at the top', NULL, NULL), + (1249, 'en_US', 'Logs - bottom', NULL, NULL), + (1250, 'en_US', 'Logs - JavaScript', NULL, NULL), + (1251, 'en_US', 'Folder - Edit JavaScript', NULL, NULL), + (1252, 'en_US', 'Hooks - at the top', NULL, NULL), + (1253, 'en_US', 'Hooks - table header', NULL, NULL), + (1254, 'en_US', 'Hooks - table row', NULL, NULL), + (1255, 'en_US', 'Hooks - bottom', NULL, NULL), + (1256, 'en_US', 'Hook - create form', NULL, NULL), + (1257, 'en_US', 'Hook - delete form', NULL, NULL), + (1258, 'en_US', 'Hooks - JavaScript', NULL, NULL), + (1259, 'en_US', 'Layout - CSS', NULL, NULL), + (1260, 'en_US', 'Layout - before topbar', NULL, NULL), + (1261, 'en_US', 'Layout - inside top bar', NULL, NULL), + (1262, 'en_US', 'Layout - after top bar', NULL, NULL), + (1263, 'en_US', 'Layout - before top menu', NULL, NULL), + (1264, 'en_US', 'Layout - in top menu items', NULL, NULL), + (1265, 'en_US', 'Layout - after top menu', NULL, NULL), + (1266, 'en_US', 'Layout - before footer', NULL, NULL), + (1267, 'en_US', 'Layout - in footer', NULL, NULL), + (1268, 'en_US', 'Layout - after footer', NULL, NULL), + (1269, 'en_US', 'Layout - JavaScript', NULL, NULL), + (1270, 'en_US', 'Layout - at the top of the top bar', NULL, NULL), + (1271, 'en_US', 'Layout - at the bottom of the top bar', NULL, NULL), + (1272, 'en_US', 'Layout - in the menu customers', NULL, NULL), + (1273, 'en_US', 'Layout - in the menu orders', NULL, NULL), + (1274, 'en_US', 'Layout - in the menu catalog', NULL, NULL), + (1275, 'en_US', 'Layout - in the menu folders', NULL, NULL), + (1276, 'en_US', 'Layout - in the menu tools', NULL, NULL), + (1277, 'en_US', 'Layout - in the menu modules', NULL, NULL), + (1278, 'en_US', 'Layout - in the menu configuration', NULL, NULL), + (1279, 'en_US', 'Brand - Edit JavaScript', NULL, NULL), + (1280, 'en_US', 'Home - block', NULL, NULL), + (1281, 'en_US', 'Brands - at the top', NULL, NULL), + (1282, 'en_US', 'Brands - table header', NULL, NULL), + (1283, 'en_US', 'Brands - table row', NULL, NULL), + (1284, 'en_US', 'Brands - bottom', NULL, NULL), + (1285, 'en_US', 'Brand - create form', NULL, NULL), + (1286, 'en_US', 'Brand - delete form', NULL, NULL), + (1287, 'en_US', 'Brand - JavaScript', NULL, NULL), + (1288, 'en_US', 'Exports - at the top', NULL, NULL), + (1289, 'en_US', 'Exports - at the bottom of a category', NULL, NULL), + (1290, 'en_US', 'Exports - at the bottom of column 1', NULL, NULL), + (1291, 'en_US', 'Exports - JavaScript', NULL, NULL), + (1292, 'en_US', 'Export - JavaScript', NULL, NULL), + (1293, 'en_US', 'Brand - content', NULL, NULL), + (1294, 'en_US', 'Customer - order table header', NULL, NULL), + (1295, 'en_US', 'Customer - order table row', NULL, NULL), + (1296, 'en_US', 'Sales - at the top', NULL, NULL), + (1297, 'en_US', 'Sales - table header', NULL, NULL), + (1298, 'en_US', 'Sales - table row', NULL, NULL), + (1299, 'en_US', 'Sales - at the bottom', NULL, NULL), + (1300, 'en_US', 'Sale - create form', NULL, NULL), + (1301, 'en_US', 'Sale - delete form', NULL, NULL), + (1302, 'en_US', 'Sales - JavaScript', NULL, NULL), + (1303, 'en_US', 'Product - at the bottom of a product combination', NULL, NULL), + (1304, 'en_US', 'Layout - Before the main content', NULL, NULL), + (1305, 'en_US', 'Admin layout - After the main content', NULL, NULL), + (1306, 'en_US', 'Category - Tab', NULL, NULL), + (1307, 'en_US', 'Product - Tab', NULL, NULL), + (1308, 'en_US', 'Folder - Tab', NULL, NULL), + (1309, 'en_US', 'Content - Tab', NULL, NULL), + (1310, 'en_US', 'Brand - Tab', NULL, NULL), + (1311, 'en_US', 'Order edit - delivery address', NULL, NULL), + (1312, 'en_US', 'Product page - On the top of the form', NULL, NULL), + (1313, 'en_US', 'Product page - On the bottom of the form', NULL, NULL), + (1314, 'en_US', 'Brand edit page - in the form', NULL, NULL), + (1315, 'en_US', 'Sale edit page - javascript last call block', NULL, NULL), + (1316, 'en_US', 'Api page - at top', NULL, NULL), + (1317, 'en_US', 'Api page - at bottom', NULL, NULL), + (1318, 'en_US', 'Api page - in deletion form', NULL, NULL), + (1319, 'en_US', 'Coupon page - in deletion form', NULL, NULL), + (1320, 'en_US', 'Order - Tab', NULL, NULL), + (1321, 'en_US', 'Profile - table header', '', ''), + (1322, 'en_US', 'Profile - table row', '', ''), + (1323, 'en_US', 'Import - table header', '', ''), + (1324, 'en_US', 'Import - table row', '', ''), + (1325, 'en_US', 'Export - table header', '', ''), + (1326, 'en_US', 'Export - table row', '', ''), + (1327, 'en_US', 'Category edit - top', '', ''), + (1328, 'en_US', 'Category edit - bottom', '', ''), + (1329, 'en_US', 'Brand edit - top', '', ''), + (1330, 'en_US', 'Brand edit - bottom', '', ''), + (1331, 'en_US', 'Attribute edit - top', '', ''), + (1332, 'en_US', 'Attribute edit - bottom', '', ''), + (1333, 'en_US', 'Currency edit - top', '', ''), + (1334, 'en_US', 'Currency edit - bottom', '', ''), + (1335, 'en_US', 'Country edit - top', '', ''), + (1336, 'en_US', 'Country edit - bottom', '', ''), + (1337, 'en_US', 'Content edit - top', '', ''), + (1338, 'en_US', 'Content edit - bottom', '', ''), + (1339, 'en_US', 'Feature edit - top', '', ''), + (1340, 'en_US', 'Feature edit - bottom', '', ''), + (1341, 'en_US', 'Document edit - top', '', ''), + (1342, 'en_US', 'Document edit - bottom', '', ''), + (1343, 'en_US', 'Client edit - top', '', ''), + (1344, 'en_US', 'Client edit - bottom', '', ''), + (1345, 'en_US', 'Image edit - top', '', ''), + (1346, 'en_US', 'Image edit - bottom', '', ''), + (1347, 'en_US', 'Hook edit - top', '', ''), + (1348, 'en_US', 'Hook edit - bottom', '', ''), + (1349, 'en_US', 'Folder edit - top', '', ''), + (1350, 'en_US', 'Folder edit - bottom', '', ''), + (1351, 'en_US', 'Module hook edit - top', '', ''), + (1352, 'en_US', 'Module hook edit - bottom', '', ''), + (1353, 'en_US', 'Module edit - top', '', ''), + (1354, 'en_US', 'Module edit - bottom', '', ''), + (1355, 'en_US', 'Message edit - top', '', ''), + (1356, 'en_US', 'Message edit - bottom', '', ''), + (1357, 'en_US', 'Profile edit - top', '', ''), + (1358, 'en_US', 'Profile edit - bottom', '', ''), + (1359, 'en_US', 'Product edit - top', '', ''), + (1360, 'en_US', 'Product edit - bottom', '', ''), + (1361, 'en_US', 'Order edit - top', '', ''), + (1362, 'en_US', 'Order edit - bottom', '', ''), + (1363, 'en_US', 'Shipping zones edit - top', '', ''), + (1364, 'en_US', 'Shipping zones edit - bottom', '', ''), + (1365, 'en_US', 'Shipping configuration edit - top', '', ''), + (1366, 'en_US', 'Shipping configuration edit - bottom', '', ''), + (1367, 'en_US', 'Sale edit - top', '', ''), + (1368, 'en_US', 'Sale edit - bottom', '', ''), + (1369, 'en_US', 'Variable edit - top', '', ''), + (1370, 'en_US', 'Variable edit - bottom', '', ''), + (1371, 'en_US', 'Template edit - top', '', ''), + (1372, 'en_US', 'Template edit - bottom', '', ''), + (1373, 'en_US', 'Tax rule edit - top', '', ''), + (1374, 'en_US', 'Tax rule edit - bottom', '', ''), + (1375, 'en_US', 'Tax edit - top', '', ''), + (1376, 'en_US', 'Tax edit - bottom', '', ''), + (1377, 'en_US', 'Order edit - displayed after product information', '', ''), + (1378, 'en_US', 'Tab SEO - top', '', ''), + (1379, 'en_US', 'Tab SEO - bottom', '', ''), + (1380, 'en_US', 'Tab image - top', '', ''), + (1381, 'en_US', 'Tab image - bottom', '', ''), + (1382, 'en_US', 'Tab document - top', '', ''), + (1383, 'en_US', 'Tab document - bottom', '', ''), + (1384, 'en_US', 'Export modal or page - top', '', ''), + (1385, 'en_US', 'Export modal or page - bottom', '', ''), + (1386, 'en_US', 'Order - customer information bottom', '', ''), + (1387, 'en_US', 'Order - payment module bottom', '', ''), + (1388, 'en_US', 'Order - delivery module bottom', '', ''), + (1389, 'en_US', 'Tab SEO - update form', '', ''), + (1390, 'en_US', 'Order edit - order product table header', '', ''), + (1391, 'en_US', 'Order edit - order product table row', '', ''), + (1392, 'en_US', 'Administrators - header', '', ''), + (1393, 'en_US', 'Administrators - row', '', ''), + (1394, 'en_US', 'Advanced Configuration', '', ''), + (1395, 'en_US', 'Advanced Configuration - Javascript', '', ''), + (1396, 'en_US', 'Brand edit - right column top', NULL, NULL), + (1397, 'en_US', 'Brand edit - right column bottom', NULL, NULL), + (1398, 'en_US', 'Category edit - right column top', NULL, NULL), + (1399, 'en_US', 'Category edit - right column bottom', NULL, NULL), + (1400, 'en_US', 'Content edit - right column top', NULL, NULL), + (1401, 'en_US', 'Content edit - right column bottom', NULL, NULL), + (1402, 'en_US', 'Folder edit - right column top', NULL, NULL), + (1403, 'en_US', 'Folder edit - right column bottom', NULL, NULL), + (1404, 'en_US', 'Product edit - right column top', NULL, NULL), + (1405, 'en_US', 'Product edit - right column bottom', NULL, NULL), + (1406, 'en_US', 'state-edit - at the top', '', ''), + (1407, 'en_US', 'state-edit - bottom', '', ''), + (1408, 'en_US', 'state - Edit JavaScript', '', ''), + (1409, 'en_US', 'states - at the top', '', ''), + (1410, 'en_US', 'states - table header', '', ''), + (1411, 'en_US', 'states - table row', '', ''), + (1412, 'en_US', 'states - bottom', '', ''), + (1413, 'en_US', 'state - creation form', '', ''), + (1414, 'en_US', 'state - delete form', '', ''), + (1415, 'en_US', 'states - JavaScript', '', ''), + (1000, 'es_ES', 'Categoría - contenido', NULL, NULL), + (1001, 'es_ES', 'Contenido - contenido', NULL, NULL), + (1002, 'es_ES', 'Carpeta - contenido', NULL, NULL), + (1003, 'es_ES', 'Orden - contenido', NULL, NULL), + (1004, 'es_ES', 'Producto - contenido', NULL, NULL), + (1005, 'es_ES', 'Valor Característica - encabezado de tabla', NULL, NULL), + (1006, 'es_ES', 'Valor Característica - fila de tabla', NULL, NULL), + (1007, 'es_ES', 'Característica - Formulario para crear valor', NULL, NULL), + (1008, 'es_ES', 'Característica - Editar JavaScript', NULL, NULL), + (1009, 'es_ES', 'Producto - Editar JavaScript', NULL, NULL), + (1010, 'es_ES', 'Cupón - crear JavaScript', NULL, NULL), + (1011, 'es_ES', 'Impuestos - formulario de actualización', NULL, NULL), + (1012, 'es_ES', 'regla de impuesto - Editar JavaScript', NULL, NULL), + (1013, 'es_ES', 'Herramientas - en la parte superior', NULL, NULL), + (1014, 'es_ES', 'Herramientas - en la parte superior de la columna', NULL, NULL), + (1015, 'es_ES', 'Herramientas - en la parte inferior de la columna 1', NULL, NULL), + (1016, 'es_ES', 'Herramientas - parte inferior', NULL, NULL), + (1017, 'es_ES', 'Herramientas - JavaScript', NULL, NULL), + (1018, 'es_ES', 'Mensajes - al tope', NULL, NULL), + (1019, 'es_ES', 'Mensajes - encabezado de la tabla', NULL, NULL), + (1020, 'es_ES', 'Mensajes - fila de la tabla', NULL, NULL), + (1021, 'es_ES', 'Mensajes - base', NULL, NULL), + (1022, 'es_ES', 'Mensaje - formulario de creación', NULL, NULL), + (1023, 'es_ES', 'Mensaje - formulario de borrado', NULL, NULL), + (1024, 'es_ES', 'Mensajes - JavaScript', NULL, NULL), + (1025, 'es_ES', 'Reglas de impuestos - en la parte superior', NULL, NULL), + (1026, 'es_ES', 'Reglas de impuestos - parte inferior', NULL, NULL), + (1027, 'es_ES', 'Impuesto - formulario de creación', NULL, NULL), + (1028, 'es_ES', 'Impuesto - formulario de borrado', NULL, NULL), + (1029, 'es_ES', 'regla de impuesto - formulario de creación', NULL, NULL), + (1030, 'es_ES', 'regla de impuesto - formulario de borrado', NULL, NULL), + (1031, 'es_ES', 'Reglas de impuestos - JavaScript', NULL, NULL), + (1032, 'es_ES', 'Exportar - en la parte superior', NULL, NULL), + (1033, 'es_ES', 'Exportar - en la parte inferior de una categoría', NULL, NULL), + (1034, 'es_ES', 'Exportar - en la parte inferior de la columna 1', NULL, NULL), + (1035, 'es_ES', 'Exportar JavaScript', NULL, NULL), + (1036, 'es_ES', 'Exportación - JavaScript', NULL, NULL), + (1037, 'es_ES', 'Producto - encabezado de la tabla de carpetas', NULL, NULL), + (1038, 'es_ES', 'Producto - fila de la tabla de carpetas', NULL, NULL), + (1039, 'es_ES', 'Producto - formato de detalles del precio', NULL, NULL), + (1040, 'es_ES', 'Producto - Editar formulario de stock', NULL, NULL), + (1041, 'es_ES', 'Producto - formulario de detalles de la promoción', NULL, NULL), + (1042, 'es_ES', 'Producto - después de las combinaciones', NULL, NULL), + (1043, 'es_ES', 'Producto - título de la lista de combinaciones', NULL, NULL), + (1044, 'es_ES', 'Producto - después de las combinaciones', NULL, NULL), + (1045, 'es_ES', 'Producto - Formulario para borrar combinaciones', NULL, NULL), + (1046, 'es_ES', 'Módulos - encabezado de la tabla', NULL, NULL), + (1047, 'es_ES', 'Módulos - fila de la tabla', NULL, NULL), + (1048, 'es_ES', 'Divisas - Editar javaScript', NULL, NULL), + (1049, 'es_ES', 'Categoría - encabezado de tabla de contenido', NULL, NULL), + (1050, 'es_ES', 'Categoría - fila de la tabla de contenido', NULL, NULL), + (1051, 'es_ES', 'Categoría - edición JavaScript', NULL, NULL), + (1052, 'es_ES', 'Documento - edición JavaScript', NULL, NULL), + (1053, 'es_ES', 'Cliente - en la cabecera', NULL, NULL), + (1054, 'es_ES', 'Clientes - texto', NULL, NULL), + (1055, 'es_ES', 'Clientes - encabezado', NULL, NULL), + (1056, 'es_ES', 'Clientes - fila', NULL, NULL), + (1057, 'es_ES', 'Cliente - pie', NULL, NULL), + (1058, 'es_ES', 'Cliente - formulario creación', NULL, NULL), + (1059, 'es_ES', 'Cliente - formulario eliminación', NULL, NULL), + (1060, 'es_ES', 'Clientes - JavaScript', NULL, NULL), + (1061, 'es_ES', 'Producto - contenidos del encabezado de tabla', NULL, NULL), + (1062, 'es_ES', 'Producto - contenidos de la fila de la tabla', NULL, NULL), + (1063, 'es_ES', 'Producto - encabezado de la tabla accesoria', NULL, NULL), + (1064, 'es_ES', 'Producto - fila de la tabla de accesorios', NULL, NULL), + (1065, 'es_ES', 'Producto - encabezado de la tabla de categorías', NULL, NULL), + (1066, 'es_ES', 'Producto - fila de la tabla de categorías', NULL, NULL), + (1067, 'es_ES', 'Producto - encabezado de la tabla de atributos', NULL, NULL), + (1068, 'es_ES', 'Producto - fila de la tabla de atributos', NULL, NULL), + (1069, 'es_ES', 'Producto - encabezado de la tabla de características', NULL, NULL), + (1070, 'es_ES', 'Producto - fila de la tabla de características', NULL, NULL), + (1071, 'es_ES', 'Plantilla - cabecera de la tabla de atributos', NULL, NULL), + (1072, 'es_ES', 'Plantilla - fila de la tabla de atributos', NULL, NULL), + (1073, 'es_ES', 'Plantilla - encabezado de tabla de características', NULL, NULL), + (1074, 'es_ES', 'Plantilla - fila de la tabla de características', NULL, NULL), + (1075, 'es_ES', 'Plantillas - en la parte superior', NULL, NULL), + (1076, 'es_ES', 'Plantillas - encabezado de tabla', NULL, NULL), + (1077, 'es_ES', 'Plantillas - fila de la tabla', NULL, NULL), + (1078, 'es_ES', 'Plantillas - parte inferior', NULL, NULL), + (1079, 'es_ES', 'Plantilla - formulario de creación', NULL, NULL), + (1080, 'es_ES', 'Plantilla - formulario de borrado', NULL, NULL), + (1081, 'es_ES', 'Plantillas - JavaScript', NULL, NULL), + (1082, 'es_ES', 'Configuración - en la parte superior', NULL, NULL), + (1083, 'es_ES', 'Configuración - en la parte superior de la zona de catálogo', NULL, NULL), + (1084, 'es_ES', 'Configuración - en la parte inferior del catálogo', NULL, NULL), + (1085, 'es_ES', 'Configuración - en la parte superior del área de envío', NULL, NULL), + (1086, 'es_ES', 'Configuración - en la parte inferior de la zona de envío', NULL, NULL), + (1087, 'es_ES', 'Configuración - en la parte superior del área del sistema', NULL, NULL), + (1088, 'es_ES', 'Configuración - en la parte inferior de la zona del sistema', NULL, NULL), + (1089, 'es_ES', 'Configuración - parte inferior', NULL, NULL), + (1090, 'es_ES', 'Configuración - JavaScript', NULL, NULL), + (1091, 'es_ES', 'Dashboard - en la parte superior', NULL, NULL), + (1092, 'es_ES', 'Dashboard - medio', NULL, NULL), + (1093, 'es_ES', 'Dashboard - fondo', NULL, NULL), + (1094, 'es_ES', 'Pedidos - encabezado', NULL, NULL), + (1095, 'es_ES', 'Pedidos - encabezado de tabla', NULL, NULL), + (1096, 'es_ES', 'Pedidos - fila de tabla', NULL, NULL), + (1097, 'es_ES', 'Pedidos - pie de página', NULL, NULL), + (1098, 'es_ES', 'Pedidos - JavaScript', NULL, NULL), + (1099, 'es_ES', 'Zona de entrega - En la cabecera', NULL, NULL), + (1100, 'es_ES', 'Zona de entrega - en el encabezado de tabla', NULL, NULL), + (1101, 'es_ES', 'Zona de entrega - en la fila de la tabla', NULL, NULL), + (1102, 'es_ES', 'Zona de entrega - en el pie', NULL, NULL), + (1103, 'es_ES', 'Zona de entrega - JavaScript', NULL, NULL), + (1104, 'es_ES', 'Contenido - Editar JavaScript', NULL, NULL), + (1105, 'es_ES', 'Inicio - en la parte superior', NULL, NULL), + (1106, 'es_ES', 'Inicio - fondo', NULL, NULL), + (1107, 'es_ES', 'Inicio - JavaScript', NULL, NULL), + (1108, 'es_ES', 'Módulos - al inicio', NULL, NULL), + (1109, 'es_ES', 'Módulos - base', NULL, NULL), + (1110, 'es_ES', 'Módulos - JavaScript', NULL, NULL), + (1111, 'es_ES', 'Idiomas - en la parte superior', NULL, NULL), + (1112, 'es_ES', 'Idiomas - parte inferior', NULL, NULL), + (1113, 'es_ES', 'Idioma - formulario de creación', NULL, NULL), + (1114, 'es_ES', 'Idiomas - Formulario de borrar', NULL, NULL), + (1115, 'es_ES', 'Idiomas - JavaScript', NULL, NULL), + (1116, 'es_ES', 'Zona - formulario de borrado', NULL, NULL), + (1117, 'es_ES', 'Zona de entrega - Editar JavasCript', NULL, NULL), + (1118, 'es_ES', 'Sistema - registros de JavaScript', NULL, NULL), + (1119, 'es_ES', 'Búsqueda - al inicio', NULL, NULL), + (1120, 'es_ES', 'Búsqueda - base', NULL, NULL), + (1121, 'es_ES', 'Búsqueda - JavaScript', NULL, NULL), + (1122, 'es_ES', 'Administradores - en la parte superior', NULL, NULL), + (1123, 'es_ES', 'Administradores - inferior', NULL, NULL), + (1124, 'es_ES', 'Administrador - formulario de creación', NULL, NULL), + (1125, 'es_ES', 'Administrador - formulario de actualización', NULL, NULL), + (1126, 'es_ES', 'Administrador - formulario de eliminación', NULL, NULL), + (1127, 'es_ES', 'Administradores - JavaScript', NULL, NULL), + (1128, 'es_ES', NULL, NULL, NULL), + (1129, 'es_ES', 'Configuración de envío - al inicio', NULL, NULL), + (1130, 'es_ES', 'Configuración de envío - encabezado de tabla', NULL, NULL), + (1131, 'es_ES', 'Configuración de envío - fila de tabla', NULL, NULL), + (1132, 'es_ES', 'Configuración de envío - base', NULL, NULL), + (1133, 'es_ES', 'Configuración de envío - formulario de creación', NULL, NULL), + (1134, 'es_ES', 'Configuración de envío - formulario de borrado', NULL, NULL), + (1135, 'es_ES', 'Configuración de envío - JavaScript', NULL, NULL), + (1136, 'es_ES', 'Característica - ir arriba', NULL, NULL), + (1137, 'es_ES', 'Característica - Encabezado de tabla', NULL, NULL), + (1138, 'es_ES', 'Característica - Fila de tabla', NULL, NULL), + (1139, 'es_ES', 'Característica - inferior', NULL, NULL), + (1140, 'es_ES', 'Característica - formulario crear', NULL, NULL), + (1141, 'es_ES', 'Característica - formulario borrar', NULL, NULL), + (1142, 'es_ES', 'Característica - Agregar a todos los formularios', NULL, NULL), + (1143, 'es_ES', 'Característica - eliminar todos los formularios', NULL, NULL), + (1144, 'es_ES', 'Característica - JavaScript', NULL, NULL), + (1145, 'es_ES', 'Módulo - Editar JavaScript', NULL, NULL), + (1146, 'es_ES', NULL, NULL, NULL), + (1147, 'es_ES', NULL, NULL, NULL), + (1148, 'es_ES', NULL, NULL, NULL), + (1149, 'es_ES', 'Configuración de envío - Editar', NULL, NULL), + (1150, 'es_ES', 'Configuración de envío - formulario de borrado de país', NULL, NULL), + (1151, 'es_ES', 'Configuración de envío - Editar JavaScript', NULL, NULL), + (1152, 'es_ES', 'Sistema de correo - en la parte superior', NULL, NULL), + (1153, 'es_ES', 'Sistema de correo - fondo', NULL, NULL), + (1154, 'es_ES', 'Sistema de correo - JavaScript', NULL, NULL), + (1155, 'es_ES', 'Categorías - en la parte superior', NULL, NULL), + (1156, 'es_ES', 'Categorías - título', NULL, NULL), + (1157, 'es_ES', 'Categorías - header', NULL, NULL), + (1158, 'es_ES', 'Categorías - fila', NULL, NULL), + (1159, 'es_ES', 'Productos - leyenda', NULL, NULL), + (1160, 'es_ES', 'Productos - encabezado', NULL, NULL), + (1161, 'es_ES', 'Productos - fila', NULL, NULL), + (1162, 'es_ES', 'Categorías - inferior', NULL, NULL), + (1163, 'es_ES', 'Categorías - en la parte inferior del catálogo', NULL, NULL), + (1164, 'es_ES', 'Formulario de creación de la categoría-', NULL, NULL), + (1165, 'es_ES', 'Producto - formulario de creación', NULL, NULL), + (1166, 'es_ES', 'Categoría - formulario de eliminación', NULL, NULL), + (1167, 'es_ES', 'Producto - formulario de borrado', NULL, NULL), + (1168, 'es_ES', 'Categorías - JavaScript', NULL, NULL), + (1169, 'es_ES', 'Variables - en la parte superior', NULL, NULL), + (1170, 'es_ES', 'Variables - encabezado de tabla', NULL, NULL), + (1171, 'es_ES', 'Variables - fila de la tabla', NULL, NULL), + (1172, 'es_ES', 'Variables - parte inferior', NULL, NULL), + (1173, 'es_ES', 'Variable - formulario de creación', NULL, NULL), + (1174, 'es_ES', 'Variable - formulario de borrado', NULL, NULL), + (1175, 'es_ES', 'Variables - JavaScript', NULL, NULL), + (1176, 'es_ES', 'Orden - lista de productos', NULL, NULL), + (1177, 'es_ES', 'Orden - editar JavaScript', NULL, NULL), + (1178, 'es_ES', 'Información de tienda - JavaScript', NULL, NULL), + (1179, 'es_ES', 'Traducciones - JavaScript', NULL, NULL), + (1180, 'es_ES', 'Carpeta - ir arriba', NULL, NULL), + (1181, 'es_ES', 'Carpeta - título', NULL, NULL), + (1182, 'es_ES', 'Carpeta - encabezado', NULL, NULL), + (1183, 'es_ES', 'Carpeta - fila', NULL, NULL), + (1184, 'es_ES', 'Contenido - leyenda', NULL, NULL), + (1185, 'es_ES', 'Contenido - encabezado', NULL, NULL), + (1186, 'es_ES', 'Contenido - fila', NULL, NULL), + (1187, 'es_ES', 'Carpeta - abajo', NULL, NULL), + (1188, 'es_ES', NULL, NULL, NULL), + (1189, 'es_ES', 'Contenido - formulario de creación', NULL, NULL), + (1190, 'es_ES', NULL, NULL, NULL), + (1191, 'es_ES', 'Contenido - Formulario para eliminar', NULL, NULL), + (1192, 'es_ES', 'Carpeta - JavaScript', NULL, NULL), + (1193, 'es_ES', 'Plantilla - editar JavaScript', NULL, NULL), + (1194, 'es_ES', 'Editar JavaScript', NULL, NULL), + (1195, 'es_ES', 'Hook - editar JavaScript', NULL, NULL), + (1196, 'es_ES', 'Países - en la parte superior', NULL, NULL), + (1197, 'es_ES', 'Países - encabezado de la tabla', NULL, NULL), + (1198, 'es_ES', 'Países - fila de la tabla', NULL, NULL), + (1199, 'es_ES', 'Países - parte inferior', NULL, NULL), + (1200, 'es_ES', 'País - formulario de creación', NULL, NULL), + (1201, 'es_ES', 'País - formulario para eliminar', NULL, NULL), + (1202, 'es_ES', 'Países - JavaScript', NULL, NULL), + (1203, 'es_ES', 'Divisas - en la parte superior', NULL, NULL), + (1204, 'es_ES', 'Divisas - encabezado de tabla', NULL, NULL), + (1205, 'es_ES', 'Divisas - fila de tabla', NULL, NULL), + (1206, 'es_ES', 'Divisas - inferior', NULL, NULL), + (1207, 'es_ES', 'Divisas - formulario de creación', NULL, NULL), + (1208, 'es_ES', 'Moneda - Formulario de eliminación', NULL, NULL), + (1209, 'es_ES', 'Divisas - JavaScript', NULL, NULL), + (1210, 'es_ES', 'Cliente - Editar', NULL, NULL), + (1211, 'es_ES', 'Cliente - formulario crear dirección', NULL, NULL), + (1212, 'es_ES', 'Cliente - formulario de actualización de dirección', NULL, NULL), + (1213, 'es_ES', 'Cliente - Formulario borrar dirección', NULL, NULL), + (1214, 'es_ES', 'Cliente - Editar JavaScript', NULL, NULL), + (1215, 'es_ES', 'Valor de atributos - encabezado de tabla', NULL, NULL), + (1216, 'es_ES', 'Valor de atributos - fila de la tabla', NULL, NULL), + (1217, 'es_ES', 'Valor de atributo - formulario de creación', NULL, NULL), + (1218, 'es_ES', 'Atributo - Formulario de eliminación de id', NULL, NULL), + (1219, 'es_ES', 'Atributo - editar JavaScript', NULL, NULL), + (1220, 'es_ES', 'Perfiles - en la parte superior', NULL, NULL), + (1221, 'es_ES', 'Perfiles - parte inferior', NULL, NULL), + (1222, 'es_ES', 'Perfil - formulario de alta', NULL, NULL), + (1223, 'es_ES', 'Perfil - formulario de borrado', NULL, NULL), + (1224, 'es_ES', 'Perfiles - JavaScript', NULL, NULL), + (1225, 'es_ES', 'País - editar JavaScript', NULL, NULL), + (1226, 'es_ES', 'Perfil - editar JavaScript', NULL, NULL), + (1227, 'es_ES', 'Variable - Editar JavaScript', NULL, NULL), + (1228, 'es_ES', 'Cupón - actualizar JavaScript', NULL, NULL), + (1229, 'es_ES', 'Cupón - en la parte superior', NULL, NULL), + (1230, 'es_ES', 'Cupón - titulo de la lista', NULL, NULL), + (1231, 'es_ES', 'Cupón - encabezado de tabla', NULL, NULL), + (1232, 'es_ES', 'Cupón - fila de la tabla', NULL, NULL), + (1233, 'es_ES', 'Cupón - parte inferior', NULL, NULL), + (1234, 'es_ES', 'Cupón - enlistar JavaScript', NULL, NULL), + (1235, 'es_ES', 'Módulo - configuración', NULL, NULL), + (1236, 'es_ES', 'Módulo - configuración de JavaScript', NULL, NULL), + (1237, 'es_ES', 'Mensaje - Editar JavaScript', NULL, NULL), + (1238, 'es_ES', 'Imagen - Editar JavaScript', NULL, NULL), + (1239, 'es_ES', 'Atributos - en la parte superior', NULL, NULL), + (1240, 'es_ES', 'Atributos - encabezado de tabla', NULL, NULL), + (1241, 'es_ES', 'Atributos - fila de la tabla', NULL, NULL), + (1242, 'es_ES', 'Atributos - inferior', NULL, NULL), + (1243, 'es_ES', 'Atributo - formulario de creación', NULL, NULL), + (1244, 'es_ES', 'Atributo - formulario de eliminación', NULL, NULL), + (1245, 'es_ES', 'Atributo - agregar a todos los formularios', NULL, NULL), + (1246, 'es_ES', 'Atributo - quitar a todos', NULL, NULL), + (1247, 'es_ES', 'Atributos - JavaScript', NULL, NULL), + (1248, 'es_ES', 'Registros - en la parte superior', NULL, NULL), + (1249, 'es_ES', 'Registros - inferior', NULL, NULL), + (1250, 'es_ES', 'Registros - JavaScript', NULL, NULL), + (1251, 'es_ES', 'Carpeta - Editar JavaScript', NULL, NULL), + (1252, 'es_ES', 'Hooks - en la parte superior', NULL, NULL), + (1253, 'es_ES', 'Hooks - encabezado de tabla', NULL, NULL), + (1254, 'es_ES', 'Hooks - fila de la tabla', NULL, NULL), + (1255, 'es_ES', 'Hooks - inferior', NULL, NULL), + (1256, 'es_ES', NULL, NULL, NULL), + (1257, 'es_ES', NULL, NULL, NULL), + (1258, 'es_ES', 'Hooks - JavaScript', NULL, NULL), + (1259, 'es_ES', 'Diseño - CSS', NULL, NULL), + (1260, 'es_ES', 'Diseño - antes de la barra superior', NULL, NULL), + (1261, 'es_ES', 'Diseño - en la barra superior', NULL, NULL), + (1262, 'es_ES', 'Diseño - después de la barra superior', NULL, NULL), + (1263, 'es_ES', 'Diseño - antes del menú principal', NULL, NULL), + (1264, 'es_ES', 'Diseño - en la parte superior del menú artículos', NULL, NULL), + (1265, 'es_ES', 'Diseño - después del menú principal', NULL, NULL), + (1266, 'es_ES', 'Diseño - antes del pie de página', NULL, NULL), + (1267, 'es_ES', 'Diseño - en el pie de página', NULL, NULL), + (1268, 'es_ES', 'Diseño - después de pie de página', NULL, NULL), + (1269, 'es_ES', 'Diseño - JavaScript', NULL, NULL), + (1270, 'es_ES', 'Diseño - en la parte superior de la barra superior', NULL, NULL), + (1271, 'es_ES', 'Diseño - en la parte inferior de la barra superior', NULL, NULL), + (1272, 'es_ES', 'Diseño - en el menú de cliente', NULL, NULL), + (1273, 'es_ES', 'Diseño - en el menú de pedidos', NULL, NULL), + (1274, 'es_ES', 'Diseño - en el menú de catálogo', NULL, NULL), + (1275, 'es_ES', 'Diseño - en el menú de carpetas', NULL, NULL), + (1276, 'es_ES', 'Diseño - en el menú de herramientas', NULL, NULL), + (1277, 'es_ES', 'Diseño - en el menú de módulos', NULL, NULL), + (1278, 'es_ES', 'Diseño - en el menú de configuración', NULL, NULL), + (1279, 'es_ES', 'Marca - editar JavaScript', NULL, NULL), + (1280, 'es_ES', 'Inicio - bloque', NULL, NULL), + (1281, 'es_ES', 'Marcas - en parte superior', NULL, NULL), + (1282, 'es_ES', 'Marcas - encabezado de tabla', NULL, NULL), + (1283, 'es_ES', 'Marcas - file de la tabla', NULL, NULL), + (1284, 'es_ES', 'Marcas - inferior', NULL, NULL), + (1285, 'es_ES', 'Marca - formulario de creación', NULL, NULL), + (1286, 'es_ES', 'Marca - formulario de eliminación', NULL, NULL), + (1287, 'es_ES', 'Marca - JavaScript', NULL, NULL), + (1288, 'es_ES', 'Exportar - en la parte superior', NULL, NULL), + (1289, 'es_ES', 'Exportar - en la parte inferior de una categoría', NULL, NULL), + (1290, 'es_ES', 'Exportar - en la parte inferior de la columna 1', NULL, NULL), + (1291, 'es_ES', 'Exportar JavaScript', NULL, NULL), + (1292, 'es_ES', 'Exportación - JavaScript', NULL, NULL), + (1293, 'es_ES', 'Marca - contenido', NULL, NULL), + (1294, 'es_ES', 'Cliente - cabecera tabla de pedidos', NULL, NULL), + (1295, 'es_ES', 'Cliente - celda tabla pedidos', NULL, NULL), + (1296, 'es_ES', 'Ventas - en la parte superior', NULL, NULL), + (1297, 'es_ES', 'Ventas - encabezado de tabla', NULL, NULL), + (1298, 'es_ES', 'Ventas - fila de la tabla', NULL, NULL), + (1299, 'es_ES', 'Ventas - en la parte inferior', NULL, NULL), + (1300, 'es_ES', 'Venta - formulario de creación', NULL, NULL), + (1301, 'es_ES', 'Venta - formulario de borrado', NULL, NULL), + (1302, 'es_ES', 'Ventas - JavaScript', NULL, NULL), + (1303, 'es_ES', 'Producto - al pie de la combinación de un producto', NULL, NULL), + (1304, 'es_ES', 'Diseño - antes el contenido principal', NULL, NULL), + (1305, 'es_ES', 'Diseño de administración - Después del contenido principal', NULL, NULL), + (1306, 'es_ES', 'Categoría - Tab', NULL, NULL), + (1307, 'es_ES', 'Producto - Pestaña', NULL, NULL), + (1308, 'es_ES', 'Carpeta - Pestaña', NULL, NULL), + (1309, 'es_ES', 'Contenido - Pestaña', NULL, NULL), + (1310, 'es_ES', 'Marca - Tab', NULL, NULL), + (1311, 'es_ES', 'Editar Orden - dirección de envío', NULL, NULL), + (1312, 'es_ES', 'Página de producto - en la parte superior del formulario', NULL, NULL), + (1313, 'es_ES', 'Página del producto - en la parte inferior del formulario', NULL, NULL), + (1314, 'es_ES', 'Página de edición de marca - en formulario', NULL, NULL), + (1315, 'es_ES', 'Página de edición de Venta - última bloque de llamada JavaScript', NULL, NULL), + (1316, 'es_ES', 'Página de la API - en la parte superior', NULL, NULL), + (1317, 'es_ES', 'Página de la API - en la parte inferior', NULL, NULL), + (1318, 'es_ES', 'Página de Api - en formulario de eliminación', NULL, NULL), + (1319, 'es_ES', 'Página de cupón - en formulario de eliminación', NULL, NULL), + (1320, 'es_ES', 'Orden - Pestaña', NULL, NULL), + (1321, 'es_ES', 'Perfil - encabezado de tabla', '', ''), + (1322, 'es_ES', 'Perfil - fila de la tabla', '', ''), + (1323, 'es_ES', 'Importar - encabezado de tabla', '', ''), + (1324, 'es_ES', 'Importar - fila de la tabla', '', ''), + (1325, 'es_ES', 'Exportación - encabezado de tabla', '', ''), + (1326, 'es_ES', 'Exportación - fila de la tabla', '', ''), + (1327, 'es_ES', 'Categoría edición - superior', '', ''), + (1328, 'es_ES', 'Editar categoría - inferior', '', ''), + (1329, 'es_ES', 'Editar marca - superior', '', ''), + (1330, 'es_ES', 'Editar marca - inferior', '', ''), + (1331, 'es_ES', 'Editar atributo - superior', '', ''), + (1332, 'es_ES', 'Edición de atributos - inferior', '', ''), + (1333, 'es_ES', 'Editar Monedas - Cabecera', '', ''), + (1334, 'es_ES', 'Editar Monedas - Pie', '', ''), + (1335, 'es_ES', 'Edición de país - parte superior', '', ''), + (1336, 'es_ES', 'Edición de pais - parte inferior', '', ''), + (1337, 'es_ES', 'Editar contenido - superior', '', ''), + (1338, 'es_ES', 'Editar Contenido - inferior', '', ''), + (1339, 'es_ES', 'Editar Característica - superior', '', ''), + (1340, 'es_ES', 'Editar Característica - inferior', '', ''), + (1341, 'es_ES', 'Edición de documentos - cabecera', '', ''), + (1342, 'es_ES', 'Edición de documentos - pie', '', ''), + (1343, 'es_ES', 'Editar cliente - superior', '', ''), + (1344, 'es_ES', 'Editar cliente - parte inferior', '', ''), + (1345, 'es_ES', 'Edición de imagen - parte superior', '', ''), + (1346, 'es_ES', 'Edición de imagen - parte inferior', '', ''), + (1347, 'es_ES', 'Edición de Hook - superior', '', ''), + (1348, 'es_ES', 'Edición de Hook - inferior', '', ''), + (1349, 'es_ES', 'Edición de carpeta - superior', '', ''), + (1350, 'es_ES', 'Editar carpeta - parte inferior', '', ''), + (1351, 'es_ES', NULL, '', ''), + (1352, 'es_ES', NULL, '', ''), + (1353, 'es_ES', 'Edición de módulo - tope', '', ''), + (1354, 'es_ES', 'Edición de módulo - base', '', ''), + (1355, 'es_ES', 'Editar mensaje - tope', '', ''), + (1356, 'es_ES', 'Editar mensaje - base', '', ''), + (1357, 'es_ES', 'Editar Perfil - parte superior', '', ''), + (1358, 'es_ES', 'Editar Perfil - parte inferior', '', ''), + (1359, 'es_ES', 'Editar producto - parte superior', '', ''), + (1360, 'es_ES', 'Editar producto - parte inferior', '', ''), + (1361, 'es_ES', 'Edición de Pedido - al tope', '', ''), + (1362, 'es_ES', 'Editar Orden - parte inferior', '', ''), + (1363, 'es_ES', 'Edición zonas de envío - inicio', '', ''), + (1364, 'es_ES', 'Edición zonas de envío - base', '', ''), + (1365, 'es_ES', 'Configuración de envío - inicio', '', ''), + (1366, 'es_ES', 'Configuración de envío - base', '', ''), + (1367, 'es_ES', 'Editar Venta - parte superior', '', ''), + (1368, 'es_ES', 'Editar Venta - parte inferior', '', ''), + (1369, 'es_ES', 'Editar variable - parte superior', '', ''), + (1370, 'es_ES', 'Editar variable - parte inferior', '', ''), + (1371, 'es_ES', 'Editar plantilla - parte superior', '', ''), + (1372, 'es_ES', 'Editar plantilla - parte inferior', '', ''), + (1373, 'es_ES', 'Edición de regla de impuesto - parte superior', '', ''), + (1374, 'es_ES', 'Editar regla de Impuesto - base', '', ''), + (1375, 'es_ES', 'Editar Impuesto - parte superior', '', ''), + (1376, 'es_ES', 'Editar Impuesto - base', '', ''), + (1377, 'es_ES', 'Edición de Pedido - se muestra después de la información de producto', '', ''), + (1378, 'es_ES', 'Ficha SEO - arriba', '', ''), + (1379, 'es_ES', 'Ficha SEO - abajo', '', ''), + (1380, 'es_ES', 'Pestaña de imagen - arriba', '', ''), + (1381, 'es_ES', 'Pestaña de imagen - abajo', '', ''), + (1382, 'es_ES', 'Ficha de documento - arriba', '', ''), + (1383, 'es_ES', 'Ficha de documento - abajo', '', ''), + (1384, 'es_ES', 'Modal o página de exportación - superior', '', ''), + (1385, 'es_ES', 'Modal o página de exportación - inferior', '', ''), + (1386, 'es_ES', 'Orden - parte inferior de información del cliente', '', ''), + (1387, 'es_ES', 'Orden - parte inferior del módulo de pago', '', ''), + (1388, 'es_ES', 'Orden - parte inferior del módulo de entrega', '', ''), + (1389, 'es_ES', 'Ficha SEO - formato de actualización', '', ''), + (1390, 'es_ES', 'Edición de Pedido - encabezado de la tabla de pedido de producto', '', ''), + (1391, 'es_ES', 'Edición de Pedido - fila de la tabla del pedido de producto', '', ''), + (1392, 'es_ES', 'Administradores - cabecera', '', ''), + (1393, 'es_ES', 'Administradores - fila', '', ''), + (1394, 'es_ES', 'Configuración avanzada', '', ''), + (1395, 'es_ES', 'Configuración avanzada - JavaScript', '', ''), + (1396, 'es_ES', 'Edición de marca - encabezado de la columna derecha', NULL, NULL), + (1397, 'es_ES', 'Edición de marca - al pie de la columna derecha', NULL, NULL), + (1398, 'es_ES', 'Edición de categoría - al tope de la columna derecha', NULL, NULL), + (1399, 'es_ES', 'Edición de categoría - al pie de la columna derecha', NULL, NULL), + (1400, 'es_ES', 'Edición de Contenido - al tope de la columna derecha', NULL, NULL), + (1401, 'es_ES', 'Edición de Contenido - al pie de la columna derecha', NULL, NULL), + (1402, 'es_ES', 'Edición de carpeta - al tope de la columna derecha', NULL, NULL), + (1403, 'es_ES', 'Edición de carpeta - al pie de la columna derecha', NULL, NULL), + (1404, 'es_ES', 'Edición de producto - encabezado de la columna derecha', NULL, NULL), + (1405, 'es_ES', 'Edición de producto - al pie de la columna derecha', NULL, NULL), + (1406, 'es_ES', 'estado - editar - encabezado', '', ''), + (1407, 'es_ES', 'estado - al pie', '', ''), + (1408, 'es_ES', 'estado - Editar JavaScript', '', ''), + (1409, 'es_ES', 'estados - encabezado', '', ''), + (1410, 'es_ES', 'estados - encabezado de tabla', '', ''), + (1411, 'es_ES', 'estados - fila de tabla', '', ''), + (1412, 'es_ES', 'estados - al pie', '', ''), + (1413, 'es_ES', 'estado - formulario de creación', '', ''), + (1414, 'es_ES', 'estado - formulario de borrado', '', ''), + (1415, 'es_ES', 'estados - JavaScript', '', ''), + (1000, 'fr_FR', 'Catégorie - contenu', NULL, NULL), + (1001, 'fr_FR', 'Contenu - contenu', NULL, NULL), + (1002, 'fr_FR', 'Dossier - contenu', NULL, NULL), + (1003, 'fr_FR', 'Commande - contenu', NULL, NULL), + (1004, 'fr_FR', 'Produit - contenu', NULL, NULL), + (1005, 'fr_FR', 'Valeur de caractéristiques - colonne tableau', NULL, NULL), + (1006, 'fr_FR', 'Valeur de caractéristiques - ligne tableau', NULL, NULL), + (1007, 'fr_FR', 'Caractéristique - Formulaire de création de valeur', NULL, NULL), + (1008, 'fr_FR', 'Caractéristique - JavaScript modification', NULL, NULL), + (1009, 'fr_FR', 'Produit - Modification de JavaScript', NULL, NULL), + (1010, 'fr_FR', 'Code promo - JavaScript création', NULL, NULL), + (1011, 'fr_FR', 'Taxes - formulaire de modification', NULL, NULL), + (1012, 'fr_FR', 'Règle de taxe - Modification de JavaScript', NULL, NULL), + (1013, 'fr_FR', 'Outils - en haut', NULL, NULL), + (1014, 'fr_FR', 'Outils - en haut de la colonne', NULL, NULL), + (1015, 'fr_FR', 'Outils - en bas de la colonne 1', NULL, NULL), + (1016, 'fr_FR', 'Outils - en bas', NULL, NULL), + (1017, 'fr_FR', 'Outils - JavaScript', NULL, NULL), + (1018, 'fr_FR', 'Messages - en haut', NULL, NULL), + (1019, 'fr_FR', 'Messages - colonne tableau', NULL, NULL), + (1020, 'fr_FR', 'Messages - ligne tableau', NULL, NULL), + (1021, 'fr_FR', 'Messages - bas', NULL, NULL), + (1022, 'fr_FR', 'Message - formulaire de création', NULL, NULL), + (1023, 'fr_FR', 'Message - formulaire de suppression', NULL, NULL), + (1024, 'fr_FR', 'Messages - JavaScript', NULL, NULL), + (1025, 'fr_FR', 'Règles de taxes - en haut', NULL, NULL), + (1026, 'fr_FR', 'Règles de taxes - en bas', NULL, NULL), + (1027, 'fr_FR', 'Taxe - formulaire de création', NULL, NULL), + (1028, 'fr_FR', 'Taxe - formulaire de suppression', NULL, NULL), + (1029, 'fr_FR', 'Règle de taxe - formulaire de création', NULL, NULL), + (1030, 'fr_FR', 'Règle de taxe - formulaire de suppression', NULL, NULL), + (1031, 'fr_FR', 'Règles de taxes - JavaScript', NULL, NULL), + (1032, 'fr_FR', 'Exports - en haut', NULL, NULL), + (1033, 'fr_FR', 'Exports - en bas d\'une catégorie', NULL, NULL), + (1034, 'fr_FR', 'Exports - en bas de la colonne 1', NULL, NULL), + (1035, 'fr_FR', 'Exports - JavaScript', NULL, NULL), + (1036, 'fr_FR', 'Export - JavaScript', NULL, NULL), + (1037, 'fr_FR', 'Produit - colonne tableau dossiers', NULL, NULL), + (1038, 'fr_FR', 'Produit - ligne tableau dossiers', NULL, NULL), + (1039, 'fr_FR', 'Produit - Formulaire détail des prix', NULL, NULL), + (1040, 'fr_FR', 'Produit - formulaire de modification du stock', NULL, NULL), + (1041, 'fr_FR', 'Produit - Formulaire détail des promotions', NULL, NULL), + (1042, 'fr_FR', 'Produit - avant les déclinaisons', NULL, NULL), + (1043, 'fr_FR', 'Produit - légende liste des déclinaisons', NULL, NULL), + (1044, 'fr_FR', 'Produit - après les déclinaisons', NULL, NULL), + (1045, 'fr_FR', 'Produit - formulaire de suppression de combinaison', NULL, NULL), + (1046, 'fr_FR', 'Modules - colonne tableau', NULL, NULL), + (1047, 'fr_FR', 'Modules - ligne tableau', NULL, NULL), + (1048, 'fr_FR', 'Devise - JavaScript modification', NULL, NULL), + (1049, 'fr_FR', 'Catégorie - colonne tableau contenus', NULL, NULL), + (1050, 'fr_FR', 'Catégorie - ligne tableau contenus', NULL, NULL), + (1051, 'fr_FR', 'Catégorie - JavaScript modification', NULL, NULL), + (1052, 'fr_FR', 'Document - JavaScript modification', NULL, NULL), + (1053, 'fr_FR', 'Client - en haut', NULL, NULL), + (1054, 'fr_FR', 'Clients - légende', NULL, NULL), + (1055, 'fr_FR', 'Clients - en-tête', NULL, NULL), + (1056, 'fr_FR', 'Clients - ligne', NULL, NULL), + (1057, 'fr_FR', 'Client - bas', NULL, NULL), + (1058, 'fr_FR', 'Client - formulaire de création', NULL, NULL), + (1059, 'fr_FR', 'Client - formulaire de suppression', NULL, NULL), + (1060, 'fr_FR', 'Clients - JavaScript', NULL, NULL), + (1061, 'fr_FR', 'Produit - colonne tableau contenus', NULL, NULL), + (1062, 'fr_FR', 'Produit - ligne tableau contenus', NULL, NULL), + (1063, 'fr_FR', 'Produit - colonne tableau accessoires', NULL, NULL), + (1064, 'fr_FR', 'Produit - ligne tableau accessoires', NULL, NULL), + (1065, 'fr_FR', 'Produit - colonne tableau catégories', NULL, NULL), + (1066, 'fr_FR', 'Produit - ligne tableau catégories', NULL, NULL), + (1067, 'fr_FR', 'Produit - colonne tableau attributs', NULL, NULL), + (1068, 'fr_FR', 'Produit - ligne tableau attributs', NULL, NULL), + (1069, 'fr_FR', 'Produit - colonne tableau caractéristiques', NULL, NULL), + (1070, 'fr_FR', 'Produit - ligne tableau caractéristiques', NULL, NULL), + (1071, 'fr_FR', 'Gabarit - colonne tableau attributs', NULL, NULL), + (1072, 'fr_FR', 'Gabarit - ligne tableau attributs', NULL, NULL), + (1073, 'fr_FR', 'Gabarit - colonne tableau caractéristiques', NULL, NULL), + (1074, 'fr_FR', 'Gabarit - ligne tableau caractéristiques', NULL, NULL), + (1075, 'fr_FR', 'Gabarits - en haut', NULL, NULL), + (1076, 'fr_FR', 'Gabarits - colonne tableau', NULL, NULL), + (1077, 'fr_FR', 'Gabarits - ligne tableau', NULL, NULL), + (1078, 'fr_FR', 'Gabarits - en bas', NULL, NULL), + (1079, 'fr_FR', 'Gabarit - formulaire de création', NULL, NULL), + (1080, 'fr_FR', 'Gabarit - formulaire de suppression', NULL, NULL), + (1081, 'fr_FR', 'Gabarits - JavaScript', NULL, NULL), + (1082, 'fr_FR', 'Configuration - en haut', NULL, NULL), + (1083, 'fr_FR', 'Configuration - en haut de la zone catalogue', NULL, NULL), + (1084, 'fr_FR', 'Configuration - en bas du catlogue', NULL, NULL), + (1085, 'fr_FR', 'Configuration - en haut de la zone livraison', NULL, NULL), + (1086, 'fr_FR', 'Configuration - en bas de la zone livraison', NULL, NULL), + (1087, 'fr_FR', 'Configuration - en haut de la zone système', NULL, NULL), + (1088, 'fr_FR', 'Configuration - en bas de la zone système', NULL, NULL), + (1089, 'fr_FR', 'Configuration - bas', NULL, NULL), + (1090, 'fr_FR', 'Configuration - JavaScript', NULL, NULL), + (1091, 'fr_FR', 'Tableau de bord - en haut', NULL, NULL), + (1092, 'fr_FR', 'Tableau de bord - au milieu', NULL, NULL), + (1093, 'fr_FR', 'Tableau de bord - bas', NULL, NULL), + (1094, 'fr_FR', 'Commandes - en haut', NULL, NULL), + (1095, 'fr_FR', 'Commandes - colonne tableau', NULL, NULL), + (1096, 'fr_FR', 'Commandes - ligne tableau', NULL, NULL), + (1097, 'fr_FR', 'Commandes - en bas', NULL, NULL), + (1098, 'fr_FR', 'Commandes - JavaScript', NULL, NULL), + (1099, 'fr_FR', 'Zone de livraison - en haut', NULL, NULL), + (1100, 'fr_FR', 'Zone de livraison - colonne tableau', NULL, NULL), + (1101, 'fr_FR', 'Zone de livraison - ligne tableau', NULL, NULL), + (1102, 'fr_FR', 'Zone de livraison - bas', NULL, NULL), + (1103, 'fr_FR', 'Zone de livraison - JavaScript', NULL, NULL), + (1104, 'fr_FR', 'Contenu - JavaScript modification', NULL, NULL), + (1105, 'fr_FR', 'Accueil - en haut', NULL, NULL), + (1106, 'fr_FR', 'Accueil - bas', NULL, NULL), + (1107, 'fr_FR', 'Accueil - JavaScript', NULL, NULL), + (1108, 'fr_FR', 'Modules - en haut', NULL, NULL), + (1109, 'fr_FR', 'Modules - bas', NULL, NULL), + (1110, 'fr_FR', 'Modules - JavaScript', NULL, NULL), + (1111, 'fr_FR', 'Langages - en haut', NULL, NULL), + (1112, 'fr_FR', 'Langages - bas', NULL, NULL), + (1113, 'fr_FR', 'Langage - formulaire de création', NULL, NULL), + (1114, 'fr_FR', 'Langages - formulaire de suppression', NULL, NULL), + (1115, 'fr_FR', 'Langages - JavaScript', NULL, NULL), + (1116, 'fr_FR', 'Zone - formulaire de suppression', NULL, NULL), + (1117, 'fr_FR', 'Zone de livraison - JavaScript modification', NULL, NULL), + (1118, 'fr_FR', 'Système - logs JavaScript', NULL, NULL), + (1119, 'fr_FR', 'Recherche - en haut', NULL, NULL), + (1120, 'fr_FR', 'Recherche - en bas', NULL, NULL), + (1121, 'fr_FR', 'Recherche - JavaScript', NULL, NULL), + (1122, 'fr_FR', 'Administateurs - en haut', NULL, NULL), + (1123, 'fr_FR', 'Administateurs - bas', NULL, NULL), + (1124, 'fr_FR', 'Administateur - formulaire de création', NULL, NULL), + (1125, 'fr_FR', 'Administateur - formulaire de modification', NULL, NULL), + (1126, 'fr_FR', 'Administateur - formulaire de suppression', NULL, NULL), + (1127, 'fr_FR', 'Administateurs - JavaScript', NULL, NULL), + (1128, 'fr_FR', 'Module hook - Modification de JavaScript', NULL, NULL), + (1129, 'fr_FR', 'Configuration du transport - en haut', NULL, NULL), + (1130, 'fr_FR', 'Configuration du transport - colonne tableau', NULL, NULL), + (1131, 'fr_FR', 'Configuration du transport - ligne tableau', NULL, NULL), + (1132, 'fr_FR', 'Configuration du transport - en bas', NULL, NULL), + (1133, 'fr_FR', 'Configuration du transport - formulaire de création', NULL, NULL), + (1134, 'fr_FR', 'Configuration du transport - formulaire de suppression', NULL, NULL), + (1135, 'fr_FR', 'Configuration du transport - JavaScript', NULL, NULL), + (1136, 'fr_FR', 'Caractéristiques - en haut', NULL, NULL), + (1137, 'fr_FR', 'Caractéristiques - colonne tableau', NULL, NULL), + (1138, 'fr_FR', 'Caractéristiques - ligne tableau', NULL, NULL), + (1139, 'fr_FR', 'Caractéristiques - bas', NULL, NULL), + (1140, 'fr_FR', 'Caractéristique - formulaire de création', NULL, NULL), + (1141, 'fr_FR', 'Caractéristique - formulaire de suppression', NULL, NULL), + (1142, 'fr_FR', 'Caractéristique - formulaire ajouter à tous', NULL, NULL), + (1143, 'fr_FR', 'Caractéristique - formulaire de suppression multiple', NULL, NULL), + (1144, 'fr_FR', 'Caractéristiques - JavaScript', NULL, NULL), + (1145, 'fr_FR', 'Module - Modification de JavaScript', NULL, NULL), + (1146, 'fr_FR', 'Module hook - formulaire de création', NULL, NULL), + (1147, 'fr_FR', 'Module hook - formulaire de suppression', NULL, NULL), + (1148, 'fr_FR', 'Point d\'accroche des modules - Javascript', NULL, NULL), + (1149, 'fr_FR', 'Configuration du transport - Modification', NULL, NULL), + (1150, 'fr_FR', 'Configuration du transport - formulaire de suppression de pays', NULL, NULL), + (1151, 'fr_FR', 'Configuration du transport - Modification de JavaScript', NULL, NULL), + (1152, 'fr_FR', 'Envoi des e-mails - en haut', NULL, NULL), + (1153, 'fr_FR', 'Envoi des e-mails - en bas', NULL, NULL), + (1154, 'fr_FR', 'Envoi des e-mails - JavaScript', NULL, NULL), + (1155, 'fr_FR', 'Catégories - en haut', NULL, NULL), + (1156, 'fr_FR', 'Catégories - légende', NULL, NULL), + (1157, 'fr_FR', 'Catégories - en-tête', NULL, NULL), + (1158, 'fr_FR', 'Catégories - ligne', NULL, NULL), + (1159, 'fr_FR', 'Produits - légende', NULL, NULL), + (1160, 'fr_FR', 'Produits - en-tête', NULL, NULL), + (1161, 'fr_FR', 'Produits - ligne', NULL, NULL), + (1162, 'fr_FR', 'Catégories - bas', NULL, NULL), + (1163, 'fr_FR', 'Catégories - en bas du catalogue', NULL, NULL), + (1164, 'fr_FR', 'Catégorie - formulaire de création', NULL, NULL), + (1165, 'fr_FR', 'Produit - formulaire de création', NULL, NULL), + (1166, 'fr_FR', 'Catégorie - formulaire de suppression', NULL, NULL), + (1167, 'fr_FR', 'Produit - formulaire de suppression', NULL, NULL), + (1168, 'fr_FR', 'Catégories - JavaScript', NULL, NULL), + (1169, 'fr_FR', 'Variables - en haut', NULL, NULL), + (1170, 'fr_FR', 'Variables - colonne tableau', NULL, NULL), + (1171, 'fr_FR', 'Variables - ligne tableau', NULL, NULL), + (1172, 'fr_FR', 'Variables - en bas', NULL, NULL), + (1173, 'fr_FR', 'Variable - formulaire de création', NULL, NULL), + (1174, 'fr_FR', 'Variable - formulaire de suppression', NULL, NULL), + (1175, 'fr_FR', 'Variables - JavaScript', NULL, NULL), + (1176, 'fr_FR', 'Commande - liste produit', NULL, NULL), + (1177, 'fr_FR', 'Commande - Modification de JavaScript', NULL, NULL), + (1178, 'fr_FR', 'Information boutique - JavaScript', NULL, NULL), + (1179, 'fr_FR', 'Traductions - JavaScript', NULL, NULL), + (1180, 'fr_FR', 'Dossiers - en haut', NULL, NULL), + (1181, 'fr_FR', 'Dossiers - légende', NULL, NULL), + (1182, 'fr_FR', 'Dossiers - en-tête', NULL, NULL), + (1183, 'fr_FR', 'Dossiers - ligne', NULL, NULL), + (1184, 'fr_FR', 'Contenus - légende', NULL, NULL), + (1185, 'fr_FR', 'Contenus - en-tête', NULL, NULL), + (1186, 'fr_FR', 'Contenus - ligne', NULL, NULL), + (1187, 'fr_FR', 'Dossiers - bas', NULL, NULL), + (1188, 'fr_FR', 'Dossier - formulaire de création', NULL, NULL), + (1189, 'fr_FR', 'Contenu - formulaire de création', NULL, NULL), + (1190, 'fr_FR', 'Dossier - formulaire de suppression', NULL, NULL), + (1191, 'fr_FR', 'Contenu - formulaire de suppression', NULL, NULL), + (1192, 'fr_FR', 'Dossiers - JavaScript', NULL, NULL), + (1193, 'fr_FR', 'Gabarit - Modification de JavaScript', NULL, NULL), + (1194, 'fr_FR', 'Taxe - Modification de JavaScript', NULL, NULL), + (1195, 'fr_FR', 'Point d\'accroche - JavaScript modification', NULL, NULL), + (1196, 'fr_FR', 'Pays - en haut', NULL, NULL), + (1197, 'fr_FR', 'Pays - colonne tableau', NULL, NULL), + (1198, 'fr_FR', 'Pays - ligne tableau', NULL, NULL), + (1199, 'fr_FR', 'Pays - bas', NULL, NULL), + (1200, 'fr_FR', 'Pays - formulaire de création', NULL, NULL), + (1201, 'fr_FR', 'Pays - formulaire de suppression', NULL, NULL), + (1202, 'fr_FR', 'Pays - JavaScript', NULL, NULL), + (1203, 'fr_FR', 'Devises - en haut', NULL, NULL), + (1204, 'fr_FR', 'Devises - colonne tableau', NULL, NULL), + (1205, 'fr_FR', 'Devises - ligne tableau', NULL, NULL), + (1206, 'fr_FR', 'Devises - bas', NULL, NULL), + (1207, 'fr_FR', 'Devise - formulaire de création', NULL, NULL), + (1208, 'fr_FR', 'Devise - formulaire de suppression', NULL, NULL), + (1209, 'fr_FR', 'Devises - JavaScript', NULL, NULL), + (1210, 'fr_FR', 'Client - Modification', NULL, NULL), + (1211, 'fr_FR', 'Client - formulaire de création d\'adresse', NULL, NULL), + (1212, 'fr_FR', 'Client - formulaire de Modification d\'adresse', NULL, NULL), + (1213, 'fr_FR', 'Client - formulaire de suppression adresse', NULL, NULL), + (1214, 'fr_FR', 'Client - JavaScript modification', NULL, NULL), + (1215, 'fr_FR', 'Valeurs des attributs - colonne tableau', NULL, NULL), + (1216, 'fr_FR', 'Valeurs des attributs - ligne tableau', NULL, NULL), + (1217, 'fr_FR', 'Valeur d\'attribut - formulaire de création', NULL, NULL), + (1218, 'fr_FR', 'Attribut - formulaire de suppression ID', NULL, NULL), + (1219, 'fr_FR', 'Attribut - JavaScript modification', NULL, NULL), + (1220, 'fr_FR', 'Profils - en haut', NULL, NULL), + (1221, 'fr_FR', 'Profils - en bas', NULL, NULL), + (1222, 'fr_FR', 'Profil - formulaire de création', NULL, NULL), + (1223, 'fr_FR', 'Profil - formulaire de suppression', NULL, NULL), + (1224, 'fr_FR', 'Profils - JavaScript', NULL, NULL), + (1225, 'fr_FR', 'Pays - JavaScript modification', NULL, NULL), + (1226, 'fr_FR', 'Profil - Modification de JavaScript', NULL, NULL), + (1227, 'fr_FR', 'Variable - Modification de JavaScript', NULL, NULL), + (1228, 'fr_FR', 'Code promo - JavaScript modification', NULL, NULL), + (1229, 'fr_FR', 'Code promo - en haut', NULL, NULL), + (1230, 'fr_FR', 'Code promo - légende liste', NULL, NULL), + (1231, 'fr_FR', 'Code promo - colonne tableau', NULL, NULL), + (1232, 'fr_FR', 'Code promo - ligne tableau', NULL, NULL), + (1233, 'fr_FR', 'Code promo - bas', NULL, NULL), + (1234, 'fr_FR', 'Code promo - JavaScript des listes', NULL, NULL), + (1235, 'fr_FR', 'Module - configuration', NULL, NULL), + (1236, 'fr_FR', 'Module - JavaScript configuration', NULL, NULL), + (1237, 'fr_FR', 'Message - Modification de JavaScript', NULL, NULL), + (1238, 'fr_FR', 'Image - Modification de JavaScript', NULL, NULL), + (1239, 'fr_FR', 'Attributs - en haut', NULL, NULL), + (1240, 'fr_FR', 'Attributs - colonne tableau', NULL, NULL), + (1241, 'fr_FR', 'Attributs - ligne tableau', NULL, NULL), + (1242, 'fr_FR', 'Attributs - bas', NULL, NULL), + (1243, 'fr_FR', 'Attribut - formulaire de création', NULL, NULL), + (1244, 'fr_FR', 'Attribut - formulaire de suppression', NULL, NULL), + (1245, 'fr_FR', 'Attribut - formulaire ajouter à tous', NULL, NULL), + (1246, 'fr_FR', 'Attribut - formulaire de suppression multiple', NULL, NULL), + (1247, 'fr_FR', 'Attributs - JavaScript', NULL, NULL), + (1248, 'fr_FR', 'Logs - en haut', NULL, NULL), + (1249, 'fr_FR', 'Logs - bas', NULL, NULL), + (1250, 'fr_FR', 'Journaux - JavaScript', NULL, NULL), + (1251, 'fr_FR', 'Dossier - JavaScript modification', NULL, NULL), + (1252, 'fr_FR', 'Point d\'accroches - en haut', NULL, NULL), + (1253, 'fr_FR', 'Point d\'accroches - colonne tableau', NULL, NULL), + (1254, 'fr_FR', 'Point d\'accroches - ligne tableau', NULL, NULL), + (1255, 'fr_FR', 'Point d\'accroches - bas', NULL, NULL), + (1256, 'fr_FR', 'Point d\'accroche - formulaire de création', NULL, NULL), + (1257, 'fr_FR', 'Point d\'accroche - formulaire de suppression', NULL, NULL), + (1258, 'fr_FR', 'Points d\'accroche - Javascript', NULL, NULL), + (1259, 'fr_FR', 'Mise en page - CSS', NULL, NULL), + (1260, 'fr_FR', 'Mise en page - avant la barre de titre', NULL, NULL), + (1261, 'fr_FR', 'Mise en page - dans la barre de titre', NULL, NULL), + (1262, 'fr_FR', 'Mise en page - après la barre de titre', NULL, NULL), + (1263, 'fr_FR', 'Mise en page - avant le menu haut', NULL, NULL), + (1264, 'fr_FR', 'Mise en page - éléments du menu haut', NULL, NULL), + (1265, 'fr_FR', 'Mise en page - après le menu haut', NULL, NULL), + (1266, 'fr_FR', 'Mise en page - avant le pied de page', NULL, NULL), + (1267, 'fr_FR', 'Mise en page - dans le pied de page', NULL, NULL), + (1268, 'fr_FR', 'Mise en page - après le pied de page', NULL, NULL), + (1269, 'fr_FR', 'Mise en page - JavaScript', NULL, NULL), + (1270, 'fr_FR', 'Mise en page - en haut de la barre supérieure', NULL, NULL), + (1271, 'fr_FR', 'Mise en page - en bas de la barre supérieure', NULL, NULL), + (1272, 'fr_FR', 'Mise en page - dans le menu clients', NULL, NULL), + (1273, 'fr_FR', 'Mise en page - dans le menu commandes', NULL, NULL), + (1274, 'fr_FR', 'Mise en page - dans le menu catalogue', NULL, NULL), + (1275, 'fr_FR', 'Mise en page - dans le menu dossiers', NULL, NULL), + (1276, 'fr_FR', 'Mise en page - dans le menu outils', NULL, NULL), + (1277, 'fr_FR', 'Mise en page - dans le menu modules', NULL, NULL), + (1278, 'fr_FR', 'Mise en page - dans le menu configuration', NULL, NULL), + (1279, 'fr_FR', 'Marque - Modification du JavaScript', NULL, NULL), + (1280, 'fr_FR', 'Accueil - bloc', NULL, NULL), + (1281, 'fr_FR', 'Marques - en haut', NULL, NULL), + (1282, 'fr_FR', 'Marques - colonne tableau', NULL, NULL), + (1283, 'fr_FR', 'Marques - ligne tableau', NULL, NULL), + (1284, 'fr_FR', 'Marques - bas', NULL, NULL), + (1285, 'fr_FR', 'Marque - formulaire de création', NULL, NULL), + (1286, 'fr_FR', 'Marque - formulaire de suppression', NULL, NULL), + (1287, 'fr_FR', 'Marque - JavaScript', NULL, NULL), + (1288, 'fr_FR', 'Exports - en haut', NULL, NULL), + (1289, 'fr_FR', 'Exports - en bas d\'une catégorie', NULL, NULL), + (1290, 'fr_FR', 'Exports - en bas de la colonne 1', NULL, NULL), + (1291, 'fr_FR', 'Exports - JavaScript', NULL, NULL), + (1292, 'fr_FR', 'Export - JavaScript', NULL, NULL), + (1293, 'fr_FR', 'Marque - contenu', NULL, NULL), + (1294, 'fr_FR', 'Client - colonne tableau commande', NULL, NULL), + (1295, 'fr_FR', 'Client - ligne tableau commande', NULL, NULL), + (1296, 'fr_FR', 'Promotions - en haut', NULL, NULL), + (1297, 'fr_FR', 'Promotions - colonne tableau', NULL, NULL), + (1298, 'fr_FR', 'Promotions - ligne du tableau', NULL, NULL), + (1299, 'fr_FR', 'Promotions - en bas', NULL, NULL), + (1300, 'fr_FR', 'Promotion - formulaire de création', NULL, NULL), + (1301, 'fr_FR', 'Promotion - formulaire de suppression', NULL, NULL), + (1302, 'fr_FR', 'Promotions - JavaScript', NULL, NULL), + (1303, 'fr_FR', 'Produit - en bas d\'une combinaison de déclinaisons', NULL, NULL), + (1304, 'fr_FR', 'Layout - Avant le contenu principal', NULL, NULL), + (1305, 'fr_FR', 'Admin layout - Après le contenu principal', NULL, NULL), + (1306, 'fr_FR', 'Catégorie - Onglet', NULL, NULL), + (1307, 'fr_FR', 'Produit - Onglet', NULL, NULL), + (1308, 'fr_FR', 'Dossier - Onglet', NULL, NULL), + (1309, 'fr_FR', 'Contenu - Onglet', NULL, NULL), + (1310, 'fr_FR', 'Marque - Onglet', NULL, NULL), + (1311, 'fr_FR', 'Modification commande - adresse de livraison', NULL, NULL), + (1312, 'fr_FR', 'Page produit - En haut du formulaire', NULL, NULL), + (1313, 'fr_FR', 'Page produit - En bas du formulaire', NULL, NULL), + (1314, 'fr_FR', 'Page brand edit - dans formulaire', NULL, NULL), + (1315, 'fr_FR', 'Page sale edit - appel javascript', NULL, NULL), + (1316, 'fr_FR', 'Page api - en haut', NULL, NULL), + (1317, 'fr_FR', 'Page api - en bas', NULL, NULL), + (1318, 'fr_FR', 'Page api - formulaire de suppression', NULL, NULL), + (1319, 'fr_FR', 'Page coupon - formulaire de suppression', NULL, NULL), + (1320, 'fr_FR', 'Commande- Onglet', NULL, NULL), + (1321, 'fr_FR', 'Profil - colonne tableau', '', ''), + (1322, 'fr_FR', 'Profil - ligne du tableau', '', ''), + (1323, 'fr_FR', 'Import - colonne tableau', '', ''), + (1324, 'fr_FR', 'Import - ligne du tableau', '', ''), + (1325, 'fr_FR', 'Export - colonne tableau', '', ''), + (1326, 'fr_FR', 'Export - ligne du tableau', '', ''), + (1327, 'fr_FR', 'Édition d\'une categorie - en haut', '', ''), + (1328, 'fr_FR', 'Édition d\'une categorie - en bas', '', ''), + (1329, 'fr_FR', 'Édition d\'une marque - en haut', '', ''), + (1330, 'fr_FR', 'Édition d\'une marque - en bas', '', ''), + (1331, 'fr_FR', 'Édition d\'une déclinaison - en haut', '', ''), + (1332, 'fr_FR', 'Édition d\'une déclinaison - en bas', '', ''), + (1333, 'fr_FR', 'Édition d\'une devise - en haut', '', ''), + (1334, 'fr_FR', 'Édition d\'une devise - en bas', '', ''), + (1335, 'fr_FR', 'Édition d\'un pays - en haut', '', ''), + (1336, 'fr_FR', 'Édition d\'un pays - en bas', '', ''), + (1337, 'fr_FR', 'Édition d\'un contenu - en haut', '', ''), + (1338, 'fr_FR', 'Édition d\'un contenu - en bas', '', ''), + (1339, 'fr_FR', 'Édition d\'une caractéristique - en haut', '', ''), + (1340, 'fr_FR', 'Édition d\'une caractéristique - en bas', '', ''), + (1341, 'fr_FR', 'Édition d\'un document - en haut', '', ''), + (1342, 'fr_FR', 'Édition d\'un document - en bas', '', ''), + (1343, 'fr_FR', 'Édition d\'un client - en haut', '', ''), + (1344, 'fr_FR', 'Édition d\'un client - en bas', '', ''), + (1345, 'fr_FR', 'Édition d\'image - en haut', '', ''), + (1346, 'fr_FR', 'Édition d\'image - en bas', '', ''), + (1347, 'fr_FR', 'Édition d\'hook - en haut', '', ''), + (1348, 'fr_FR', 'Édition d\'hook - en bas', '', ''), + (1349, 'fr_FR', 'Édition d\'un dossier - en haut', '', ''), + (1350, 'fr_FR', 'Édition d\'un dossier - en bas', '', ''), + (1351, 'fr_FR', 'Édition d\'un hook de module - en haut', '', ''), + (1352, 'fr_FR', 'Édition d\'un hook de module - en bas', '', ''), + (1353, 'fr_FR', 'Édition d\'un module - en haut', '', ''), + (1354, 'fr_FR', 'Édition d\'un module - en bas', '', ''), + (1355, 'fr_FR', 'Édition d\'un message - en haut', '', ''), + (1356, 'fr_FR', 'Édition d\'un message - en bas', '', ''), + (1357, 'fr_FR', 'Édition d\'un profil - en haut', '', ''), + (1358, 'fr_FR', 'Édition d\'un profil - en bas', '', ''), + (1359, 'fr_FR', 'Édition d\'un produit - en haut', '', ''), + (1360, 'fr_FR', 'Édition d\'un produit - en bas', '', ''), + (1361, 'fr_FR', 'Édition d\'une commande - en haut', '', ''), + (1362, 'fr_FR', 'Édition d\'une commande - en bas', '', ''), + (1363, 'fr_FR', 'Édition des zones de livraison d\'un transporteur - en haut', '', ''), + (1364, 'fr_FR', 'Édition des zones de livraison d\'un transporteur - en bas', '', ''), + (1365, 'fr_FR', 'Édition d\'une zone de livraison - en haut', '', ''), + (1366, 'fr_FR', 'Édition d\'une zone de livraiso - en bas', '', ''), + (1367, 'fr_FR', 'Édition d\'une promotion - en haut', '', ''), + (1368, 'fr_FR', 'Édition d\'une promotion - en bas', '', ''), + (1369, 'fr_FR', 'Édition d\'une variable - en haut', '', ''), + (1370, 'fr_FR', 'Édition d\'une variable - en bas', '', ''), + (1371, 'fr_FR', 'Édition d\'un gabarit - en haut', '', ''), + (1372, 'fr_FR', 'Édition d\'un gabarit - en bas', '', ''), + (1373, 'fr_FR', 'Édition d\'une règle de taxe - en haut', '', ''), + (1374, 'fr_FR', 'Édition d\'une règle de taxe - en bas', '', ''), + (1375, 'fr_FR', 'Édition d\'une taxe - en haut', '', ''), + (1376, 'fr_FR', 'Édition d\'une taxe - en bas', '', ''), + (1377, 'fr_FR', 'Édition d\'une commande - sous les informations du produit', '', ''), + (1378, 'fr_FR', 'Onglet SEO - en haut', '', ''), + (1379, 'fr_FR', 'Onglet SEO - en bas', '', ''), + (1380, 'fr_FR', 'Onglet image - en haut', '', ''), + (1381, 'fr_FR', 'Onglet image - en bas', '', ''), + (1382, 'fr_FR', 'Onglet document - en haut', '', ''), + (1383, 'fr_FR', 'Onglet document - en bas', '', ''), + (1384, 'fr_FR', 'Modal ou page d\'export - en haut', '', ''), + (1385, 'fr_FR', 'Modal ou page d\'export - en bas', '', ''), + (1386, 'fr_FR', 'Commande - en bas des informations client', '', ''), + (1387, 'fr_FR', 'Commande - en bas du module de paiement', '', ''), + (1388, 'fr_FR', 'Commande - en bas du module de livraison', '', ''), + (1389, 'fr_FR', 'Onglet SEO - formulaire de mise à jour', '', ''), + (1390, 'fr_FR', 'Modification commande - en-tête des produits', '', ''), + (1391, 'fr_FR', 'Modification commande - ligne du tableau des produits', '', ''), + (1392, 'fr_FR', 'Administrateurs - en-tête', '', ''), + (1393, 'fr_FR', 'Administrateurs - ligne', '', ''), + (1394, 'fr_FR', 'Configuration avancée', '', ''), + (1395, 'fr_FR', 'Configuration avancée - JavaScript', '', ''), + (1396, 'fr_FR', 'Édition d\'une marque - en haut de la colonne de droite', NULL, NULL), + (1397, 'fr_FR', 'Édition d\'une marque - en bas de la colonne de droite', NULL, NULL), + (1398, 'fr_FR', 'Édition d\'une catégorie - en haut de la colonne de droite', NULL, NULL), + (1399, 'fr_FR', 'Édition d\'une catégorie - en bas de la colonne de droite', NULL, NULL), + (1400, 'fr_FR', 'Édition d\'un contenu - en haut de la colonne de droite', NULL, NULL), + (1401, 'fr_FR', 'Édition d\'un contenu - en bas de la colonne de droite', NULL, NULL), + (1402, 'fr_FR', 'Édition d\'un dossier - en haut de la colonne de droite', NULL, NULL), + (1403, 'fr_FR', 'Édition d\'un dossier - en bas de la colonne de droite', NULL, NULL), + (1404, 'fr_FR', 'Édition d\'un produit - en haut de la colonne de droite', NULL, NULL), + (1405, 'fr_FR', 'Édition d\'un produit - en bas de la colonne de droite', NULL, NULL), + (1406, 'fr_FR', 'édition d\'un état - en haut', '', ''), + (1407, 'fr_FR', 'édition d\'un état - en bas', '', ''), + (1408, 'fr_FR', 'Etat - JavaScript modification', '', ''), + (1409, 'fr_FR', 'états - en haut', '', ''), + (1410, 'fr_FR', 'états - colonne tableau', '', ''), + (1411, 'fr_FR', 'états - ligne du tableau', '', ''), + (1412, 'fr_FR', 'états - bas', '', ''), + (1413, 'fr_FR', 'état - formulaire de création', '', ''), + (1414, 'fr_FR', 'état - formulaire de suppression', '', ''), + (1415, 'fr_FR', 'états - JavaScript', '', '') +; + +-- Insert I18n pdf hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES + (2001, 'de_DE', 'Rechnung - CSS', NULL, NULL), + (2002, 'de_DE', 'Rechnung - im Header', NULL, NULL), + (2003, 'de_DE', 'Rechnung - oben an dem Footer', NULL, NULL), + (2004, 'de_DE', 'Rechnung - Impressum', NULL, NULL), + (2005, 'de_DE', 'Rechnung - unten an dem Footer', NULL, NULL), + (2006, 'de_DE', 'Rechnung - unten an dem Informationsbereich', NULL, NULL), + (2007, 'de_DE', 'Rechnung - nach dem Informationsbereich', NULL, NULL), + (2008, 'de_DE', 'Rechnung - Bestellungsadresse', NULL, NULL), + (2009, 'de_DE', 'Rechnung - nach dem Adressebereich', NULL, NULL), + (2010, 'de_DE', 'Rechnung - nach der Produktliste', NULL, NULL), + (2011, 'de_DE', 'Rechnung - nach der Bestellungs-Zusammenfassung', NULL, NULL), + (2012, 'de_DE', 'Lieferung - CSS', NULL, NULL), + (2013, 'de_DE', 'Lieferung - im Header', NULL, NULL), + (2014, 'de_DE', 'Lieferung - oben an dem Footer', NULL, NULL), + (2015, 'de_DE', 'Lieferung - Impressum', NULL, NULL), + (2016, 'de_DE', 'Lieferung - unten an dem Footer', NULL, NULL), + (2017, 'de_DE', 'Lieferung - unten an dem Informationsbereich', NULL, NULL), + (2018, 'de_DE', 'Lieferung - Nach dem Informationsbereich', NULL, NULL), + (2019, 'de_DE', 'Lieferung - Lieferadresse', NULL, NULL), + (2020, 'de_DE', 'Lieferung - Nach dem Adresse-Bereich', NULL, NULL), + (2021, 'de_DE', 'Lieferung - Nach der Zusammenfassung der Bestellung', NULL, NULL), + (2022, 'de_DE', 'Bestellbestätigung - nach den Bestellungszusammenfassungen', NULL, NULL), + (2023, 'de_DE', 'Überall wo WYSIWYG editor ist nötig', NULL, NULL), + (2024, 'de_DE', 'Bestellung - Warenkorb oben', NULL, NULL), + (2025, 'de_DE', 'Bestellung - Warenkorb unten', NULL, NULL), + (2026, 'de_DE', 'Bestellung - Rechnung oben', NULL, NULL), + (2027, 'de_DE', 'Bestellung - Rechnung unten', NULL, NULL), + (2028, 'de_DE', 'Bestellung - Vor der Produktliste', NULL, NULL), + (2029, 'de_DE', 'Bestellung - Vor der Öffnung der Produktzeile', NULL, NULL), + (2030, 'de_DE', 'Bestellung - Nach Sperrung der Produkt Zeile', NULL, NULL), + (2031, 'de_DE', 'Bestellung - Nach der Produktliste', NULL, NULL), + (2032, 'de_DE', 'Rechnung - Nach dem Zahlungsmodul', NULL, NULL), + (2033, 'de_DE', 'Rechnung - Nach dem Liefermodul', NULL, NULL), + (2034, 'de_DE', 'Lieferung - Nach dem Liefermodul', NULL, NULL), + (2035, 'de_DE', 'Rechnung - Weitere Produktinformationen', NULL, NULL), + (2036, 'de_DE', 'Lieferung - Weitere Produktinformationen', NULL, NULL), + (2001, 'en_US', 'Invoice - CSS', NULL, NULL), + (2002, 'en_US', 'Invoice - in the header', NULL, NULL), + (2003, 'en_US', 'Invoice - at the top of the footer', NULL, NULL), + (2004, 'en_US', 'Invoice - imprint', NULL, NULL), + (2005, 'en_US', 'Invoice - at the bottom of the footer', NULL, NULL), + (2006, 'en_US', 'Invoice - at the bottom of information area', NULL, NULL), + (2007, 'en_US', 'Invoice - after the information area', NULL, NULL), + (2008, 'en_US', 'Invoice - delivery address', NULL, NULL), + (2009, 'en_US', 'Invoice - after addresse area', NULL, NULL), + (2010, 'en_US', 'Invoice - after product listing', NULL, NULL), + (2011, 'en_US', 'Invoice - after the order summary', NULL, NULL), + (2012, 'en_US', 'Delivery - CSS', NULL, NULL), + (2013, 'en_US', 'Delivery - in the header', NULL, NULL), + (2014, 'en_US', 'Delivery - at the top of the footer', NULL, NULL), + (2015, 'en_US', 'Delivery - imprint', NULL, NULL), + (2016, 'en_US', 'Delivery - at the bottom of the footer', NULL, NULL), + (2017, 'en_US', 'Delivery - at the bottom of information area', NULL, NULL), + (2018, 'en_US', 'Delivery - after the information area', NULL, NULL), + (2019, 'en_US', 'Delivery - delivery address', NULL, NULL), + (2020, 'en_US', 'Delivery - after addresse area', NULL, NULL), + (2021, 'en_US', 'Delivery - after the order summary', NULL, NULL), + (2022, 'en_US', 'Order confirmation - after the order summary', NULL, NULL), + (2023, 'en_US', 'Where the WYSIWYG editor is required', NULL, NULL), + (2024, 'en_US', 'Order - cart top', NULL, NULL), + (2025, 'en_US', 'Order - cart bottom', NULL, NULL), + (2026, 'en_US', 'Order - bill top', NULL, NULL), + (2027, 'en_US', 'Order - bill bottom', NULL, NULL), + (2028, 'en_US', 'Order - Before product list', NULL, NULL), + (2029, 'en_US', 'Order - Before starting product row', NULL, NULL), + (2030, 'en_US', 'Order - After closing product row', NULL, NULL), + (2031, 'en_US', 'Order - After product list', NULL, NULL), + (2032, 'en_US', 'Invoice - After payment module', NULL, NULL), + (2033, 'en_US', 'Invoice - After delivery module', NULL, NULL), + (2034, 'en_US', 'Delivery - After delivery module', NULL, NULL), + (2035, 'en_US', 'Invoice - additional product information', NULL, NULL), + (2036, 'en_US', 'Delivery - additional product information', NULL, NULL), + (2001, 'es_ES', 'Factura - CSS', NULL, NULL), + (2002, 'es_ES', 'Factura - en la cabecera', NULL, NULL), + (2003, 'es_ES', 'Factura - en la parte superior del pie de página', NULL, NULL), + (2004, 'es_ES', 'Factura - pie de imprenta', NULL, NULL), + (2005, 'es_ES', 'Factura - en la parte inferior del pie de página', NULL, NULL), + (2006, 'es_ES', 'Factura - en la parte inferior del área de la información', NULL, NULL), + (2007, 'es_ES', 'Factura - después del área de información', NULL, NULL), + (2008, 'es_ES', 'Factura - dirección de envío', NULL, NULL), + (2009, 'es_ES', 'Factura - después del área de dirección', NULL, NULL), + (2010, 'es_ES', 'Factura - después de listado de productos', NULL, NULL), + (2011, 'es_ES', 'Factura - después del resumen de la orden', NULL, NULL), + (2012, 'es_ES', 'Entrega - CSS', NULL, NULL), + (2013, 'es_ES', 'Envío - en la cabecera', NULL, NULL), + (2014, 'es_ES', 'Envío - en la parte superior del footer', NULL, NULL), + (2015, 'es_ES', 'Envío - imprimir', NULL, NULL), + (2016, 'es_ES', 'Envío - En el pie del footer', NULL, NULL), + (2017, 'es_ES', 'Envío - en el pié del área de información', NULL, NULL), + (2018, 'es_ES', 'Entrega - después del área de información', NULL, NULL), + (2019, 'es_ES', 'Envío - dirección de entrega', NULL, NULL), + (2020, 'es_ES', 'Entrega - tras el área de dirección', NULL, NULL), + (2021, 'es_ES', 'Envío - después del resumen de pedido', NULL, NULL), + (2022, 'es_ES', 'Confirmación de la orden - después del Resumen de la orden', NULL, NULL), + (2023, 'es_ES', 'Donde se requiere el editor WYSIWYG', NULL, NULL), + (2024, 'es_ES', 'Orden - parte superior del carro', NULL, NULL), + (2025, 'es_ES', 'Orden - parte inferior del carro', NULL, NULL), + (2026, 'es_ES', 'Orden - parte superior de la cuenta', NULL, NULL), + (2027, 'es_ES', 'Orden - parte inferior de la cuenta', NULL, NULL), + (2028, 'es_ES', 'Orden - antes de la lista de productos', NULL, NULL), + (2029, 'es_ES', 'Orden - antes de comenzar la fila de producto', NULL, NULL), + (2030, 'es_ES', 'Orden - después de cerrar la fila de producto', NULL, NULL), + (2031, 'es_ES', 'Orden - después de la lista de productos', NULL, NULL), + (2032, 'es_ES', 'Factura - Después de módulo de pago de factura', NULL, NULL), + (2033, 'es_ES', 'Factura - Después de módulo de entrega de factura', NULL, NULL), + (2034, 'es_ES', 'Entrega - después del módulo de entrega', NULL, NULL), + (2035, 'es_ES', 'Factura - información adicional del producto', NULL, NULL), + (2036, 'es_ES', 'Entrega - información adicional del producto', NULL, NULL), + (2001, 'fr_FR', 'Facture - CSS', NULL, NULL), + (2002, 'fr_FR', 'Facture - dans l\'en-tête', NULL, NULL), + (2003, 'fr_FR', 'Facture - en haut du pied de page', NULL, NULL), + (2004, 'fr_FR', 'Facture - mentions légales', NULL, NULL), + (2005, 'fr_FR', 'Facture - en bas du pied de page', NULL, NULL), + (2006, 'fr_FR', 'Facture - en bas de la zone d\'informations', NULL, NULL), + (2007, 'fr_FR', 'Facture - après la zone d\'informations', NULL, NULL), + (2008, 'fr_FR', 'Facture - adresse de livraison', NULL, NULL), + (2009, 'fr_FR', 'Facture - après la zone d\'adresses', NULL, NULL), + (2010, 'fr_FR', 'Facture - après la liste des produits', NULL, NULL), + (2011, 'fr_FR', 'Facture - après le résumé de la commande', NULL, NULL), + (2012, 'fr_FR', 'Bon de livraison - CSS', NULL, NULL), + (2013, 'fr_FR', 'Bon de livraison - dans l\'en-tête', NULL, NULL), + (2014, 'fr_FR', 'Bon de livraison - en haut du pied de page', NULL, NULL), + (2015, 'fr_FR', 'Bon de livraison - mentions légales', NULL, NULL), + (2016, 'fr_FR', 'Bon de livraison - en bas du pied de page', NULL, NULL), + (2017, 'fr_FR', 'Bon de livraison - en bas de la zone d\'informations', NULL, NULL), + (2018, 'fr_FR', 'Bon de livraison - après la zone d\'informations', NULL, NULL), + (2019, 'fr_FR', 'Bon de livraison - adresse de livraison', NULL, NULL), + (2020, 'fr_FR', 'Bon de livraison - après la zone d\'adresses', NULL, NULL), + (2021, 'fr_FR', 'Bon de livraison - après le résumé de la commande', NULL, NULL), + (2022, 'fr_FR', 'Confirmation de commande - après les récapitulatif de commande', NULL, NULL), + (2023, 'fr_FR', 'Partout ou l\'éditeur WYSIWYG est nécessaire', NULL, NULL), + (2024, 'fr_FR', 'Commande - panier haut', NULL, NULL), + (2025, 'fr_FR', 'Commande - panier bas', NULL, NULL), + (2026, 'fr_FR', 'Commande - facture haut', NULL, NULL), + (2027, 'fr_FR', 'Commande - facture bas', NULL, NULL), + (2028, 'fr_FR', 'Commande - Avant la liste des produits', NULL, NULL), + (2029, 'fr_FR', 'Commande - Avant d\'ouvrir la ligne produit', NULL, NULL), + (2030, 'fr_FR', 'Commande - Après avoir fermé la ligne produit', NULL, NULL), + (2031, 'fr_FR', 'Commande - Après la liste des produits', NULL, NULL), + (2032, 'fr_FR', 'Commande - après le module de paiement', NULL, NULL), + (2033, 'fr_FR', 'Commande - après le module de livraison', NULL, NULL), + (2034, 'fr_FR', 'Commande - après le module de livraison', NULL, NULL), + (2035, 'fr_FR', 'Facture - informations additionnelles pour un produit', NULL, NULL), + (2036, 'fr_FR', 'Bon de livraison - informations additionnelles pour un produit', NULL, NULL) +; + +-- Insert I18n email hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES + (3000, 'de_DE', 'E-Mail html - Layout - CSS', NULL, NULL), + (3001, 'de_DE', 'E-Mail html - Layout - Fußzeile', NULL, NULL), + (3002, 'de_DE', 'E-Mail html - Bestellbestätigung - vor Adresse', NULL, NULL), + (3003, 'de_DE', NULL, NULL, NULL), + (3004, 'de_DE', 'E-Mail html - Bestellbestätigung - nach Adresse', NULL, NULL), + (3005, 'de_DE', NULL, NULL, NULL), + (3006, 'de_DE', 'E-Mail html - Bestellbestätigung - vor Produkten', NULL, NULL), + (3007, 'de_DE', 'E-Mail html - Bestellbestätigung - nach Produkten', NULL, NULL), + (3008, 'de_DE', NULL, NULL, NULL), + (3009, 'de_DE', NULL, NULL, NULL), + (3010, 'de_DE', NULL, NULL, NULL), + (3011, 'de_DE', NULL, NULL, NULL), + (3012, 'de_DE', NULL, NULL, NULL), + (3013, 'de_DE', NULL, NULL, NULL), + (3014, 'de_DE', NULL, NULL, NULL), + (3015, 'de_DE', NULL, NULL, NULL), + (3016, 'de_DE', NULL, NULL, NULL), + (3017, 'de_DE', NULL, NULL, NULL), + (3018, 'de_DE', NULL, NULL, NULL), + (3019, 'de_DE', NULL, NULL, NULL), + (3020, 'de_DE', NULL, NULL, NULL), + (3021, 'de_DE', NULL, NULL, NULL), + (3022, 'de_DE', NULL, NULL, NULL), + (3023, 'de_DE', NULL, NULL, NULL), + (3024, 'de_DE', NULL, NULL, NULL), + (3025, 'de_DE', NULL, NULL, NULL), + (3026, 'de_DE', NULL, NULL, NULL), + (3000, 'en_US', 'Email html - layout - CSS', NULL, NULL), + (3001, 'en_US', 'Email html - layout - footer', NULL, NULL), + (3002, 'en_US', 'Email html - order confirmation - before address', NULL, NULL), + (3003, 'en_US', 'Email html - order confirmation - delivery address', NULL, NULL), + (3004, 'en_US', 'Email html - order confirmation - after address', NULL, NULL), + (3005, 'en_US', 'Email html - order confirmation - order product', NULL, NULL), + (3006, 'en_US', 'Email html - order confirmation - before products', NULL, NULL), + (3007, 'en_US', 'Email html - order confirmation - after products', NULL, NULL), + (3008, 'en_US', 'Email html - order confirmation - footer', NULL, NULL), + (3009, 'en_US', 'Email html - order notification - before address', NULL, NULL), + (3010, 'en_US', 'Email html - order notification - delivery address', NULL, NULL), + (3011, 'en_US', 'Email html - order notification - after address', NULL, NULL), + (3012, 'en_US', 'Email html - order notification - order product', NULL, NULL), + (3013, 'en_US', 'Email html - order notification - before products', NULL, NULL), + (3014, 'en_US', 'Email html - order notification - after products', NULL, NULL), + (3015, 'en_US', 'Email txt - order confirmation - before address', NULL, NULL), + (3016, 'en_US', 'Email txt - order confirmation - delivery address', NULL, NULL), + (3017, 'en_US', 'Email txt - order confirmation - after address', NULL, NULL), + (3018, 'en_US', 'Email txt - order confirmation - order product', NULL, NULL), + (3019, 'en_US', 'Email txt - order confirmation - before products', NULL, NULL), + (3020, 'en_US', 'Email txt - order confirmation - after products', NULL, NULL), + (3021, 'en_US', 'Email txt - order notification - before address', NULL, NULL), + (3022, 'en_US', 'Email txt - order notification - delivery address', NULL, NULL), + (3023, 'en_US', 'Email txt - order notification - after address', NULL, NULL), + (3024, 'en_US', 'Email txt - order notification - order product', NULL, NULL), + (3025, 'en_US', 'Email txt - order notification - before products', NULL, NULL), + (3026, 'en_US', 'Email txt - order notification - after products', NULL, NULL), + (3000, 'es_ES', 'Email HTML - Interfaz - CSS', NULL, NULL), + (3001, 'es_ES', 'Email HTML - Interfaz - pie', NULL, NULL), + (3002, 'es_ES', NULL, NULL, NULL), + (3003, 'es_ES', NULL, NULL, NULL), + (3004, 'es_ES', 'Email HTML - confirmación de orden - después de la dirección', NULL, NULL), + (3005, 'es_ES', NULL, NULL, NULL), + (3006, 'es_ES', NULL, NULL, NULL), + (3007, 'es_ES', NULL, NULL, NULL), + (3008, 'es_ES', NULL, NULL, NULL), + (3009, 'es_ES', NULL, NULL, NULL), + (3010, 'es_ES', NULL, NULL, NULL), + (3011, 'es_ES', NULL, NULL, NULL), + (3012, 'es_ES', 'Email HTML - notificación de orden - pedir producto', NULL, NULL), + (3013, 'es_ES', NULL, NULL, NULL), + (3014, 'es_ES', NULL, NULL, NULL), + (3015, 'es_ES', 'Email texto - confirmación de pedido - antes de la dirección', NULL, NULL), + (3016, 'es_ES', 'Email texto - confirmación de pedido - dirección de entrega', NULL, NULL), + (3017, 'es_ES', 'Email texto - confirmación de pedido - después de la dirección', NULL, NULL), + (3018, 'es_ES', 'Email texto - confirmación de pedido - pedido de producto', NULL, NULL), + (3019, 'es_ES', 'Email texto - confirmación de pedido - antes de los productos', NULL, NULL), + (3020, 'es_ES', 'Email texto - confirmación de pedido - después de los productos', NULL, NULL), + (3021, 'es_ES', NULL, NULL, NULL), + (3022, 'es_ES', NULL, NULL, NULL), + (3023, 'es_ES', 'Email texto - notificación de pedido - después de la dirección', NULL, NULL), + (3024, 'es_ES', NULL, NULL, NULL), + (3025, 'es_ES', NULL, NULL, NULL), + (3026, 'es_ES', NULL, NULL, NULL), + (3000, 'fr_FR', 'Email html - layout - CSS', NULL, NULL), + (3001, 'fr_FR', 'Email html - layout - pied de page', NULL, NULL), + (3002, 'fr_FR', 'Email html - confirmation commande - avant adresses', NULL, NULL), + (3003, 'fr_FR', 'Email html - confirmation commande - adresse de livraison', NULL, NULL), + (3004, 'fr_FR', 'Email html - confirmation commande - après adresses', NULL, NULL), + (3005, 'fr_FR', 'Email html - confirmation commande - produit de la commande', NULL, NULL), + (3006, 'fr_FR', 'Email html - confirmation commande - avant produits', NULL, NULL), + (3007, 'fr_FR', 'Email html - confirmation commande - après produits', NULL, NULL), + (3008, 'fr_FR', 'Email html - confirmation commande - pied de page', NULL, NULL), + (3009, 'fr_FR', 'Email html - notification commande - avant adresses', NULL, NULL), + (3010, 'fr_FR', 'Email html - notification commande - adresse de livraison', NULL, NULL), + (3011, 'fr_FR', 'Email html - notification commande - après adresses', NULL, NULL), + (3012, 'fr_FR', 'Email html - notification commande - produit de la commande', NULL, NULL), + (3013, 'fr_FR', 'Email html - notification commande - avant produits', NULL, NULL), + (3014, 'fr_FR', 'Email html - notification commande - après produits', NULL, NULL), + (3015, 'fr_FR', 'Email txt - confirmation commande - avant adresses', NULL, NULL), + (3016, 'fr_FR', 'Email txt - confirmation commande - adresse de livraison', NULL, NULL), + (3017, 'fr_FR', 'Email txt - confirmation commande - après adresses', NULL, NULL), + (3018, 'fr_FR', 'Email txt - confirmation commande - produit de la commande', NULL, NULL), + (3019, 'fr_FR', 'Email txt - confirmation commande - avant produits', NULL, NULL), + (3020, 'fr_FR', 'Email txt - confirmation commande - après produits', NULL, NULL), + (3021, 'fr_FR', 'Email txt - notification commande - avant adresses', NULL, NULL), + (3022, 'fr_FR', 'Email txt - notification commande - adresse de livraison', NULL, NULL), + (3023, 'fr_FR', 'Email txt - notification commande - après adresses', NULL, NULL), + (3024, 'fr_FR', 'Email txt - notification commande - produit de la commande', NULL, NULL), + (3025, 'fr_FR', 'Email txt - notification commande - avant produits', NULL, NULL), + (3026, 'fr_FR', 'Email txt - notification commande - après produits', NULL, NULL) +; + +INSERT INTO `customer_title_i18n` (`id`, `locale`, `short`, `long`) VALUES + (1, 'de_DE', 'Hr.', 'Herr'), + (2, 'de_DE', 'Fr.', 'Frau'), + (3, 'de_DE', 'Fr.', 'Fräulein'), + (1, 'en_US', 'Mr.', 'Mister'), + (2, 'en_US', 'Mrs', 'Misses'), + (3, 'en_US', 'Miss_short', 'Miss'), + (1, 'es_ES', 'Sr.', 'Señor'), + (2, 'es_ES', 'Sra', 'Señora'), + (3, 'es_ES', 'Señorita', 'Señorita'), + (1, 'fr_FR', 'M.', 'Monsieur'), + (2, 'fr_FR', 'Mme', 'Madame'), + (3, 'fr_FR', 'Mlle', 'Mademoiselle') +; + +INSERT INTO `currency_i18n` (`id`, `locale`, `name`) VALUES + (1, 'de_DE', 'Euro'), + (2, 'de_DE', 'US Dollar'), + (3, 'de_DE', 'Britische Pfund'), + (4, 'de_DE', NULL), + (5, 'de_DE', NULL), + (6, 'de_DE', NULL), + (7, 'de_DE', NULL), + (8, 'de_DE', NULL), + (9, 'de_DE', NULL), + (10, 'de_DE', NULL), + (11, 'de_DE', NULL), + (12, 'de_DE', NULL), + (13, 'de_DE', 'Dollar'), + (14, 'de_DE', NULL), + (15, 'de_DE', NULL), + (16, 'de_DE', NULL), + (17, 'de_DE', 'Dänische Kronen'), + (18, 'de_DE', NULL), + (19, 'de_DE', NULL), + (20, 'de_DE', 'Dollar (CAD)'), + (21, 'de_DE', NULL), + (22, 'de_DE', NULL), + (23, 'de_DE', NULL), + (24, 'de_DE', NULL), + (25, 'de_DE', NULL), + (26, 'de_DE', NULL), + (27, 'de_DE', NULL), + (28, 'de_DE', NULL), + (29, 'de_DE', NULL), + (30, 'de_DE', NULL), + (31, 'de_DE', NULL), + (32, 'de_DE', NULL), + (33, 'de_DE', NULL), + (34, 'de_DE', NULL), + (35, 'de_DE', NULL), + (36, 'de_DE', NULL), + (37, 'de_DE', NULL), + (38, 'de_DE', NULL), + (39, 'de_DE', NULL), + (40, 'de_DE', NULL), + (41, 'de_DE', NULL), + (42, 'de_DE', NULL), + (43, 'de_DE', NULL), + (44, 'de_DE', NULL), + (45, 'de_DE', NULL), + (46, 'de_DE', NULL), + (47, 'de_DE', NULL), + (48, 'de_DE', NULL), + (1, 'en_US', 'Euro'), + (2, 'en_US', 'United States Dollar'), + (3, 'en_US', 'UK Pound'), + (4, 'en_US', 'Franc'), + (5, 'en_US', 'Peso'), + (6, 'en_US', 'Złoty'), + (7, 'en_US', 'Yuan'), + (8, 'en_US', 'Krone'), + (9, 'en_US', 'Lei'), + (10, 'en_US', 'Guaraní'), + (11, 'en_US', 'Peso Argentino'), + (12, 'en_US', 'Belarusian ruble'), + (13, 'en_US', 'Dollar'), + (14, 'en_US', 'Dinar'), + (15, 'en_US', 'Krona'), + (16, 'en_US', 'Croatian Kuna'), + (17, 'en_US', 'Danish krone'), + (18, 'en_US', 'Nigerian naira'), + (19, 'en_US', 'Hong Kong Dollar'), + (20, 'en_US', 'Dollar (CAD)'), + (21, 'en_US', 'Riyal'), + (22, 'en_US', 'Czech koruna'), + (23, 'en_US', 'Colón'), + (24, 'en_US', 'Manat'), + (25, 'en_US', 'Rupiah'), + (26, 'en_US', 'Rupee'), + (27, 'en_US', 'Real'), + (28, 'en_US', 'Đồng'), + (29, 'en_US', 'Philippine Peso'), + (30, 'en_US', 'Quetzal'), + (31, 'en_US', 'Lira'), + (32, 'en_US', 'Yen'), + (33, 'en_US', 'Ruble'), + (34, 'en_US', 'Nuevo Sol'), + (35, 'en_US', 'Pound'), + (36, 'en_US', 'Lari'), + (37, 'en_US', 'Boliviano'), + (38, 'en_US', 'United Arab Emirates dirham'), + (39, 'en_US', 'Baht'), + (40, 'en_US', 'Shekel'), + (41, 'en_US', 'Ringgit'), + (42, 'en_US', 'Bolívar fuerte'), + (43, 'en_US', 'Forint'), + (44, 'en_US', 'Kenyan shilling'), + (45, 'en_US', 'Гривна'), + (46, 'en_US', 'Tunisian Dinar'), + (47, 'en_US', 'Lev'), + (48, 'en_US', 'Indian Rupee'), + (1, 'es_ES', 'Euro'), + (2, 'es_ES', 'Dólar Estadunidense'), + (3, 'es_ES', 'Libra Reino Unido'), + (4, 'es_ES', NULL), + (5, 'es_ES', NULL), + (6, 'es_ES', NULL), + (7, 'es_ES', NULL), + (8, 'es_ES', NULL), + (9, 'es_ES', NULL), + (10, 'es_ES', NULL), + (11, 'es_ES', NULL), + (12, 'es_ES', NULL), + (13, 'es_ES', NULL), + (14, 'es_ES', NULL), + (15, 'es_ES', NULL), + (16, 'es_ES', NULL), + (17, 'es_ES', NULL), + (18, 'es_ES', NULL), + (19, 'es_ES', 'Dólar de Hong Kong'), + (20, 'es_ES', NULL), + (21, 'es_ES', NULL), + (22, 'es_ES', NULL), + (23, 'es_ES', NULL), + (24, 'es_ES', NULL), + (25, 'es_ES', NULL), + (26, 'es_ES', NULL), + (27, 'es_ES', NULL), + (28, 'es_ES', NULL), + (29, 'es_ES', NULL), + (30, 'es_ES', NULL), + (31, 'es_ES', NULL), + (32, 'es_ES', NULL), + (33, 'es_ES', NULL), + (34, 'es_ES', NULL), + (35, 'es_ES', NULL), + (36, 'es_ES', NULL), + (37, 'es_ES', NULL), + (38, 'es_ES', NULL), + (39, 'es_ES', NULL), + (40, 'es_ES', NULL), + (41, 'es_ES', NULL), + (42, 'es_ES', NULL), + (43, 'es_ES', NULL), + (44, 'es_ES', NULL), + (45, 'es_ES', NULL), + (46, 'es_ES', NULL), + (47, 'es_ES', NULL), + (48, 'es_ES', NULL), + (1, 'fr_FR', 'Euro'), + (2, 'fr_FR', 'Dollar Américain'), + (3, 'fr_FR', 'Livre anglaise'), + (4, 'fr_FR', 'Franc'), + (5, 'fr_FR', 'Peso'), + (6, 'fr_FR', 'Złoty'), + (7, 'fr_FR', 'Yuan'), + (8, 'fr_FR', 'Couronne Norvégienne'), + (9, 'fr_FR', 'Lei'), + (10, 'fr_FR', 'Guaraní'), + (11, 'fr_FR', 'Peso Argentin'), + (12, 'fr_FR', 'Rouble Biélorusse'), + (13, 'fr_FR', 'Dollar'), + (14, 'fr_FR', 'Dinar'), + (15, 'fr_FR', 'Couronne Suédoise'), + (16, 'fr_FR', 'Kuna Croate'), + (17, 'fr_FR', 'Couronne Danoise'), + (18, 'fr_FR', 'Naira Nigérien'), + (19, 'fr_FR', 'Dollar de Honk-Kong'), + (20, 'fr_FR', 'Dollar Canadien'), + (21, 'fr_FR', 'Riyal'), + (22, 'fr_FR', 'Couronne Tchèque'), + (23, 'fr_FR', 'Colón'), + (24, 'fr_FR', 'Manat'), + (25, 'fr_FR', 'Roupie Indonésienne'), + (26, 'fr_FR', 'Roupie Pakistanaise'), + (27, 'fr_FR', 'Real'), + (28, 'fr_FR', 'Đồng'), + (29, 'fr_FR', 'Peso Philippin'), + (30, 'fr_FR', 'Quetzal'), + (31, 'fr_FR', 'Lire'), + (32, 'fr_FR', 'Yen'), + (33, 'fr_FR', 'Rouble'), + (34, 'fr_FR', 'Nuevo Sol'), + (35, 'fr_FR', 'Livre'), + (36, 'fr_FR', 'Lari'), + (37, 'fr_FR', 'Bolivie'), + (38, 'fr_FR', 'Dirham des Émirats Arabes Unis'), + (39, 'fr_FR', 'Baht'), + (40, 'fr_FR', 'Shekel'), + (41, 'fr_FR', 'Ringgit'), + (42, 'fr_FR', 'Bolivar Vénézuélien'), + (43, 'fr_FR', 'Forint'), + (44, 'fr_FR', 'Shilling Kenyan'), + (45, 'fr_FR', 'Hryvnia Ukrainien'), + (46, 'fr_FR', 'Dinar Tunisien'), + (47, 'fr_FR', 'Lev'), + (48, 'fr_FR', 'Roupie Hindoue') +; + +INSERT INTO `country_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES + (1, 'de_DE', 'Afghanistan', NULL, NULL, NULL), + (2, 'de_DE', 'Südafrika', NULL, NULL, NULL), + (3, 'de_DE', 'Albanien', NULL, NULL, NULL), + (4, 'de_DE', 'Algerien', NULL, NULL, NULL), + (5, 'de_DE', 'Deutschland', NULL, NULL, NULL), + (6, 'de_DE', 'Andorra', NULL, NULL, NULL), + (7, 'de_DE', 'Angola', NULL, NULL, NULL), + (8, 'de_DE', 'Antigua und Barbuda', NULL, NULL, NULL), + (9, 'de_DE', 'Saudi-Arabien', NULL, NULL, NULL), + (10, 'de_DE', 'Argentinien', NULL, NULL, NULL), + (11, 'de_DE', 'Armenien', NULL, NULL, NULL), + (12, 'de_DE', 'Australien', NULL, NULL, NULL), + (13, 'de_DE', 'Österreich', NULL, NULL, NULL), + (14, 'de_DE', 'Aserbaidschan', NULL, NULL, NULL), + (15, 'de_DE', 'Bahamas', NULL, NULL, NULL), + (16, 'de_DE', 'Bahrein', NULL, NULL, NULL), + (17, 'de_DE', 'Bangladesch', NULL, NULL, NULL), + (18, 'de_DE', 'Barbados', NULL, NULL, NULL), + (19, 'de_DE', 'Weißrussland', NULL, NULL, NULL), + (20, 'de_DE', 'Belgien', NULL, NULL, NULL), + (21, 'de_DE', 'Belize', NULL, NULL, NULL), + (22, 'de_DE', 'Bénin', NULL, NULL, NULL), + (23, 'de_DE', 'Bhutan', NULL, NULL, NULL), + (24, 'de_DE', 'Weißrussland', NULL, NULL, NULL), + (25, 'de_DE', 'Birma', NULL, NULL, NULL), + (26, 'de_DE', 'Bolivien', NULL, NULL, NULL), + (27, 'de_DE', 'Bosnien Herzegovina', NULL, NULL, NULL), + (28, 'de_DE', 'Botswana', NULL, NULL, NULL), + (29, 'de_DE', 'Brasilien', NULL, NULL, NULL), + (30, 'de_DE', 'Brunei', NULL, NULL, NULL), + (31, 'de_DE', 'Bulgarien', NULL, NULL, NULL), + (32, 'de_DE', 'Burkina Faso', NULL, NULL, NULL), + (33, 'de_DE', 'Burundi', NULL, NULL, NULL), + (34, 'de_DE', 'Kambodscha', NULL, NULL, NULL), + (35, 'de_DE', 'Kamerun', NULL, NULL, NULL), + (37, 'de_DE', 'Kap Verde', NULL, NULL, NULL), + (38, 'de_DE', 'Chile', NULL, NULL, NULL), + (39, 'de_DE', 'China', NULL, NULL, NULL), + (40, 'de_DE', 'Zypern', NULL, NULL, NULL), + (41, 'de_DE', 'Kolumbien', NULL, NULL, NULL), + (42, 'de_DE', 'Komoren', NULL, NULL, NULL), + (43, 'de_DE', 'Kongo', NULL, NULL, NULL), + (44, 'de_DE', 'Cookinseln', NULL, NULL, NULL), + (45, 'de_DE', 'Nordkorea', NULL, NULL, NULL), + (46, 'de_DE', 'Südkorea', NULL, NULL, NULL), + (47, 'de_DE', 'Costa Rica', NULL, NULL, NULL), + (48, 'de_DE', 'Elfenbeinküste', NULL, NULL, NULL), + (49, 'de_DE', 'Kroatien', NULL, NULL, NULL), + (50, 'de_DE', 'Kuba', NULL, NULL, NULL), + (51, 'de_DE', 'Dänemark', NULL, NULL, NULL), + (52, 'de_DE', 'Djibuti', NULL, NULL, NULL), + (53, 'de_DE', 'Dominikanische Republik', NULL, NULL, NULL), + (54, 'de_DE', 'Ägypten', NULL, NULL, NULL), + (55, 'de_DE', 'Vereinigte Arabische Emirate', NULL, NULL, NULL), + (56, 'de_DE', 'Ecuador', NULL, NULL, NULL), + (57, 'de_DE', 'Eritrea', NULL, NULL, NULL), + (58, 'de_DE', 'Spanien', NULL, NULL, NULL), + (59, 'de_DE', 'Estland', NULL, NULL, NULL), + (61, 'de_DE', 'Äthiopien', NULL, NULL, NULL), + (62, 'de_DE', 'Fiji', NULL, NULL, NULL), + (63, 'de_DE', 'Finnland', NULL, NULL, NULL), + (64, 'de_DE', 'Frankreich', NULL, NULL, NULL), + (65, 'de_DE', 'Gabun', NULL, NULL, NULL), + (66, 'de_DE', 'Gambie', NULL, NULL, NULL), + (67, 'de_DE', 'Georgien', NULL, NULL, NULL), + (68, 'de_DE', 'Ghana', NULL, NULL, NULL), + (69, 'de_DE', 'Griechenland', NULL, NULL, NULL), + (70, 'de_DE', 'Grenada', NULL, NULL, NULL), + (71, 'de_DE', 'Guatemala', NULL, NULL, NULL), + (72, 'de_DE', 'Guinea', NULL, NULL, NULL), + (73, 'de_DE', 'Guinea-Bissau', NULL, NULL, NULL), + (74, 'de_DE', 'Äquatorialguinea', NULL, NULL, NULL), + (75, 'de_DE', 'Guyana', NULL, NULL, NULL), + (76, 'de_DE', 'Haiti', NULL, NULL, NULL), + (77, 'de_DE', 'Honduras', NULL, NULL, NULL), + (78, 'de_DE', 'Ungarn', NULL, NULL, NULL), + (79, 'de_DE', 'Indien', NULL, NULL, NULL), + (80, 'de_DE', 'Indonesien', NULL, NULL, NULL), + (81, 'de_DE', 'Iran', NULL, NULL, NULL), + (82, 'de_DE', 'Irak', NULL, NULL, NULL), + (83, 'de_DE', 'Irland', NULL, NULL, NULL), + (84, 'de_DE', 'Island', NULL, NULL, NULL), + (85, 'de_DE', 'Israel', NULL, NULL, NULL), + (86, 'de_DE', 'Italien', NULL, NULL, NULL), + (87, 'de_DE', 'Jamaika', NULL, NULL, NULL), + (88, 'de_DE', 'Japan', NULL, NULL, NULL), + (89, 'de_DE', 'Jordanien', NULL, NULL, NULL), + (90, 'de_DE', 'Kasachstan', NULL, NULL, NULL), + (91, 'de_DE', 'Kenia', NULL, NULL, NULL), + (92, 'de_DE', 'Kirgisistan', NULL, NULL, NULL), + (93, 'de_DE', 'Kiribati', NULL, NULL, NULL), + (94, 'de_DE', 'Kuwait', NULL, NULL, NULL), + (95, 'de_DE', 'Laos', NULL, NULL, NULL), + (96, 'de_DE', 'Lesotho', NULL, NULL, NULL), + (97, 'de_DE', 'Lettland', NULL, NULL, NULL), + (98, 'de_DE', 'Libanon', NULL, NULL, NULL), + (99, 'de_DE', 'Liberia', NULL, NULL, NULL), + (100, 'de_DE', 'Libyen', NULL, NULL, NULL), + (101, 'de_DE', 'Liechtenstein', NULL, NULL, NULL), + (102, 'de_DE', 'Litauen', NULL, NULL, NULL), + (103, 'de_DE', 'Luxemburg', NULL, NULL, NULL), + (104, 'de_DE', 'Mazedonien', NULL, NULL, NULL), + (105, 'de_DE', 'Madagaskar', NULL, NULL, NULL), + (106, 'de_DE', 'Malaysien', NULL, NULL, NULL), + (107, 'de_DE', 'Malawi', NULL, NULL, NULL), + (108, 'de_DE', 'Malediven', NULL, NULL, NULL), + (109, 'de_DE', 'Mali', NULL, NULL, NULL), + (110, 'de_DE', 'Malta', NULL, NULL, NULL), + (111, 'de_DE', 'Marokko', NULL, NULL, NULL), + (112, 'de_DE', 'Marshallinseln', NULL, NULL, NULL), + (113, 'de_DE', 'Mauritius', NULL, NULL, NULL), + (114, 'de_DE', 'Mauretanien', NULL, NULL, NULL), + (115, 'de_DE', 'Mexiko', NULL, NULL, NULL), + (116, 'de_DE', 'Mikronesien', NULL, NULL, NULL), + (117, 'de_DE', 'Moldau', NULL, NULL, NULL), + (118, 'de_DE', 'Monaco', NULL, NULL, NULL), + (119, 'de_DE', 'Mongolei', NULL, NULL, NULL), + (120, 'de_DE', 'Mosambik', NULL, NULL, NULL), + (121, 'de_DE', 'Namibia', NULL, NULL, NULL), + (122, 'de_DE', 'Nauru', NULL, NULL, NULL), + (123, 'de_DE', 'Nepal', NULL, NULL, NULL), + (124, 'de_DE', 'Nicaragua', NULL, NULL, NULL), + (125, 'de_DE', 'Niger', NULL, NULL, NULL), + (126, 'de_DE', 'Nigeria', NULL, NULL, NULL), + (127, 'de_DE', 'Niue', NULL, NULL, NULL), + (128, 'de_DE', 'Norwegen', NULL, NULL, NULL), + (129, 'de_DE', 'Neuseeland', NULL, NULL, NULL), + (130, 'de_DE', 'Oman', NULL, NULL, NULL), + (131, 'de_DE', 'Uganda', NULL, NULL, NULL), + (132, 'de_DE', 'Usbekistan', NULL, NULL, NULL), + (133, 'de_DE', 'Pakistan', NULL, NULL, NULL), + (134, 'de_DE', 'Panama', NULL, NULL, NULL), + (135, 'de_DE', 'Papua-Neuguinea', NULL, NULL, NULL), + (136, 'de_DE', 'Paraguay', NULL, NULL, NULL), + (137, 'de_DE', 'Niederlande', NULL, NULL, NULL), + (138, 'de_DE', 'Peru', NULL, NULL, NULL), + (139, 'de_DE', 'Philippinen', NULL, NULL, NULL), + (140, 'de_DE', 'Polen', NULL, NULL, NULL), + (141, 'de_DE', 'Portugal', NULL, NULL, NULL), + (142, 'de_DE', 'Katar', NULL, NULL, NULL), + (143, 'de_DE', 'Zentralafrikanische Republik', NULL, NULL, NULL), + (144, 'de_DE', 'Dominikanische Republik', NULL, NULL, NULL), + (145, 'de_DE', 'Tschechische Republik', NULL, NULL, NULL), + (146, 'de_DE', 'Rumänien', NULL, NULL, NULL), + (147, 'de_DE', 'Vereinigtes Königreich', NULL, NULL, NULL), + (148, 'de_DE', 'Russland', NULL, NULL, NULL), + (149, 'de_DE', 'Ruanda', NULL, NULL, NULL), + (150, 'de_DE', 'St. Kitts und Nevis', NULL, NULL, NULL), + (151, 'de_DE', 'St. Lucia', NULL, NULL, NULL), + (152, 'de_DE', 'Saint-Marin', NULL, NULL, NULL), + (153, 'de_DE', 'St. Vincent und die Grenadinen', NULL, NULL, NULL), + (154, 'de_DE', 'Salomon-Inseln', NULL, NULL, NULL), + (155, 'de_DE', 'El Salvador', NULL, NULL, NULL), + (156, 'de_DE', 'West-Samoa', NULL, NULL, NULL), + (157, 'de_DE', 'São Tomé und Príncipe', NULL, NULL, NULL), + (158, 'de_DE', 'Senegal', NULL, NULL, NULL), + (159, 'de_DE', 'Seychellen', NULL, NULL, NULL), + (160, 'de_DE', 'Sierra Leone', NULL, NULL, NULL), + (161, 'de_DE', 'Singapur', NULL, NULL, NULL), + (162, 'de_DE', 'Slowakei', NULL, NULL, NULL), + (163, 'de_DE', 'Slowenien', NULL, NULL, NULL), + (164, 'de_DE', 'Somalia', NULL, NULL, NULL), + (165, 'de_DE', 'Sudan', NULL, NULL, NULL), + (166, 'de_DE', 'Sri Lanka', NULL, NULL, NULL), + (167, 'de_DE', 'Schweden', NULL, NULL, NULL), + (168, 'de_DE', 'Schweiz', NULL, NULL, NULL), + (169, 'de_DE', 'Suriname', NULL, NULL, NULL), + (170, 'de_DE', 'Swaziland', NULL, NULL, NULL), + (171, 'de_DE', 'Syrien', NULL, NULL, NULL), + (172, 'de_DE', 'Tadschikistan', NULL, NULL, NULL), + (173, 'de_DE', 'Tansania', NULL, NULL, NULL), + (174, 'de_DE', 'Tschad', NULL, NULL, NULL), + (175, 'de_DE', 'Thailand', NULL, NULL, NULL), + (176, 'de_DE', 'Togo', NULL, NULL, NULL), + (177, 'de_DE', 'Tonga', NULL, NULL, NULL), + (178, 'de_DE', 'Trinidad und Tobago', NULL, NULL, NULL), + (179, 'de_DE', 'Tunesien', NULL, NULL, NULL), + (180, 'de_DE', 'Turkménistan', NULL, NULL, NULL), + (181, 'de_DE', 'Türkei', NULL, NULL, NULL), + (182, 'de_DE', 'Tuvalu', NULL, NULL, NULL), + (183, 'de_DE', 'Ukraine', NULL, NULL, NULL), + (184, 'de_DE', 'Uruguay', NULL, NULL, NULL), + (185, 'de_DE', 'der Vatikan', NULL, NULL, NULL), + (186, 'de_DE', 'Vanuatu', NULL, NULL, NULL), + (187, 'de_DE', 'Venezuela', NULL, NULL, NULL), + (188, 'de_DE', 'Vietnam', NULL, NULL, NULL), + (189, 'de_DE', 'Jemen', NULL, NULL, NULL), + (191, 'de_DE', 'Zaire', NULL, NULL, NULL), + (192, 'de_DE', 'Sambia', NULL, NULL, NULL), + (193, 'de_DE', 'Zimbabwe', NULL, NULL, NULL), + (196, 'de_DE', NULL, NULL, NULL, NULL), + (246, 'de_DE', NULL, NULL, NULL, NULL), + (259, 'de_DE', 'Guadeloupe', NULL, NULL, NULL), + (260, 'de_DE', 'Französisch-Guayana', NULL, NULL, NULL), + (261, 'de_DE', 'Martinique', NULL, NULL, NULL), + (262, 'de_DE', 'Mayotte', NULL, NULL, NULL), + (263, 'de_DE', 'La Réunion', NULL, NULL, NULL), + (264, 'de_DE', 'Saint-Pierre und Miquelon', NULL, NULL, NULL), + (265, 'de_DE', 'Neu-Kaledonien', NULL, NULL, NULL), + (266, 'de_DE', 'Französisch-Polynesien', NULL, NULL, NULL), + (267, 'de_DE', 'Wallis und Futuna', NULL, NULL, NULL), + (269, 'de_DE', 'Hong Kong', NULL, NULL, NULL), + (270, 'de_DE', 'Saint-Barthélemy', NULL, NULL, NULL), + (271, 'de_DE', 'Saint-Martin (franz. Teil)', NULL, NULL, NULL), + (272, 'de_DE', 'Französische Süd- und Antarktisgebiete', NULL, NULL, NULL), + (1, 'en_US', 'Afghanistan', NULL, NULL, NULL), + (2, 'en_US', 'South Africa', NULL, NULL, NULL), + (3, 'en_US', 'Albania', NULL, NULL, NULL), + (4, 'en_US', 'Algeria', NULL, NULL, NULL), + (5, 'en_US', 'Germany', NULL, NULL, NULL), + (6, 'en_US', 'Andorra', NULL, NULL, NULL), + (7, 'en_US', 'Angola', NULL, NULL, NULL), + (8, 'en_US', 'Antigua and Barbuda', NULL, NULL, NULL), + (9, 'en_US', 'Saudi Arabia', NULL, NULL, NULL), + (10, 'en_US', 'Argentina', NULL, NULL, NULL), + (11, 'en_US', 'Armenia', NULL, NULL, NULL), + (12, 'en_US', 'Australia', NULL, NULL, NULL), + (13, 'en_US', 'Austria', NULL, NULL, NULL), + (14, 'en_US', 'Azerbaijan', NULL, NULL, NULL), + (15, 'en_US', 'Bahamas', NULL, NULL, NULL), + (16, 'en_US', 'Bahrain', NULL, NULL, NULL), + (17, 'en_US', 'Bangladesh', NULL, NULL, NULL), + (18, 'en_US', 'Barbados', NULL, NULL, NULL), + (19, 'en_US', 'Belarus', NULL, NULL, NULL), + (20, 'en_US', 'Belgium', NULL, NULL, NULL), + (21, 'en_US', 'Belize', NULL, NULL, NULL), + (22, 'en_US', 'Benin', NULL, NULL, NULL), + (23, 'en_US', 'Bhutan', NULL, NULL, NULL), + (24, 'en_US', 'Bielorussia', NULL, NULL, NULL), + (25, 'en_US', 'Burma', NULL, NULL, NULL), + (26, 'en_US', 'Bolivia', NULL, NULL, NULL), + (27, 'en_US', 'Bosnia and Herzegovina', NULL, NULL, NULL), + (28, 'en_US', 'Botswana', NULL, NULL, NULL), + (29, 'en_US', 'Brazil', NULL, NULL, NULL), + (30, 'en_US', 'Brunei', NULL, NULL, NULL), + (31, 'en_US', 'Bulgaria', NULL, NULL, NULL), + (32, 'en_US', 'Burkina', NULL, NULL, NULL), + (33, 'en_US', 'Burundi', NULL, NULL, NULL), + (34, 'en_US', 'Cambodia', NULL, NULL, NULL), + (35, 'en_US', 'Cameroon', NULL, NULL, NULL), + (37, 'en_US', 'Cape Verde', NULL, NULL, NULL), + (38, 'en_US', 'Chile', NULL, NULL, NULL), + (39, 'en_US', 'China', NULL, NULL, NULL), + (40, 'en_US', 'Cyprus', NULL, NULL, NULL), + (41, 'en_US', 'Colombia', NULL, NULL, NULL), + (42, 'en_US', 'Comoros', NULL, NULL, NULL), + (43, 'en_US', 'Congo', NULL, NULL, NULL), + (44, 'en_US', 'Cook Islands', NULL, NULL, NULL), + (45, 'en_US', 'North Korea', NULL, NULL, NULL), + (46, 'en_US', 'South Korea', NULL, NULL, NULL), + (47, 'en_US', 'Costa Rica', NULL, NULL, NULL), + (48, 'en_US', 'Ivory Coast', NULL, NULL, NULL), + (49, 'en_US', 'Croatia', NULL, NULL, NULL), + (50, 'en_US', 'Cuba', NULL, NULL, NULL), + (51, 'en_US', 'Denmark', NULL, NULL, NULL), + (52, 'en_US', 'Djibouti', NULL, NULL, NULL), + (53, 'en_US', 'Dominica', NULL, NULL, NULL), + (54, 'en_US', 'Egypt', NULL, NULL, NULL), + (55, 'en_US', 'United Arab Emirates', NULL, NULL, NULL), + (56, 'en_US', 'Ecuador', NULL, NULL, NULL), + (57, 'en_US', 'Eritrea', NULL, NULL, NULL), + (58, 'en_US', 'Spain', NULL, NULL, NULL), + (59, 'en_US', 'Estonia', NULL, NULL, NULL), + (61, 'en_US', 'Ethiopia', NULL, NULL, NULL), + (62, 'en_US', 'Fiji', NULL, NULL, NULL), + (63, 'en_US', 'Finland', NULL, NULL, NULL), + (64, 'en_US', 'France metropolitan', NULL, NULL, NULL), + (65, 'en_US', 'Gabon', NULL, NULL, NULL), + (66, 'en_US', 'Gambia', NULL, NULL, NULL), + (67, 'en_US', 'Georgia', NULL, NULL, NULL), + (68, 'en_US', 'Ghana', NULL, NULL, NULL), + (69, 'en_US', 'Greece', NULL, NULL, NULL), + (70, 'en_US', 'Grenada', NULL, NULL, NULL), + (71, 'en_US', 'Guatemala', NULL, NULL, NULL), + (72, 'en_US', 'Guinea', NULL, NULL, NULL), + (73, 'en_US', 'Guinea-Bissau', NULL, NULL, NULL), + (74, 'en_US', 'Equatorial Guinea', NULL, NULL, NULL), + (75, 'en_US', 'Guyana', NULL, NULL, NULL), + (76, 'en_US', 'Haiti', NULL, NULL, NULL), + (77, 'en_US', 'Honduras', NULL, NULL, NULL), + (78, 'en_US', 'Hungary', NULL, NULL, NULL), + (79, 'en_US', 'India', NULL, NULL, NULL), + (80, 'en_US', 'Indonesia', NULL, NULL, NULL), + (81, 'en_US', 'Iran', NULL, NULL, NULL), + (82, 'en_US', 'Iraq', NULL, NULL, NULL), + (83, 'en_US', 'Ireland', NULL, NULL, NULL), + (84, 'en_US', 'Iceland', NULL, NULL, NULL), + (85, 'en_US', 'Israel', NULL, NULL, NULL), + (86, 'en_US', 'Italy', NULL, NULL, NULL), + (87, 'en_US', 'Jamaica', NULL, NULL, NULL), + (88, 'en_US', 'Japan', NULL, NULL, NULL), + (89, 'en_US', 'Jordan', NULL, NULL, NULL), + (90, 'en_US', 'Kazakhstan', NULL, NULL, NULL), + (91, 'en_US', 'Kenya', NULL, NULL, NULL), + (92, 'en_US', 'Kyrgyzstan', NULL, NULL, NULL), + (93, 'en_US', 'Kiribati', NULL, NULL, NULL), + (94, 'en_US', 'Kuwait', NULL, NULL, NULL), + (95, 'en_US', 'Laos', NULL, NULL, NULL), + (96, 'en_US', 'Lesotho', NULL, NULL, NULL), + (97, 'en_US', 'Latvia', NULL, NULL, NULL), + (98, 'en_US', 'Lebanon', NULL, NULL, NULL), + (99, 'en_US', 'Liberia', NULL, NULL, NULL), + (100, 'en_US', 'Libya', NULL, NULL, NULL), + (101, 'en_US', 'Liechtenstein', NULL, NULL, NULL), + (102, 'en_US', 'Lithuania', NULL, NULL, NULL), + (103, 'en_US', 'Luxembourg', NULL, NULL, NULL), + (104, 'en_US', 'Macedonia', NULL, NULL, NULL), + (105, 'en_US', 'Madagascar', NULL, NULL, NULL), + (106, 'en_US', 'Malaysia', NULL, NULL, NULL), + (107, 'en_US', 'Malawi', NULL, NULL, NULL), + (108, 'en_US', 'Maldives', NULL, NULL, NULL), + (109, 'en_US', 'Mali', NULL, NULL, NULL), + (110, 'en_US', 'Malta', NULL, NULL, NULL), + (111, 'en_US', 'Morocco', NULL, NULL, NULL), + (112, 'en_US', 'Marshall Islands', NULL, NULL, NULL), + (113, 'en_US', 'Mauritius', NULL, NULL, NULL), + (114, 'en_US', 'Mauritania', NULL, NULL, NULL), + (115, 'en_US', 'Mexico', NULL, NULL, NULL), + (116, 'en_US', 'Micronesia', NULL, NULL, NULL), + (117, 'en_US', 'Moldova', NULL, NULL, NULL), + (118, 'en_US', 'Monaco', NULL, NULL, NULL), + (119, 'en_US', 'Mongolia', NULL, NULL, NULL), + (120, 'en_US', 'Mozambique', NULL, NULL, NULL), + (121, 'en_US', 'Namibia', NULL, NULL, NULL), + (122, 'en_US', 'Nauru', NULL, NULL, NULL), + (123, 'en_US', 'Nepal', NULL, NULL, NULL), + (124, 'en_US', 'Nicaragua', NULL, NULL, NULL), + (125, 'en_US', 'Niger', NULL, NULL, NULL), + (126, 'en_US', 'Nigeria', NULL, NULL, NULL), + (127, 'en_US', 'Niue', NULL, NULL, NULL), + (128, 'en_US', 'Norway', NULL, NULL, NULL), + (129, 'en_US', 'New Zealand', NULL, NULL, NULL), + (130, 'en_US', 'Oman', NULL, NULL, NULL), + (131, 'en_US', 'Uganda', NULL, NULL, NULL), + (132, 'en_US', 'Uzbekistan', NULL, NULL, NULL), + (133, 'en_US', 'Pakistan', NULL, NULL, NULL), + (134, 'en_US', 'Panama', NULL, NULL, NULL), + (135, 'en_US', 'Papua Nueva Guinea', NULL, NULL, NULL), + (136, 'en_US', 'Paraguay', NULL, NULL, NULL), + (137, 'en_US', 'Netherlands', NULL, NULL, NULL), + (138, 'en_US', 'Peru', NULL, NULL, NULL), + (139, 'en_US', 'Philippines', NULL, NULL, NULL), + (140, 'en_US', 'Poland', NULL, NULL, NULL), + (141, 'en_US', 'Portugal', NULL, NULL, NULL), + (142, 'en_US', 'Qatar', NULL, NULL, NULL), + (143, 'en_US', 'Central African Republic', NULL, NULL, NULL), + (144, 'en_US', 'Dominican Republic', NULL, NULL, NULL), + (145, 'en_US', 'Czech Republic', NULL, NULL, NULL), + (146, 'en_US', 'Romania', NULL, NULL, NULL), + (147, 'en_US', 'United Kingdom', NULL, NULL, NULL), + (148, 'en_US', 'Russia', NULL, NULL, NULL), + (149, 'en_US', 'Rwanda', NULL, NULL, NULL), + (150, 'en_US', 'Saint Kitts and Nevis', NULL, NULL, NULL), + (151, 'en_US', 'Saint Lucia', NULL, NULL, NULL), + (152, 'en_US', 'San Marino', NULL, NULL, NULL), + (153, 'en_US', 'Saint Vincent and the Grenadines', NULL, NULL, NULL), + (154, 'en_US', 'Solomon Islands', NULL, NULL, NULL), + (155, 'en_US', 'El Salvador', NULL, NULL, NULL), + (156, 'en_US', 'Western Samoa', NULL, NULL, NULL), + (157, 'en_US', 'Sao Tome and Principe', NULL, NULL, NULL), + (158, 'en_US', 'Senegal', NULL, NULL, NULL), + (159, 'en_US', 'Seychelles', NULL, NULL, NULL), + (160, 'en_US', 'Sierra Leone', NULL, NULL, NULL), + (161, 'en_US', 'Singapore', NULL, NULL, NULL), + (162, 'en_US', 'Slovakia', NULL, NULL, NULL), + (163, 'en_US', 'Slovenia', NULL, NULL, NULL), + (164, 'en_US', 'Somalia', NULL, NULL, NULL), + (165, 'en_US', 'Sudan', NULL, NULL, NULL), + (166, 'en_US', 'Sri Lanka', NULL, NULL, NULL), + (167, 'en_US', 'Sweden', NULL, NULL, NULL), + (168, 'en_US', 'Switzerland', NULL, NULL, NULL), + (169, 'en_US', 'Suriname', NULL, NULL, NULL), + (170, 'en_US', 'Swaziland', NULL, NULL, NULL), + (171, 'en_US', 'Syria', NULL, NULL, NULL), + (172, 'en_US', 'Tajikistan', NULL, NULL, NULL), + (173, 'en_US', 'Tanzania', NULL, NULL, NULL), + (174, 'en_US', 'Chad', NULL, NULL, NULL), + (175, 'en_US', 'Thailand', NULL, NULL, NULL), + (176, 'en_US', 'Togo', NULL, NULL, NULL), + (177, 'en_US', 'Tonga', NULL, NULL, NULL), + (178, 'en_US', 'Trinidad and Tobago', NULL, NULL, NULL), + (179, 'en_US', 'Tunisia', NULL, NULL, NULL), + (180, 'en_US', 'Turkmenistan', NULL, NULL, NULL), + (181, 'en_US', 'Turkey', NULL, NULL, NULL), + (182, 'en_US', 'Tuvalu', NULL, NULL, NULL), + (183, 'en_US', 'Ukraine', NULL, NULL, NULL), + (184, 'en_US', 'Uruguay', NULL, NULL, NULL), + (185, 'en_US', 'The Vatican', NULL, NULL, NULL), + (186, 'en_US', 'Vanuatu', NULL, NULL, NULL), + (187, 'en_US', 'Venezuela', NULL, NULL, NULL), + (188, 'en_US', 'Vietnam', NULL, NULL, NULL), + (189, 'en_US', 'Yemen', NULL, NULL, NULL), + (191, 'en_US', 'Zaire', NULL, NULL, NULL), + (192, 'en_US', 'Zambia', NULL, NULL, NULL), + (193, 'en_US', 'Zimbabwe', NULL, NULL, NULL), + (196, 'en_US', 'USA', NULL, NULL, NULL), + (246, 'en_US', 'Canada', NULL, NULL, NULL), + (259, 'en_US', 'Guadeloupe', NULL, NULL, NULL), + (260, 'en_US', 'Guyane Française', NULL, NULL, NULL), + (261, 'en_US', 'Martinique', NULL, NULL, NULL), + (262, 'en_US', 'Mayotte', NULL, NULL, NULL), + (263, 'en_US', 'Réunion(La)', NULL, NULL, NULL), + (264, 'en_US', 'St Pierre et Miquelon', NULL, NULL, NULL), + (265, 'en_US', 'Nouvelle-Calédonie', NULL, NULL, NULL), + (266, 'en_US', 'Polynésie française', NULL, NULL, NULL), + (267, 'en_US', 'Wallis-et-Futuna', NULL, NULL, NULL), + (269, 'en_US', 'Hong Kong', NULL, NULL, NULL), + (270, 'en_US', 'Saint Barthélemy', NULL, NULL, NULL), + (271, 'en_US', 'Saint Martin (French part)', NULL, NULL, NULL), + (272, 'en_US', 'French Southern Territories', NULL, NULL, NULL), + (1, 'es_ES', 'Afganistán', NULL, NULL, NULL), + (2, 'es_ES', 'Sudáfrica', NULL, NULL, NULL), + (3, 'es_ES', 'Albania', NULL, NULL, NULL), + (4, 'es_ES', 'Argelia', NULL, NULL, NULL), + (5, 'es_ES', 'Alemania', NULL, NULL, NULL), + (6, 'es_ES', 'Andorra', NULL, NULL, NULL), + (7, 'es_ES', 'Angola', NULL, NULL, NULL), + (8, 'es_ES', 'Antigua y Barbuda', NULL, NULL, NULL), + (9, 'es_ES', 'Arabia Saudita', NULL, NULL, NULL), + (10, 'es_ES', 'Argentina', NULL, NULL, NULL), + (11, 'es_ES', 'Armenia', NULL, NULL, NULL), + (12, 'es_ES', 'Australia', NULL, NULL, NULL), + (13, 'es_ES', 'Austria', NULL, NULL, NULL), + (14, 'es_ES', 'Azerbaiyán', NULL, NULL, NULL), + (15, 'es_ES', 'Bahamas', NULL, NULL, NULL), + (16, 'es_ES', 'Bahrein', NULL, NULL, NULL), + (17, 'es_ES', 'Bangladesh', NULL, NULL, NULL), + (18, 'es_ES', 'Barbados', NULL, NULL, NULL), + (19, 'es_ES', 'Belarús', NULL, NULL, NULL), + (20, 'es_ES', 'Bélgica', NULL, NULL, NULL), + (21, 'es_ES', 'Belice', NULL, NULL, NULL), + (22, 'es_ES', 'Benin', NULL, NULL, NULL), + (23, 'es_ES', 'Bhután', NULL, NULL, NULL), + (24, 'es_ES', 'Bielorusia', NULL, NULL, NULL), + (25, 'es_ES', 'Birmania', NULL, NULL, NULL), + (26, 'es_ES', 'Bolivia', NULL, NULL, NULL), + (27, 'es_ES', 'Bosnia y Herzegovina', NULL, NULL, NULL), + (28, 'es_ES', 'Botswana', NULL, NULL, NULL), + (29, 'es_ES', 'Brasil', NULL, NULL, NULL), + (30, 'es_ES', 'Brunei', NULL, NULL, NULL), + (31, 'es_ES', 'Bulgaria', NULL, NULL, NULL), + (32, 'es_ES', 'Burkina', NULL, NULL, NULL), + (33, 'es_ES', 'Burundi', NULL, NULL, NULL), + (34, 'es_ES', 'Camboya', NULL, NULL, NULL), + (35, 'es_ES', 'Camerún', NULL, NULL, NULL), + (37, 'es_ES', 'Cabo Verde', NULL, NULL, NULL), + (38, 'es_ES', 'Chile', NULL, NULL, NULL), + (39, 'es_ES', 'China', NULL, NULL, NULL), + (40, 'es_ES', 'Chipre', NULL, NULL, NULL), + (41, 'es_ES', 'Colombia', NULL, NULL, NULL), + (42, 'es_ES', 'Comoras', NULL, NULL, NULL), + (43, 'es_ES', 'Congo', NULL, NULL, NULL), + (44, 'es_ES', 'Cook', NULL, NULL, NULL), + (45, 'es_ES', 'Corea del Norte', NULL, NULL, NULL), + (46, 'es_ES', 'Corea del Sur', NULL, NULL, NULL), + (47, 'es_ES', 'Costa Rica', NULL, NULL, NULL), + (48, 'es_ES', 'Costa de Marfil', NULL, NULL, NULL), + (49, 'es_ES', 'Croacia', NULL, NULL, NULL), + (50, 'es_ES', 'Cuba', NULL, NULL, NULL), + (51, 'es_ES', 'Dinamarca', NULL, NULL, NULL), + (52, 'es_ES', 'Djibouti', NULL, NULL, NULL), + (53, 'es_ES', 'Dominica', NULL, NULL, NULL), + (54, 'es_ES', 'Egipto', NULL, NULL, NULL), + (55, 'es_ES', 'Emiratos Árabes Unidos', NULL, NULL, NULL), + (56, 'es_ES', 'Ecuador', NULL, NULL, NULL), + (57, 'es_ES', 'Eritrea', NULL, NULL, NULL), + (58, 'es_ES', 'España', NULL, NULL, NULL), + (59, 'es_ES', 'Estonia', NULL, NULL, NULL), + (61, 'es_ES', 'Etiopía', NULL, NULL, NULL), + (62, 'es_ES', 'Fiji', NULL, NULL, NULL), + (63, 'es_ES', 'Finlandia', NULL, NULL, NULL), + (64, 'es_ES', 'Francia', NULL, NULL, NULL), + (65, 'es_ES', 'Gabón', NULL, NULL, NULL), + (66, 'es_ES', 'Gambia', NULL, NULL, NULL), + (67, 'es_ES', 'Georgia', NULL, NULL, NULL), + (68, 'es_ES', 'Ghana', NULL, NULL, NULL), + (69, 'es_ES', 'Grecia', NULL, NULL, NULL), + (70, 'es_ES', 'Granada', NULL, NULL, NULL), + (71, 'es_ES', 'Guatemala', NULL, NULL, NULL), + (72, 'es_ES', 'Guinea', NULL, NULL, NULL), + (73, 'es_ES', 'Guinea-Bissau', NULL, NULL, NULL), + (74, 'es_ES', 'Guinea Ecuatorial', NULL, NULL, NULL), + (75, 'es_ES', 'Guyana', NULL, NULL, NULL), + (76, 'es_ES', 'Haití', NULL, NULL, NULL), + (77, 'es_ES', 'Honduras', NULL, NULL, NULL), + (78, 'es_ES', 'Hungría', NULL, NULL, NULL), + (79, 'es_ES', 'India', NULL, NULL, NULL), + (80, 'es_ES', 'Indonesia', NULL, NULL, NULL), + (81, 'es_ES', 'Irán', NULL, NULL, NULL), + (82, 'es_ES', 'Iraq', NULL, NULL, NULL), + (83, 'es_ES', 'Irlanda', NULL, NULL, NULL), + (84, 'es_ES', 'Islandia', NULL, NULL, NULL), + (85, 'es_ES', 'Israel', NULL, NULL, NULL), + (86, 'es_ES', 'Italia', NULL, NULL, NULL), + (87, 'es_ES', 'Jamaica', NULL, NULL, NULL), + (88, 'es_ES', 'Japón', NULL, NULL, NULL), + (89, 'es_ES', 'Jordania', NULL, NULL, NULL), + (90, 'es_ES', 'Kazajstán', NULL, NULL, NULL), + (91, 'es_ES', 'Kenia', NULL, NULL, NULL), + (92, 'es_ES', 'Kirguistán', NULL, NULL, NULL), + (93, 'es_ES', 'Kiribati', NULL, NULL, NULL), + (94, 'es_ES', 'Kuwait', NULL, NULL, NULL), + (95, 'es_ES', 'Laos', NULL, NULL, NULL), + (96, 'es_ES', 'Lesoto', NULL, NULL, NULL), + (97, 'es_ES', 'Letonia', NULL, NULL, NULL), + (98, 'es_ES', 'Líbano', NULL, NULL, NULL), + (99, 'es_ES', 'Liberia', NULL, NULL, NULL), + (100, 'es_ES', 'Libia', NULL, NULL, NULL), + (101, 'es_ES', 'Liechtenstein', NULL, NULL, NULL), + (102, 'es_ES', 'Lituania', NULL, NULL, NULL), + (103, 'es_ES', 'Luxemburgo', NULL, NULL, NULL), + (104, 'es_ES', 'Macedonia', NULL, NULL, NULL), + (105, 'es_ES', 'Madagascar', NULL, NULL, NULL), + (106, 'es_ES', 'Malasia', NULL, NULL, NULL), + (107, 'es_ES', 'Malawi', NULL, NULL, NULL), + (108, 'es_ES', 'Maldivas', NULL, NULL, NULL), + (109, 'es_ES', 'Malí', NULL, NULL, NULL), + (110, 'es_ES', 'Malta', NULL, NULL, NULL), + (111, 'es_ES', 'Marruecos', NULL, NULL, NULL), + (112, 'es_ES', 'Marshall', NULL, NULL, NULL), + (113, 'es_ES', 'Mauricio', NULL, NULL, NULL), + (114, 'es_ES', 'Mauritania', NULL, NULL, NULL), + (115, 'es_ES', 'Méjico', NULL, NULL, NULL), + (116, 'es_ES', 'Micronesia', NULL, NULL, NULL), + (117, 'es_ES', 'Moldova', NULL, NULL, NULL), + (118, 'es_ES', 'Mónaco', NULL, NULL, NULL), + (119, 'es_ES', 'Mongolia', NULL, NULL, NULL), + (120, 'es_ES', 'Mozambique', NULL, NULL, NULL), + (121, 'es_ES', 'Namibia', NULL, NULL, NULL), + (122, 'es_ES', 'Nauru', NULL, NULL, NULL), + (123, 'es_ES', 'Nepal', NULL, NULL, NULL), + (124, 'es_ES', 'Nicaragua', NULL, NULL, NULL), + (125, 'es_ES', 'Níger', NULL, NULL, NULL), + (126, 'es_ES', 'Nigeria', NULL, NULL, NULL), + (127, 'es_ES', 'Niue', NULL, NULL, NULL), + (128, 'es_ES', 'Noruega', NULL, NULL, NULL), + (129, 'es_ES', 'Nueva Zelandia', NULL, NULL, NULL), + (130, 'es_ES', 'Omán', NULL, NULL, NULL), + (131, 'es_ES', NULL, NULL, NULL, NULL), + (132, 'es_ES', 'Uzbekistán', NULL, NULL, NULL), + (133, 'es_ES', 'Pakistán', NULL, NULL, NULL), + (134, 'es_ES', 'Panamá', NULL, NULL, NULL), + (135, 'es_ES', 'Papua Nueva Guinea', NULL, NULL, NULL), + (136, 'es_ES', 'Paraguay', NULL, NULL, NULL), + (137, 'es_ES', 'Países Bajos', NULL, NULL, NULL), + (138, 'es_ES', 'Perú', NULL, NULL, NULL), + (139, 'es_ES', 'Filipinas', NULL, NULL, NULL), + (140, 'es_ES', 'Polonia', NULL, NULL, NULL), + (141, 'es_ES', 'Portugal', NULL, NULL, NULL), + (142, 'es_ES', 'Qatar', NULL, NULL, NULL), + (143, 'es_ES', 'República Centroafricana', NULL, NULL, NULL), + (144, 'es_ES', 'República Dominicana', NULL, NULL, NULL), + (145, 'es_ES', 'República Checa', NULL, NULL, NULL), + (146, 'es_ES', 'Rumania', NULL, NULL, NULL), + (147, 'es_ES', 'Reino Unido', NULL, NULL, NULL), + (148, 'es_ES', 'Rusia', NULL, NULL, NULL), + (149, 'es_ES', 'Ruanda', NULL, NULL, NULL), + (150, 'es_ES', 'San Cristóbal', NULL, NULL, NULL), + (151, 'es_ES', 'Santa Lucía', NULL, NULL, NULL), + (152, 'es_ES', 'San Marino', NULL, NULL, NULL), + (153, 'es_ES', 'San Vicente y las Granadinas', NULL, NULL, NULL), + (154, 'es_ES', 'Salomón', NULL, NULL, NULL), + (155, 'es_ES', 'El Salvador', NULL, NULL, NULL), + (156, 'es_ES', 'Samoa', NULL, NULL, NULL), + (157, 'es_ES', 'Santo Tomé y Príncipe', NULL, NULL, NULL), + (158, 'es_ES', 'Senegal', NULL, NULL, NULL), + (159, 'es_ES', 'Seychelles', NULL, NULL, NULL), + (160, 'es_ES', 'Sierra Leona', NULL, NULL, NULL), + (161, 'es_ES', 'Singapur', NULL, NULL, NULL), + (162, 'es_ES', 'Eslovaquia', NULL, NULL, NULL), + (163, 'es_ES', 'Eslovenia', NULL, NULL, NULL), + (164, 'es_ES', 'Somalia', NULL, NULL, NULL), + (165, 'es_ES', 'Sudán', NULL, NULL, NULL), + (166, 'es_ES', 'Sri Lanka', NULL, NULL, NULL), + (167, 'es_ES', 'Suecia', NULL, NULL, NULL), + (168, 'es_ES', 'Suiza', NULL, NULL, NULL), + (169, 'es_ES', 'Suriname', NULL, NULL, NULL), + (170, 'es_ES', 'Swazilandia', NULL, NULL, NULL), + (171, 'es_ES', 'Siria', NULL, NULL, NULL), + (172, 'es_ES', 'Tayikistán', NULL, NULL, NULL), + (173, 'es_ES', 'Tanzanía', NULL, NULL, NULL), + (174, 'es_ES', 'Chad', NULL, NULL, NULL), + (175, 'es_ES', 'Tailandia', NULL, NULL, NULL), + (176, 'es_ES', 'Togo', NULL, NULL, NULL), + (177, 'es_ES', 'Tonga', NULL, NULL, NULL), + (178, 'es_ES', 'Trinidad y Tabago', NULL, NULL, NULL), + (179, 'es_ES', 'Túnez', NULL, NULL, NULL), + (180, 'es_ES', 'Turkmenistán', NULL, NULL, NULL), + (181, 'es_ES', 'Turquía', NULL, NULL, NULL), + (182, 'es_ES', 'Tuvalu', NULL, NULL, NULL), + (183, 'es_ES', 'Ucrania', NULL, NULL, NULL), + (184, 'es_ES', 'Uruguay', NULL, NULL, NULL), + (185, 'es_ES', 'El Vatican', NULL, NULL, NULL), + (186, 'es_ES', 'Vanuatu', NULL, NULL, NULL), + (187, 'es_ES', 'Venezuela', NULL, NULL, NULL), + (188, 'es_ES', 'Viet Nam', NULL, NULL, NULL), + (189, 'es_ES', 'Yemen', NULL, NULL, NULL), + (191, 'es_ES', 'Zaire', NULL, NULL, NULL), + (192, 'es_ES', 'Zambia', NULL, NULL, NULL), + (193, 'es_ES', 'Zimbabue', NULL, NULL, NULL), + (196, 'es_ES', NULL, NULL, NULL, NULL), + (246, 'es_ES', NULL, NULL, NULL, NULL), + (259, 'es_ES', 'Guadalupe', NULL, NULL, NULL), + (260, 'es_ES', 'Guayana Francesa', NULL, NULL, NULL), + (261, 'es_ES', 'Martinica', NULL, NULL, NULL), + (262, 'es_ES', 'Mayotte', NULL, NULL, NULL), + (263, 'es_ES', 'Réunion(la)', NULL, NULL, NULL), + (264, 'es_ES', 'San Pedro y Miquelón', NULL, NULL, NULL), + (265, 'es_ES', 'Nouvelle-Calédonie', NULL, NULL, NULL), + (266, 'es_ES', 'Polinesia Francesa', NULL, NULL, NULL), + (267, 'es_ES', 'Wallis-et-Futuna', NULL, NULL, NULL), + (269, 'es_ES', 'Hong Kong', NULL, NULL, NULL), + (270, 'es_ES', 'San Bartolomé', NULL, NULL, NULL), + (271, 'es_ES', 'San Martín (parte francesa)', NULL, NULL, NULL), + (272, 'es_ES', 'Tierras Australes y Antárticas Francesas', NULL, NULL, NULL), + (1, 'fr_FR', 'Afghanistan', NULL, NULL, NULL), + (2, 'fr_FR', 'Afrique du Sud', NULL, NULL, NULL), + (3, 'fr_FR', 'Albanie', NULL, NULL, NULL), + (4, 'fr_FR', 'Algérie', NULL, NULL, NULL), + (5, 'fr_FR', 'Allemagne', NULL, NULL, NULL), + (6, 'fr_FR', 'Andorre', NULL, NULL, NULL), + (7, 'fr_FR', 'Angola', NULL, NULL, NULL), + (8, 'fr_FR', 'Antigua-et-Barbuda', NULL, NULL, NULL), + (9, 'fr_FR', 'Arabie saoudite', NULL, NULL, NULL), + (10, 'fr_FR', 'Argentine', NULL, NULL, NULL), + (11, 'fr_FR', 'Arménie', NULL, NULL, NULL), + (12, 'fr_FR', 'Australie', NULL, NULL, NULL), + (13, 'fr_FR', 'Autriche', NULL, NULL, NULL), + (14, 'fr_FR', 'Azerbaïdjan', NULL, NULL, NULL), + (15, 'fr_FR', 'Bahamas', NULL, NULL, NULL), + (16, 'fr_FR', 'Bahreïn', NULL, NULL, NULL), + (17, 'fr_FR', 'Bangladesh', NULL, NULL, NULL), + (18, 'fr_FR', 'Barbade', NULL, NULL, NULL), + (19, 'fr_FR', 'Belarus', NULL, NULL, NULL), + (20, 'fr_FR', 'Belgique', NULL, NULL, NULL), + (21, 'fr_FR', 'Belize', NULL, NULL, NULL), + (22, 'fr_FR', 'Bénin', NULL, NULL, NULL), + (23, 'fr_FR', 'Bhoutan', NULL, NULL, NULL), + (24, 'fr_FR', 'Biélorussie', NULL, NULL, NULL), + (25, 'fr_FR', 'Birmanie', NULL, NULL, NULL), + (26, 'fr_FR', 'Bolivie', NULL, NULL, NULL), + (27, 'fr_FR', 'Bosnie-Herzégovine', NULL, NULL, NULL), + (28, 'fr_FR', 'Botswana', NULL, NULL, NULL), + (29, 'fr_FR', 'Brésil', NULL, NULL, NULL), + (30, 'fr_FR', 'Brunei', NULL, NULL, NULL), + (31, 'fr_FR', 'Bulgarie', NULL, NULL, NULL), + (32, 'fr_FR', 'Burkina', NULL, NULL, NULL), + (33, 'fr_FR', 'Burundi', NULL, NULL, NULL), + (34, 'fr_FR', 'Cambodge', NULL, NULL, NULL), + (35, 'fr_FR', 'Cameroun', NULL, NULL, NULL), + (37, 'fr_FR', 'Cap-Vert', NULL, NULL, NULL), + (38, 'fr_FR', 'Chili', NULL, NULL, NULL), + (39, 'fr_FR', 'Chine', NULL, NULL, NULL), + (40, 'fr_FR', 'Chypre', NULL, NULL, NULL), + (41, 'fr_FR', 'Colombie', NULL, NULL, NULL), + (42, 'fr_FR', 'Comores', NULL, NULL, NULL), + (43, 'fr_FR', 'Congo', NULL, NULL, NULL), + (44, 'fr_FR', 'Cook', NULL, NULL, NULL), + (45, 'fr_FR', 'Corée du Nord', NULL, NULL, NULL), + (46, 'fr_FR', 'Corée du Sud', NULL, NULL, NULL), + (47, 'fr_FR', 'Costa Rica', NULL, NULL, NULL), + (48, 'fr_FR', 'Côte dIvoire', NULL, NULL, NULL), + (49, 'fr_FR', 'Croatie', NULL, NULL, NULL), + (50, 'fr_FR', 'Cuba', NULL, NULL, NULL), + (51, 'fr_FR', 'Danemark', NULL, NULL, NULL), + (52, 'fr_FR', 'Djibouti', NULL, NULL, NULL), + (53, 'fr_FR', 'Dominique', NULL, NULL, NULL), + (54, 'fr_FR', 'Égypte', NULL, NULL, NULL), + (55, 'fr_FR', 'Émirats arabes unis', NULL, NULL, NULL), + (56, 'fr_FR', 'Équateur', NULL, NULL, NULL), + (57, 'fr_FR', 'Érythrée', NULL, NULL, NULL), + (58, 'fr_FR', 'Espagne', NULL, NULL, NULL), + (59, 'fr_FR', 'Estonie', NULL, NULL, NULL), + (61, 'fr_FR', 'Éthiopie', NULL, NULL, NULL), + (62, 'fr_FR', 'Fidji', NULL, NULL, NULL), + (63, 'fr_FR', 'Finlande', NULL, NULL, NULL), + (64, 'fr_FR', 'France métropolitaine', NULL, NULL, NULL), + (65, 'fr_FR', 'Gabon', NULL, NULL, NULL), + (66, 'fr_FR', 'Gambie', NULL, NULL, NULL), + (67, 'fr_FR', 'Géorgie', NULL, NULL, NULL), + (68, 'fr_FR', 'Ghana', NULL, NULL, NULL), + (69, 'fr_FR', 'Grèce', NULL, NULL, NULL), + (70, 'fr_FR', 'Grenade', NULL, NULL, NULL), + (71, 'fr_FR', 'Guatemala', NULL, NULL, NULL), + (72, 'fr_FR', 'Guinée', NULL, NULL, NULL), + (73, 'fr_FR', 'Guinée-Bissao', NULL, NULL, NULL), + (74, 'fr_FR', 'Guinée équatoriale', NULL, NULL, NULL), + (75, 'fr_FR', 'Guyane', NULL, NULL, NULL), + (76, 'fr_FR', 'Haïti', NULL, NULL, NULL), + (77, 'fr_FR', 'Honduras', NULL, NULL, NULL), + (78, 'fr_FR', 'Hongrie', NULL, NULL, NULL), + (79, 'fr_FR', 'Inde', NULL, NULL, NULL), + (80, 'fr_FR', 'Indonésie', NULL, NULL, NULL), + (81, 'fr_FR', 'Iran', NULL, NULL, NULL), + (82, 'fr_FR', 'Iraq', NULL, NULL, NULL), + (83, 'fr_FR', 'Irlande', NULL, NULL, NULL), + (84, 'fr_FR', 'Islande', NULL, NULL, NULL), + (85, 'fr_FR', 'Israël', NULL, NULL, NULL), + (86, 'fr_FR', 'Italie', NULL, NULL, NULL), + (87, 'fr_FR', 'Jamaïque', NULL, NULL, NULL), + (88, 'fr_FR', 'Japon', NULL, NULL, NULL), + (89, 'fr_FR', 'Jordanie', NULL, NULL, NULL), + (90, 'fr_FR', 'Kazakhstan', NULL, NULL, NULL), + (91, 'fr_FR', 'Kenya', NULL, NULL, NULL), + (92, 'fr_FR', 'Kirghizistan', NULL, NULL, NULL), + (93, 'fr_FR', 'Kiribati', NULL, NULL, NULL), + (94, 'fr_FR', 'Koweït', NULL, NULL, NULL), + (95, 'fr_FR', 'Laos', NULL, NULL, NULL), + (96, 'fr_FR', 'Lesotho', NULL, NULL, NULL), + (97, 'fr_FR', 'Lettonie', NULL, NULL, NULL), + (98, 'fr_FR', 'Liban', NULL, NULL, NULL), + (99, 'fr_FR', 'Liberia', NULL, NULL, NULL), + (100, 'fr_FR', 'Libye', NULL, NULL, NULL), + (101, 'fr_FR', 'Liechtenstein', NULL, NULL, NULL), + (102, 'fr_FR', 'Lituanie', NULL, NULL, NULL), + (103, 'fr_FR', 'Luxembourg', NULL, NULL, NULL), + (104, 'fr_FR', 'Macédoine', NULL, NULL, NULL), + (105, 'fr_FR', 'Madagascar', NULL, NULL, NULL), + (106, 'fr_FR', 'Malaisie', NULL, NULL, NULL), + (107, 'fr_FR', 'Malawi', NULL, NULL, NULL), + (108, 'fr_FR', 'Maldives', NULL, NULL, NULL), + (109, 'fr_FR', 'Mali', NULL, NULL, NULL), + (110, 'fr_FR', 'Malte', NULL, NULL, NULL), + (111, 'fr_FR', 'Maroc', NULL, NULL, NULL), + (112, 'fr_FR', 'Marshall', NULL, NULL, NULL), + (113, 'fr_FR', 'Maurice', NULL, NULL, NULL), + (114, 'fr_FR', 'Mauritanie', NULL, NULL, NULL), + (115, 'fr_FR', 'Mexique', NULL, NULL, NULL), + (116, 'fr_FR', 'Micronésie', NULL, NULL, NULL), + (117, 'fr_FR', 'Moldavie', NULL, NULL, NULL), + (118, 'fr_FR', 'Principauté de Monaco', NULL, NULL, NULL), + (119, 'fr_FR', 'Mongolie', NULL, NULL, NULL), + (120, 'fr_FR', 'Mozambique', NULL, NULL, NULL), + (121, 'fr_FR', 'Namibie', NULL, NULL, NULL), + (122, 'fr_FR', 'Nauru', NULL, NULL, NULL), + (123, 'fr_FR', 'Népal', NULL, NULL, NULL), + (124, 'fr_FR', 'Nicaragua', NULL, NULL, NULL), + (125, 'fr_FR', 'Niger', NULL, NULL, NULL), + (126, 'fr_FR', 'Nigeria', NULL, NULL, NULL), + (127, 'fr_FR', 'Niue', NULL, NULL, NULL), + (128, 'fr_FR', 'Norvège', NULL, NULL, NULL), + (129, 'fr_FR', 'Nouvelle-Zélande', NULL, NULL, NULL), + (130, 'fr_FR', 'Oman', NULL, NULL, NULL), + (131, 'fr_FR', 'Ouganda', NULL, NULL, NULL), + (132, 'fr_FR', 'Ouzbékistan', NULL, NULL, NULL), + (133, 'fr_FR', 'Pakistan', NULL, NULL, NULL), + (134, 'fr_FR', 'Panama', NULL, NULL, NULL), + (135, 'fr_FR', 'Papouasie', NULL, NULL, NULL), + (136, 'fr_FR', 'Paraguay', NULL, NULL, NULL), + (137, 'fr_FR', 'Pays-Bas', NULL, NULL, NULL), + (138, 'fr_FR', 'Pérou', NULL, NULL, NULL), + (139, 'fr_FR', 'Philippines', NULL, NULL, NULL), + (140, 'fr_FR', 'Pologne', NULL, NULL, NULL), + (141, 'fr_FR', 'Portugal', NULL, NULL, NULL), + (142, 'fr_FR', 'Qatar', NULL, NULL, NULL), + (143, 'fr_FR', 'République centrafricaine', NULL, NULL, NULL), + (144, 'fr_FR', 'République dominicaine', NULL, NULL, NULL), + (145, 'fr_FR', 'République tchèque', NULL, NULL, NULL), + (146, 'fr_FR', 'Roumanie', NULL, NULL, NULL), + (147, 'fr_FR', 'Royaume-Uni', NULL, NULL, NULL), + (148, 'fr_FR', 'Russie', NULL, NULL, NULL), + (149, 'fr_FR', 'Rwanda', NULL, NULL, NULL), + (150, 'fr_FR', 'Saint-Christophe-et-Niévès', NULL, NULL, NULL), + (151, 'fr_FR', 'Sainte-Lucie', NULL, NULL, NULL), + (152, 'fr_FR', 'Saint-Marin', NULL, NULL, NULL), + (153, 'fr_FR', 'Saint-Vincent-et-les Grenadines', NULL, NULL, NULL), + (154, 'fr_FR', 'Salomon', NULL, NULL, NULL), + (155, 'fr_FR', 'Salvador', NULL, NULL, NULL), + (156, 'fr_FR', 'Samoa occidentales', NULL, NULL, NULL), + (157, 'fr_FR', 'Sao Tomé-et-Principe', NULL, NULL, NULL), + (158, 'fr_FR', 'Sénégal', NULL, NULL, NULL), + (159, 'fr_FR', 'Seychelles', NULL, NULL, NULL), + (160, 'fr_FR', 'Sierra Léone', NULL, NULL, NULL), + (161, 'fr_FR', 'Singapour', NULL, NULL, NULL), + (162, 'fr_FR', 'Slovaquie', NULL, NULL, NULL), + (163, 'fr_FR', 'Slovénie', NULL, NULL, NULL), + (164, 'fr_FR', 'Somalie', NULL, NULL, NULL), + (165, 'fr_FR', 'Soudan', NULL, NULL, NULL), + (166, 'fr_FR', 'Sri Lanka', NULL, NULL, NULL), + (167, 'fr_FR', 'Suède', NULL, NULL, NULL), + (168, 'fr_FR', 'Suisse', NULL, NULL, NULL), + (169, 'fr_FR', 'Suriname', NULL, NULL, NULL), + (170, 'fr_FR', 'Swaziland', NULL, NULL, NULL), + (171, 'fr_FR', 'Syrie', NULL, NULL, NULL), + (172, 'fr_FR', 'Tadjikistan', NULL, NULL, NULL), + (173, 'fr_FR', 'Tanzanie', NULL, NULL, NULL), + (174, 'fr_FR', 'Tchad', NULL, NULL, NULL), + (175, 'fr_FR', 'Thaïlande', NULL, NULL, NULL), + (176, 'fr_FR', 'Togo', NULL, NULL, NULL), + (177, 'fr_FR', 'Îles Tonga', NULL, NULL, NULL), + (178, 'fr_FR', 'Trinité-et-Tobago', NULL, NULL, NULL), + (179, 'fr_FR', 'Tunisie', NULL, NULL, NULL), + (180, 'fr_FR', 'Turkménistan', NULL, NULL, NULL), + (181, 'fr_FR', 'Turquie', NULL, NULL, NULL), + (182, 'fr_FR', 'Tuvalu', NULL, NULL, NULL), + (183, 'fr_FR', 'Ukraine', NULL, NULL, NULL), + (184, 'fr_FR', 'Uruguay', NULL, NULL, NULL), + (185, 'fr_FR', 'Vatican', NULL, NULL, NULL), + (186, 'fr_FR', 'Vanuatu', NULL, NULL, NULL), + (187, 'fr_FR', 'Vénézuela', NULL, NULL, NULL), + (188, 'fr_FR', 'Viêt Nam', NULL, NULL, NULL), + (189, 'fr_FR', 'Yémen', NULL, NULL, NULL), + (191, 'fr_FR', 'Zaïre', NULL, NULL, NULL), + (192, 'fr_FR', 'Zambie', NULL, NULL, NULL), + (193, 'fr_FR', 'Zimbabwe', NULL, NULL, NULL), + (196, 'fr_FR', 'États-Unis', NULL, NULL, NULL), + (246, 'fr_FR', 'Canada', NULL, NULL, NULL), + (259, 'fr_FR', 'Guadeloupe', NULL, NULL, NULL), + (260, 'fr_FR', 'Guyane Française', NULL, NULL, NULL), + (261, 'fr_FR', 'Martinique', NULL, NULL, NULL), + (262, 'fr_FR', 'Mayotte', NULL, NULL, NULL), + (263, 'fr_FR', 'Réunion(La)', NULL, NULL, NULL), + (264, 'fr_FR', 'St Pierre et Miquelon', NULL, NULL, NULL), + (265, 'fr_FR', 'Nouvelle-Calédonie', NULL, NULL, NULL), + (266, 'fr_FR', 'Polynésie française', NULL, NULL, NULL), + (267, 'fr_FR', 'Wallis-et-Futuna', NULL, NULL, NULL), + (269, 'fr_FR', 'Hong Kong', NULL, NULL, NULL), + (270, 'fr_FR', 'Saint-Barthélemy', NULL, NULL, NULL), + (271, 'fr_FR', 'Saint-Martin (Antilles françaises)', NULL, NULL, NULL), + (272, 'fr_FR', 'Terres australes et antarctiques françaises', NULL, NULL, NULL) +; + +INSERT INTO `state_i18n` (`id`, `locale`, `title`) VALUES + + (1, 'de_DE', NULL), + (2, 'de_DE', NULL), + (3, 'de_DE', NULL), + (4, 'de_DE', NULL), + (5, 'de_DE', NULL), + (6, 'de_DE', NULL), + (7, 'de_DE', NULL), + (8, 'de_DE', NULL), + (9, 'de_DE', NULL), + (10, 'de_DE', 'Georgien'), + (11, 'de_DE', NULL), + (12, 'de_DE', NULL), + (13, 'de_DE', NULL), + (14, 'de_DE', NULL), + (15, 'de_DE', NULL), + (16, 'de_DE', NULL), + (17, 'de_DE', NULL), + (18, 'de_DE', NULL), + (19, 'de_DE', NULL), + (20, 'de_DE', NULL), + (21, 'de_DE', NULL), + (22, 'de_DE', NULL), + (23, 'de_DE', NULL), + (24, 'de_DE', NULL), + (25, 'de_DE', NULL), + (26, 'de_DE', NULL), + (27, 'de_DE', NULL), + (28, 'de_DE', NULL), + (29, 'de_DE', NULL), + (30, 'de_DE', NULL), + (31, 'de_DE', NULL), + (32, 'de_DE', 'New York'), + (33, 'de_DE', NULL), + (34, 'de_DE', NULL), + (35, 'de_DE', NULL), + (36, 'de_DE', NULL), + (37, 'de_DE', NULL), + (38, 'de_DE', NULL), + (39, 'de_DE', NULL), + (40, 'de_DE', NULL), + (41, 'de_DE', NULL), + (42, 'de_DE', NULL), + (43, 'de_DE', NULL), + (44, 'de_DE', NULL), + (45, 'de_DE', NULL), + (46, 'de_DE', NULL), + (47, 'de_DE', NULL), + (48, 'de_DE', NULL), + (49, 'de_DE', NULL), + (50, 'de_DE', NULL), + (51, 'de_DE', NULL), + (52, 'de_DE', NULL), + (53, 'de_DE', NULL), + (54, 'de_DE', NULL), + (55, 'de_DE', NULL), + (56, 'de_DE', NULL), + (57, 'de_DE', NULL), + (58, 'de_DE', NULL), + (59, 'de_DE', NULL), + (60, 'de_DE', NULL), + (61, 'de_DE', NULL), + (62, 'de_DE', NULL), + (63, 'de_DE', NULL), + (64, 'de_DE', NULL), + (65, 'de_DE', NULL), + (66, 'de_DE', NULL), + (67, 'de_DE', NULL), + (68, 'de_DE', NULL), + (69, 'de_DE', NULL), + (70, 'de_DE', NULL), + (71, 'de_DE', NULL), + (72, 'de_DE', NULL), + (73, 'de_DE', NULL), + (74, 'de_DE', NULL), + (75, 'de_DE', NULL), + (76, 'de_DE', NULL), + (77, 'de_DE', NULL), + (78, 'de_DE', NULL), + (79, 'de_DE', NULL), + (80, 'de_DE', NULL), + (81, 'de_DE', NULL), + (82, 'de_DE', NULL), + (83, 'de_DE', NULL), + (84, 'de_DE', NULL), + (85, 'de_DE', NULL), + (86, 'de_DE', NULL), + (87, 'de_DE', NULL), + (88, 'de_DE', NULL), + (89, 'de_DE', NULL), + (90, 'de_DE', NULL), + (91, 'de_DE', NULL), + (92, 'de_DE', NULL), + (93, 'de_DE', NULL), + (94, 'de_DE', NULL), + (95, 'de_DE', NULL), + (96, 'de_DE', NULL), + (97, 'de_DE', NULL), + (98, 'de_DE', NULL), + (99, 'de_DE', NULL), + (100, 'de_DE', NULL), + (101, 'de_DE', NULL), + (102, 'de_DE', NULL), + (103, 'de_DE', NULL), + (104, 'de_DE', NULL), + (105, 'de_DE', NULL), + (106, 'de_DE', NULL), + (107, 'de_DE', NULL), + (108, 'de_DE', NULL), + (109, 'de_DE', NULL), + (110, 'de_DE', NULL), + (111, 'de_DE', NULL), + (112, 'de_DE', NULL), + (113, 'de_DE', NULL), + (114, 'de_DE', NULL), + (115, 'de_DE', NULL), + (116, 'de_DE', NULL), + (117, 'de_DE', NULL), + (118, 'de_DE', NULL), + (119, 'de_DE', NULL), + (120, 'de_DE', NULL), + (121, 'de_DE', NULL), + (122, 'de_DE', NULL), + (123, 'de_DE', NULL), + (124, 'de_DE', NULL), + (125, 'de_DE', NULL), + (126, 'de_DE', NULL), + (127, 'de_DE', NULL), + (128, 'de_DE', NULL), + (129, 'de_DE', NULL), + (130, 'de_DE', NULL), + (131, 'de_DE', NULL), + (132, 'de_DE', NULL), + (133, 'de_DE', NULL), + (134, 'de_DE', NULL), + (135, 'de_DE', NULL), + (136, 'de_DE', NULL), + (137, 'de_DE', NULL), + (138, 'de_DE', NULL), + (139, 'de_DE', NULL), + (140, 'de_DE', NULL), + (141, 'de_DE', NULL), + (142, 'de_DE', NULL), + (143, 'de_DE', NULL), + (144, 'de_DE', NULL), + (145, 'de_DE', NULL), + (146, 'de_DE', NULL), + (147, 'de_DE', NULL), + (148, 'de_DE', NULL), + (149, 'de_DE', NULL), + (150, 'de_DE', NULL), + (151, 'de_DE', NULL), + (152, 'de_DE', NULL), + (153, 'de_DE', NULL), + (154, 'de_DE', NULL), + (155, 'de_DE', NULL), + (156, 'de_DE', NULL), + (157, 'de_DE', NULL), + (158, 'de_DE', NULL), + (159, 'de_DE', NULL), + (160, 'de_DE', NULL), + (161, 'de_DE', NULL), + (162, 'de_DE', NULL), + (163, 'de_DE', NULL), + (164, 'de_DE', NULL), + (165, 'de_DE', NULL), + (166, 'de_DE', NULL), + (167, 'de_DE', NULL), + (168, 'de_DE', NULL), + (169, 'de_DE', NULL), + (170, 'de_DE', NULL), + (171, 'de_DE', NULL), + (172, 'de_DE', NULL), + (173, 'de_DE', NULL), + (174, 'de_DE', NULL), + (175, 'de_DE', NULL), + (176, 'de_DE', NULL), + (177, 'de_DE', NULL), + (178, 'de_DE', NULL), + (179, 'de_DE', NULL), + (180, 'de_DE', NULL), + (181, 'de_DE', NULL), + (182, 'de_DE', NULL), + (183, 'de_DE', NULL), + (184, 'de_DE', NULL), + (185, 'de_DE', NULL), + (186, 'de_DE', NULL), + (187, 'de_DE', NULL), + (188, 'de_DE', NULL), + (189, 'de_DE', NULL), + (190, 'de_DE', NULL), + (191, 'de_DE', NULL), + (192, 'de_DE', NULL), + (193, 'de_DE', NULL), + (194, 'de_DE', NULL), + (195, 'de_DE', NULL), + (196, 'de_DE', NULL), + (197, 'de_DE', NULL), + (198, 'de_DE', NULL), + (199, 'de_DE', NULL), + (200, 'de_DE', NULL), + (201, 'de_DE', NULL), + (202, 'de_DE', NULL), + (203, 'de_DE', NULL), + (204, 'de_DE', NULL), + (205, 'de_DE', NULL), + (206, 'de_DE', NULL), + (207, 'de_DE', NULL), + (208, 'de_DE', NULL), + (209, 'de_DE', NULL), + (210, 'de_DE', NULL), + (211, 'de_DE', NULL), + (212, 'de_DE', NULL), + (213, 'de_DE', NULL), + (214, 'de_DE', NULL), + (215, 'de_DE', NULL), + (216, 'de_DE', NULL), + (217, 'de_DE', NULL), + (218, 'de_DE', NULL), + (219, 'de_DE', NULL), + (220, 'de_DE', NULL), + (221, 'de_DE', NULL), + (222, 'de_DE', NULL), + (223, 'de_DE', NULL), + (224, 'de_DE', NULL), + (225, 'de_DE', NULL), + (226, 'de_DE', NULL), + (227, 'de_DE', NULL), + (228, 'de_DE', NULL), + (229, 'de_DE', NULL), + (230, 'de_DE', NULL), + (231, 'de_DE', NULL), + (232, 'de_DE', NULL), + (233, 'de_DE', NULL), + (234, 'de_DE', NULL), + (235, 'de_DE', NULL), + (236, 'de_DE', NULL), + (237, 'de_DE', NULL), + (238, 'de_DE', NULL), + (239, 'de_DE', NULL), + (240, 'de_DE', NULL), + (241, 'de_DE', NULL), + (242, 'de_DE', NULL), + (243, 'de_DE', NULL), + (244, 'de_DE', NULL), + (245, 'de_DE', NULL), + (246, 'de_DE', NULL), + (247, 'de_DE', NULL), + (248, 'de_DE', NULL), + (249, 'de_DE', NULL), + (250, 'de_DE', NULL), + (251, 'de_DE', NULL), + (252, 'de_DE', NULL), + (253, 'de_DE', NULL), + (254, 'de_DE', NULL), + (255, 'de_DE', NULL), + (256, 'de_DE', NULL), + (257, 'de_DE', NULL), + (258, 'de_DE', NULL), + (259, 'de_DE', NULL), + (260, 'de_DE', NULL), + (261, 'de_DE', NULL), + (262, 'de_DE', NULL), + (263, 'de_DE', NULL), + (264, 'de_DE', NULL), + (265, 'de_DE', NULL), + (266, 'de_DE', NULL), + (267, 'de_DE', NULL), + (268, 'de_DE', NULL), + (269, 'de_DE', NULL), + (270, 'de_DE', NULL), + (271, 'de_DE', NULL), + (272, 'de_DE', NULL), + (273, 'de_DE', NULL), + (274, 'de_DE', NULL), + (275, 'de_DE', NULL), + (276, 'de_DE', NULL), + (277, 'de_DE', NULL), + (278, 'de_DE', NULL), + (279, 'de_DE', NULL), + (280, 'de_DE', NULL), + (281, 'de_DE', NULL), + (282, 'de_DE', NULL), + (283, 'de_DE', NULL), + (284, 'de_DE', NULL), + (285, 'de_DE', NULL), + (286, 'de_DE', NULL), + (287, 'de_DE', NULL), + (288, 'de_DE', NULL), + (289, 'de_DE', NULL), + (290, 'de_DE', NULL), + (291, 'de_DE', NULL), + (292, 'de_DE', NULL), + (293, 'de_DE', NULL), + (294, 'de_DE', NULL), + (295, 'de_DE', NULL), + (296, 'de_DE', NULL), + (297, 'de_DE', NULL), + (298, 'de_DE', NULL), + (299, 'de_DE', NULL), + (300, 'de_DE', NULL), + (301, 'de_DE', NULL), + (302, 'de_DE', NULL), + (303, 'de_DE', NULL), + (304, 'de_DE', NULL), + (305, 'de_DE', NULL), + (306, 'de_DE', NULL), + (307, 'de_DE', NULL), + (308, 'de_DE', NULL), + (309, 'de_DE', NULL), + (310, 'de_DE', NULL), + (311, 'de_DE', NULL), + (312, 'de_DE', NULL), + + (1, 'en_US', 'Alabama'), + (2, 'en_US', 'Alaska'), + (3, 'en_US', 'Arizona'), + (4, 'en_US', 'Arkansas'), + (5, 'en_US', 'California'), + (6, 'en_US', 'Colorado'), + (7, 'en_US', 'Connecticut'), + (8, 'en_US', 'Delaware'), + (9, 'en_US', 'Florida'), + (10, 'en_US', 'Georgia'), + (11, 'en_US', 'Hawaii'), + (12, 'en_US', 'Idaho'), + (13, 'en_US', 'Illinois'), + (14, 'en_US', 'Indiana'), + (15, 'en_US', 'Iowa'), + (16, 'en_US', 'Kansas'), + (17, 'en_US', 'Kentucky'), + (18, 'en_US', 'Louisiana'), + (19, 'en_US', 'Maine'), + (20, 'en_US', 'Maryland'), + (21, 'en_US', 'Massachusetts'), + (22, 'en_US', 'Michigan'), + (23, 'en_US', 'Minnesota'), + (24, 'en_US', 'Mississippi'), + (25, 'en_US', 'Missouri'), + (26, 'en_US', 'Montana'), + (27, 'en_US', 'Nebraska'), + (28, 'en_US', 'Nevada'), + (29, 'en_US', 'New Hampshire'), + (30, 'en_US', 'New Jersey'), + (31, 'en_US', 'New Mexico'), + (32, 'en_US', 'New York'), + (33, 'en_US', 'North Carolina'), + (34, 'en_US', 'North Dakota'), + (35, 'en_US', 'Ohio'), + (36, 'en_US', 'Oklahoma'), + (37, 'en_US', 'Oregon'), + (38, 'en_US', 'Pennsylvania'), + (39, 'en_US', 'Rhode Island'), + (40, 'en_US', 'South Carolina'), + (41, 'en_US', 'South Dakota'), + (42, 'en_US', 'Tennessee'), + (43, 'en_US', 'Texas'), + (44, 'en_US', 'Utah'), + (45, 'en_US', 'Vermont'), + (46, 'en_US', 'Virginia'), + (47, 'en_US', 'Washington'), + (48, 'en_US', 'West Virginia'), + (49, 'en_US', 'Wisconsin'), + (50, 'en_US', 'Wyoming'), + (51, 'en_US', 'Puerto Rico'), + (52, 'en_US', 'US Virgin Islands'), + (53, 'en_US', 'District of Columbia'), + (54, 'en_US', 'Aguascalientes'), + (55, 'en_US', 'Baja California'), + (56, 'en_US', 'Baja California Sur'), + (57, 'en_US', 'Campeche'), + (58, 'en_US', 'Chiapas'), + (59, 'en_US', 'Chihuahua'), + (60, 'en_US', 'Coahuila'), + (61, 'en_US', 'Colima'), + (62, 'en_US', 'Distrito Federal'), + (63, 'en_US', 'Durango'), + (64, 'en_US', 'Guanajuato'), + (65, 'en_US', 'Guerrero'), + (66, 'en_US', 'Hidalgo'), + (67, 'en_US', 'Jalisco'), + (68, 'en_US', 'Estado de México'), + (69, 'en_US', 'Michoacán'), + (70, 'en_US', 'Morelos'), + (71, 'en_US', 'Nayarit'), + (72, 'en_US', 'Nuevo León'), + (73, 'en_US', 'Oaxaca'), + (74, 'en_US', 'Puebla'), + (75, 'en_US', 'Querétaro'), + (76, 'en_US', 'Quintana Roo'), + (77, 'en_US', 'San Luis Potosí'), + (78, 'en_US', 'Sinaloa'), + (79, 'en_US', 'Sonora'), + (80, 'en_US', 'Tabasco'), + (81, 'en_US', 'Tamaulipas'), + (82, 'en_US', 'Tlaxcala'), + (83, 'en_US', 'Veracruz'), + (84, 'en_US', 'Yucatán'), + (85, 'en_US', 'Zacatecas'), + (86, 'en_US', 'Ontario'), + (87, 'en_US', 'Quebec'), + (88, 'en_US', 'British Columbia'), + (89, 'en_US', 'Alberta'), + (90, 'en_US', 'Manitoba'), + (91, 'en_US', 'Saskatchewan'), + (92, 'en_US', 'Nova Scotia'), + (93, 'en_US', 'New Brunswick'), + (94, 'en_US', 'Newfoundland and Labrador'), + (95, 'en_US', 'Prince Edward Island'), + (96, 'en_US', 'Northwest Territories'), + (97, 'en_US', 'Yukon'), + (98, 'en_US', 'Nunavut'), + (99, 'en_US', 'Buenos Aires'), + (100, 'en_US', 'Catamarca'), + (101, 'en_US', 'Chaco'), + (102, 'en_US', 'Chubut'), + (103, 'en_US', 'Ciudad de Buenos Aires'), + (104, 'en_US', 'Córdoba'), + (105, 'en_US', 'Corrientes'), + (106, 'en_US', 'Entre Ríos'), + (107, 'en_US', 'Formosa'), + (108, 'en_US', 'Jujuy'), + (109, 'en_US', 'La Pampa'), + (110, 'en_US', 'La Rioja'), + (111, 'en_US', 'Mendoza'), + (112, 'en_US', 'Misiones'), + (113, 'en_US', 'Neuquén'), + (114, 'en_US', 'Río Negro'), + (115, 'en_US', 'Salta'), + (116, 'en_US', 'San Juan'), + (117, 'en_US', 'San Luis'), + (118, 'en_US', 'Santa Cruz'), + (119, 'en_US', 'Santa Fe'), + (120, 'en_US', 'Santiago del Estero'), + (121, 'en_US', 'Tierra del Fuego'), + (122, 'en_US', 'Tucumán'), + (123, 'en_US', 'Agrigento'), + (124, 'en_US', 'Alessandria'), + (125, 'en_US', 'Ancona'), + (126, 'en_US', 'Aosta'), + (127, 'en_US', 'Arezzo'), + (128, 'en_US', 'Ascoli Piceno'), + (129, 'en_US', 'Asti'), + (130, 'en_US', 'Avellino'), + (131, 'en_US', 'Bari'), + (132, 'en_US', 'Barletta-Andria-Trani'), + (133, 'en_US', 'Belluno'), + (134, 'en_US', 'Benevento'), + (135, 'en_US', 'Bergamo'), + (136, 'en_US', 'Biella'), + (137, 'en_US', 'Bologna'), + (138, 'en_US', 'Bolzano'), + (139, 'en_US', 'Brescia'), + (140, 'en_US', 'Brindisi'), + (141, 'en_US', 'Cagliari'), + (142, 'en_US', 'Caltanissetta'), + (143, 'en_US', 'Campobasso'), + (144, 'en_US', 'Carbonia-Iglesias'), + (145, 'en_US', 'Caserta'), + (146, 'en_US', 'Catania'), + (147, 'en_US', 'Catanzaro'), + (148, 'en_US', 'Chieti'), + (149, 'en_US', 'Como'), + (150, 'en_US', 'Cosenza'), + (151, 'en_US', 'Cremona'), + (152, 'en_US', 'Crotone'), + (153, 'en_US', 'Cuneo'), + (154, 'en_US', 'Enna'), + (155, 'en_US', 'Fermo'), + (156, 'en_US', 'Ferrara'), + (157, 'en_US', 'Firenze'), + (158, 'en_US', 'Foggia'), + (159, 'en_US', 'Forlì-Cesena'), + (160, 'en_US', 'Frosinone'), + (161, 'en_US', 'Genova'), + (162, 'en_US', 'Gorizia'), + (163, 'en_US', 'Grosseto'), + (164, 'en_US', 'Imperia'), + (165, 'en_US', 'Isernia'), + (166, 'en_US', 'L\'Aquila'), + (167, 'en_US', 'La Spezia'), + (168, 'en_US', 'Latina'), + (169, 'en_US', 'Lecce'), + (170, 'en_US', 'Lecco'), + (171, 'en_US', 'Livorno'), + (172, 'en_US', 'Lodi'), + (173, 'en_US', 'Lucca'), + (174, 'en_US', 'Macerata'), + (175, 'en_US', 'Mantova'), + (176, 'en_US', 'Massa'), + (177, 'en_US', 'Matera'), + (178, 'en_US', 'Medio Campidano'), + (179, 'en_US', 'Messina'), + (180, 'en_US', 'Milano'), + (181, 'en_US', 'Modena'), + (182, 'en_US', 'Monza e della Brianza'), + (183, 'en_US', 'Napoli'), + (184, 'en_US', 'Novara'), + (185, 'en_US', 'Nuoro'), + (186, 'en_US', 'Ogliastra'), + (187, 'en_US', 'Olbia-Tempio'), + (188, 'en_US', 'Oristano'), + (189, 'en_US', 'Padova'), + (190, 'en_US', 'Palermo'), + (191, 'en_US', 'Parma'), + (192, 'en_US', 'Pavia'), + (193, 'en_US', 'Perugia'), + (194, 'en_US', 'Pesaro-Urbino'), + (195, 'en_US', 'Pescara'), + (196, 'en_US', 'Piacenza'), + (197, 'en_US', 'Pisa'), + (198, 'en_US', 'Pistoia'), + (199, 'en_US', 'Pordenone'), + (200, 'en_US', 'Potenza'), + (201, 'en_US', 'Prato'), + (202, 'en_US', 'Ragusa'), + (203, 'en_US', 'Ravenna'), + (204, 'en_US', 'Reggio Calabria'), + (205, 'en_US', 'Reggio Emilia'), + (206, 'en_US', 'Rieti'), + (207, 'en_US', 'Rimini'), + (208, 'en_US', 'Roma'), + (209, 'en_US', 'Rovigo'), + (210, 'en_US', 'Salerno'), + (211, 'en_US', 'Sassari'), + (212, 'en_US', 'Savona'), + (213, 'en_US', 'Siena'), + (214, 'en_US', 'Siracusa'), + (215, 'en_US', 'Sondrio'), + (216, 'en_US', 'Taranto'), + (217, 'en_US', 'Teramo'), + (218, 'en_US', 'Terni'), + (219, 'en_US', 'Torino'), + (220, 'en_US', 'Trapani'), + (221, 'en_US', 'Trento'), + (222, 'en_US', 'Treviso'), + (223, 'en_US', 'Trieste'), + (224, 'en_US', 'Udine'), + (225, 'en_US', 'Varese'), + (226, 'en_US', 'Venezia'), + (227, 'en_US', 'Verbano-Cusio-Ossola'), + (228, 'en_US', 'Vercelli'), + (229, 'en_US', 'Verona'), + (230, 'en_US', 'Vibo Valentia'), + (231, 'en_US', 'Vicenza'), + (232, 'en_US', 'Viterbo'), + (233, 'en_US', 'Aceh'), + (234, 'en_US', 'Bali'), + (235, 'en_US', 'Bangka'), + (236, 'en_US', 'Banten'), + (237, 'en_US', 'Bengkulu'), + (238, 'en_US', 'Central Java'), + (239, 'en_US', 'Central Kalimantan'), + (240, 'en_US', 'Central Sulawesi'), + (241, 'en_US', 'Coat of arms of East Java'), + (242, 'en_US', 'East kalimantan'), + (243, 'en_US', 'East Nusa Tenggara'), + (244, 'en_US', 'Lambang propinsi'), + (245, 'en_US', 'Jakarta'), + (246, 'en_US', 'Jambi'), + (247, 'en_US', 'Lampung'), + (248, 'en_US', 'Maluku'), + (249, 'en_US', 'North Maluku'), + (250, 'en_US', 'North Sulawesi'), + (251, 'en_US', 'North Sumatra'), + (252, 'en_US', 'Papua'), + (253, 'en_US', 'Riau'), + (254, 'en_US', 'Lambang Riau'), + (255, 'en_US', 'Southeast Sulawesi'), + (256, 'en_US', 'South Kalimantan'), + (257, 'en_US', 'South Sulawesi'), + (258, 'en_US', 'South Sumatra'), + (259, 'en_US', 'West Java'), + (260, 'en_US', 'West Kalimantan'), + (261, 'en_US', 'West Nusa Tenggara'), + (262, 'en_US', 'Lambang Provinsi Papua Barat'), + (263, 'en_US', 'West Sulawesi'), + (264, 'en_US', 'West Sumatra'), + (265, 'en_US', 'Yogyakarta'), + (266, 'en_US', 'Aichi'), + (267, 'en_US', 'Akita'), + (268, 'en_US', 'Aomori'), + (269, 'en_US', 'Chiba'), + (270, 'en_US', 'Ehime'), + (271, 'en_US', 'Fukui'), + (272, 'en_US', 'Fukuoka'), + (273, 'en_US', 'Fukushima'), + (274, 'en_US', 'Gifu'), + (275, 'en_US', 'Gunma'), + (276, 'en_US', 'Hiroshima'), + (277, 'en_US', 'Hokkaido'), + (278, 'en_US', 'Hyogo'), + (279, 'en_US', 'Ibaraki'), + (280, 'en_US', 'Ishikawa'), + (281, 'en_US', 'Iwate'), + (282, 'en_US', 'Kagawa'), + (283, 'en_US', 'Kagoshima'), + (284, 'en_US', 'Kanagawa'), + (285, 'en_US', 'Kochi'), + (286, 'en_US', 'Kumamoto'), + (287, 'en_US', 'Kyoto'), + (288, 'en_US', 'Mie'), + (289, 'en_US', 'Miyagi'), + (290, 'en_US', 'Miyazaki'), + (291, 'en_US', 'Nagano'), + (292, 'en_US', 'Nagasaki'), + (293, 'en_US', 'Nara'), + (294, 'en_US', 'Niigata'), + (295, 'en_US', 'Oita'), + (296, 'en_US', 'Okayama'), + (297, 'en_US', 'Okinawa'), + (298, 'en_US', 'Osaka'), + (299, 'en_US', 'Saga'), + (300, 'en_US', 'Saitama'), + (301, 'en_US', 'Shiga'), + (302, 'en_US', 'Shimane'), + (303, 'en_US', 'Shizuoka'), + (304, 'en_US', 'Tochigi'), + (305, 'en_US', 'Tokushima'), + (306, 'en_US', 'Tokyo'), + (307, 'en_US', 'Tottori'), + (308, 'en_US', 'Toyama'), + (309, 'en_US', 'Wakayama'), + (310, 'en_US', 'Yamagata'), + (311, 'en_US', 'Yamaguchi'), + (312, 'en_US', 'Yamanashi'), + + (1, 'es_ES', NULL), + (2, 'es_ES', NULL), + (3, 'es_ES', NULL), + (4, 'es_ES', NULL), + (5, 'es_ES', NULL), + (6, 'es_ES', NULL), + (7, 'es_ES', NULL), + (8, 'es_ES', NULL), + (9, 'es_ES', NULL), + (10, 'es_ES', 'Georgia'), + (11, 'es_ES', NULL), + (12, 'es_ES', NULL), + (13, 'es_ES', NULL), + (14, 'es_ES', NULL), + (15, 'es_ES', NULL), + (16, 'es_ES', NULL), + (17, 'es_ES', NULL), + (18, 'es_ES', NULL), + (19, 'es_ES', NULL), + (20, 'es_ES', NULL), + (21, 'es_ES', NULL), + (22, 'es_ES', NULL), + (23, 'es_ES', NULL), + (24, 'es_ES', NULL), + (25, 'es_ES', NULL), + (26, 'es_ES', NULL), + (27, 'es_ES', NULL), + (28, 'es_ES', NULL), + (29, 'es_ES', NULL), + (30, 'es_ES', NULL), + (31, 'es_ES', NULL), + (32, 'es_ES', 'Nueva York'), + (33, 'es_ES', NULL), + (34, 'es_ES', NULL), + (35, 'es_ES', NULL), + (36, 'es_ES', NULL), + (37, 'es_ES', NULL), + (38, 'es_ES', NULL), + (39, 'es_ES', NULL), + (40, 'es_ES', NULL), + (41, 'es_ES', NULL), + (42, 'es_ES', NULL), + (43, 'es_ES', NULL), + (44, 'es_ES', NULL), + (45, 'es_ES', NULL), + (46, 'es_ES', NULL), + (47, 'es_ES', NULL), + (48, 'es_ES', NULL), + (49, 'es_ES', NULL), + (50, 'es_ES', NULL), + (51, 'es_ES', NULL), + (52, 'es_ES', NULL), + (53, 'es_ES', NULL), + (54, 'es_ES', NULL), + (55, 'es_ES', NULL), + (56, 'es_ES', NULL), + (57, 'es_ES', NULL), + (58, 'es_ES', NULL), + (59, 'es_ES', NULL), + (60, 'es_ES', NULL), + (61, 'es_ES', NULL), + (62, 'es_ES', 'Ciudad de México'), + (63, 'es_ES', NULL), + (64, 'es_ES', NULL), + (65, 'es_ES', NULL), + (66, 'es_ES', NULL), + (67, 'es_ES', NULL), + (68, 'es_ES', NULL), + (69, 'es_ES', NULL), + (70, 'es_ES', NULL), + (71, 'es_ES', NULL), + (72, 'es_ES', NULL), + (73, 'es_ES', NULL), + (74, 'es_ES', NULL), + (75, 'es_ES', NULL), + (76, 'es_ES', NULL), + (77, 'es_ES', NULL), + (78, 'es_ES', NULL), + (79, 'es_ES', NULL), + (80, 'es_ES', NULL), + (81, 'es_ES', NULL), + (82, 'es_ES', NULL), + (83, 'es_ES', NULL), + (84, 'es_ES', NULL), + (85, 'es_ES', NULL), + (86, 'es_ES', NULL), + (87, 'es_ES', NULL), + (88, 'es_ES', NULL), + (89, 'es_ES', NULL), + (90, 'es_ES', NULL), + (91, 'es_ES', NULL), + (92, 'es_ES', NULL), + (93, 'es_ES', NULL), + (94, 'es_ES', NULL), + (95, 'es_ES', NULL), + (96, 'es_ES', NULL), + (97, 'es_ES', NULL), + (98, 'es_ES', NULL), + (99, 'es_ES', NULL), + (100, 'es_ES', NULL), + (101, 'es_ES', NULL), + (102, 'es_ES', NULL), + (103, 'es_ES', NULL), + (104, 'es_ES', NULL), + (105, 'es_ES', NULL), + (106, 'es_ES', NULL), + (107, 'es_ES', NULL), + (108, 'es_ES', NULL), + (109, 'es_ES', NULL), + (110, 'es_ES', NULL), + (111, 'es_ES', NULL), + (112, 'es_ES', NULL), + (113, 'es_ES', NULL), + (114, 'es_ES', NULL), + (115, 'es_ES', NULL), + (116, 'es_ES', NULL), + (117, 'es_ES', NULL), + (118, 'es_ES', NULL), + (119, 'es_ES', NULL), + (120, 'es_ES', NULL), + (121, 'es_ES', NULL), + (122, 'es_ES', NULL), + (123, 'es_ES', NULL), + (124, 'es_ES', NULL), + (125, 'es_ES', NULL), + (126, 'es_ES', NULL), + (127, 'es_ES', NULL), + (128, 'es_ES', NULL), + (129, 'es_ES', NULL), + (130, 'es_ES', NULL), + (131, 'es_ES', NULL), + (132, 'es_ES', NULL), + (133, 'es_ES', NULL), + (134, 'es_ES', NULL), + (135, 'es_ES', NULL), + (136, 'es_ES', NULL), + (137, 'es_ES', NULL), + (138, 'es_ES', NULL), + (139, 'es_ES', NULL), + (140, 'es_ES', NULL), + (141, 'es_ES', NULL), + (142, 'es_ES', NULL), + (143, 'es_ES', NULL), + (144, 'es_ES', NULL), + (145, 'es_ES', NULL), + (146, 'es_ES', NULL), + (147, 'es_ES', NULL), + (148, 'es_ES', NULL), + (149, 'es_ES', NULL), + (150, 'es_ES', NULL), + (151, 'es_ES', NULL), + (152, 'es_ES', NULL), + (153, 'es_ES', NULL), + (154, 'es_ES', NULL), + (155, 'es_ES', NULL), + (156, 'es_ES', NULL), + (157, 'es_ES', NULL), + (158, 'es_ES', NULL), + (159, 'es_ES', NULL), + (160, 'es_ES', NULL), + (161, 'es_ES', NULL), + (162, 'es_ES', NULL), + (163, 'es_ES', NULL), + (164, 'es_ES', NULL), + (165, 'es_ES', NULL), + (166, 'es_ES', NULL), + (167, 'es_ES', NULL), + (168, 'es_ES', NULL), + (169, 'es_ES', NULL), + (170, 'es_ES', NULL), + (171, 'es_ES', NULL), + (172, 'es_ES', NULL), + (173, 'es_ES', NULL), + (174, 'es_ES', NULL), + (175, 'es_ES', NULL), + (176, 'es_ES', NULL), + (177, 'es_ES', NULL), + (178, 'es_ES', NULL), + (179, 'es_ES', NULL), + (180, 'es_ES', NULL), + (181, 'es_ES', NULL), + (182, 'es_ES', NULL), + (183, 'es_ES', NULL), + (184, 'es_ES', NULL), + (185, 'es_ES', NULL), + (186, 'es_ES', NULL), + (187, 'es_ES', NULL), + (188, 'es_ES', NULL), + (189, 'es_ES', NULL), + (190, 'es_ES', NULL), + (191, 'es_ES', NULL), + (192, 'es_ES', NULL), + (193, 'es_ES', NULL), + (194, 'es_ES', NULL), + (195, 'es_ES', NULL), + (196, 'es_ES', NULL), + (197, 'es_ES', NULL), + (198, 'es_ES', NULL), + (199, 'es_ES', NULL), + (200, 'es_ES', NULL), + (201, 'es_ES', NULL), + (202, 'es_ES', NULL), + (203, 'es_ES', NULL), + (204, 'es_ES', NULL), + (205, 'es_ES', NULL), + (206, 'es_ES', NULL), + (207, 'es_ES', NULL), + (208, 'es_ES', NULL), + (209, 'es_ES', NULL), + (210, 'es_ES', NULL), + (211, 'es_ES', NULL), + (212, 'es_ES', NULL), + (213, 'es_ES', NULL), + (214, 'es_ES', NULL), + (215, 'es_ES', NULL), + (216, 'es_ES', NULL), + (217, 'es_ES', NULL), + (218, 'es_ES', NULL), + (219, 'es_ES', NULL), + (220, 'es_ES', NULL), + (221, 'es_ES', NULL), + (222, 'es_ES', NULL), + (223, 'es_ES', NULL), + (224, 'es_ES', NULL), + (225, 'es_ES', NULL), + (226, 'es_ES', NULL), + (227, 'es_ES', NULL), + (228, 'es_ES', NULL), + (229, 'es_ES', NULL), + (230, 'es_ES', NULL), + (231, 'es_ES', NULL), + (232, 'es_ES', NULL), + (233, 'es_ES', NULL), + (234, 'es_ES', NULL), + (235, 'es_ES', NULL), + (236, 'es_ES', NULL), + (237, 'es_ES', NULL), + (238, 'es_ES', NULL), + (239, 'es_ES', NULL), + (240, 'es_ES', NULL), + (241, 'es_ES', NULL), + (242, 'es_ES', NULL), + (243, 'es_ES', NULL), + (244, 'es_ES', NULL), + (245, 'es_ES', NULL), + (246, 'es_ES', NULL), + (247, 'es_ES', NULL), + (248, 'es_ES', NULL), + (249, 'es_ES', NULL), + (250, 'es_ES', NULL), + (251, 'es_ES', NULL), + (252, 'es_ES', NULL), + (253, 'es_ES', NULL), + (254, 'es_ES', NULL), + (255, 'es_ES', NULL), + (256, 'es_ES', NULL), + (257, 'es_ES', NULL), + (258, 'es_ES', NULL), + (259, 'es_ES', NULL), + (260, 'es_ES', NULL), + (261, 'es_ES', NULL), + (262, 'es_ES', NULL), + (263, 'es_ES', NULL), + (264, 'es_ES', NULL), + (265, 'es_ES', NULL), + (266, 'es_ES', NULL), + (267, 'es_ES', NULL), + (268, 'es_ES', NULL), + (269, 'es_ES', NULL), + (270, 'es_ES', NULL), + (271, 'es_ES', NULL), + (272, 'es_ES', NULL), + (273, 'es_ES', NULL), + (274, 'es_ES', NULL), + (275, 'es_ES', NULL), + (276, 'es_ES', NULL), + (277, 'es_ES', NULL), + (278, 'es_ES', NULL), + (279, 'es_ES', NULL), + (280, 'es_ES', NULL), + (281, 'es_ES', NULL), + (282, 'es_ES', NULL), + (283, 'es_ES', NULL), + (284, 'es_ES', NULL), + (285, 'es_ES', NULL), + (286, 'es_ES', NULL), + (287, 'es_ES', NULL), + (288, 'es_ES', NULL), + (289, 'es_ES', NULL), + (290, 'es_ES', NULL), + (291, 'es_ES', NULL), + (292, 'es_ES', NULL), + (293, 'es_ES', NULL), + (294, 'es_ES', NULL), + (295, 'es_ES', NULL), + (296, 'es_ES', NULL), + (297, 'es_ES', NULL), + (298, 'es_ES', NULL), + (299, 'es_ES', NULL), + (300, 'es_ES', NULL), + (301, 'es_ES', NULL), + (302, 'es_ES', NULL), + (303, 'es_ES', NULL), + (304, 'es_ES', NULL), + (305, 'es_ES', NULL), + (306, 'es_ES', NULL), + (307, 'es_ES', NULL), + (308, 'es_ES', NULL), + (309, 'es_ES', NULL), + (310, 'es_ES', NULL), + (311, 'es_ES', NULL), + (312, 'es_ES', NULL), + + (1, 'fr_FR', 'Alabama'), + (2, 'fr_FR', 'Alaska'), + (3, 'fr_FR', 'Arizona'), + (4, 'fr_FR', 'Arkansas'), + (5, 'fr_FR', 'Californie'), + (6, 'fr_FR', 'Colorado'), + (7, 'fr_FR', 'Connecticut'), + (8, 'fr_FR', 'Delaware'), + (9, 'fr_FR', 'Floride'), + (10, 'fr_FR', 'Géorgie'), + (11, 'fr_FR', 'Hawaii'), + (12, 'fr_FR', 'Idaho'), + (13, 'fr_FR', 'Illinois'), + (14, 'fr_FR', 'Indiana'), + (15, 'fr_FR', 'Iowa'), + (16, 'fr_FR', 'Kansas'), + (17, 'fr_FR', 'Kentucky'), + (18, 'fr_FR', 'Louisiane'), + (19, 'fr_FR', 'Maine'), + (20, 'fr_FR', 'Maryland'), + (21, 'fr_FR', 'Massachusetts'), + (22, 'fr_FR', 'Michigan'), + (23, 'fr_FR', 'Minnesota'), + (24, 'fr_FR', 'Mississippi'), + (25, 'fr_FR', 'Missouri'), + (26, 'fr_FR', 'Montana'), + (27, 'fr_FR', 'Nebraska'), + (28, 'fr_FR', 'Nevada'), + (29, 'fr_FR', 'New Hampshire'), + (30, 'fr_FR', 'New Jersey'), + (31, 'fr_FR', 'Nouveau-Mexique'), + (32, 'fr_FR', 'New York'), + (33, 'fr_FR', 'Caroline du Nord'), + (34, 'fr_FR', 'Dakota du Nord'), + (35, 'fr_FR', 'Ohio'), + (36, 'fr_FR', 'Oklahoma'), + (37, 'fr_FR', 'Oregon'), + (38, 'fr_FR', 'Pennsylvanie'), + (39, 'fr_FR', 'Rhode Island'), + (40, 'fr_FR', 'Caroline du Sud'), + (41, 'fr_FR', 'Dakota du Sud'), + (42, 'fr_FR', 'Tennessee'), + (43, 'fr_FR', 'Texas'), + (44, 'fr_FR', 'Utah'), + (45, 'fr_FR', 'Vermont'), + (46, 'fr_FR', 'Virginie'), + (47, 'fr_FR', 'Washington'), + (48, 'fr_FR', 'Virginie-occidentale'), + (49, 'fr_FR', 'Wisconsin'), + (50, 'fr_FR', 'Wyoming'), + (51, 'fr_FR', 'Porto Rico'), + (52, 'fr_FR', 'Îles Vierges américaines'), + (53, 'fr_FR', 'District de Columbia'), + (54, 'fr_FR', 'Aguascalientes'), + (55, 'fr_FR', 'Baja California'), + (56, 'fr_FR', 'Baja California Sur'), + (57, 'fr_FR', 'Campeche'), + (58, 'fr_FR', 'Chiapas'), + (59, 'fr_FR', 'Chihuahua'), + (60, 'fr_FR', 'Coahuila'), + (61, 'fr_FR', 'Colima'), + (62, 'fr_FR', 'Distrito Federal'), + (63, 'fr_FR', 'Durango'), + (64, 'fr_FR', 'Guanajuato'), + (65, 'fr_FR', 'Guerrero'), + (66, 'fr_FR', 'Hidalgo'), + (67, 'fr_FR', 'Jalisco'), + (68, 'fr_FR', 'Estado de México'), + (69, 'fr_FR', 'Michoacán'), + (70, 'fr_FR', 'Morelos'), + (71, 'fr_FR', 'Nayarit'), + (72, 'fr_FR', 'Nuevo León'), + (73, 'fr_FR', 'Oaxaca'), + (74, 'fr_FR', 'Puebla'), + (75, 'fr_FR', 'Querétaro'), + (76, 'fr_FR', 'Quintana Roo'), + (77, 'fr_FR', 'San Luis Potosí'), + (78, 'fr_FR', 'Sinaloa'), + (79, 'fr_FR', 'Sonora'), + (80, 'fr_FR', 'Tabasco'), + (81, 'fr_FR', 'Tamaulipas'), + (82, 'fr_FR', 'Tlaxcala'), + (83, 'fr_FR', 'Veracruz'), + (84, 'fr_FR', 'Yucatán'), + (85, 'fr_FR', 'Zacatecas'), + (86, 'fr_FR', 'Ontario'), + (87, 'fr_FR', 'Québec'), + (88, 'fr_FR', 'Colombie-Britannique'), + (89, 'fr_FR', 'Alberta'), + (90, 'fr_FR', 'Manitoba'), + (91, 'fr_FR', 'Saskatchewan'), + (92, 'fr_FR', 'Nouvelle-Écosse'), + (93, 'fr_FR', 'Nouveau-Brunswick'), + (94, 'fr_FR', 'Terre Neuve et Labrador'), + (95, 'fr_FR', 'Île-du-Prince-Édouard'), + (96, 'fr_FR', 'Territoires du Nord-Ouest'), + (97, 'fr_FR', 'Yukon'), + (98, 'fr_FR', 'Nunavut'), + (99, 'fr_FR', 'Buenos Aires'), + (100, 'fr_FR', 'Catamarca'), + (101, 'fr_FR', 'Chaco'), + (102, 'fr_FR', 'Chubut'), + (103, 'fr_FR', 'Ciudad de Buenos Aires'), + (104, 'fr_FR', 'Cordoba'), + (105, 'fr_FR', 'Corrientes'), + (106, 'fr_FR', 'Entre Ríos'), + (107, 'fr_FR', 'Formosa'), + (108, 'fr_FR', 'Jujuy'), + (109, 'fr_FR', 'La Pampa'), + (110, 'fr_FR', 'La Rioja'), + (111, 'fr_FR', 'Mendoza'), + (112, 'fr_FR', 'Misiones'), + (113, 'fr_FR', 'Neuquén'), + (114, 'fr_FR', 'Rio Negro'), + (115, 'fr_FR', 'Salta'), + (116, 'fr_FR', 'San Juan'), + (117, 'fr_FR', 'San Luis'), + (118, 'fr_FR', 'Santa Cruz'), + (119, 'fr_FR', 'Santa Fe'), + (120, 'fr_FR', 'Santiago del Estero'), + (121, 'fr_FR', 'Tierra del Fuego'), + (122, 'fr_FR', 'Tucuman'), + (123, 'fr_FR', 'Agrigento'), + (124, 'fr_FR', 'Alessandria'), + (125, 'fr_FR', 'Ancona'), + (126, 'fr_FR', 'Aosta'), + (127, 'fr_FR', 'Arezzo'), + (128, 'fr_FR', 'Ascoli Piceno'), + (129, 'fr_FR', 'Asti'), + (130, 'fr_FR', 'Avellino'), + (131, 'fr_FR', 'Bari'), + (132, 'fr_FR', 'Barletta-Andria-Trani'), + (133, 'fr_FR', 'Belluno'), + (134, 'fr_FR', 'Benevento'), + (135, 'fr_FR', 'Bergamo'), + (136, 'fr_FR', 'Biella'), + (137, 'fr_FR', 'Bologne'), + (138, 'fr_FR', 'Bolzano'), + (139, 'fr_FR', 'Brescia'), + (140, 'fr_FR', 'Brindisi'), + (141, 'fr_FR', 'Cagliari'), + (142, 'fr_FR', 'Caltanissetta'), + (143, 'fr_FR', 'Campobasso'), + (144, 'fr_FR', 'Carbonia-Iglesias'), + (145, 'fr_FR', 'Caserta'), + (146, 'fr_FR', 'Catane'), + (147, 'fr_FR', 'Catanzaro'), + (148, 'fr_FR', 'Chieti'), + (149, 'fr_FR', 'Como'), + (150, 'fr_FR', 'Cosenza'), + (151, 'fr_FR', 'Cremona'), + (152, 'fr_FR', 'Crotone'), + (153, 'fr_FR', 'Cuneo'), + (154, 'fr_FR', 'Enna'), + (155, 'fr_FR', 'Fermo'), + (156, 'fr_FR', 'Ferrara'), + (157, 'fr_FR', 'Firenze'), + (158, 'fr_FR', 'Foggia'), + (159, 'fr_FR', 'Forlì-Cesena'), + (160, 'fr_FR', 'Frosinone'), + (161, 'fr_FR', 'Genova'), + (162, 'fr_FR', 'Gorizia'), + (163, 'fr_FR', 'Grosseto'), + (164, 'fr_FR', 'Imperia'), + (165, 'fr_FR', 'Isernia'), + (166, 'fr_FR', 'L\'Aquila'), + (167, 'fr_FR', 'La Spezia'), + (168, 'fr_FR', 'Latina'), + (169, 'fr_FR', 'Lecce'), + (170, 'fr_FR', 'Lecco'), + (171, 'fr_FR', 'Livourne'), + (172, 'fr_FR', 'Lodi'), + (173, 'fr_FR', 'Lucca'), + (174, 'fr_FR', 'Macerata'), + (175, 'fr_FR', 'Mantova'), + (176, 'fr_FR', 'Massa'), + (177, 'fr_FR', 'Matera'), + (178, 'fr_FR', 'Medio Campidano'), + (179, 'fr_FR', 'Messina'), + (180, 'fr_FR', 'Milano'), + (181, 'fr_FR', 'Modena'), + (182, 'fr_FR', 'Monza e della Brianza'), + (183, 'fr_FR', 'Napoli'), + (184, 'fr_FR', 'Novara'), + (185, 'fr_FR', 'Nuoro'), + (186, 'fr_FR', 'Ogliastra'), + (187, 'fr_FR', 'Olbia-Tempio'), + (188, 'fr_FR', 'Oristano'), + (189, 'fr_FR', 'Padova'), + (190, 'fr_FR', 'Palerme'), + (191, 'fr_FR', 'Parma'), + (192, 'fr_FR', 'Pavie'), + (193, 'fr_FR', 'Pérouse'), + (194, 'fr_FR', 'Pesaro-Urbino'), + (195, 'fr_FR', 'Pescara'), + (196, 'fr_FR', 'Piacenza'), + (197, 'fr_FR', 'Pise'), + (198, 'fr_FR', 'Pistoia'), + (199, 'fr_FR', 'Pordenone'), + (200, 'fr_FR', 'Potenza'), + (201, 'fr_FR', 'Prato'), + (202, 'fr_FR', 'Ragusa'), + (203, 'fr_FR', 'Ravenne'), + (204, 'fr_FR', 'Reggio de Calabre'), + (205, 'fr_FR', 'Reggio d\'Émilie'), + (206, 'fr_FR', 'Rieti'), + (207, 'fr_FR', 'Rimini'), + (208, 'fr_FR', 'Rome'), + (209, 'fr_FR', 'Rovigo'), + (210, 'fr_FR', 'Salerno'), + (211, 'fr_FR', 'Sassari'), + (212, 'fr_FR', 'Savona'), + (213, 'fr_FR', 'Siena'), + (214, 'fr_FR', 'Siracusa'), + (215, 'fr_FR', 'Sondrio'), + (216, 'fr_FR', 'Taranto'), + (217, 'fr_FR', 'Teramo'), + (218, 'fr_FR', 'Terni'), + (219, 'fr_FR', 'Torino'), + (220, 'fr_FR', 'Trapani'), + (221, 'fr_FR', 'Trento'), + (222, 'fr_FR', 'Treviso'), + (223, 'fr_FR', 'Trieste'), + (224, 'fr_FR', 'Udine'), + (225, 'fr_FR', 'Varese'), + (226, 'fr_FR', 'Venezia'), + (227, 'fr_FR', 'Verbano-Cusio-Ossola'), + (228, 'fr_FR', 'Vercelli'), + (229, 'fr_FR', 'Vérone'), + (230, 'fr_FR', 'Vibo Valentia'), + (231, 'fr_FR', 'Vicenza'), + (232, 'fr_FR', 'Viterbo'), + (233, 'fr_FR', 'Aceh'), + (234, 'fr_FR', 'Bali'), + (235, 'fr_FR', 'Bangka'), + (236, 'fr_FR', 'Banten'), + (237, 'fr_FR', 'Bengkulu'), + (238, 'fr_FR', 'Central Java'), + (239, 'fr_FR', 'Kalimantan occidental'), + (240, 'fr_FR', 'Sulawesi central'), + (241, 'fr_FR', 'Coat of arms of East Java'), + (242, 'fr_FR', 'Kalimantan oriental'), + (243, 'fr_FR', 'Nusa Tenggara oriental'), + (244, 'fr_FR', 'Lambang propinsi'), + (245, 'fr_FR', 'Jakarta'), + (246, 'fr_FR', 'Jambi'), + (247, 'fr_FR', 'Lampung'), + (248, 'fr_FR', 'Maluku'), + (249, 'fr_FR', 'Maluku du Nord'), + (250, 'fr_FR', 'Sulawesi du Nord'), + (251, 'fr_FR', 'Sumatra-Nord'), + (252, 'fr_FR', 'Papouasie'), + (253, 'fr_FR', 'Riau'), + (254, 'fr_FR', 'Lambang Riau'), + (255, 'fr_FR', 'Sulawesi du sud-est'), + (256, 'fr_FR', 'Kalimantan du Sud'), + (257, 'fr_FR', 'Sulawesi du Sud'), + (258, 'fr_FR', 'Sumatra du Sud'), + (259, 'fr_FR', 'Java-Ouest'), + (260, 'fr_FR', 'Kalimantan occidental'), + (261, 'fr_FR', 'Nusa Tenggara occidental'), + (262, 'fr_FR', 'Lambang Provinsi Papua Barat'), + (263, 'fr_FR', 'Sulawesi occidental'), + (264, 'fr_FR', 'Sumatra occidental'), + (265, 'fr_FR', 'Yogyakarta'), + (266, 'fr_FR', 'Aichi'), + (267, 'fr_FR', 'Akita'), + (268, 'fr_FR', 'Aomori'), + (269, 'fr_FR', 'Chiba'), + (270, 'fr_FR', 'Ehime'), + (271, 'fr_FR', 'Fukui'), + (272, 'fr_FR', 'Fukuoka'), + (273, 'fr_FR', 'Fukushima'), + (274, 'fr_FR', 'Gifu'), + (275, 'fr_FR', 'Gunma'), + (276, 'fr_FR', 'Hiroshima'), + (277, 'fr_FR', 'Hokkaido'), + (278, 'fr_FR', 'Hyogo'), + (279, 'fr_FR', 'Ibaraki'), + (280, 'fr_FR', 'Ishikawa'), + (281, 'fr_FR', 'Iwate'), + (282, 'fr_FR', 'Kagawa'), + (283, 'fr_FR', 'Kagoshima'), + (284, 'fr_FR', 'Kanagawa'), + (285, 'fr_FR', 'Kochi'), + (286, 'fr_FR', 'Kumamoto'), + (287, 'fr_FR', 'Kyoto'), + (288, 'fr_FR', 'Mie'), + (289, 'fr_FR', 'Miyagi'), + (290, 'fr_FR', 'Miyazaki'), + (291, 'fr_FR', 'Nagano'), + (292, 'fr_FR', 'Nagasaki'), + (293, 'fr_FR', 'Nara'), + (294, 'fr_FR', 'Niigata'), + (295, 'fr_FR', 'Oita'), + (296, 'fr_FR', 'Okayama'), + (297, 'fr_FR', 'Okinawa'), + (298, 'fr_FR', 'Osaka'), + (299, 'fr_FR', 'Saga'), + (300, 'fr_FR', 'Saitama'), + (301, 'fr_FR', 'Shiga'), + (302, 'fr_FR', 'Shimane'), + (303, 'fr_FR', 'Shizuoka'), + (304, 'fr_FR', 'Tochigi'), + (305, 'fr_FR', 'Tokushima'), + (306, 'fr_FR', 'Tokyo'), + (307, 'fr_FR', 'Tottori'), + (308, 'fr_FR', 'Toyama'), + (309, 'fr_FR', 'Wakayama'), + (310, 'fr_FR', 'Yamagata'), + (311, 'fr_FR', 'Yamaguchi'), + (312, 'fr_FR', 'Yamanashi') +; + + +INSERT INTO `tax_i18n` (`id`, `locale`, `title`, `description`) VALUES + (1, 'de_DE', '20% Französische MwSt.', NULL), + (2, 'de_DE', '10% Französische MwSt.', NULL), + (1, 'en_US', 'French 20% VAT', NULL), + (2, 'en_US', 'French 10% VAT', NULL), + (1, 'es_ES', 'Francés 20% de IVA', NULL), + (2, 'es_ES', 'Francés 10% de IVA', NULL), + (1, 'fr_FR', 'TVA française à 20%', NULL), + (2, 'fr_FR', 'TVA française à 10%', NULL) +; + +INSERT INTO `tax_rule_i18n` (`id`, `locale`, `title`) VALUES + (1, 'de_DE', '20% Französische MwSt.'), + (2, 'de_DE', '10% Französische MwSt.'), + (1, 'en_US', 'French 20% VAT'), + (2, 'en_US', 'French 10% VAT'), + (1, 'es_ES', 'Francés 20% de IVA'), + (2, 'es_ES', 'Francés 10% de IVA'), + (1, 'fr_FR', 'TVA française à 20%'), + (2, 'fr_FR', 'TVA française à 10%') +; + +INSERT INTO `order_status_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (1, 'de_DE', 'Nicht bezahlt', '', '', ''), + (2, 'de_DE', 'Bezahlt', '', '', ''), + (3, 'de_DE', 'Bearbeitung', '', '', ''), + (4, 'de_DE', 'Gesendet', '', '', ''), + (5, 'de_DE', 'Storniert', '', '', ''), + (6, 'de_DE', 'Zrückerstattet', '', '', ''), + (1, 'en_US', 'Not paid', '', '', ''), + (2, 'en_US', 'Paid', '', '', ''), + (3, 'en_US', 'Processing', '', '', ''), + (4, 'en_US', 'Sent', '', '', ''), + (5, 'en_US', 'Canceled', '', '', ''), + (6, 'en_US', 'Refunded', '', '', ''), + (1, 'es_ES', 'No pagados', '', '', ''), + (2, 'es_ES', 'Pagado', '', '', ''), + (3, 'es_ES', 'Procesando', '', '', ''), + (4, 'es_ES', 'Enviado', '', '', ''), + (5, 'es_ES', 'Cancelado', '', '', ''), + (6, 'es_ES', 'Reembolsado', '', '', ''), + (1, 'fr_FR', 'Non payée', '', '', ''), + (2, 'fr_FR', 'Payée', '', '', ''), + (3, 'fr_FR', 'Traitement', '', '', ''), + (4, 'fr_FR', 'Envoyée', '', '', ''), + (5, 'fr_FR', 'Annulée', '', '', ''), + (6, 'fr_FR', 'Remboursé', '', '', '') +; + +INSERT INTO `resource_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES + (1, 'de_DE', 'Adresse', NULL, NULL, NULL), + (2, 'de_DE', 'Konfiguration / Administrator', NULL, NULL, NULL), + (3, 'de_DE', 'Konfiguration / Zone', NULL, NULL, NULL), + (4, 'de_DE', 'Konfiguration / Deklination', NULL, NULL, NULL), + (5, 'de_DE', 'Kategorie', NULL, NULL, NULL), + (6, 'de_DE', 'Einstellungen', NULL, NULL, NULL), + (7, 'de_DE', 'Inhalt', NULL, NULL, NULL), + (8, 'de_DE', 'Konfiguration / Land', NULL, NULL, NULL), + (9, 'de_DE', 'Gutschein', NULL, NULL, NULL), + (10, 'de_DE', 'Konfiguration / Währung', NULL, NULL, NULL), + (11, 'de_DE', 'Kunde', NULL, NULL, NULL), + (12, 'de_DE', 'Konfiguration / Charakteristik', NULL, NULL, NULL), + (13, 'de_DE', 'Ordner', NULL, NULL, NULL), + (14, 'de_DE', 'Konfiguration / Sprache', NULL, NULL, NULL), + (15, 'de_DE', 'Konfiguration / Mailing-System', NULL, NULL, NULL), + (16, 'de_DE', 'Konfiguration / Nachricht', NULL, NULL, NULL), + (17, 'de_DE', 'Konfiguration / Modul', NULL, NULL, NULL), + (18, 'de_DE', 'Bestellung', NULL, NULL, NULL), + (19, 'de_DE', 'Produkt', NULL, NULL, NULL), + (20, 'de_DE', 'Konfiguration / Profil', NULL, NULL, NULL), + (21, 'de_DE', 'Konfiguration / Lieferzone', NULL, NULL, NULL), + (22, 'de_DE', 'Konfiguration / Tax', NULL, NULL, NULL), + (23, 'de_DE', 'Konfiguration / Template', NULL, NULL, NULL), + (24, 'de_DE', 'Konfiguration / Logs System', NULL, NULL, NULL), + (25, 'de_DE', 'Konfiguration / Cache', NULL, NULL, NULL), + (26, 'de_DE', 'Back-Office Startseite', NULL, NULL, NULL), + (27, 'de_DE', 'Shop Informationen', NULL, NULL, NULL), + (28, 'de_DE', 'Konfigurations Variablen', NULL, NULL, NULL), + (29, 'de_DE', 'Administration Logs ansehen', NULL, NULL, NULL), + (30, 'de_DE', 'Logs System Konfiguration', NULL, NULL, NULL), + (31, 'de_DE', 'Erweiterte Konfiguration', NULL, NULL, NULL), + (32, 'de_DE', 'Übersetzungen', NULL, NULL, NULL), + (33, 'de_DE', 'Exporten-Verwaltung', NULL, NULL, NULL), + (34, 'de_DE', 'Tools', NULL, NULL, NULL), + (35, 'de_DE', 'Marken-Verwaltung', NULL, NULL, NULL), + (36, 'de_DE', 'Andockpunkte', NULL, NULL, NULL), + (37, 'de_DE', 'Hook Positionen', NULL, NULL, NULL), + (38, 'de_DE', 'Sonderangebotsmanagement', NULL, NULL, NULL), + (39, 'de_DE', 'Administratorenliste', NULL, NULL, NULL), + (40, 'de_DE', 'Kategorie-Konfiguration', NULL, NULL, NULL), + (41, 'de_DE', 'Lieferungskonfiguration', NULL, NULL, NULL), + (42, 'de_DE', 'Taxeregelung-Konfiguration', NULL, NULL, NULL), + (43, 'de_DE', 'Hooks Verwendung', NULL, NULL, NULL), + (44, 'de_DE', 'Importation / Exportation von Daten', NULL, NULL, NULL), + (45, 'de_DE', 'Modul Verwendung', NULL, NULL, NULL), + (46, 'de_DE', 'Administration-Profilverwaltung', NULL, NULL, NULL), + (47, 'de_DE', 'Back-Office Suchfunktion', NULL, NULL, NULL), + (48, 'de_DE', 'API-Konfiguration', NULL, NULL, NULL), + (49, 'de_DE', 'Kunde-Andere', NULL, NULL, NULL), + (1, 'en_US', 'Address', NULL, NULL, NULL), + (2, 'en_US', 'Configuration / Administrator', NULL, NULL, NULL), + (3, 'en_US', 'Configuration / Area', NULL, NULL, NULL), + (4, 'en_US', 'Configuration / Attribute', NULL, NULL, NULL), + (5, 'en_US', 'Category', NULL, NULL, NULL), + (6, 'en_US', 'Configuration', NULL, NULL, NULL), + (7, 'en_US', 'Content', NULL, NULL, NULL), + (8, 'en_US', 'Configuration / Country', NULL, NULL, NULL), + (9, 'en_US', 'Coupon', NULL, NULL, NULL), + (10, 'en_US', 'Configuration / Currency', NULL, NULL, NULL), + (11, 'en_US', 'Customer', NULL, NULL, NULL), + (12, 'en_US', 'Configuration / Feature', NULL, NULL, NULL), + (13, 'en_US', 'Folder', NULL, NULL, NULL), + (14, 'en_US', 'Configuration / Language', NULL, NULL, NULL), + (15, 'en_US', 'Configuration / Mailing-system', NULL, NULL, NULL), + (16, 'en_US', 'Configuration / Message', NULL, NULL, NULL), + (17, 'en_US', 'Configuration / Module', NULL, NULL, NULL), + (18, 'en_US', 'Order', NULL, NULL, NULL), + (19, 'en_US', 'Product', NULL, NULL, NULL), + (20, 'en_US', 'Configuration / Profile', NULL, NULL, NULL), + (21, 'en_US', 'Configuration / Shipping-zone', NULL, NULL, NULL), + (22, 'en_US', 'Configuration / Tax', NULL, NULL, NULL), + (23, 'en_US', 'Configuration / Template', NULL, NULL, NULL), + (24, 'en_US', 'Configuration / System Log', NULL, NULL, NULL), + (25, 'en_US', 'Configuration / Cache', NULL, NULL, NULL), + (26, 'en_US', 'Back-office home page', NULL, NULL, NULL), + (27, 'en_US', 'Store information configuration', NULL, NULL, NULL), + (28, 'en_US', 'Configuration variables', NULL, NULL, NULL), + (29, 'en_US', 'View administration logs', NULL, NULL, NULL), + (30, 'en_US', 'Logging system configuration', NULL, NULL, NULL), + (31, 'en_US', 'Advanced configuration', NULL, NULL, NULL), + (32, 'en_US', 'Translations', NULL, NULL, NULL), + (33, 'en_US', 'Back-office export management', NULL, NULL, NULL), + (34, 'en_US', 'Tools panel', NULL, NULL, NULL), + (35, 'en_US', 'Brands management', NULL, NULL, NULL), + (36, 'en_US', 'Hooks', NULL, NULL, NULL), + (37, 'en_US', 'Hook positions', NULL, NULL, NULL), + (38, 'en_US', 'Sales management', NULL, NULL, NULL), + (39, 'en_US', 'Administatros list', NULL, NULL, NULL), + (40, 'en_US', 'Category configuration', NULL, NULL, NULL), + (41, 'en_US', 'Shipping configuration', NULL, NULL, NULL), + (42, 'en_US', 'Tax rules configuration', NULL, NULL, NULL), + (43, 'en_US', 'Hooks management', NULL, NULL, NULL), + (44, 'en_US', 'Data import / export', NULL, NULL, NULL), + (45, 'en_US', 'Modules maagement', NULL, NULL, NULL), + (46, 'en_US', 'Administration profiles management', NULL, NULL, NULL), + (47, 'en_US', 'Back-office search function', NULL, NULL, NULL), + (48, 'en_US', 'API Configuration', NULL, NULL, NULL), + (49, 'en_US', 'Customer title', NULL, NULL, NULL), + (1, 'es_ES', 'Dirección', NULL, NULL, NULL), + (2, 'es_ES', 'Configuración / administrador', NULL, NULL, NULL), + (3, 'es_ES', 'Configuración / área', NULL, NULL, NULL), + (4, 'es_ES', 'Configuración / atributo', NULL, NULL, NULL), + (5, 'es_ES', 'Categoria', NULL, NULL, NULL), + (6, 'es_ES', 'Configuración', NULL, NULL, NULL), + (7, 'es_ES', 'Contenido', NULL, NULL, NULL), + (8, 'es_ES', 'Configuración / país', NULL, NULL, NULL), + (9, 'es_ES', 'Cupón', NULL, NULL, NULL), + (10, 'es_ES', 'Configuración / Moneda', NULL, NULL, NULL), + (11, 'es_ES', 'Cliente', NULL, NULL, NULL), + (12, 'es_ES', 'Configuración / Característica', NULL, NULL, NULL), + (13, 'es_ES', 'Carpeta', NULL, NULL, NULL), + (14, 'es_ES', 'Configuración / Idioma', NULL, NULL, NULL), + (15, 'es_ES', 'Configuración / Sistema de correo', NULL, NULL, NULL), + (16, 'es_ES', 'Configuración / Mensaje', NULL, NULL, NULL), + (17, 'es_ES', 'Configuración / Módulo', NULL, NULL, NULL), + (18, 'es_ES', 'Pedido', NULL, NULL, NULL), + (19, 'es_ES', 'Producto', NULL, NULL, NULL), + (20, 'es_ES', 'Configuración / Perfil', NULL, NULL, NULL), + (21, 'es_ES', 'Configuración / Zona de envío', NULL, NULL, NULL), + (22, 'es_ES', 'Configuración / Impuestos', NULL, NULL, NULL), + (23, 'es_ES', 'Configuración / Plantilla', NULL, NULL, NULL), + (24, 'es_ES', 'Configuración / Sistema de log', NULL, NULL, NULL), + (25, 'es_ES', 'Configuración / caché', NULL, NULL, NULL), + (26, 'es_ES', 'Página de inicio de back office', NULL, NULL, NULL), + (27, 'es_ES', 'Configuración de la información de tienda', NULL, NULL, NULL), + (28, 'es_ES', 'Variables de configuración', NULL, NULL, NULL), + (29, 'es_ES', 'Ver logs de administración', NULL, NULL, NULL), + (30, 'es_ES', 'Configuración de sistema de registro', NULL, NULL, NULL), + (31, 'es_ES', 'Configuración avanzada', NULL, NULL, NULL), + (32, 'es_ES', 'Traducciones', NULL, NULL, NULL), + (33, 'es_ES', 'Gestor de exportación de Back Office', NULL, NULL, NULL), + (34, 'es_ES', 'Panel de herramientas', NULL, NULL, NULL), + (35, 'es_ES', 'Gestión de marcas', NULL, NULL, NULL), + (36, 'es_ES', 'Hooks', NULL, NULL, NULL), + (37, 'es_ES', 'Posiciones de hook', NULL, NULL, NULL), + (38, 'es_ES', 'Administración de ventas', NULL, NULL, NULL), + (39, 'es_ES', 'Lista de Administradores', NULL, NULL, NULL), + (40, 'es_ES', 'Configuración de la categoría', NULL, NULL, NULL), + (41, 'es_ES', 'Configuración de envío', NULL, NULL, NULL), + (42, 'es_ES', 'Configuración de las reglas de impuestos', NULL, NULL, NULL), + (43, 'es_ES', 'Gestión de Hooks', NULL, NULL, NULL), + (44, 'es_ES', 'Importación/ exportación de datos', NULL, NULL, NULL), + (45, 'es_ES', 'Administración de módulos', NULL, NULL, NULL), + (46, 'es_ES', 'Gestión de perfiles de administración', NULL, NULL, NULL), + (47, 'es_ES', 'Función de búsqueda de back office', NULL, NULL, NULL), + (48, 'es_ES', 'Configuración de API', NULL, NULL, NULL), + (49, 'es_ES', 'Estado civil cliente', NULL, NULL, NULL), + (1, 'fr_FR', 'Adresse', NULL, NULL, NULL), + (2, 'fr_FR', 'Configuration / Administrateur', NULL, NULL, NULL), + (3, 'fr_FR', 'Configuration / Zone', NULL, NULL, NULL), + (4, 'fr_FR', 'Configuration / Attribut', NULL, NULL, NULL), + (5, 'fr_FR', 'Catégorie', NULL, NULL, NULL), + (6, 'fr_FR', 'Configuration', NULL, NULL, NULL), + (7, 'fr_FR', 'Contenu', NULL, NULL, NULL), + (8, 'fr_FR', 'Configuration / Pays', NULL, NULL, NULL), + (9, 'fr_FR', 'Code promo', NULL, NULL, NULL), + (10, 'fr_FR', 'Configuration / Devise', NULL, NULL, NULL), + (11, 'fr_FR', 'Client', NULL, NULL, NULL), + (12, 'fr_FR', 'Configuration / Caractéristique', NULL, NULL, NULL), + (13, 'fr_FR', 'Dossier', NULL, NULL, NULL), + (14, 'fr_FR', 'Configuration / Langue', NULL, NULL, NULL), + (15, 'fr_FR', 'Configuration / Système de mails', NULL, NULL, NULL), + (16, 'fr_FR', 'Configuration / Message', NULL, NULL, NULL), + (17, 'fr_FR', 'Configuration / Module', NULL, NULL, NULL), + (18, 'fr_FR', 'Commande', NULL, NULL, NULL), + (19, 'fr_FR', 'Produit', NULL, NULL, NULL), + (20, 'fr_FR', 'Configuration / Profil', NULL, NULL, NULL), + (21, 'fr_FR', 'Configuration / Zone de livraison', NULL, NULL, NULL), + (22, 'fr_FR', 'Configuration / Taxe', NULL, NULL, NULL), + (23, 'fr_FR', 'Configuration / Modèle', NULL, NULL, NULL), + (24, 'fr_FR', 'Configuration / Logs système', NULL, NULL, NULL), + (25, 'fr_FR', 'Configuration / Cache', NULL, NULL, NULL), + (26, 'fr_FR', 'Page d\'acceuil de l\'administration', NULL, NULL, NULL), + (27, 'fr_FR', 'Configuration des informations sur la boutique', NULL, NULL, NULL), + (28, 'fr_FR', 'Variables de configuration', NULL, NULL, NULL), + (29, 'fr_FR', 'Consulter les logs d\'administration', NULL, NULL, NULL), + (30, 'fr_FR', 'Configuration du système de log', NULL, NULL, NULL), + (31, 'fr_FR', 'Configuration avancée', NULL, NULL, NULL), + (32, 'fr_FR', 'Traductions', NULL, NULL, NULL), + (33, 'fr_FR', 'gestion des exports', NULL, NULL, NULL), + (34, 'fr_FR', 'Outils', NULL, NULL, NULL), + (35, 'fr_FR', 'Gestion des marques', NULL, NULL, NULL), + (36, 'fr_FR', 'Points d\'accroche', NULL, NULL, NULL), + (37, 'fr_FR', 'Positions des points d\'accroche', NULL, NULL, NULL), + (38, 'fr_FR', 'Gestion des promotions', NULL, NULL, NULL), + (39, 'fr_FR', 'Liste des administrateurs', NULL, NULL, NULL), + (40, 'fr_FR', 'Configuration d\'une catégorie', NULL, NULL, NULL), + (41, 'fr_FR', 'Configuration du transport', NULL, NULL, NULL), + (42, 'fr_FR', 'Configuration des règles de taxes', NULL, NULL, NULL), + (43, 'fr_FR', 'Gestion des hooks', NULL, NULL, NULL), + (44, 'fr_FR', 'Importation / exportation de données', NULL, NULL, NULL), + (45, 'fr_FR', 'Gestion des modules', NULL, NULL, NULL), + (46, 'fr_FR', 'Gestion des profils d\'administration', NULL, NULL, NULL), + (47, 'fr_FR', 'Fonction de recherche dans l\'administration', NULL, NULL, NULL), + (48, 'fr_FR', 'Configuration de l\'API', NULL, NULL, NULL), + (49, 'fr_FR', 'civilité client', NULL, NULL, NULL) +; + + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES + (1, 'de_DE', 'Bestellbestätigung den Kunden gesendet', 'Ihre Bestellung {$order_ref} bei {config key=\"store_name\"}', NULL, NULL), + (2, 'de_DE', 'Ihr neues Passwort', 'Ihr neues Passwort für {config key=\"store_name\"}', NULL, NULL), + (3, 'de_DE', 'Gesendete Nachricht wenn eine neue Bestellung erteilt wird.', 'Neue Bestellung {$order_ref} für {config key=\"store_name\"}', NULL, NULL), + (4, 'de_DE', 'Mail an den Kunden geschickt, wenn sein Passwort oder E-Mail von einem Administrator im Back-Office geändert werden', 'Ihre Konto-Zugriff für {config key=\"store_name\"} wurde geändert', NULL, NULL), + (5, 'de_DE', 'Mail an den Kunden geschickt, wenn sein Konto von einem Administrator im Back-Office erstellt wird', 'Ein Konto {config key=\"store_name\"} wurde für Sie erstellt.', NULL, NULL), + (6, 'de_DE', NULL, NULL, NULL, NULL), + (7, 'de_DE', NULL, NULL, NULL, NULL), + (1, 'en_US', 'Order confirmation sent to the customer', 'Your order {$order_ref} at {config key=\"store_name\"}', NULL, NULL), + (2, 'en_US', 'Your new password', 'Your new password for {config key=\"store_name\"}', NULL, NULL), + (3, 'en_US', 'Message sent to the shop owner when a new order is placed', 'New order {$order_ref} placed on {config key=\"store_name\"}', NULL, NULL), + (4, 'en_US', 'Mail sent to the customer when its password or email is changed in the back-office', 'Your account information on {config key=\"store_name\"} has been changed.', NULL, NULL), + (5, 'en_US', 'Mail sent to the customer when its account is created by an administrator in the back-office', 'A {config key=\"store_name\"} account has been created for you', NULL, NULL), + (6, 'en_US', 'Mail sent to an administrator who requested a new password', NULL, NULL, NULL), + (7, 'en_US', 'Newsletter subscription confirmation mail', 'Your subscription to %store newsletter', NULL, NULL), + (1, 'es_ES', 'Confirmación de la orden enviada al cliente', 'Su orden {$order_ref} en {tecla config = \"store_name\"}', NULL, NULL), + (2, 'es_ES', 'Su nueva contraseña', 'Su nueva contraseña para {tecla config = \"store_name\"}', NULL, NULL), + (3, 'es_ES', 'Mensaje enviado al propietario de la tienda cuando se envía una nueva orden', 'Nueva orden {$order_ref} ubicada en {tecla config = \"store_name\"}', NULL, NULL), + (4, 'es_ES', 'Correo enviado al cliente cuando se cambia su contraseña o correo electrónico en el back-office', 'La información de su cuenta en {tecla config = \"store_name\"} ha sido cambiada.', NULL, NULL), + (5, 'es_ES', 'Correo enviado al cliente cuando se crea su cuenta por un administrador en el back-office', 'Una {config key=\"store_name\"} cuenta ha sido creada para ti', NULL, NULL), + (6, 'es_ES', 'Correo enviado a un administrador que ha solicitado una nueva contraseña', NULL, NULL, NULL), + (7, 'es_ES', 'Confirmación de suscripción por correo al boletín', 'Tu suscripción al boletín de %store', NULL, NULL), + (1, 'fr_FR', 'Confirmation de commande envoyée au client', 'Votre commande {$order_ref} chez {config key=\"store_name\"}', NULL, NULL), + (2, 'fr_FR', 'Votre nouveau mot de passe', 'Votre nouveau mot de passe {config key=\"store_name\"}', NULL, NULL), + (3, 'fr_FR', 'Message envoyé au gestionnaire de la boutique lors d\'une nouvelle commande.', 'Nouvelle commande {$order_ref} reçue sur {config key=\"store_name\"}', NULL, NULL), + (4, 'fr_FR', 'Message envoyé au client lorsque son mot de passe ou son email est changé dans le back-office', 'L\'accès à votre compte {config key=\"store_name\"} a changé', NULL, NULL), + (5, 'fr_FR', 'Mail envoyé au client lorsque son compte est créé depuis le back-office par un administrateur', 'Un compte {config key=\"store_name\"} vient d\'être créé pour vous.', NULL, NULL), + (6, 'fr_FR', 'Courrier envoyé à un administrateur qui a demandé un nouveau mot de passe', NULL, NULL, NULL), + (7, 'fr_FR', 'Mail de confirmation d\'inscription à la newsletter', 'Vous avez souscrit à la newsletter du site %store', NULL, NULL) +; diff --git a/setup/insert.sql.tpl b/setup/insert.sql.tpl new file mode 100644 index 00000000..013d49ae --- /dev/null +++ b/setup/insert.sql.tpl @@ -0,0 +1,3458 @@ +INSERT INTO `lang`(`id`,`title`,`code`,`locale`,`url`,`date_format`,`time_format`,`datetime_format`,`decimal_separator`,`thousands_separator`,`decimals`,`active`,`visible`,`by_default`,`created_at`,`updated_at`)VALUES +(1, 'Français', 'fr', 'fr_FR', '', 'd/m/Y', 'H:i:s', 'd/m/Y H:i:s', ',', ' ', '2', '1', '1', '0', NOW(), NOW()), +(2, 'English', 'en', 'en_US', '', 'm-d-Y', 'h:i:s', 'm-d-Y h:i:s', '.', ' ', '2', '1', '1', '1', NOW(), NOW()), +(3, 'Castellano', 'es', 'es_ES', '', 'm-d-Y', 'h:i:s', 'm-d-Y h:i:s', ',', '.', '2', '1', '1', '0', NOW(), NOW()), +(4, 'Italiano', 'it', 'it_IT', '', 'd/m/Y', 'H:i:s', 'd/m/y H:i:s', ',', ' ', '2', '1', '1', '0', NOW(), NOW()), +(5, 'Russian', 'ru', 'ru_RU', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', '0', '0', '0', NOW(), NOW()), +(6, 'Czech', 'cs', 'cs_CZ', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', '0', '0', '0', NOW(), NOW()), +(7, 'Deutsch', 'de', 'de_DE', '', 'd-m-Y', 'H:i:s', 'd-m-Y H:i:s', ',', '.', '2', '0', '0', '0', NOW(), NOW()); + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(1, 'check-available-stock', '1', 0, 0, NOW(), NOW()), +(2, 'active-front-template', 'default', 0, 0, NOW(), NOW()), +(3, 'active-admin-template', 'default', 0, 0, NOW(), NOW()), +(4, 'active-pdf-template', 'default', 0, 0, NOW(), NOW()), +(5, 'active-mail-template', 'default', 0, 0, NOW(), NOW()), +(6, 'rewriting_enable', '0', 0, 0, NOW(), NOW()), +(7, 'imagine_graphic_driver', 'gd', 0, 0, NOW(), NOW()), +(8, 'default_images_quality_percent', '75', 0, 0, NOW(), NOW()), +(9, 'original_image_delivery_mode', 'symlink', 0, 0, NOW(), NOW()), +(10, 'original_document_delivery_mode', 'symlink', 0, 0, NOW(), NOW()), +(11, 'images_library_path', 'local/media/images', 0, 0, NOW(), NOW()), +(12, 'documents_library_path', 'local/media/documents', 0, 0, NOW(), NOW()), +(13, 'image_cache_dir_from_web_root', 'cache/images', 0, 0, NOW(), NOW()), +(14, 'document_cache_dir_from_web_root', 'cache/documents', 0, 0, NOW(), NOW()), +(15, 'page_not_found_view', '404.html', 0, 0, NOW(), NOW()), +(16, 'obsolete_rewriten_url_view', 'obsolete-rewritten-url', 0, 0, NOW(), NOW()), +(17, 'use_tax_free_amounts', 0, 0, 0, NOW(), NOW()), +(18, 'process_assets', '0', 0, 0, NOW(), NOW()), +(19, 'thelia_admin_remember_me_cookie_name', 'tarmcn', 0, 0, NOW(), NOW()), +(20, 'thelia_admin_remember_me_cookie_expiration', 2592000, 0, 0, NOW(), NOW()), +(21, 'thelia_customer_remember_me_cookie_name', 'tcrmcn', 0, 0, NOW(), NOW()), +(22, 'thelia_customer_remember_me_cookie_expiration', 31536000, 0, 0, NOW(), NOW()), +(23, 'url_site','', 0, 0, NOW(), NOW()), +(24, 'pdf_invoice_file', 'invoice', 0, 0, NOW(), NOW()), +(25, 'pdf_delivery_file', 'delivery', 0, 0, NOW(), NOW()), +(26, 'unknown-flag-path','assets/img/flags/unknown.png', 0, 0, NOW(), NOW()), +(27, 'html_output_trim_level','1', 0, 0, NOW(), NOW()), +(28, 'default_available_stock', '100', 0, 0, NOW(), NOW()), +(29, 'information_folder_id', '', 0, 0, NOW(), NOW()), +(30, 'terms_conditions_content_id', '', 0, 0, NOW(), NOW()), +(31, 'allow_negative_stock', '0', 0, 0, NOW(), NOW()), +(32, 'cart.use_persistent_cookie', '1', 0, 0, NOW(), NOW()), +(33, 'cart.cookie_name', 'thelia_cart', 0, 0, NOW(), NOW()), +(34, 'cart.cookie_lifetime', '31536060', 0, 0, NOW(), NOW()), +(35, 'session_config.lifetime', '0', 0, 0, NOW(), NOW()), +(36, 'session_config.default', '1', 1, 1, NOW(), NOW()), +(37, 'default_lang_without_translation', '1', 1, 1, NOW(), NOW()), +(38, 'store_name','', 0, 1, NOW(), NOW()), +(39, 'store_description','', 0, 1, NOW(), NOW()), +(40, 'store_email','', 0, 1, NOW(), NOW()), +(41, 'store_notification_emails','', 0, 1, NOW(), NOW()), +(42, 'one_domain_foreach_lang','0', 1, 1, NOW(), NOW()), +(43, 'thelia_version','{$version}', 1, 1, NOW(), NOW()), +(44, 'thelia_major_version','{$major}', 1, 1, NOW(), NOW()), +(45, 'thelia_minus_version','{$minus}', 1, 1, NOW(), NOW()), +(46, 'thelia_release_version','{$release}', 1, 1, NOW(), NOW()), +(47, 'thelia_extra_version','{$extra}', 1, 1, NOW(), NOW()), +(48, 'front_cart_country_cookie_name','fcccn', 1, 1, NOW(), NOW()), +(49, 'front_cart_country_cookie_expires','2592000', 1, 1, NOW(), NOW()), +(50, 'sitemap_ttl','7200', 1, 1, NOW(), NOW()), +(51, 'feed_ttl','7200', 1, 1, NOW(), NOW()), +(52, 'form_firewall_bruteforce_time_to_wait', '10', 0, 0, NOW(), NOW()), +(53, 'form_firewall_time_to_wait', '60', 0, 0, NOW(), NOW()), +(54, 'form_firewall_bruteforce_attempts', '10', 0, 0, NOW(), NOW()), +(55, 'form_firewall_attempts', '6', 0, 0, NOW(), NOW()), +(56, 'form_firewall_active', '1', 0, 0, NOW(), NOW()), +(57, 'allow_slash_ended_uri', '1', 0, 0, NOW(), NOW()), +(58, 'error_message.show', '1', 0, 0, NOW(), NOW()), +(59, 'error_message.page_name', 'error.html', 0, 0, NOW(), NOW()), +(60, 'customer_change_email', '0', 0, 0, NOW(), NOW()), +(61, 'customer_confirm_email', '1', 0, 0, NOW(), NOW()), +(62, 'form.secret', 'ThisIsNotASecret', 0, 0, NOW(), NOW()), +(63, 'minimum_admin_password_length', '4', 0, 0, NOW(), NOW()), +(64, 'enable_lost_admin_password_recovery', '1', 0, 0, NOW(), NOW()), +(65, 'notify_newsletter_subscription', '1', 0, 0, NOW(), NOW()), +(66, 'number_default_results_per_page.product_list', '20', 0, 0, NOW(), NOW()), +(67, 'number_default_results_per_page.order_list', '20', 0, 0, NOW(), NOW()), +(68, 'number_default_results_per_page.customer_list', '20', 0, 0, NOW(), NOW()) +; + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +(1, 'Carousel', 1, 0, 1, 'Carousel\\Carousel', NOW(), NOW()), +(2, 'Colissimo', 2, 0, 1, 'Colissimo\\Colissimo', NOW(), NOW()), +(3, 'Cheque', 3, 0, 1, 'Cheque\\Cheque', NOW(), NOW()), +(4, 'Front', 1, 1, 2, 'Front\\Front', NOW(), NOW()), +(5, 'Tinymce', 1, 0, 16, 'Tinymce\\Tinymce', NOW(), NOW()), +(6, 'HookNavigation', 1, 1, 11, 'HookNavigation\\HookNavigation', NOW(), NOW()), +(7, 'HookCurrency', 1, 1, 3, 'HookCurrency\\HookCurrency', NOW(), NOW()), +(8, 'HookLang', 1, 1, 4, 'HookLang\\HookLang', NOW(), NOW()), +(9, 'HookSearch', 1, 1, 5, 'HookSearch\\HookSearch', NOW(), NOW()), +(10, 'HookCustomer', 1, 1, 6, 'HookCustomer\\HookCustomer', NOW(), NOW()), +(11, 'HookCart', 1, 1, 7, 'HookCart\\HookCart', NOW(), NOW()), +(12, 'HookAnalytics', 1, 1, 8, 'HookAnalytics\\HookAnalytics', NOW(), NOW()), +(13, 'HookContact', 1, 1, 9, 'HookContact\\HookContact', NOW(), NOW()), +(14, 'HookLinks', 1, 1, 10, 'HookLinks\\HookLinks', NOW(), NOW()), +(15, 'HookNewsletter', 1, 1, 12, 'HookNewsletter\\HookNewsletter', NOW(), NOW()), +(16, 'HookSocial', 1, 1, 13, 'HookSocial\\HookSocial', NOW(), NOW()), +(17, 'HookProductsNew', 1, 1, 14, 'HookProductsNew\\HookProductsNew', NOW(), NOW()), +(18, 'HookProductsOffer', 1, 1, 15, 'HookProductsOffer\\HookProductsOffer', NOW(), NOW()), +(19, 'TheliaSmarty', 1, 1, 16, 'TheliaSmarty\\TheliaSmarty', NOW(), NOW()), +(20, 'VirtualProductControl', 1, 1, 17, 'VirtualProductControl\\VirtualProductControl', NOW(), NOW()), +(21, 'HookAdminHome', 1, 1, 18, 'HookAdminHome\\HookAdminHome', NOW(), NOW()) +; + +-- Insert front hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(1, 'order-invoice.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(2, 'order-invoice.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(3, 'order-invoice.payment-extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(4, 'order-invoice.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(5, 'order-invoice.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(6, 'order-invoice.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(7, 'order-invoice.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(8, 'order-payment-gateway.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(9, 'order-payment-gateway.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(10, 'order-payment-gateway.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(11, 'order-payment-gateway.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(12, 'order-payment-gateway.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(13, 'sitemap.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(14, 'currency.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(15, 'currency.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(16, 'currency.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(17, 'currency.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(18, 'currency.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(19, 'login.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(20, 'login.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(21, 'login.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(22, 'login.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(23, 'login.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(24, 'login.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(25, 'login.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(26, 'login.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(27, 'login.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(28, 'account-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(29, 'account-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(30, 'account-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(31, 'account-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(32, 'account-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(33, 'account-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(34, 'account-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(35, 'cart.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(36, 'cart.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(37, 'cart.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(38, 'cart.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(39, 'cart.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(40, 'contact.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(41, 'contact.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(42, 'contact.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(43, 'contact.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(44, 'contact.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(45, 'contact.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(46, 'contact.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(47, 'order-placed.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(48, 'order-placed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(49, 'order-placed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(50, 'order-placed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(51, 'search.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(52, 'search.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(53, 'search.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(54, 'register.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(55, 'register.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(56, 'register.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(57, 'register.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(58, 'register.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(59, 'register.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(60, 'register.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(61, 'password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(62, 'password.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(63, 'password.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(64, 'password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(65, 'password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(66, 'password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(67, 'password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(68, 'language.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(69, 'language.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(70, 'language.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(71, 'language.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(72, 'language.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(73, 'contact.success', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(74, 'newsletter.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(75, 'newsletter.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(76, 'newsletter.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(77, 'newsletter.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(78, 'newsletter.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(79, 'badresponseorder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(80, 'badresponseorder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(81, 'badresponseorder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(82, 'content.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(83, 'content.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(84, 'content.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(85, 'content.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(86, 'content.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(87, 'content.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(88, 'content.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(89, 'main.head-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(90, 'main.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(91, 'main.head-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(92, 'main.body-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(93, 'main.header-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(94, 'main.navbar-secondary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(95, 'main.navbar-primary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(96, 'main.header-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(97, 'main.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(98, 'main.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(99, 'main.footer-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(100, 'main.footer-body', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(101, 'main.footer-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(102, 'main.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(103, 'main.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(104, 'main.body-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(105, '404.content', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(106, '404.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(107, '404.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(108, '404.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(109, 'order-delivery.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(110, 'order-delivery.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(111, 'order-delivery.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(112, 'order-delivery.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(113, 'order-delivery.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(114, 'order-delivery.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(115, 'order-delivery.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(116, 'address-create.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(117, 'address-create.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(118, 'address-create.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(119, 'address-create.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(120, 'address-create.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(121, 'address-create.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(122, 'address-create.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(123, 'folder.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(124, 'folder.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(125, 'folder.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(126, 'folder.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(127, 'folder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(128, 'folder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(129, 'folder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(130, 'order-failed.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(131, 'order-failed.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(132, 'order-failed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(133, 'order-failed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(134, 'order-failed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(135, 'category.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(136, 'category.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(137, 'category.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(138, 'category.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(139, 'category.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(140, 'category.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(141, 'category.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(142, 'address-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(143, 'address-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(144, 'address-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(145, 'address-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(146, 'address-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(147, 'address-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(148, 'address-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(149, 'home.body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(150, 'home.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(151, 'home.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(152, 'home.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(153, 'account-password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(154, 'account-password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(155, 'account-password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(156, 'account-password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(157, 'account-password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(158, 'product.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(159, 'product.gallery', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(160, 'product.details-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(161, 'product.details-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(162, 'product.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(163, 'product.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(164, 'product.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(165, 'product.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(166, 'product.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(167, 'account.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(168, 'account.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(169, 'account.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(170, 'account.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(171, 'account.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(172, 'viewall.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(173, 'viewall.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(174, 'viewall.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(175, 'viewall.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(176, 'viewall.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(177, 'singleproduct.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(178, 'singleproduct.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(179, 'category.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(180, 'category.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(181, 'category.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(182, 'content.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(183, 'content.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(184, 'content.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(185, 'order-delivery.extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(186, 'order-delivery.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(187, 'category.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(188, 'category.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(189, 'content.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(190, 'content.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(191, 'folder.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(192, 'folder.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(193, 'brand.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(194, 'brand.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(195, 'brand.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(196, 'brand.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(197, 'brand.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(198, 'brand.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(199, 'brand.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(200, 'brand.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(201, 'brand.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(202, 'brand.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(203, 'brand.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(204, 'brand.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(205, 'account-order.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(206, 'account-order.information', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(207, 'account-order.after-information', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(208, 'account-order.delivery-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(209, 'account-order.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(210, 'account-order.invoice-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(211, 'account-order.invoice-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(212, 'account-order.after-addresses', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(213, 'account-order.products-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(214, 'account-order.product-extra', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(215, 'account-order.products-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(216, 'account-order.after-products', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(217, 'account-order.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(218, 'account-order.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(219, 'account-order.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(220, 'account-order.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(221, 'account.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(222, 'account-order.product', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(223, 'mini-cart', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(224, 'sale.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(225, 'sale.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(226, 'sale.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(227, 'sale.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(228, 'sale.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(229, 'sale.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(230, 'sale.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(231, 'sale.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(232, 'sale.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(233, 'account-order.invoice-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(234, 'account-order.delivery-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(235, 'newsletter-unsubscribe.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(236, 'newsletter-unsubscribe.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(237, 'newsletter-unsubscribe.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(238, 'newsletter-unsubscribe.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(239, 'newsletter-unsubscribe.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +-- Insert admin hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(1000, 'category.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1001, 'content.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1002, 'folder.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1003, 'order.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1004, 'product.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1005, 'features-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1006, 'features-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1007, 'feature.value-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1008, 'feature.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1009, 'product.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1010, 'coupon.create-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1011, 'taxes.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1012, 'tax-rule.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1013, 'tools.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1014, 'tools.col1-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1015, 'tools.col1-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1016, 'tools.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1017, 'tools.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1018, 'messages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1019, 'messages.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1020, 'messages.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1021, 'messages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1022, 'message.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1023, 'message.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1024, 'messages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1025, 'taxes-rules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1026, 'taxes-rules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1027, 'tax.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1028, 'tax.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1029, 'tax-rule.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1030, 'tax-rule.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1031, 'taxes-rules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1032, 'exports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1033, 'exports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1034, 'exports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1035, 'exports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1036, 'export.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1037, 'product.folders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1038, 'product.folders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1039, 'product.details-pricing-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1040, 'product.details-details-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1041, 'product.details-promotion-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1042, 'product.before-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1043, 'product.combinations-list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1044, 'product.after-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1045, 'product.combination-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1046, 'modules.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1047, 'modules.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1048, 'currency.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1049, 'category.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1050, 'category.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1051, 'category.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1052, 'document.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1053, 'customer.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1054, 'customers.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1055, 'customers.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1056, 'customers.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1057, 'customer.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1058, 'customer.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1059, 'customer.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1060, 'customers.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1061, 'product.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1062, 'product.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1063, 'product.accessories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1064, 'product.accessories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1065, 'product.categories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1066, 'product.categories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1067, 'product.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1068, 'product.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1069, 'product.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1070, 'product.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1071, 'template.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1072, 'template.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1073, 'template.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1074, 'template.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1075, 'templates.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1076, 'templates.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1077, 'templates.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1078, 'templates.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1079, 'template.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1080, 'template.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1081, 'templates.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1082, 'configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1083, 'configuration.catalog-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1084, 'configuration.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1085, 'configuration.shipping-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1086, 'configuration.shipping-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1087, 'configuration.system-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1088, 'configuration.system-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1089, 'configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1090, 'configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1091, 'index.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1092, 'index.middle', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1093, 'index.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1094, 'orders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1095, 'orders.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1096, 'orders.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1097, 'orders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1098, 'orders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1099, 'shipping-zones.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1100, 'shipping-zones.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1101, 'shipping-zones.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1102, 'shipping-zones.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1103, 'shipping-zones.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1104, 'content.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1105, 'home.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1106, 'home.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1107, 'home.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1108, 'modules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1109, 'modules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1110, 'modules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1111, 'languages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1112, 'languages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1113, 'language.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1114, 'languages.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1115, 'languages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1116, 'zone.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1117, 'shipping-zones.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1118, 'system.logs-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1119, 'search.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1120, 'search.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1121, 'search.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1122, 'administrators.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1123, 'administrators.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1124, 'administrator.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1125, 'administrator.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1126, 'administrator.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1127, 'administrators.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1128, 'module-hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1129, 'shipping-configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1130, 'shipping-configuration.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1131, 'shipping-configuration.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1132, 'shipping-configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1133, 'shipping-configuration.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1134, 'shipping-configuration.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1135, 'shipping-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1136, 'features.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1137, 'features.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1138, 'features.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1139, 'features.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1140, 'feature.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1141, 'feature.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1142, 'feature.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1143, 'feature.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1144, 'features.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1145, 'module.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1146, 'module-hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1147, 'module-hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1148, 'module-hook.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1149, 'shipping-configuration.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1150, 'shipping-configuration.country-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1151, 'shipping-configuration.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1152, 'mailing-system.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1153, 'mailing-system.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1154, 'mailing-system.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1155, 'categories.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1156, 'categories.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1157, 'categories.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1158, 'categories.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1159, 'products.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1160, 'products.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1161, 'products.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1162, 'categories.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1163, 'categories.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1164, 'category.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1165, 'product.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1166, 'category.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1167, 'product.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1168, 'categories.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1169, 'variables.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1170, 'variables.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1171, 'variables.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1172, 'variables.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1173, 'variable.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1174, 'variable.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1175, 'variables.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1176, 'order.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1177, 'order.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1178, 'config-store.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1179, 'translations.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1180, 'folders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1181, 'folders.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1182, 'folders.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1183, 'folders.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1184, 'contents.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1185, 'contents.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1186, 'contents.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1187, 'folders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1188, 'folder.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1189, 'content.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1190, 'folder.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1191, 'content.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1192, 'folders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1193, 'template.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1194, 'tax.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1195, 'hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1196, 'countries.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1197, 'countries.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1198, 'countries.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1199, 'countries.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1200, 'country.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1201, 'country.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1202, 'countries.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1203, 'currencies.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1204, 'currencies.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1205, 'currencies.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1206, 'currencies.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1207, 'currency.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1208, 'currency.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1209, 'currencies.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1210, 'customer.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1211, 'customer.address-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1212, 'customer.address-update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1213, 'customer.address-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1214, 'customer.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1215, 'attributes-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1216, 'attributes-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1217, 'attribute-value.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1218, 'attribute.id-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1219, 'attribute.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1220, 'profiles.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1221, 'profiles.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1222, 'profile.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1223, 'profile.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1224, 'profiles.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1225, 'country.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1226, 'profile.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1227, 'variable.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1228, 'coupon.update-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1229, 'coupon.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1230, 'coupon.list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1231, 'coupon.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1232, 'coupon.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1233, 'coupon.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1234, 'coupon.list-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1235, 'module.configuration', 2, 1, 0, 1, 1, 1, NOW(), NOW()), +(1236, 'module.config-js', 2, 1, 0, 1, 1, 1, NOW(), NOW()), +(1237, 'message.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1238, 'image.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1239, 'attributes.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1240, 'attributes.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1241, 'attributes.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1242, 'attributes.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1243, 'attribute.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1244, 'attribute.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1245, 'attribute.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1246, 'attribute.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1247, 'attributes.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1248, 'admin-logs.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1249, 'admin-logs.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1250, 'admin-logs.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1251, 'folder.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1252, 'hooks.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1253, 'hooks.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1254, 'hooks.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1255, 'hooks.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1256, 'hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1257, 'hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1258, 'hooks.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1259, 'main.head-css', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1260, 'main.before-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1261, 'main.inside-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1262, 'main.after-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1263, 'main.before-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1264, 'main.in-top-menu-items', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1265, 'main.after-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1266, 'main.before-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1267, 'main.in-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1268, 'main.after-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1269, 'main.footer-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1270, 'main.topbar-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1271, 'main.topbar-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1272, 'main.top-menu-customer', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1273, 'main.top-menu-order', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1274, 'main.top-menu-catalog', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1275, 'main.top-menu-content', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1276, 'main.top-menu-tools', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1277, 'main.top-menu-modules', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1278, 'main.top-menu-configuration', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1279, 'brand.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1280, 'home.block', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1281, 'brands.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1282, 'brands.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1283, 'brands.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1284, 'brands.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1285, 'brand.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1286, 'brand.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1287, 'brand.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1288, 'imports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1289, 'imports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1290, 'imports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1291, 'imports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1292, 'import.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1293, 'brand.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1294, 'customer.orders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1295, 'customer.orders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1296, 'sales.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1297, 'sales.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1298, 'sales.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1299, 'sales.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1300, 'sale.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1301, 'sale.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1302, 'sales.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1303, 'product.combinations-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1304, 'main.before-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1305, 'main.after-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1306, 'category.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1307, 'product.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1308, 'folder.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1309, 'content.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1310, 'brand.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1311, 'order-edit.bill-delivery-address', 2, 1, 0, 1, 1, 1, NOW(), NOW()), +(1312, 'product.modification.form_top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1313, 'product.modification.form_bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1314, 'brand.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1315, 'sale.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1316, 'api.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1317, 'api.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1318, 'api.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1319, 'coupon.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1320, 'order.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(1321, 'profile.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1322, 'profile.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1323, 'import.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1324, 'import.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1325, 'export.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1326, 'export.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1327, 'category-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1328, 'category-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1329, 'brand-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1330, 'brand-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1331, 'attribute-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1332, 'attribute-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1333, 'currency-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1334, 'currency-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1335, 'country-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1336, 'country-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1337, 'content-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1338, 'content-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1339, 'feature-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1340, 'feature-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1341, 'document-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1342, 'document-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1343, 'customer-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1344, 'customer-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1345, 'image-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1346, 'image-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1347, 'hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1348, 'hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1349, 'folder-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1350, 'folder-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1351, 'module-hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1352, 'module-hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1353, 'module-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1354, 'module-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1355, 'message-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1356, 'message-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1357, 'profile-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1358, 'profile-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1359, 'product-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1360, 'product-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1361, 'order-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1362, 'order-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1363, 'shipping-zones-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1364, 'shipping-zones-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1365, 'shipping-configuration-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1366, 'shipping-configuration-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1367, 'sale-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1368, 'sale-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1369, 'variables-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1370, 'variables-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1371, 'template-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1372, 'template-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1373, 'tax-rule-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1374, 'tax-rule-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1375, 'tax-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1376, 'tax-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1377, 'order-edit.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1378, 'tab-seo.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1379, 'tab-seo.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1380, 'tab-image.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1381, 'tab-image.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1382, 'tab-document.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1383, 'tab-document.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1384, 'export.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1385, 'export.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1386, 'order-edit.customer-information-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1387, 'order-edit.payment-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1388, 'order-edit.delivery-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1389, 'tab-seo.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1390, 'order-edit.order-product-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1391, 'order-edit.order-product-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1392, 'administrators.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1393, 'administrators.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1394, 'advanced-configuration', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1395, 'advanced-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1396, 'brand.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1397, 'brand.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1398, 'category.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1399, 'category.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1400, 'content.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1401, 'content.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1402, 'folder.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1403, 'folder.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1404, 'product.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1405, 'product.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1406, 'state-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1407, 'state-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1408, 'state.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1409, 'states.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1410, 'states.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1411, 'states.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1412, 'states.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1413, 'state.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1414, 'state.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(1415, 'states.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()); + +-- Insert pdf hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(2001, 'invoice.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2002, 'invoice.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2003, 'invoice.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2004, 'invoice.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2005, 'invoice.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2006, 'invoice.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), +(2007, 'invoice.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2008, 'invoice.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), +(2009, 'invoice.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2010, 'invoice.after-products', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2011, 'invoice.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2012, 'delivery.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2013, 'delivery.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2014, 'delivery.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2015, 'delivery.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2016, 'delivery.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2017, 'delivery.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), +(2018, 'delivery.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2019, 'delivery.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), +(2020, 'delivery.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2021, 'delivery.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2022, 'order-placed.additional-payment-info', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(2023, 'wysiwyg.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2024, 'order-edit.cart-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2025, 'order-edit.cart-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2026, 'order-edit.bill-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2027, 'order-edit.bill-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2028, 'order-edit.before-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2029, 'order-edit.before-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2030, 'order-edit.after-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2031, 'order-edit.after-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(2032, 'invoice.after-payment-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2033, 'invoice.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2034, 'delivery.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2035, 'invoice.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(2036, 'delivery.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +-- Insert email hooks +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(3000, 'email-html.layout.css', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3001, 'email-html.layout.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3002, 'email-html.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3003, 'email-html.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3004, 'email-html.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3005, 'email-html.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3006, 'email-html.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3007, 'email-html.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3008, 'email-html.order-confirmation.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3009, 'email-html.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3010, 'email-html.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3011, 'email-html.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3012, 'email-html.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3013, 'email-html.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3014, 'email-html.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3015, 'email-txt.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3016, 'email-txt.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3017, 'email-txt.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3018, 'email-txt.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3019, 'email-txt.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3020, 'email-txt.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3021, 'email-txt.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3022, 'email-txt.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(3023, 'email-txt.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3024, 'email-txt.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3025, 'email-txt.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(3026, 'email-txt.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `customer_title`(`id`, `by_default`, `position`, `created_at`, `updated_at`) VALUES +(1, 1, 1, NOW(), NOW()), +(2, 0, 2, NOW(), NOW()), +(3, 0, 3, NOW(), NOW()); + +INSERT INTO `currency` (`id`, `code`, `symbol`, `format`, `rate`, `visible`, `position`, `by_default`, `created_at`, `updated_at`) +VALUES +(1, 'EUR', '€', '%n %s','1.00', 1, 1, '1', NOW(), NOW()), +(2, 'USD', '$', '%s%n', '1.26', 1, 2, '0', NOW(), NOW()), +(3, 'GBP', '£', '%s%n','0.89', 1, 3, '0', NOW(), NOW()), +(4, 'CHF', 'CHF', '%n %s', '1.34183', 0, 4, '0', NOW(), NOW()), +(5, 'MXN', '$', '%n %s', '17.1304', 0, 5, '0', NOW(), NOW()), +(6, 'PLN', 'zł', '%n %s', '3.84510', 0, 6, '0', NOW(), NOW()), +(7, 'CNY', '¥', '%s %n', '9.13916', 0, 7, '0', NOW(), NOW()), +(8, 'NOK', 'kr', '%n %s', '7.97791', 0, 8, '0', NOW(), NOW()), +(9, 'MDL', 'MDL', '%n %s', '16.1774', 0, 9, '0', NOW(), NOW()), +(10, 'PYG', 'Gs', '%n %s', '6547.98', 0, 10, '0', NOW(), NOW()), +(11, 'ARS', 'ARS', '%n %s', '5.39', 0, 11, '0', NOW(), NOW()), +(12, 'BYR', 'р.', '%n%s', '1.000000', 0, 12, '0', NOW(), NOW()), +(13, 'FJD', '$', '%s%n', '2.57483', 0, 13, '0', NOW(), NOW()), +(14, 'RSD', 'RSD', '%n %s', '115.680000', 0, 14, '0', NOW(), NOW()), +(15, 'SEK', 'kr', '%n %s', '9.14651', 0, 15, '0', NOW(), NOW()), +(16, 'HRK', 'kn', '%n %s', '1.000000', 0, 16, '0', NOW(), NOW()), +(17, 'DKK', 'kr', '%n %s', '7.45201', 0, 17, '0', NOW(), NOW()), +(18, 'NGN', '₦', '%s %n', '1.000000', 0, 18, '0', NOW(), NOW()), +(19, 'HKD', '$', '%n %s', '11.0512', 0, 19, '0', NOW(), NOW()), +(20, 'CAD', 'CAD$', '%s%n', '1.40054', 0, 20, '0', NOW(), NOW()), +(21, 'SAR', '﷼', '%n %s', '5.10682', 0, 21, '0', NOW(), NOW()), +(22, 'CZK', 'Kč', '%n %s', '1', 0, 22, '0', NOW(), NOW()), +(23, 'CRC', '₡', '%s %n', '560', 0, 23, '0', NOW(), NOW()), +(24, 'AZN', 'AZN', '%n %s', '1.09237', 0, 24, '0', NOW(), NOW()), +(25, 'IDR', 'Rp‎', '%n %s', '12177.63', 0, 25, '0', NOW(), NOW()), +(26, 'PKR', '₨', '%n %s', '117.289', 0, 26, '0', NOW(), NOW()), +(27, 'BRL', 'R$', '%s %n', '2.31583', 0, 27, '0', NOW(), NOW()), +(28, 'VND', '₫', '%n %s', '26505.85', 0, 28, '0', NOW(), NOW()), +(29, 'PHP', 'PHP', '%s %n', '1.000000', 0, 29, '0', NOW(), NOW()), +(30, 'GTQ', 'Q', '%n %s', '11.0988', 0, 30, '0', NOW(), NOW()), +(31, 'TRY', 'TL', '%n %s', '1.97638', 0, 31, '0', NOW(), NOW()), +(32, 'JPY', '¥', '%s %n', '113.786', 0, 32, '0', NOW(), NOW()), +(33, 'RUB', 'руб', '%n %s', '41.7632', 0, 33, '0', NOW(), NOW()), +(34, 'PEN', 'S/.', '%s %n', '2.784499', 0, 34, '0', NOW(), NOW()), +(35, 'EGP', '£', '%s %n', '7.77518', 0, 35, '0', NOW(), NOW()), +(36, 'GEL', 'ლ', '%n %s', '2.46684', 0, 36, '0', NOW(), NOW()), +(37, 'BOB', '$b', '%n %s', '9.57620', 0, 37, '0', NOW(), NOW()), +(38, 'AED', 'AED', '%s %n', '1.000000', 0, 38, '0', NOW(), NOW()), +(39, 'THB', '฿', '%n %s', '41.4441', 0, 39, '0', NOW(), NOW()), +(40, 'ILS', '₪‎', '%n%s', '4.97713', 0, 40, '0', NOW(), NOW()), +(41, 'MYR', 'RM', '%s%n', '1.000000', 0, 41, '0', NOW(), NOW()), +(42, 'VEF', 'Bs', '%n %s', '5.84819', 0, 42, '0', NOW(), NOW()), +(43, 'HUF', 'Ft‎', '%n %s', '276.334', 0, 43, '0', NOW(), NOW()), +(44, 'KES', 'KSh', '%s %n', '1.000000', 0, 44, '0', NOW(), NOW()), +(45, 'UAH', '₴', '%n %s', '1', 0, 45, '0', NOW(), NOW()), +(46, 'TND', 'DT', '%n%s', '1.000000', 0, 46, '0', NOW(), NOW()), +(47, 'BGN', 'лв', '%n %s', '1.95580', 0, 47, '0', NOW(), NOW()), +(48, 'INR', '₹', '%s %n', '60.748205', 0, 48, '0', NOW(), NOW()); + +INSERT INTO `area` (`id`, `name`, `postage`, `created_at`, `updated_at`) VALUES +(1, 'France', NULL, NOW(), NOW()), +(2, 'A Zone', NULL, NOW(), NOW()), +(3, 'B Zone', NULL, NOW(), NOW()), +(4, 'C Zone', NULL, NOW(), NOW()), +(5, 'France OM1', NULL, NOW(), NOW()), +(6, 'France OM2', NULL, NOW(), NOW()), +(7, 'Europe', NULL, NOW(), NOW()), +(8, 'North America', NULL, NOW(), NOW()), +(9, 'Asia', NULL, NOW(), NOW()), +(10, 'Africa', NULL, NOW(), NOW()), +(11, 'Oceania', NULL, NOW(), NOW()), +(12, 'South America', NULL, NOW(), NOW()), +(13, 'Europe (non-EU)', NULL, NOW(), NOW()), +(14, 'Central America/Antilla', NULL, NOW(), NOW()); + +INSERT INTO `area_delivery_module` (`id`, `area_id`, `delivery_module_id`, `created_at`, `updated_at`) VALUES +(1, 1, 2, NOW(), NOW()), +(2, 2, 2, NOW(), NOW()), +(3, 3, 2, NOW(), NOW()), +(4, 4, 2, NOW(), NOW()), +(5, 5, 2, NOW(), NOW()), +(6, 6, 2, NOW(), NOW()); + +INSERT INTO `country` (`id`, `visible`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `has_states`, `need_zip_code`, `zip_code_format`, `created_at`, `updated_at`) VALUES +(1, 1, '4', 'AF', 'AFG', 0, 0, '0', '0', '', NOW(), NOW()), +(2, 1, '710', 'ZA', 'ZAF', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(3, 1, '8', 'AL', 'ALB', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(4, 1, '12', 'DZ', 'DZA', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(5, 1, '276', 'DE', 'DEU', 0, 0, '0', '1', '', NOW(), NOW()), +(6, 1, '20', 'AD', 'AND', 0, 0, '0', '1', 'CNNN', NOW(), NOW()), +(7, 1, '24', 'AO', 'AGO', 0, 0, '0', '0', '', NOW(), NOW()), +(8, 1, '28', 'AG', 'ATG', 0, 0, '0', '1', '', NOW(), NOW()), +(9, 1, '682', 'SA', 'SAU', 0, 0, '0', '1', '', NOW(), NOW()), +(10, 1, '32', 'AR', 'ARG', 0, 0, '1', '1', 'LNNNN', NOW(), NOW()), +(11, 1, '51', 'AM', 'ARM', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(12, 1, '36', 'AU', 'AUS', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(13, 1, '40', 'AT', 'AUT', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(14, 1, '31', 'AZ', 'AZE', 0, 0, '0', '1', 'CNNNN', NOW(), NOW()), +(15, 1, '44', 'BS', 'BHS', 0, 0, '0', '1', '', NOW(), NOW()), +(16, 1, '48', 'BH', 'BHR', 0, 0, '0', '1', '', NOW(), NOW()), +(17, 1, '50', 'BD', 'BGD', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(18, 1, '52', 'BB', 'BRB', 0, 0, '0', '1', 'CNNNNN', NOW(), NOW()), +(19, 1, '585', 'PW', 'PLW', 0, 0, '0', '1', '', NOW(), NOW()), +(20, 1, '56', 'BE', 'BEL', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(21, 1, '84', 'BL', 'BLZ', 0, 0, '0', '1', '', NOW(), NOW()), +(22, 1, '204', 'BJ', 'BEN', 0, 0, '0', '0', '', NOW(), NOW()), +(23, 1, '64', 'BT', 'BTN', 0, 0, '0', '1', '', NOW(), NOW()), +(24, 1, '112', 'BY', 'BLR', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(25, 1, '104', 'MM', 'MMR', 0, 0, '0', '1', '', NOW(), NOW()), +(26, 1, '68', 'BO', 'BOL', 0, 0, '0', '1', '', NOW(), NOW()), +(27, 1, '70', 'BA', 'BIH', 0, 0, '0', '1', '', NOW(), NOW()), +(28, 1, '72', 'BW', 'BWA', 0, 0, '0', '1', '', NOW(), NOW()), +(29, 1, '76', 'BR', 'BRA', 0, 0, '0', '1', 'NNNNN-NNN', NOW(), NOW()), +(30, 1, '96', 'BN', 'BRN', 0, 0, '0', '1', 'LLNNNN', NOW(), NOW()), +(31, 1, '100', 'BG', 'BGR', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(32, 1, '854', 'BF', 'BFA', 0, 0, '0', '1', '', NOW(), NOW()), +(33, 1, '108', 'BI', 'BDI', 0, 0, '0', '1', '', NOW(), NOW()), +(34, 1, '116', 'KH', 'KHM', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(35, 1, '120', 'CM', 'CMR', 0, 0, '0', '1', '', NOW(), NOW()), +(37, 1, '132', 'CV', 'CPV', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(38, 1, '152', 'CL', 'CHL', 0, 0, '0', '1', 'NNN-NNNN', NOW(), NOW()), +(39, 1, '156', 'CN', 'CHN', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(40, 1, '196', 'CY', 'CYP', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(41, 1, '170', 'CO', 'COL', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(42, 1, '174', 'KM', 'COM', 0, 0, '0', '1', '', NOW(), NOW()), +(43, 1, '178', 'CG', 'COG', 0, 0, '0', '1', '', NOW(), NOW()), +(44, 1, '184', 'CK', 'COK', 0, 0, '0', '1', '', NOW(), NOW()), +(45, 1, '408', 'KP', 'PRK', 0, 0, '0', '1', '', NOW(), NOW()), +(46, 1, '410', 'KR', 'KOR', 0, 0, '0', '1', 'NNN-NNN', NOW(), NOW()), +(47, 1, '188', 'CR', 'CRI', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(48, 1, '384', 'CI', 'CIV', 0, 0, '0', '1', '', NOW(), NOW()), +(49, 1, '191', 'HR', 'HRV', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(50, 1, '192', 'CU', 'CUB', 0, 0, '0', '1', '', NOW(), NOW()), +(51, 1, '208', 'DK', 'DNK', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(52, 1, '262', 'DJ', 'DJI', 0, 0, '0', '1', '', NOW(), NOW()), +(53, 1, '212', 'DM', 'DMA', 0, 0, '0', '1', '', NOW(), NOW()), +(54, 1, '818', 'EG', 'EGY', 0, 0, '0', '0', '', NOW(), NOW()), +(55, 1, '784', 'AE', 'ARE', 0, 0, '0', '1', '', NOW(), NOW()), +(56, 1, '218', 'EC', 'ECU', 0, 0, '0', '1', 'CNNNNNN', NOW(), NOW()), +(57, 1, '232', 'ER', 'ERI', 0, 0, '0', '1', '', NOW(), NOW()), +(58, 1, '724', 'ES', 'ESP', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(59, 1, '233', 'EE', 'EST', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(61, 1, '231', 'ET', 'ETH', 0, 0, '0', '1', '', NOW(), NOW()), +(62, 1, '242', 'FJ', 'FJI', 0, 0, '0', '1', '', NOW(), NOW()), +(63, 1, '246', 'FI', 'FIN', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(64, 1, '250', 'FR', 'FRA', 1, 1, '0', '1', 'NNNNN', NOW(), NOW()), +(65, 1, '266', 'GA', 'GAB', 0, 0, '0', '1', '', NOW(), NOW()), +(66, 1, '270', 'GM', 'GMB', 0, 0, '0', '1', '', NOW(), NOW()), +(67, 1, '268', 'GE', 'GEO', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(68, 1, '288', 'GH', 'GHA', 0, 0, '0', '1', '', NOW(), NOW()), +(69, 1, '300', 'GR', 'GRC', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(70, 1, '308', 'GD', 'GRD', 0, 0, '0', '1', '', NOW(), NOW()), +(71, 1, '320', 'GT', 'GTM', 0, 0, '0', '1', '', NOW(), NOW()), +(72, 1, '324', 'GN', 'GIN', 0, 0, '0', '1', '', NOW(), NOW()), +(73, 1, '624', 'GW', 'GNB', 0, 0, '0', '1', '', NOW(), NOW()), +(74, 1, '226', 'GQ', 'GNQ', 0, 0, '0', '1', '', NOW(), NOW()), +(75, 1, '328', 'GY', 'GUY', 0, 0, '0', '1', '', NOW(), NOW()), +(76, 1, '332', 'HT', 'HTI', 0, 0, '0', '1', '', NOW(), NOW()), +(77, 1, '340', 'HN', 'HND', 0, 0, '0', '1', '', NOW(), NOW()), +(78, 1, '348', 'HU', 'HUN', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(79, 1, '356', 'IN', 'IND', 0, 0, '0', '1', 'NNN NNN', NOW(), NOW()), +(80, 1, '360', 'ID', 'IDN', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(81, 1, '364', 'IR', 'IRN', 0, 0, '0', '1', 'NNNNN-NNNNN', NOW(), NOW()), +(82, 1, '368', 'IQ', 'IRQ', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(83, 1, '372', 'IE', 'IRL', 0, 0, '0', '0', '', NOW(), NOW()), +(84, 1, '352', 'IS', 'ISL', 0, 0, '0', '1', 'NNN', NOW(), NOW()), +(85, 1, '376', 'IL', 'ISR', 0, 0, '0', '1', 'NNNNNNN', NOW(), NOW()), +(86, 1, '380', 'IT', 'ITA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(87, 1, '388', 'JM', 'JAM', 0, 0, '0', '1', '', NOW(), NOW()), +(88, 1, '392', 'JP', 'JPN', 0, 0, '1', '1', 'NNN-NNNN', NOW(), NOW()), +(89, 1, '400', 'JO', 'JOR', 0, 0, '0', '1', '', NOW(), NOW()), +(90, 1, '398', 'KZ', 'KAZ', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(91, 1, '404', 'KE', 'KEN', 0, 0, '0', '1', '', NOW(), NOW()), +(92, 1, '417', 'KG', 'KGZ', 0, 0, '0', '1', '', NOW(), NOW()), +(93, 1, '296', 'KI', 'KIR', 0, 0, '0', '1', '', NOW(), NOW()), +(94, 1, '414', 'KW', 'KWT', 0, 0, '0', '1', '', NOW(), NOW()), +(95, 1, '418', 'LA', 'LAO', 0, 0, '0', '1', '', NOW(), NOW()), +(96, 1, '426', 'LS', 'LSO', 0, 0, '0', '1', '', NOW(), NOW()), +(97, 1, '428', 'LV', 'LVA', 0, 0, '0', '1', 'C-NNNN', NOW(), NOW()), +(98, 1, '422', 'LB', 'LBN', 0, 0, '0', '1', '', NOW(), NOW()), +(99, 1, '430', 'LR', 'LBR', 0, 0, '0', '1', '', NOW(), NOW()), +(100, 1, '343', 'LY', 'LBY', 0, 0, '0', '1', '', NOW(), NOW()), +(101, 1, '438', 'LI', 'LIE', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(102, 1, '440', 'LT', 'LTU', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(103, 1, '442', 'LU', 'LUX', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(104, 1, '807', 'MK', 'MKD', 0, 0, '0', '1', '', NOW(), NOW()), +(105, 1, '450', 'MG', 'MDG', 0, 0, '0', '1', '', NOW(), NOW()), +(106, 1, '458', 'MY', 'MYS', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(107, 1, '454', 'MW', 'MWI', 0, 0, '0', '1', '', NOW(), NOW()), +(108, 1, '462', 'MV', 'MDV', 0, 0, '0', '1', '', NOW(), NOW()), +(109, 1, '466', 'ML', 'MLI', 0, 0, '0', '1', '', NOW(), NOW()), +(110, 1, '470', 'MT', 'MLT', 0, 0, '0', '1', 'LLL NNNN', NOW(), NOW()), +(111, 1, '504', 'MA', 'MAR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(112, 1, '584', 'MH', 'MHL', 0, 0, '0', '1', '', NOW(), NOW()), +(113, 1, '480', 'MU', 'MUS', 0, 0, '0', '1', '', NOW(), NOW()), +(114, 1, '478', 'MR', 'MRT', 0, 0, '0', '1', '', NOW(), NOW()), +(115, 1, '484', 'MX', 'MEX', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(116, 1, '583', 'FM', 'FSM', 0, 0, '0', '1', '', NOW(), NOW()), +(117, 1, '498', 'MD', 'MDA', 0, 0, '0', '1', 'C-NNNN', NOW(), NOW()), +(118, 1, '492', 'MC', 'MCO', 0, 0, '0', '1', '980NN', NOW(), NOW()), +(119, 1, '496', 'MN', 'MNG', 0, 0, '0', '1', '', NOW(), NOW()), +(120, 1, '508', 'MZ', 'MOZ', 0, 0, '0', '1', '', NOW(), NOW()), +(121, 1, '516', 'NA', 'NAM', 0, 0, '0', '1', '', NOW(), NOW()), +(122, 1, '520', 'NR', 'NRU', 0, 0, '0', '1', '', NOW(), NOW()), +(123, 1, '524', 'NP', 'NPL', 0, 0, '0', '1', '', NOW(), NOW()), +(124, 1, '558', 'NI', 'NIC', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(125, 1, '562', 'NE', 'NER', 0, 0, '0', '1', '', NOW(), NOW()), +(126, 1, '566', 'NG', 'NGA', 0, 0, '0', '1', '', NOW(), NOW()), +(127, 1, '570', 'NU', 'NIU', 0, 0, '0', '1', '', NOW(), NOW()), +(128, 1, '578', 'NO', 'NOR', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(129, 1, '554', 'NZ', 'NZL', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(130, 1, '512', 'OM', 'OMN', 0, 0, '0', '1', '', NOW(), NOW()), +(131, 1, '800', 'UG', 'UGA', 0, 0, '0', '1', '', NOW(), NOW()), +(132, 1, '860', 'UZ', 'UZB', 0, 0, '0', '1', '', NOW(), NOW()), +(133, 1, '586', 'PK', 'PAK', 0, 0, '0', '1', '', NOW(), NOW()), +(134, 1, '591', 'PA', 'PAN', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(135, 1, '598', 'PG', 'PNG', 0, 0, '0', '1', '', NOW(), NOW()), +(136, 1, '600', 'PY', 'PRY', 0, 0, '0', '1', '', NOW(), NOW()), +(137, 1, '528', 'NL', 'NLD', 0, 0, '0', '1', 'NNNN LL', NOW(), NOW()), +(138, 1, '604', 'PE', 'PER', 0, 0, '0', '1', '', NOW(), NOW()), +(139, 1, '608', 'PH', 'PHL', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(140, 1, '616', 'PL', 'POL', 0, 0, '0', '1', 'NN-NNN', NOW(), NOW()), +(141, 1, '620', 'PT', 'PRT', 0, 0, '0', '1', 'NNNN-NNN', NOW(), NOW()), +(142, 1, '634', 'QA', 'QAT', 0, 0, '0', '1', '', NOW(), NOW()), +(143, 1, '140', 'CF', 'CAF', 0, 0, '0', '1', '', NOW(), NOW()), +(144, 1, '214', 'DO', 'DOM', 0, 0, '0', '1', '', NOW(), NOW()), +(145, 1, '203', 'CZ', 'CZE', 0, 0, '0', '1', 'NNN NN', NOW(), NOW()), +(146, 1, '642', 'RO', 'ROU', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(147, 1, '826', 'GB', 'GBR', 0, 0, '0', '1', '', NOW(), NOW()), +(148, 1, '643', 'RU', 'RUS', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(149, 1, '646', 'RW', 'RWA', 0, 0, '0', '1', '', NOW(), NOW()), +(150, 1, '659', 'KN', 'KNA', 0, 0, '0', '1', '', NOW(), NOW()), +(151, 1, '662', 'LC', 'LCA', 0, 0, '0', '1', '', NOW(), NOW()), +(152, 1, '674', 'SM', 'SMR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(153, 1, '670', 'VC', 'VCT', 0, 0, '0', '1', '', NOW(), NOW()), +(154, 1, '90', 'SB', 'SLB', 0, 0, '0', '1', '', NOW(), NOW()), +(155, 1, '222', 'SV', 'SLV', 0, 0, '0', '1', '', NOW(), NOW()), +(156, 1, '882', 'WS', 'WSM', 0, 0, '0', '1', '', NOW(), NOW()), +(157, 1, '678', 'ST', 'STP', 0, 0, '0', '1', '', NOW(), NOW()), +(158, 1, '686', 'SN', 'SEN', 0, 0, '0', '1', '', NOW(), NOW()), +(159, 1, '690', 'SC', 'SYC', 0, 0, '0', '1', '', NOW(), NOW()), +(160, 1, '694', 'SL', 'SLE', 0, 0, '0', '1', '', NOW(), NOW()), +(161, 1, '702', 'SG', 'SGP', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(162, 1, '703', 'SK', 'SVK', 0, 0, '0', '1', 'NNN NN', NOW(), NOW()), +(163, 1, '705', 'SI', 'SVN', 0, 0, '0', '1', 'C-NNNN', NOW(), NOW()), +(164, 1, '706', 'SO', 'SOM', 0, 0, '0', '1', '', NOW(), NOW()), +(165, 1, '729', 'SD', 'SDN', 0, 0, '0', '1', '', NOW(), NOW()), +(166, 1, '144', 'LK', 'LKA', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(167, 1, '752', 'SE', 'SWE', 0, 0, '0', '1', 'NNN NN', NOW(), NOW()), +(168, 1, '756', 'CH', 'CHE', 0, 0, '0', '1', 'NNNN', NOW(), NOW()), +(169, 1, '740', 'SR', 'SUR', 0, 0, '0', '1', '', NOW(), NOW()), +(170, 1, '748', 'SZ', 'SWZ', 0, 0, '0', '1', '', NOW(), NOW()), +(171, 1, '760', 'SY', 'SYR', 0, 0, '0', '1', '', NOW(), NOW()), +(172, 1, '762', 'TJ', 'TJK', 0, 0, '0', '1', '', NOW(), NOW()), +(173, 1, '834', 'TZ', 'TZA', 0, 0, '0', '1', '', NOW(), NOW()), +(174, 1, '148', 'TD', 'TCD', 0, 0, '0', '1', '', NOW(), NOW()), +(175, 1, '764', 'TH', 'THA', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(176, 1, '768', 'TG', 'TGO', 0, 0, '0', '1', '', NOW(), NOW()), +(177, 1, '776', 'TO', 'TON', 0, 0, '0', '1', '', NOW(), NOW()), +(178, 1, '780', 'TT', 'TTO', 0, 0, '0', '1', '', NOW(), NOW()), +(179, 1, '788', 'TN', 'TUN', 0, 0, '0', '1', '', NOW(), NOW()), +(180, 1, '795', 'TM', 'TKM', 0, 0, '0', '1', '', NOW(), NOW()), +(181, 1, '792', 'TR', 'TUR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(182, 1, '798', 'TV', 'TUV', 0, 0, '0', '1', '', NOW(), NOW()), +(183, 1, '804', 'UA', 'UKR', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(184, 1, '858', 'UY', 'URY', 0, 0, '0', '1', '', NOW(), NOW()), +(185, 1, '336', 'VA', 'VAT', 0, 0, '0', '1', 'NNNNN', NOW(), NOW()), +(186, 1, '548', 'VU', 'VUT', 0, 0, '0', '1', '', NOW(), NOW()), +(187, 1, '862', 'VE', 'VEN', 0, 0, '0', '1', '', NOW(), NOW()), +(188, 1, '704', 'VN', 'VNM', 0, 0, '0', '1', 'NNNNNN', NOW(), NOW()), +(189, 1, '887', 'YE', 'YEM', 0, 0, '0', '1', '', NOW(), NOW()), +(191, 1, '180', 'CD', 'COD', 0, 0, '0', '1', '', NOW(), NOW()), +(192, 1, '894', 'ZM', 'ZMB', 0, 0, '0', '1', '', NOW(), NOW()), +(193, 1, '716', 'ZW', 'ZWE', 0, 0, '0', '1', '', NOW(), NOW()), +(196, 1, '840', 'US', 'USA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(246, 1, '124', 'CA', 'CAN', 0, 0, '1', '1', 'LNL NLN', NOW(), NOW()), +(259, 1, '312', 'GP', 'GLP', 0, 0, '0', '1', '', NOW(), NOW()), +(260, 1, '254', 'GF', 'GUF', 0, 0, '0', '1', '', NOW(), NOW()), +(261, 1, '474', 'MQ', 'MTQ', 0, 0, '0', '1', '', NOW(), NOW()), +(262, 1, '175', 'YT', 'MYT', 0, 0, '0', '1', '', NOW(), NOW()), +(263, 1, '638', 'RE', 'REU', 0, 0, '0', '1', '', NOW(), NOW()), +(264, 1, '666', 'PM', 'SPM', 0, 0, '0', '1', '', NOW(), NOW()), +(265, 1, '540', 'NC', 'NCL', 0, 0, '0', '1', '', NOW(), NOW()), +(266, 1, '258', 'PF', 'PYF', 0, 0, '0', '1', '', NOW(), NOW()), +(267, 1, '876', 'WF', 'WLF', 0, 0, '0', '1', '', NOW(), NOW()), +(269, 1, '344', 'HK', 'HKG', 0, 0, '0', '0', '', NOW(), NOW()), +(270, 1, '652', 'BL', 'BLM', 0, 0, '0', '0', '', NOW(), NOW()), +(271, 1, '663', 'MF', 'MAF', 0, 0, '0', '0', '', NOW(), NOW()), +(272, 1, '260', 'TF', 'ATF', 0, 0, '0', '0', '', NOW(), NOW()); + +INSERT INTO `state` (`id`, `visible`, `isocode`, `country_id`, `created_at`, `updated_at`) VALUES +(1, 1, 'AL', '196', NOW(), NOW()), +(2, 1, 'AK', '196', NOW(), NOW()), +(3, 1, 'AZ', '196', NOW(), NOW()), +(4, 1, 'AR', '196', NOW(), NOW()), +(5, 1, 'CA', '196', NOW(), NOW()), +(6, 1, 'CO', '196', NOW(), NOW()), +(7, 1, 'CT', '196', NOW(), NOW()), +(8, 1, 'DE', '196', NOW(), NOW()), +(9, 1, 'FL', '196', NOW(), NOW()), +(10, 1, 'GA', '196', NOW(), NOW()), +(11, 1, 'HI', '196', NOW(), NOW()), +(12, 1, 'ID', '196', NOW(), NOW()), +(13, 1, 'IL', '196', NOW(), NOW()), +(14, 1, 'IN', '196', NOW(), NOW()), +(15, 1, 'IA', '196', NOW(), NOW()), +(16, 1, 'KS', '196', NOW(), NOW()), +(17, 1, 'KY', '196', NOW(), NOW()), +(18, 1, 'LA', '196', NOW(), NOW()), +(19, 1, 'ME', '196', NOW(), NOW()), +(20, 1, 'MD', '196', NOW(), NOW()), +(21, 1, 'MA', '196', NOW(), NOW()), +(22, 1, 'MI', '196', NOW(), NOW()), +(23, 1, 'MN', '196', NOW(), NOW()), +(24, 1, 'MS', '196', NOW(), NOW()), +(25, 1, 'MO', '196', NOW(), NOW()), +(26, 1, 'MT', '196', NOW(), NOW()), +(27, 1, 'NE', '196', NOW(), NOW()), +(28, 1, 'NV', '196', NOW(), NOW()), +(29, 1, 'NH', '196', NOW(), NOW()), +(30, 1, 'NJ', '196', NOW(), NOW()), +(31, 1, 'NM', '196', NOW(), NOW()), +(32, 1, 'NY', '196', NOW(), NOW()), +(33, 1, 'NC', '196', NOW(), NOW()), +(34, 1, 'ND', '196', NOW(), NOW()), +(35, 1, 'OH', '196', NOW(), NOW()), +(36, 1, 'OK', '196', NOW(), NOW()), +(37, 1, 'OR', '196', NOW(), NOW()), +(38, 1, 'PA', '196', NOW(), NOW()), +(39, 1, 'RI', '196', NOW(), NOW()), +(40, 1, 'SC', '196', NOW(), NOW()), +(41, 1, 'SD', '196', NOW(), NOW()), +(42, 1, 'TN', '196', NOW(), NOW()), +(43, 1, 'TX', '196', NOW(), NOW()), +(44, 1, 'UT', '196', NOW(), NOW()), +(45, 1, 'VT', '196', NOW(), NOW()), +(46, 1, 'VA', '196', NOW(), NOW()), +(47, 1, 'WA', '196', NOW(), NOW()), +(48, 1, 'WV', '196', NOW(), NOW()), +(49, 1, 'WI', '196', NOW(), NOW()), +(50, 1, 'WY', '196', NOW(), NOW()), +(51, 1, 'PR', '196', NOW(), NOW()), +(52, 1, 'VI', '196', NOW(), NOW()), +(53, 1, 'DC', '196', NOW(), NOW()), +(54, 1, 'AGS', '115', NOW(), NOW()), +(55, 1, 'BCN', '115', NOW(), NOW()), +(56, 1, 'BCS', '115', NOW(), NOW()), +(57, 1, 'CAM', '115', NOW(), NOW()), +(58, 1, 'CHP', '115', NOW(), NOW()), +(59, 1, 'CHH', '115', NOW(), NOW()), +(60, 1, 'COA', '115', NOW(), NOW()), +(61, 1, 'COL', '115', NOW(), NOW()), +(62, 1, 'DIF', '115', NOW(), NOW()), +(63, 1, 'DUR', '115', NOW(), NOW()), +(64, 1, 'GUA', '115', NOW(), NOW()), +(65, 1, 'GRO', '115', NOW(), NOW()), +(66, 1, 'HID', '115', NOW(), NOW()), +(67, 1, 'JAL', '115', NOW(), NOW()), +(68, 1, 'MEX', '115', NOW(), NOW()), +(69, 1, 'MIC', '115', NOW(), NOW()), +(70, 1, 'MOR', '115', NOW(), NOW()), +(71, 1, 'NAY', '115', NOW(), NOW()), +(72, 1, 'NLE', '115', NOW(), NOW()), +(73, 1, 'OAX', '115', NOW(), NOW()), +(74, 1, 'PUE', '115', NOW(), NOW()), +(75, 1, 'QUE', '115', NOW(), NOW()), +(76, 1, 'ROO', '115', NOW(), NOW()), +(77, 1, 'SLP', '115', NOW(), NOW()), +(78, 1, 'SIN', '115', NOW(), NOW()), +(79, 1, 'SON', '115', NOW(), NOW()), +(80, 1, 'TAB', '115', NOW(), NOW()), +(81, 1, 'TAM', '115', NOW(), NOW()), +(82, 1, 'TLA', '115', NOW(), NOW()), +(83, 1, 'VER', '115', NOW(), NOW()), +(84, 1, 'YUC', '115', NOW(), NOW()), +(85, 1, 'ZAC', '115', NOW(), NOW()), +(86, 1, 'ON', '246', NOW(), NOW()), +(87, 1, 'QC', '246', NOW(), NOW()), +(88, 1, 'BC', '246', NOW(), NOW()), +(89, 1, 'AB', '246', NOW(), NOW()), +(90, 1, 'MB', '246', NOW(), NOW()), +(91, 1, 'SK', '246', NOW(), NOW()), +(92, 1, 'NS', '246', NOW(), NOW()), +(93, 1, 'NB', '246', NOW(), NOW()), +(94, 1, 'NL', '246', NOW(), NOW()), +(95, 1, 'PE', '246', NOW(), NOW()), +(96, 1, 'NT', '246', NOW(), NOW()), +(97, 1, 'YT', '246', NOW(), NOW()), +(98, 1, 'NU', '246', NOW(), NOW()), +(99, 1, 'B', '10', NOW(), NOW()), +(100, 1, 'K', '10', NOW(), NOW()), +(101, 1, 'H', '10', NOW(), NOW()), +(102, 1, 'U', '10', NOW(), NOW()), +(103, 1, 'C', '10', NOW(), NOW()), +(104, 1, 'X', '10', NOW(), NOW()), +(105, 1, 'W', '10', NOW(), NOW()), +(106, 1, 'E', '10', NOW(), NOW()), +(107, 1, 'P', '10', NOW(), NOW()), +(108, 1, 'Y', '10', NOW(), NOW()), +(109, 1, 'L', '10', NOW(), NOW()), +(110, 1, 'F', '10', NOW(), NOW()), +(111, 1, 'M', '10', NOW(), NOW()), +(112, 1, 'N', '10', NOW(), NOW()), +(113, 1, 'Q', '10', NOW(), NOW()), +(114, 1, 'R', '10', NOW(), NOW()), +(115, 1, 'A', '10', NOW(), NOW()), +(116, 1, 'J', '10', NOW(), NOW()), +(117, 1, 'D', '10', NOW(), NOW()), +(118, 1, 'Z', '10', NOW(), NOW()), +(119, 1, 'S', '10', NOW(), NOW()), +(120, 1, 'G', '10', NOW(), NOW()), +(121, 1, 'V', '10', NOW(), NOW()), +(122, 1, 'T', '10', NOW(), NOW()), +(123, 1, 'AG', '86', NOW(), NOW()), +(124, 1, 'AL', '86', NOW(), NOW()), +(125, 1, 'AN', '86', NOW(), NOW()), +(126, 1, 'AO', '86', NOW(), NOW()), +(127, 1, 'AR', '86', NOW(), NOW()), +(128, 1, 'AP', '86', NOW(), NOW()), +(129, 1, 'AT', '86', NOW(), NOW()), +(130, 1, 'AV', '86', NOW(), NOW()), +(131, 1, 'BA', '86', NOW(), NOW()), +(132, 1, 'BT', '86', NOW(), NOW()), +(133, 1, 'BL', '86', NOW(), NOW()), +(134, 1, 'BN', '86', NOW(), NOW()), +(135, 1, 'BG', '86', NOW(), NOW()), +(136, 1, 'BI', '86', NOW(), NOW()), +(137, 1, 'BO', '86', NOW(), NOW()), +(138, 1, 'BZ', '86', NOW(), NOW()), +(139, 1, 'BS', '86', NOW(), NOW()), +(140, 1, 'BR', '86', NOW(), NOW()), +(141, 1, 'CA', '86', NOW(), NOW()), +(142, 1, 'CL', '86', NOW(), NOW()), +(143, 1, 'CB', '86', NOW(), NOW()), +(144, 1, 'CI', '86', NOW(), NOW()), +(145, 1, 'CE', '86', NOW(), NOW()), +(146, 1, 'CT', '86', NOW(), NOW()), +(147, 1, 'CZ', '86', NOW(), NOW()), +(148, 1, 'CH', '86', NOW(), NOW()), +(149, 1, 'CO', '86', NOW(), NOW()), +(150, 1, 'CS', '86', NOW(), NOW()), +(151, 1, 'CR', '86', NOW(), NOW()), +(152, 1, 'KR', '86', NOW(), NOW()), +(153, 1, 'CN', '86', NOW(), NOW()), +(154, 1, 'EN', '86', NOW(), NOW()), +(155, 1, 'FM', '86', NOW(), NOW()), +(156, 1, 'FE', '86', NOW(), NOW()), +(157, 1, 'FI', '86', NOW(), NOW()), +(158, 1, 'FG', '86', NOW(), NOW()), +(159, 1, 'FC', '86', NOW(), NOW()), +(160, 1, 'FR', '86', NOW(), NOW()), +(161, 1, 'GE', '86', NOW(), NOW()), +(162, 1, 'GO', '86', NOW(), NOW()), +(163, 1, 'GR', '86', NOW(), NOW()), +(164, 1, 'IM', '86', NOW(), NOW()), +(165, 1, 'IS', '86', NOW(), NOW()), +(166, 1, 'AQ', '86', NOW(), NOW()), +(167, 1, 'SP', '86', NOW(), NOW()), +(168, 1, 'LT', '86', NOW(), NOW()), +(169, 1, 'LE', '86', NOW(), NOW()), +(170, 1, 'LC', '86', NOW(), NOW()), +(171, 1, 'LI', '86', NOW(), NOW()), +(172, 1, 'LO', '86', NOW(), NOW()), +(173, 1, 'LU', '86', NOW(), NOW()), +(174, 1, 'MC', '86', NOW(), NOW()), +(175, 1, 'MN', '86', NOW(), NOW()), +(176, 1, 'MS', '86', NOW(), NOW()), +(177, 1, 'MT', '86', NOW(), NOW()), +(178, 1, 'VS', '86', NOW(), NOW()), +(179, 1, 'ME', '86', NOW(), NOW()), +(180, 1, 'MI', '86', NOW(), NOW()), +(181, 1, 'MO', '86', NOW(), NOW()), +(182, 1, 'MB', '86', NOW(), NOW()), +(183, 1, 'NA', '86', NOW(), NOW()), +(184, 1, 'NO', '86', NOW(), NOW()), +(185, 1, 'NU', '86', NOW(), NOW()), +(186, 1, 'OG', '86', NOW(), NOW()), +(187, 1, 'OT', '86', NOW(), NOW()), +(188, 1, 'OR', '86', NOW(), NOW()), +(189, 1, 'PD', '86', NOW(), NOW()), +(190, 1, 'PA', '86', NOW(), NOW()), +(191, 1, 'PR', '86', NOW(), NOW()), +(192, 1, 'PV', '86', NOW(), NOW()), +(193, 1, 'PG', '86', NOW(), NOW()), +(194, 1, 'PU', '86', NOW(), NOW()), +(195, 1, 'PE', '86', NOW(), NOW()), +(196, 1, 'PC', '86', NOW(), NOW()), +(197, 1, 'PI', '86', NOW(), NOW()), +(198, 1, 'PT', '86', NOW(), NOW()), +(199, 1, 'PN', '86', NOW(), NOW()), +(200, 1, 'PZ', '86', NOW(), NOW()), +(201, 1, 'PO', '86', NOW(), NOW()), +(202, 1, 'RG', '86', NOW(), NOW()), +(203, 1, 'RA', '86', NOW(), NOW()), +(204, 1, 'RC', '86', NOW(), NOW()), +(205, 1, 'RE', '86', NOW(), NOW()), +(206, 1, 'RI', '86', NOW(), NOW()), +(207, 1, 'RN', '86', NOW(), NOW()), +(208, 1, 'RM', '86', NOW(), NOW()), +(209, 1, 'RO', '86', NOW(), NOW()), +(210, 1, 'SA', '86', NOW(), NOW()), +(211, 1, 'SS', '86', NOW(), NOW()), +(212, 1, 'SV', '86', NOW(), NOW()), +(213, 1, 'SI', '86', NOW(), NOW()), +(214, 1, 'SR', '86', NOW(), NOW()), +(215, 1, 'SO', '86', NOW(), NOW()), +(216, 1, 'TA', '86', NOW(), NOW()), +(217, 1, 'TE', '86', NOW(), NOW()), +(218, 1, 'TR', '86', NOW(), NOW()), +(219, 1, 'TO', '86', NOW(), NOW()), +(220, 1, 'TP', '86', NOW(), NOW()), +(221, 1, 'TN', '86', NOW(), NOW()), +(222, 1, 'TV', '86', NOW(), NOW()), +(223, 1, 'TS', '86', NOW(), NOW()), +(224, 1, 'UD', '86', NOW(), NOW()), +(225, 1, 'VA', '86', NOW(), NOW()), +(226, 1, 'VE', '86', NOW(), NOW()), +(227, 1, 'VB', '86', NOW(), NOW()), +(228, 1, 'VC', '86', NOW(), NOW()), +(229, 1, 'VR', '86', NOW(), NOW()), +(230, 1, 'VV', '86', NOW(), NOW()), +(231, 1, 'VI', '86', NOW(), NOW()), +(232, 1, 'VT', '86', NOW(), NOW()), +(233, 1, 'AC', '80', NOW(), NOW()), +(234, 1, 'BA', '80', NOW(), NOW()), +(235, 1, 'BB', '80', NOW(), NOW()), +(236, 1, 'BT', '80', NOW(), NOW()), +(237, 1, 'BE', '80', NOW(), NOW()), +(238, 1, 'JT', '80', NOW(), NOW()), +(239, 1, 'KT', '80', NOW(), NOW()), +(240, 1, 'ST', '80', NOW(), NOW()), +(241, 1, 'JI', '80', NOW(), NOW()), +(242, 1, 'KI', '80', NOW(), NOW()), +(243, 1, 'NT', '80', NOW(), NOW()), +(244, 1, 'GO', '80', NOW(), NOW()), +(245, 1, 'JK', '80', NOW(), NOW()), +(246, 1, 'JA', '80', NOW(), NOW()), +(247, 1, 'LA', '80', NOW(), NOW()), +(248, 1, 'MA', '80', NOW(), NOW()), +(249, 1, 'MU', '80', NOW(), NOW()), +(250, 1, 'SA', '80', NOW(), NOW()), +(251, 1, 'SU', '80', NOW(), NOW()), +(252, 1, 'PA', '80', NOW(), NOW()), +(253, 1, 'RI', '80', NOW(), NOW()), +(254, 1, 'KR', '80', NOW(), NOW()), +(255, 1, 'SG', '80', NOW(), NOW()), +(256, 1, 'KS', '80', NOW(), NOW()), +(257, 1, 'SN', '80', NOW(), NOW()), +(258, 1, 'SS', '80', NOW(), NOW()), +(259, 1, 'JB', '80', NOW(), NOW()), +(260, 1, 'KB', '80', NOW(), NOW()), +(261, 1, 'NB', '80', NOW(), NOW()), +(262, 1, 'PB', '80', NOW(), NOW()), +(263, 1, 'SR', '80', NOW(), NOW()), +(264, 1, 'SB', '80', NOW(), NOW()), +(265, 1, 'YO', '80', NOW(), NOW()), +(266, 1, '23', '88', NOW(), NOW()), +(267, 1, '05', '88', NOW(), NOW()), +(268, 1, '02', '88', NOW(), NOW()), +(269, 1, '12', '88', NOW(), NOW()), +(270, 1, '38', '88', NOW(), NOW()), +(271, 1, '18', '88', NOW(), NOW()), +(272, 1, '40', '88', NOW(), NOW()), +(273, 1, '07', '88', NOW(), NOW()), +(274, 1, '21', '88', NOW(), NOW()), +(275, 1, '10', '88', NOW(), NOW()), +(276, 1, '34', '88', NOW(), NOW()), +(277, 1, '01', '88', NOW(), NOW()), +(278, 1, '28', '88', NOW(), NOW()), +(279, 1, '08', '88', NOW(), NOW()), +(280, 1, '17', '88', NOW(), NOW()), +(281, 1, '03', '88', NOW(), NOW()), +(282, 1, '37', '88', NOW(), NOW()), +(283, 1, '46', '88', NOW(), NOW()), +(284, 1, '14', '88', NOW(), NOW()), +(285, 1, '39', '88', NOW(), NOW()), +(286, 1, '43', '88', NOW(), NOW()), +(287, 1, '26', '88', NOW(), NOW()), +(288, 1, '24', '88', NOW(), NOW()), +(289, 1, '04', '88', NOW(), NOW()), +(290, 1, '45', '88', NOW(), NOW()), +(291, 1, '20', '88', NOW(), NOW()), +(292, 1, '42', '88', NOW(), NOW()), +(293, 1, '29', '88', NOW(), NOW()), +(294, 1, '15', '88', NOW(), NOW()), +(295, 1, '44', '88', NOW(), NOW()), +(296, 1, '33', '88', NOW(), NOW()), +(297, 1, '47', '88', NOW(), NOW()), +(298, 1, '27', '88', NOW(), NOW()), +(299, 1, '41', '88', NOW(), NOW()), +(300, 1, '11', '88', NOW(), NOW()), +(301, 1, '25', '88', NOW(), NOW()), +(302, 1, '32', '88', NOW(), NOW()), +(303, 1, '22', '88', NOW(), NOW()), +(304, 1, '09', '88', NOW(), NOW()), +(305, 1, '36', '88', NOW(), NOW()), +(306, 1, '13', '88', NOW(), NOW()), +(307, 1, '31', '88', NOW(), NOW()), +(308, 1, '16', '88', NOW(), NOW()), +(309, 1, '30', '88', NOW(), NOW()), +(310, 1, '06', '88', NOW(), NOW()), +(311, 1, '35', '88', NOW(), NOW()), +(312, 1, '19', '88', NOW(), NOW()); + +INSERT INTO `country_area` (`country_id`, `area_id`, `created_at`, `updated_at`) VALUES +(1, 4, NOW(), NOW()), +(2, 4, NOW(), NOW()), +(3, 3, NOW(), NOW()), +(4, 3, NOW(), NOW()), +(5, 2, NOW(), NOW()), +(6, 1, NOW(), NOW()), +(7, 4, NOW(), NOW()), +(8, 4, NOW(), NOW()), +(9, 4, NOW(), NOW()), +(10, 4, NOW(), NOW()), +(11, 3, NOW(), NOW()), +(12, 4, NOW(), NOW()), +(13, 2, NOW(), NOW()), +(14, 3, NOW(), NOW()), +(15, 4, NOW(), NOW()), +(16, 4, NOW(), NOW()), +(17, 4, NOW(), NOW()), +(18, 4, NOW(), NOW()), +(19, 3, NOW(), NOW()), +(20, 4, NOW(), NOW()), +(21, 4, NOW(), NOW()), +(22, 4, NOW(), NOW()), +(24, 3, NOW(), NOW()), +(25, 4, NOW(), NOW()), +(26, 4, NOW(), NOW()), +(27, 3, NOW(), NOW()), +(28, 4, NOW(), NOW()), +(29, 4, NOW(), NOW()), +(30, 4, NOW(), NOW()), +(31, 3, NOW(), NOW()), +(32, 4, NOW(), NOW()), +(33, 4, NOW(), NOW()), +(34, 4, NOW(), NOW()), +(35, 4, NOW(), NOW()), +(37, 4, NOW(), NOW()), +(38, 4, NOW(), NOW()), +(39, 4, NOW(), NOW()), +(40, 2, NOW(), NOW()), +(41, 4, NOW(), NOW()), +(42, 4, NOW(), NOW()), +(43, 4, NOW(), NOW()), +(44, 4, NOW(), NOW()), +(45, 4, NOW(), NOW()), +(46, 4, NOW(), NOW()), +(47, 4, NOW(), NOW()), +(48, 4, NOW(), NOW()), +(49, 2, NOW(), NOW()), +(50, 4, NOW(), NOW()), +(51, 2, NOW(), NOW()), +(52, 4, NOW(), NOW()), +(53, 4, NOW(), NOW()), +(54, 4, NOW(), NOW()), +(55, 4, NOW(), NOW()), +(56, 4, NOW(), NOW()), +(57, 4, NOW(), NOW()), +(58, 2, NOW(), NOW()), +(59, 2, NOW(), NOW()), +(61, 4, NOW(), NOW()), +(62, 4, NOW(), NOW()), +(63, 2, NOW(), NOW()), +(64, 1, NOW(), NOW()), +(65, 4, NOW(), NOW()), +(66, 4, NOW(), NOW()), +(67, 3, NOW(), NOW()), +(68, 4, NOW(), NOW()), +(69, 2, NOW(), NOW()), +(70, 4, NOW(), NOW()), +(71, 4, NOW(), NOW()), +(72, 4, NOW(), NOW()), +(73, 4, NOW(), NOW()), +(74, 4, NOW(), NOW()), +(75, 4, NOW(), NOW()), +(76, 4, NOW(), NOW()), +(77, 4, NOW(), NOW()), +(78, 2, NOW(), NOW()), +(79, 4, NOW(), NOW()), +(80, 4, NOW(), NOW()), +(81, 4, NOW(), NOW()), +(82, 4, NOW(), NOW()), +(83, 2, NOW(), NOW()), +(84, 3, NOW(), NOW()), +(85, 4, NOW(), NOW()), +(86, 2, NOW(), NOW()), +(87, 4, NOW(), NOW()), +(88, 4, NOW(), NOW()), +(89, 4, NOW(), NOW()), +(90, 4, NOW(), NOW()), +(91, 4, NOW(), NOW()), +(92, 4, NOW(), NOW()), +(93, 4, NOW(), NOW()), +(94, 4, NOW(), NOW()), +(95, 4, NOW(), NOW()), +(96, 4, NOW(), NOW()), +(97, 2, NOW(), NOW()), +(98, 4, NOW(), NOW()), +(99, 4, NOW(), NOW()), +(100, 4, NOW(), NOW()), +(101, 2, NOW(), NOW()), +(102, 2, NOW(), NOW()), +(103, 2, NOW(), NOW()), +(104, 3, NOW(), NOW()), +(105, 4, NOW(), NOW()), +(106, 4, NOW(), NOW()), +(107, 4, NOW(), NOW()), +(108, 4, NOW(), NOW()), +(109, 4, NOW(), NOW()), +(110, 2, NOW(), NOW()), +(111, 3, NOW(), NOW()), +(112, 4, NOW(), NOW()), +(113, 4, NOW(), NOW()), +(114, 4, NOW(), NOW()), +(115, 4, NOW(), NOW()), +(117, 3, NOW(), NOW()), +(118, 1, NOW(), NOW()), +(119, 4, NOW(), NOW()), +(120, 4, NOW(), NOW()), +(121, 4, NOW(), NOW()), +(122, 4, NOW(), NOW()), +(123, 4, NOW(), NOW()), +(124, 4, NOW(), NOW()), +(125, 4, NOW(), NOW()), +(126, 4, NOW(), NOW()), +(128, 3, NOW(), NOW()), +(129, 4, NOW(), NOW()), +(130, 4, NOW(), NOW()), +(131, 4, NOW(), NOW()), +(132, 4, NOW(), NOW()), +(133, 4, NOW(), NOW()), +(134, 4, NOW(), NOW()), +(135, 4, NOW(), NOW()), +(136, 4, NOW(), NOW()), +(137, 2, NOW(), NOW()), +(138, 4, NOW(), NOW()), +(139, 4, NOW(), NOW()), +(140, 2, NOW(), NOW()), +(141, 2, NOW(), NOW()), +(142, 4, NOW(), NOW()), +(143, 4, NOW(), NOW()), +(144, 4, NOW(), NOW()), +(145, 2, NOW(), NOW()), +(146, 2, NOW(), NOW()), +(147, 2, NOW(), NOW()), +(148, 4, NOW(), NOW()), +(149, 4, NOW(), NOW()), +(150, 4, NOW(), NOW()), +(151, 4, NOW(), NOW()), +(152, 2, NOW(), NOW()), +(153, 4, NOW(), NOW()), +(154, 4, NOW(), NOW()), +(156, 4, NOW(), NOW()), +(157, 4, NOW(), NOW()), +(158, 4, NOW(), NOW()), +(159, 4, NOW(), NOW()), +(160, 4, NOW(), NOW()), +(161, 4, NOW(), NOW()), +(162, 2, NOW(), NOW()), +(163, 2, NOW(), NOW()), +(164, 4, NOW(), NOW()), +(165, 4, NOW(), NOW()), +(166, 4, NOW(), NOW()), +(167, 2, NOW(), NOW()), +(168, 2, NOW(), NOW()), +(169, 4, NOW(), NOW()), +(170, 4, NOW(), NOW()), +(171, 4, NOW(), NOW()), +(172, 4, NOW(), NOW()), +(173, 4, NOW(), NOW()), +(174, 4, NOW(), NOW()), +(175, 4, NOW(), NOW()), +(176, 4, NOW(), NOW()), +(177, 4, NOW(), NOW()), +(178, 4, NOW(), NOW()), +(179, 3, NOW(), NOW()), +(180, 4, NOW(), NOW()), +(181, 3, NOW(), NOW()), +(182, 4, NOW(), NOW()), +(183, 2, NOW(), NOW()), +(184, 4, NOW(), NOW()), +(185, 2, NOW(), NOW()), +(186, 4, NOW(), NOW()), +(187, 4, NOW(), NOW()), +(188, 4, NOW(), NOW()), +(189, 4, NOW(), NOW()), +(191, 4, NOW(), NOW()), +(192, 4, NOW(), NOW()), +(193, 4, NOW(), NOW()), +(196, 4, NOW(), NOW()), +(246, 4, NOW(), NOW()), +(259, 5, NOW(), NOW()), +(260, 5, NOW(), NOW()), +(261, 5, NOW(), NOW()), +(262, 5, NOW(), NOW()), +(263, 5, NOW(), NOW()), +(264, 5, NOW(), NOW()), +(265, 6, NOW(), NOW()), +(266, 6, NOW(), NOW()), +(267, 6, NOW(), NOW()), +(269, 4, NOW(), NOW()), +(270, 5, NOW(), NOW()), +(271, 5, NOW(), NOW()), +(272, 6, NOW(), NOW()), +(1, 9, NOW(), NOW()), +(2, 10, NOW(), NOW()), +(3, 13, NOW(), NOW()), +(4, 10, NOW(), NOW()), +(5, 7, NOW(), NOW()), +(6, 13, NOW(), NOW()), +(7, 10, NOW(), NOW()), +(8, 8, NOW(), NOW()), +(9, 9, NOW(), NOW()), +(10, 12, NOW(), NOW()), +(11, 9, NOW(), NOW()), +(12, 11, NOW(), NOW()), +(13, 7, NOW(), NOW()), +(14, 9, NOW(), NOW()), +(15, 8, NOW(), NOW()), +(16, 9, NOW(), NOW()), +(17, 9, NOW(), NOW()), +(18, 8, NOW(), NOW()), +(19, 11, NOW(), NOW()), +(20, 7, NOW(), NOW()), +(21, 14, NOW(), NOW()), +(22, 10, NOW(), NOW()), +(23, 9, NOW(), NOW()), +(24, 13, NOW(), NOW()), +(25, 9, NOW(), NOW()), +(26, 12, NOW(), NOW()), +(27, 7, NOW(), NOW()), +(28, 10, NOW(), NOW()), +(29, 12, NOW(), NOW()), +(30, 9, NOW(), NOW()), +(31, 7, NOW(), NOW()), +(32, 10, NOW(), NOW()), +(33, 10, NOW(), NOW()), +(34, 9, NOW(), NOW()), +(35, 10, NOW(), NOW()), +(37, 10, NOW(), NOW()), +(38, 12, NOW(), NOW()), +(39, 9, NOW(), NOW()), +(40, 7, NOW(), NOW()), +(41, 12, NOW(), NOW()), +(42, 10, NOW(), NOW()), +(43, 10, NOW(), NOW()), +(44, 11, NOW(), NOW()), +(45, 9, NOW(), NOW()), +(46, 9, NOW(), NOW()), +(47, 14, NOW(), NOW()), +(48, 10, NOW(), NOW()), +(49, 13, NOW(), NOW()), +(50, 14, NOW(), NOW()), +(51, 7, NOW(), NOW()), +(52, 10, NOW(), NOW()), +(53, 14, NOW(), NOW()), +(54, 10, NOW(), NOW()), +(55, 9, NOW(), NOW()), +(56, 12, NOW(), NOW()), +(57, 10, NOW(), NOW()), +(58, 7, NOW(), NOW()), +(59, 7, NOW(), NOW()), +(61, 10, NOW(), NOW()), +(62, 11, NOW(), NOW()), +(63, 7, NOW(), NOW()), +(64, 7, NOW(), NOW()), +(65, 10, NOW(), NOW()), +(66, 10, NOW(), NOW()), +(67, 9, NOW(), NOW()), +(68, 10, NOW(), NOW()), +(69, 7, NOW(), NOW()), +(70, 14, NOW(), NOW()), +(71, 14, NOW(), NOW()), +(72, 10, NOW(), NOW()), +(73, 10, NOW(), NOW()), +(74, 10, NOW(), NOW()), +(75, 12, NOW(), NOW()), +(76, 14, NOW(), NOW()), +(77, 14, NOW(), NOW()), +(78, 7, NOW(), NOW()), +(79, 9, NOW(), NOW()), +(80, 9, NOW(), NOW()), +(81, 9, NOW(), NOW()), +(82, 9, NOW(), NOW()), +(83, 7, NOW(), NOW()), +(84, 13, NOW(), NOW()), +(85, 9, NOW(), NOW()), +(86, 7, NOW(), NOW()), +(87, 14, NOW(), NOW()), +(88, 9, NOW(), NOW()), +(89, 9, NOW(), NOW()), +(90, 9, NOW(), NOW()), +(91, 10, NOW(), NOW()), +(92, 9, NOW(), NOW()), +(93, 11, NOW(), NOW()), +(94, 9, NOW(), NOW()), +(95, 9, NOW(), NOW()), +(96, 10, NOW(), NOW()), +(97, 7, NOW(), NOW()), +(98, 9, NOW(), NOW()), +(99, 10, NOW(), NOW()), +(100, 10, NOW(), NOW()), +(101, 7, NOW(), NOW()), +(102, 7, NOW(), NOW()), +(103, 7, NOW(), NOW()), +(104, 13, NOW(), NOW()), +(105, 10, NOW(), NOW()), +(106, 9, NOW(), NOW()), +(107, 10, NOW(), NOW()), +(108, 9, NOW(), NOW()), +(109, 10, NOW(), NOW()), +(110, 7, NOW(), NOW()), +(111, 10, NOW(), NOW()), +(112, 11, NOW(), NOW()), +(113, 10, NOW(), NOW()), +(114, 10, NOW(), NOW()), +(115, 8, NOW(), NOW()), +(116, 11, NOW(), NOW()), +(117, 13, NOW(), NOW()), +(118, 13, NOW(), NOW()), +(119, 9, NOW(), NOW()), +(120, 10, NOW(), NOW()), +(121, 10, NOW(), NOW()), +(122, 11, NOW(), NOW()), +(123, 9, NOW(), NOW()), +(124, 14, NOW(), NOW()), +(125, 10, NOW(), NOW()), +(126, 10, NOW(), NOW()), +(127, 11, NOW(), NOW()), +(128, 13, NOW(), NOW()), +(129, 11, NOW(), NOW()), +(130, 9, NOW(), NOW()), +(131, 10, NOW(), NOW()), +(132, 9, NOW(), NOW()), +(133, 9, NOW(), NOW()), +(134, 14, NOW(), NOW()), +(135, 11, NOW(), NOW()), +(136, 12, NOW(), NOW()), +(137, 7, NOW(), NOW()), +(138, 12, NOW(), NOW()), +(139, 9, NOW(), NOW()), +(140, 7, NOW(), NOW()), +(141, 7, NOW(), NOW()), +(142, 9, NOW(), NOW()), +(143, 10, NOW(), NOW()), +(144, 14, NOW(), NOW()), +(145, 7, NOW(), NOW()), +(146, 7, NOW(), NOW()), +(147, 7, NOW(), NOW()), +(148, 13, NOW(), NOW()), +(149, 10, NOW(), NOW()), +(150, 14, NOW(), NOW()), +(151, 14, NOW(), NOW()), +(152, 13, NOW(), NOW()), +(153, 14, NOW(), NOW()), +(154, 11, NOW(), NOW()), +(155, 14, NOW(), NOW()), +(156, 11, NOW(), NOW()), +(157, 10, NOW(), NOW()), +(158, 10, NOW(), NOW()), +(159, 10, NOW(), NOW()), +(160, 10, NOW(), NOW()), +(161, 9, NOW(), NOW()), +(162, 7, NOW(), NOW()), +(163, 7, NOW(), NOW()), +(164, 10, NOW(), NOW()), +(165, 10, NOW(), NOW()), +(166, 9, NOW(), NOW()), +(167, 7, NOW(), NOW()), +(168, 13, NOW(), NOW()), +(169, 14, NOW(), NOW()), +(170, 10, NOW(), NOW()), +(171, 9, NOW(), NOW()), +(172, 9, NOW(), NOW()), +(173, 10, NOW(), NOW()), +(174, 10, NOW(), NOW()), +(175, 9, NOW(), NOW()), +(176, 10, NOW(), NOW()), +(177, 11, NOW(), NOW()), +(178, 12, NOW(), NOW()), +(179, 10, NOW(), NOW()), +(180, 9, NOW(), NOW()), +(181, 13, NOW(), NOW()), +(182, 11, NOW(), NOW()), +(183, 7, NOW(), NOW()), +(184, 12, NOW(), NOW()), +(185, 13, NOW(), NOW()), +(186, 11, NOW(), NOW()), +(187, 12, NOW(), NOW()), +(188, 9, NOW(), NOW()), +(189, 9, NOW(), NOW()), +(191, 10, NOW(), NOW()), +(192, 10, NOW(), NOW()), +(193, 10, NOW(), NOW()), +(196, 8, NOW(), NOW()), +(246, 8, NOW(), NOW()), +(259, 14, NOW(), NOW()), +(260, 12, NOW(), NOW()), +(261, 14, NOW(), NOW()), +(262, 10, NOW(), NOW()), +(263, 10, NOW(), NOW()), +(264, 14, NOW(), NOW()), +(265, 11, NOW(), NOW()), +(266, 11, NOW(), NOW()), +(267, 11, NOW(), NOW()), +(269, 9, NOW(), NOW()); + +INSERT INTO `tax` (`id`, `type`, `serialized_requirements`, `created_at`, `updated_at`) +VALUES +(1, 'Thelia\\TaxEngine\\TaxType\\PricePercentTaxType', 'eyJwZXJjZW50IjoiMjAifQ==', NOW(), NOW()), +(2, 'Thelia\\TaxEngine\\TaxType\\PricePercentTaxType', 'eyJwZXJjZW50IjoiMTAifQ==', NOW(), NOW()); + + +INSERT INTO `tax_rule` (`id`, `is_default`, `created_at`, `updated_at`) +VALUES +(1, 1, NOW(), NOW()), +(2, 0, NOW(), NOW()); + +INSERT INTO `tax_rule_country` (`tax_rule_id`, `country_id`, `tax_id`, `position`, `created_at`, `updated_at`) +VALUES +(1, 64, 1, 1, NOW(), NOW()), +(2, 64, 2, 1, NOW(), NOW()); + +INSERT INTO `order_status`(`id`, `code`, `created_at`, `updated_at`) VALUES +(1, 'not_paid', NOW(), NOW()), +(2, 'paid', NOW(), NOW()), +(3, 'processing', NOW(), NOW()), +(4, 'sent', NOW(), NOW()), +(5, 'canceled', NOW(), NOW()), +(6, 'refunded', NOW(), NOW()); + +/** +generated with command : php Thelia thelia:generate-resources --output sql +*/ +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(1, 'admin.address', NOW(), NOW()), +(2, 'admin.configuration.administrator', NOW(), NOW()), +(3, 'admin.configuration.area', NOW(), NOW()), +(4, 'admin.configuration.attribute', NOW(), NOW()), +(5, 'admin.category', NOW(), NOW()), +(6, 'admin.configuration', NOW(), NOW()), +(7, 'admin.content', NOW(), NOW()), +(8, 'admin.configuration.country', NOW(), NOW()), +(9, 'admin.coupon', NOW(), NOW()), +(10, 'admin.configuration.currency', NOW(), NOW()), +(11, 'admin.customer', NOW(), NOW()), +(12, 'admin.configuration.feature', NOW(), NOW()), +(13, 'admin.folder', NOW(), NOW()), +(14, 'admin.configuration.language', NOW(), NOW()), +(15, 'admin.configuration.mailing-system', NOW(), NOW()), +(16, 'admin.configuration.message', NOW(), NOW()), +(17, 'admin.module', NOW(), NOW()), +(18, 'admin.order', NOW(), NOW()), +(19, 'admin.product', NOW(), NOW()), +(20, 'admin.configuration.profile', NOW(), NOW()), +(21, 'admin.configuration.shipping-zone', NOW(), NOW()), +(22, 'admin.configuration.tax', NOW(), NOW()), +(23, 'admin.configuration.template', NOW(), NOW()), +(24, 'admin.configuration.system-log', NOW(), NOW()), +(25, 'admin.cache', NOW(), NOW()), +(26, 'admin.home', NOW(), NOW()), +(27, 'admin.configuration.store', NOW(), NOW()), +(28, 'admin.configuration.variable', NOW(), NOW()), +(29, 'admin.configuration.admin-logs', NOW(), NOW()), +(30, 'admin.configuration.system-logs', NOW(), NOW()), +(31, 'admin.configuration.advanced', NOW(), NOW()), +(32, 'admin.configuration.translations', NOW(), NOW()), +(33, 'admin.export', NOW(), NOW()), +(34, 'admin.tools', NOW(), NOW()), +(35, 'admin.brand', NOW(), NOW()), +(36, 'admin.hook', NOW(), NOW()), +(37, 'admin.module-hook', NOW(), NOW()), +(38, 'admin.sales', NOW(), NOW()), +(39, 'admin.administrator', NOW(), NOW()), +(40, 'admin.configuration.category', NOW(), NOW()), +(41, 'admin.configuration.shipping-configuration', NOW(), NOW()), +(42, 'admin.configuration.tax-rule', NOW(), NOW()), +(43, 'admin.hooks', NOW(), NOW()), +(44, 'admin.import', NOW(), NOW()), +(45, 'admin.modules', NOW(), NOW()), +(46, 'admin.profile', NOW(), NOW()), +(47, 'admin.search', NOW(), NOW()), +(48, 'admin.configuration.api', NOW(), NOW()), +(49, 'admin.customer.title', NOW(), NOW()) +; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES +(1, 'order_confirmation', NULL, NULL, 'order_confirmation.txt', NULL, 'order_confirmation.html', NOW(), NOW()), +(2, 'lost_password', NULL, NULL, 'password.txt', NULL, 'password.html', NOW(), NOW()), +(3, 'order_notification', NULL, NULL, 'order_notification.txt', NULL, 'order_notification.html', NOW(), NOW()), +(4, 'customer_account_changed', 0, NULL, 'account_changed_by_admin.txt', NULL, 'account_changed_by_admin.html', NOW(), NOW()), +(5, 'customer_account_created', 0, NULL, 'account_created_by_admin.txt', NULL, 'account_created_by_admin.html', NOW(), NOW()), +(6, 'new_admin_password', NULL, NULL, 'admin_password.txt', NULL, 'admin_password.html', NOW(), NOW()), +(7, 'newsletter_subscription_confirmation', NULL, NULL, 'newsletter_subscription_confirmation.txt', NULL, 'newsletter_subscription_confirmation.html', NOW(), NOW()) +; + +/** +I18n +*/ + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Check available product stock (1) or ignore it (0) when displaying and changing ordered quantity' locale=$locale}, NULL, NULL, NULL), + (2, '{$locale}', {intl l='Name of the active front-office template' locale=$locale}, NULL, NULL, NULL), + (3, '{$locale}', {intl l='Name of the active back-office template' locale=$locale}, NULL, NULL, NULL), + (4, '{$locale}', {intl l='Name of the active PDF template' locale=$locale}, NULL, NULL, NULL), + (5, '{$locale}', {intl l='Name of the active mailing template' locale=$locale}, NULL, NULL, NULL), + (6, '{$locale}', {intl l='Enable (1) or disable (0) URL rewriting' locale=$locale}, NULL, NULL, NULL), + (7, '{$locale}', {intl l='Name of the graphic driver used by the Imagine library (see https://imagine.readthedocs.org)' locale=$locale}, NULL, NULL, NULL), + (8, '{$locale}', {intl l='The default quality (in %) of the generated images' locale=$locale}, NULL, NULL, NULL), + (9, '{$locale}', {intl l='How original (full resolution) images are delivered in the web space (symlink or copy)' locale=$locale}, NULL, NULL, NULL), + (10, '{$locale}', {intl l='How document files are delivered in the web space (symlink or copy)' locale=$locale}, NULL, NULL, NULL), + (11, '{$locale}', {intl l='Path to the directory where images are stored' locale=$locale}, NULL, NULL, NULL), + (12, '{$locale}', {intl l='Path to the directory where documents are stored' locale=$locale}, NULL, NULL, NULL), + (13, '{$locale}', {intl l='The path to the image cache directory in the web space' locale=$locale}, NULL, NULL, NULL), + (14, '{$locale}', {intl l='The path to the document cache directory in the web space' locale=$locale}, NULL, NULL, NULL), + (15, '{$locale}', {intl l='File name of the 404 (not found) view in the current template (with extension, e.g. 404.html)' locale=$locale}, NULL, NULL, NULL), + (16, '{$locale}', {intl l='Name of the template view returned when an obsolete (or inactive) product URL is invoked' locale=$locale}, NULL, NULL, NULL), + (17, '{$locale}', {intl l='Display and process prices with (0) or without (1) taxes.' locale=$locale}, NULL, NULL, NULL), + (18, '{$locale}', {intl l='Compile templates assets automatically upon asset source change (1 = yes, 0 = no)' locale=$locale}, NULL, NULL, NULL), + (19, '{$locale}', {intl l='"Remember me" cookie name for administration users' locale=$locale}, NULL, NULL, NULL), + (20, '{$locale}', {intl l='"Remember me" cookie expiration time, in seconds, for administration users' locale=$locale}, NULL, NULL, NULL), + (21, '{$locale}', {intl l='"Remember me" cookie name for customer users' locale=$locale}, NULL, NULL, NULL), + (22, '{$locale}', {intl l='"Remember me" cookie expiration time, in seconds, for customer users' locale=$locale}, NULL, NULL, NULL), + (23, '{$locale}', {intl l='Base URL of the shop (e.g. http://www.yourshopdomain.com)' locale=$locale}, NULL, NULL, NULL), + (24, '{$locale}', {intl l='Name of the invoice view in the current PDF template (without extension)' locale=$locale}, NULL, NULL, NULL), + (25, '{$locale}', {intl l='Name of the delivery view in the current PDF template (without extension)' locale=$locale}, NULL, NULL, NULL), + (26, '{$locale}', {intl l='The path (relative to the default back-office template) to the image used when no flag image can be found for a country' locale=$locale}, NULL, NULL, NULL), + (27, '{$locale}', {intl l='Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)' locale=$locale}, NULL, NULL, NULL), + (28, '{$locale}', {intl l='Default available stock when check-available-stock is set to 0.' locale=$locale}, NULL, NULL, NULL), + (29, '{$locale}', {intl l='The ID of the folder containing your information pages : terms, imprint, ...' locale=$locale}, NULL, NULL, NULL), + (30, '{$locale}', {intl l='The ID of the \'Terms & Conditions\' content.' locale=$locale}, NULL, NULL, NULL), + (31, '{$locale}', {intl l='Allow negative product stock (1) or not (0)' locale=$locale}, NULL, NULL, NULL), + (32, '{$locale}', {intl l='Use a persistent cookie to keep track of customer cart' locale=$locale}, NULL, NULL, NULL), + (33, '{$locale}', {intl l='Name of the cart cookie' locale=$locale}, NULL, NULL, NULL), + (34, '{$locale}', {intl l='Life time of the cart cookie in the customer browser, in seconds' locale=$locale}, NULL, NULL, NULL), + (35, '{$locale}', {intl l='Life time of the session cookie in the customer browser, in seconds' locale=$locale}, NULL, NULL, NULL), + (36, '{$locale}', {intl l='Leave the default configuration of session' locale=$locale}, NULL, NULL, NULL), + (37, '{$locale}', {intl l='Default lang without translation' locale=$locale}, NULL, NULL, NULL), + (52, '{$locale}', {intl l='[Firewall/Bruteforce] Time to wait between X attempts' locale=$locale}, NULL, NULL, NULL), + (53, '{$locale}', {intl l='[Firewall] Time to wait between X attempts' locale=$locale}, NULL, NULL, NULL), + (54, '{$locale}', {intl l='[Firewall/Bruteforce] Number of allowed attemps' locale=$locale}, NULL, NULL, NULL), + (55, '{$locale}', {intl l='[Firewall] Number of allowed attemps' locale=$locale}, NULL, NULL, NULL), + (56, '{$locale}', {intl l='[Firewall] Activate the firewall' locale=$locale}, NULL, NULL, NULL), + (57, '{$locale}', {intl l='Allow slash ended uri' locale=$locale}, NULL, NULL, NULL), + (58, '{$locale}', {intl l='Show error message instead of a white page on a server error' locale=$locale}, NULL, NULL, NULL), + (59, '{$locale}', {intl l='Filename of the error page' locale=$locale}, NULL, NULL, NULL), + (60, '{$locale}', {intl l='Allow customers to change their email. 1 for yes, 0 for no' locale=$locale}, NULL, NULL, NULL), + (61, '{$locale}', {intl l='Ask the customers to confirm their email, 1 for yes, 0 for no' locale=$locale}, NULL, NULL, NULL), + (62, '{$locale}', {intl l='Secret key for form CSRF token' locale=$locale}, NULL, NULL, NULL), + (63, '{$locale}', {intl l='The minimum length required for an administrator password' locale=$locale}, NULL, NULL, NULL), + (64, '{$locale}', {intl l='Allow an administrator to recreate a lost password (1 = yes, 0 = no)' locale=$locale}, NULL, NULL, NULL), + (65, '{$locale}', {intl l='Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)' locale=$locale}, NULL, NULL, NULL), + (66, '{$locale}', {intl l='Number by default of results per page for product list' locale=$locale}, NUll, NULL, NULL), + (67, '{$locale}', {intl l='Number by default of results per page for order list' locale=$locale}, NUll, NULL, NULL), + (68, '{$locale}', {intl l='Number by default of results per page for customer list' locale=$locale}, NUll, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='An image carousel on your home page' locale=$locale}, NULL, NULL, NULL), + (2, '{$locale}', {intl l='72h delivery' locale=$locale}, NULL, NULL, NULL), + (3, '{$locale}', {intl l='Pay by cheque' locale=$locale}, NULL, NULL, NULL), + (4, '{$locale}', {intl l='Front office integration' locale=$locale}, NULL, NULL, NULL), + (5, '{$locale}', {intl l='TinyMCE WYSIWYG editor' locale=$locale}, NULL, NULL, NULL), + (6, '{$locale}', {intl l='Navigation block' locale=$locale}, NULL, NULL, NULL), + (7, '{$locale}', {intl l='Currency block' locale=$locale}, NULL, NULL, NULL), + (8, '{$locale}', {intl l='Languages block' locale=$locale}, NULL, NULL, NULL), + (9, '{$locale}', {intl l='Search block' locale=$locale}, NULL, NULL, NULL), + (10, '{$locale}', {intl l='Customer account block' locale=$locale}, NULL, NULL, NULL), + (11, '{$locale}', {intl l='Cart block' locale=$locale}, NULL, NULL, NULL), + (12, '{$locale}', {intl l='Google Analytics block' locale=$locale}, NULL, NULL, NULL), + (13, '{$locale}', {intl l='Contact block' locale=$locale}, NULL, NULL, NULL), + (14, '{$locale}', {intl l='Links block' locale=$locale}, NULL, NULL, NULL), + (15, '{$locale}', {intl l='Newsletter block' locale=$locale}, NULL, NULL, NULL), + (16, '{$locale}', {intl l='Social Networks block' locale=$locale}, NULL, NULL, NULL), + (17, '{$locale}', {intl l='New Products block' locale=$locale}, NULL, NULL, NULL), + (18, '{$locale}', {intl l='Products offer block' locale=$locale}, NULL, NULL, NULL), + (19, '{$locale}', {intl l='Smarty template engine integration' locale=$locale}, NULL, NULL, NULL), + (20, '{$locale}', {intl l='Virtual Product Controller' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Insert I18n front hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Invoice choice - at the top' locale=$locale}, NULL, NULL), + (2, '{$locale}', {intl l='Invoice choice - delivery address' locale=$locale}, NULL, NULL), + (3, '{$locale}', {intl l='Invoice choice - extra payment zone' locale=$locale}, NULL, NULL), + (4, '{$locale}', {intl l='Invoice choice - at the bottom' locale=$locale}, NULL, NULL), + (5, '{$locale}', {intl l='Invoice choice - after javascript initialisation' locale=$locale}, NULL, NULL), + (6, '{$locale}', {intl l='Invoice choice - CSS stylesheet' locale=$locale}, NULL, NULL), + (7, '{$locale}', {intl l='Invoice choice - after javascript include' locale=$locale}, NULL, NULL), + (8, '{$locale}', {intl l='Payment gateway - main area' locale=$locale}, NULL, NULL), + (9, '{$locale}', {intl l='Payment gateway - javascript' locale=$locale}, NULL, NULL), + (10, '{$locale}', {intl l='Payment gateway - after javascript initialisation' locale=$locale}, NULL, NULL), + (11, '{$locale}', {intl l='Payment gateway - CSS stylesheet' locale=$locale}, NULL, NULL), + (12, '{$locale}', {intl l='Payment gateway - after javascript include' locale=$locale}, NULL, NULL), + (13, '{$locale}', {intl l='Sitemap - at the bottom' locale=$locale}, NULL, NULL), + (14, '{$locale}', {intl l='Curency selection page - at the top' locale=$locale}, NULL, NULL), + (15, '{$locale}', {intl l='Curency selection page - at the bottom' locale=$locale}, NULL, NULL), + (16, '{$locale}', {intl l='Curency selection page - CSS stylesheet' locale=$locale}, NULL, NULL), + (17, '{$locale}', {intl l='Curency selection page - after javascript include' locale=$locale}, NULL, NULL), + (18, '{$locale}', {intl l='Curency selection page - after javascript initialisation' locale=$locale}, NULL, NULL), + (19, '{$locale}', {intl l='Login page - at the top' locale=$locale}, NULL, NULL), + (20, '{$locale}', {intl l='Login page - at the top of the main area' locale=$locale}, NULL, NULL), + (21, '{$locale}', {intl l='Login page - at the top of the form' locale=$locale}, NULL, NULL), + (22, '{$locale}', {intl l='Login page - at the bottom of the form' locale=$locale}, NULL, NULL), + (23, '{$locale}', {intl l='Login page - at the bottom of the main area' locale=$locale}, NULL, NULL), + (24, '{$locale}', {intl l='Login page - at the bottom' locale=$locale}, NULL, NULL), + (25, '{$locale}', {intl l='Login page - CSS stylesheet' locale=$locale}, NULL, NULL), + (26, '{$locale}', {intl l='Login page - after javascript include' locale=$locale}, NULL, NULL), + (27, '{$locale}', {intl l='Login page - after javascript initialisation' locale=$locale}, NULL, NULL), + (28, '{$locale}', {intl l='Update customer account - at the top' locale=$locale}, NULL, NULL), + (29, '{$locale}', {intl l='Update customer account - at the top of the form' locale=$locale}, NULL, NULL), + (30, '{$locale}', {intl l='Update customer account - at the bottom of the form' locale=$locale}, NULL, NULL), + (31, '{$locale}', {intl l='Update customer account - at the bottom' locale=$locale}, NULL, NULL), + (32, '{$locale}', {intl l='Update customer account - CSS stylesheet' locale=$locale}, NULL, NULL), + (33, '{$locale}', {intl l='Update customer account - after javascript include' locale=$locale}, NULL, NULL), + (34, '{$locale}', {intl l='Update customer account - after javascript initialisation' locale=$locale}, NULL, NULL), + (35, '{$locale}', {intl l='Cart - at the top' locale=$locale}, NULL, NULL), + (36, '{$locale}', {intl l='Cart - at the bottom' locale=$locale}, NULL, NULL), + (37, '{$locale}', {intl l='Cart - after javascript include' locale=$locale}, NULL, NULL), + (38, '{$locale}', {intl l='Cart - CSS stylesheet' locale=$locale}, NULL, NULL), + (39, '{$locale}', {intl l='Cart - javascript initialization' locale=$locale}, NULL, NULL), + (40, '{$locale}', {intl l='Contact page - at the top' locale=$locale}, NULL, NULL), + (41, '{$locale}', {intl l='Contact page - at the top of the form' locale=$locale}, NULL, NULL), + (42, '{$locale}', {intl l='Contact page - at the bottom of the form' locale=$locale}, NULL, NULL), + (43, '{$locale}', {intl l='Contact page - at the bottom' locale=$locale}, NULL, NULL), + (44, '{$locale}', {intl l='Contact page - CSS stylesheet' locale=$locale}, NULL, NULL), + (45, '{$locale}', {intl l='Contact page - after javascript include' locale=$locale}, NULL, NULL), + (46, '{$locale}', {intl l='Contact page - after javascript initialisation' locale=$locale}, NULL, NULL), + (47, '{$locale}', {intl l='Placed order - main area' locale=$locale}, NULL, NULL), + (48, '{$locale}', {intl l='Placed order - CSS stylesheet' locale=$locale}, NULL, NULL), + (49, '{$locale}', {intl l='Placed order - after javascript include' locale=$locale}, NULL, NULL), + (50, '{$locale}', {intl l='Placed order - after javascript initialisation' locale=$locale}, NULL, NULL), + (51, '{$locale}', {intl l='Search page - CSS stylesheet' locale=$locale}, NULL, NULL), + (52, '{$locale}', {intl l='Search page - after javascript include' locale=$locale}, NULL, NULL), + (53, '{$locale}', {intl l='Search page - after javascript initialisation' locale=$locale}, NULL, NULL), + (54, '{$locale}', {intl l='Register - at the top' locale=$locale}, NULL, NULL), + (55, '{$locale}', {intl l='Register - at the top of the form' locale=$locale}, NULL, NULL), + (56, '{$locale}', {intl l='Register - at the bottom of the form' locale=$locale}, NULL, NULL), + (57, '{$locale}', {intl l='Register - at the bottom' locale=$locale}, NULL, NULL), + (58, '{$locale}', {intl l='Register - CSS stylesheet' locale=$locale}, NULL, NULL), + (59, '{$locale}', {intl l='Register - after javascript include' locale=$locale}, NULL, NULL), + (60, '{$locale}', {intl l='Register - after javascript initialisation' locale=$locale}, NULL, NULL), + (61, '{$locale}', {intl l='Lost password - at the top' locale=$locale}, NULL, NULL), + (62, '{$locale}', {intl l='Lost password - at the top of the form' locale=$locale}, NULL, NULL), + (63, '{$locale}', {intl l='Lost password - at the bottom of the form' locale=$locale}, NULL, NULL), + (64, '{$locale}', {intl l='Lost password - at the bottom' locale=$locale}, NULL, NULL), + (65, '{$locale}', {intl l='Lost password - CSS stylesheet' locale=$locale}, NULL, NULL), + (66, '{$locale}', {intl l='Lost password - after javascript include' locale=$locale}, NULL, NULL), + (67, '{$locale}', {intl l='Lost password - javascript initialization' locale=$locale}, NULL, NULL), + (68, '{$locale}', {intl l='language selection page - at the top' locale=$locale}, NULL, NULL), + (69, '{$locale}', {intl l='language selection page - at the bottom' locale=$locale}, NULL, NULL), + (70, '{$locale}', {intl l='language selection page - CSS stylesheet' locale=$locale}, NULL, NULL), + (71, '{$locale}', {intl l='language selection page - after javascript include' locale=$locale}, NULL, NULL), + (72, '{$locale}', {intl l='language selection page - after javascript initialisation' locale=$locale}, NULL, NULL), + (73, '{$locale}', {intl l='Contact page - if successful response' locale=$locale}, NULL, NULL), + (74, '{$locale}', {intl l='Newsletter page - at the top' locale=$locale}, NULL, NULL), + (75, '{$locale}', {intl l='Newsletter page - at the bottom' locale=$locale}, NULL, NULL), + (76, '{$locale}', {intl l='Newsletter page - CSS stylesheet' locale=$locale}, NULL, NULL), + (77, '{$locale}', {intl l='Newsletter page - after javascript include' locale=$locale}, NULL, NULL), + (78, '{$locale}', {intl l='Newsletter page - after javascript initialisation' locale=$locale}, NULL, NULL), + (79, '{$locale}', {intl l='Payment failed - CSS stylesheet' locale=$locale}, NULL, NULL), + (80, '{$locale}', {intl l='Payment failed - after javascript include' locale=$locale}, NULL, NULL), + (81, '{$locale}', {intl l='Payment failed - javascript initialization' locale=$locale}, NULL, NULL), + (82, '{$locale}', {intl l='Content page - at the top' locale=$locale}, NULL, NULL), + (83, '{$locale}', {intl l='Content page - at the top of the main area' locale=$locale}, NULL, NULL), + (84, '{$locale}', {intl l='Content page - at the bottom of the main area' locale=$locale}, NULL, NULL), + (85, '{$locale}', {intl l='Content page - at the bottom' locale=$locale}, NULL, NULL), + (86, '{$locale}', {intl l='Content page - CSS stylesheet' locale=$locale}, NULL, NULL), + (87, '{$locale}', {intl l='Content page - after javascript include' locale=$locale}, NULL, NULL), + (88, '{$locale}', {intl l='Content page - after javascript initialisation' locale=$locale}, NULL, NULL), + (89, '{$locale}', {intl l='HTML layout - after the opening of the head tag' locale=$locale}, NULL, NULL), + (90, '{$locale}', {intl l='HTML layout - CSS stylesheet' locale=$locale}, NULL, NULL), + (91, '{$locale}', {intl l='HTML layout - before the end of the head tag' locale=$locale}, NULL, NULL), + (92, '{$locale}', {intl l='HTML layout - after the opening of the body tag' locale=$locale}, NULL, NULL), + (93, '{$locale}', {intl l='HTML layout - at the top of the header' locale=$locale}, NULL, NULL), + (94, '{$locale}', {intl l='HTML layout - secondary navigation' locale=$locale}, NULL, NULL), + (95, '{$locale}', {intl l='HTML layout - primary navigation' locale=$locale}, NULL, NULL), + (96, '{$locale}', {intl l='HTML layout - at the bottom of the header' locale=$locale}, NULL, NULL), + (97, '{$locale}', {intl l='HTML layout - before the main content area' locale=$locale}, NULL, NULL), + (98, '{$locale}', {intl l='HTML layout - after the main content area' locale=$locale}, NULL, NULL), + (99, '{$locale}', {intl l='HTML layout - at the top of the footer' locale=$locale}, NULL, NULL), + (100, '{$locale}', {intl l='HTML layout - footer body' locale=$locale}, NULL, NULL), + (101, '{$locale}', {intl l='HTML layout - bottom of the footer' locale=$locale}, NULL, NULL), + (102, '{$locale}', {intl l='HTML layout - after javascript include' locale=$locale}, NULL, NULL), + (103, '{$locale}', {intl l='HTML layout - javascript initialization' locale=$locale}, NULL, NULL), + (104, '{$locale}', {intl l='HTML layout - before the end body tag' locale=$locale}, NULL, NULL), + (105, '{$locale}', {intl l='Page 404 - content area' locale=$locale}, NULL, NULL), + (106, '{$locale}', {intl l='Page 404 - CSS stylesheet' locale=$locale}, NULL, NULL), + (107, '{$locale}', {intl l='Page 404 - after javascript include' locale=$locale}, NULL, NULL), + (108, '{$locale}', {intl l='Page 404 - after javascript initialisation' locale=$locale}, NULL, NULL), + (109, '{$locale}', {intl l='Delivery choice - at the top' locale=$locale}, NULL, NULL), + (110, '{$locale}', {intl l='Delivery choice - at the top of the form' locale=$locale}, NULL, NULL), + (111, '{$locale}', {intl l='Delivery choice - at the bottom of the form' locale=$locale}, NULL, NULL), + (112, '{$locale}', {intl l='Delivery choice - at the bottom' locale=$locale}, NULL, NULL), + (113, '{$locale}', {intl l='Delivery choice - after javascript initialisation' locale=$locale}, NULL, NULL), + (114, '{$locale}', {intl l='Delivery choice - CSS stylesheet' locale=$locale}, NULL, NULL), + (115, '{$locale}', {intl l='Delivery choice - after javascript include' locale=$locale}, NULL, NULL), + (116, '{$locale}', {intl l='Address creation - at the top' locale=$locale}, NULL, NULL), + (117, '{$locale}', {intl l='Address creation - at the top of the form' locale=$locale}, NULL, NULL), + (118, '{$locale}', {intl l='Address creation - at the bottom of the form' locale=$locale}, NULL, NULL), + (119, '{$locale}', {intl l='Address creation - at the bottom' locale=$locale}, NULL, NULL), + (120, '{$locale}', {intl l='Address creation - CSS stylesheet' locale=$locale}, NULL, NULL), + (121, '{$locale}', {intl l='Address creation - after javascript include' locale=$locale}, NULL, NULL), + (122, '{$locale}', {intl l='Address creation - after javascript initialisation' locale=$locale}, NULL, NULL), + (123, '{$locale}', {intl l='Folder page - at the top' locale=$locale}, NULL, NULL), + (124, '{$locale}', {intl l='Folder page - at the top of the main area' locale=$locale}, NULL, NULL), + (125, '{$locale}', {intl l='Folder page - at the bottom of the main area' locale=$locale}, NULL, NULL), + (126, '{$locale}', {intl l='Folder page - at the bottom' locale=$locale}, NULL, NULL), + (127, '{$locale}', {intl l='Folder page - CSS stylesheet' locale=$locale}, NULL, NULL), + (128, '{$locale}', {intl l='Folder page - after javascript include' locale=$locale}, NULL, NULL), + (129, '{$locale}', {intl l='Folder page - after javascript initialisation' locale=$locale}, NULL, NULL), + (130, '{$locale}', {intl l='Order failed - at the top' locale=$locale}, NULL, NULL), + (131, '{$locale}', {intl l='Order failed - at the bottom' locale=$locale}, NULL, NULL), + (132, '{$locale}', {intl l='Order failed - CSS stylesheet' locale=$locale}, NULL, NULL), + (133, '{$locale}', {intl l='Order failed - after javascript include' locale=$locale}, NULL, NULL), + (134, '{$locale}', {intl l='Order failed - after javascript initialisation' locale=$locale}, NULL, NULL), + (135, '{$locale}', {intl l='Category page - at the top' locale=$locale}, NULL, NULL), + (136, '{$locale}', {intl l='Category page - at the top of the main area' locale=$locale}, NULL, NULL), + (137, '{$locale}', {intl l='Category page - at the bottom of the main area' locale=$locale}, NULL, NULL), + (138, '{$locale}', {intl l='Category page - at the bottom' locale=$locale}, NULL, NULL), + (139, '{$locale}', {intl l='Category page - CSS stylesheet' locale=$locale}, NULL, NULL), + (140, '{$locale}', {intl l='Category page - after javascript include' locale=$locale}, NULL, NULL), + (141, '{$locale}', {intl l='Category page - after javascript initialisation' locale=$locale}, NULL, NULL), + (142, '{$locale}', {intl l='Address update - at the top' locale=$locale}, NULL, NULL), + (143, '{$locale}', {intl l='Address update - at the top of the form' locale=$locale}, NULL, NULL), + (144, '{$locale}', {intl l='Address update - at the bottom of the form' locale=$locale}, NULL, NULL), + (145, '{$locale}', {intl l='Address update - at the bottom' locale=$locale}, NULL, NULL), + (146, '{$locale}', {intl l='Address update - CSS stylesheet' locale=$locale}, NULL, NULL), + (147, '{$locale}', {intl l='Address update - after javascript include' locale=$locale}, NULL, NULL), + (148, '{$locale}', {intl l='Address update - after javascript initialisation' locale=$locale}, NULL, NULL), + (149, '{$locale}', {intl l='Home page - main area' locale=$locale}, NULL, NULL), + (150, '{$locale}', {intl l='Home page - CSS stylesheet' locale=$locale}, NULL, NULL), + (151, '{$locale}', {intl l='Home page - after javascript include' locale=$locale}, NULL, NULL), + (152, '{$locale}', {intl l='Home page - after javascript initialisation' locale=$locale}, NULL, NULL), + (153, '{$locale}', {intl l='Change password - at the top' locale=$locale}, NULL, NULL), + (154, '{$locale}', {intl l='Change password - at the bottom' locale=$locale}, NULL, NULL), + (155, '{$locale}', {intl l='Change password - CSS stylesheet' locale=$locale}, NULL, NULL), + (156, '{$locale}', {intl l='Change password - after javascript include' locale=$locale}, NULL, NULL), + (157, '{$locale}', {intl l='Change password - after javascript initialisation' locale=$locale}, NULL, NULL), + (158, '{$locale}', {intl l='Product page - at the top' locale=$locale}, NULL, NULL), + (159, '{$locale}', {intl l='Product page - photo gallery' locale=$locale}, NULL, NULL), + (160, '{$locale}', {intl l='Product page - at the top of the detail' locale=$locale}, NULL, NULL), + (161, '{$locale}', {intl l='Product page - at the bottom of the detail area' locale=$locale}, NULL, NULL), + (162, '{$locale}', {intl l='Product page - additional information' locale=$locale}, NULL, NULL), + (163, '{$locale}', {intl l='Product page - at the bottom' locale=$locale}, NULL, NULL), + (164, '{$locale}', {intl l='Product page - CSS stylesheet' locale=$locale}, NULL, NULL), + (165, '{$locale}', {intl l='Product page - after javascript include' locale=$locale}, NULL, NULL), + (166, '{$locale}', {intl l='Product page - after javascript initialisation' locale=$locale}, NULL, NULL), + (167, '{$locale}', {intl l='customer account - at the top' locale=$locale}, NULL, NULL), + (168, '{$locale}', {intl l='customer account - at the bottom' locale=$locale}, NULL, NULL), + (169, '{$locale}', {intl l='customer account - CSS stylesheet' locale=$locale}, NULL, NULL), + (170, '{$locale}', {intl l='customer account - after javascript include' locale=$locale}, NULL, NULL), + (171, '{$locale}', {intl l='customer account - after javascript initialisation' locale=$locale}, NULL, NULL), + (172, '{$locale}', {intl l='All Products - at the top' locale=$locale}, NULL, NULL), + (173, '{$locale}', {intl l='All Products - at the bottom' locale=$locale}, NULL, NULL), + (174, '{$locale}', {intl l='All Products - CSS stylesheet' locale=$locale}, NULL, NULL), + (175, '{$locale}', {intl l='All Products - after javascript include' locale=$locale}, NULL, NULL), + (176, '{$locale}', {intl l='All Products - after javascript initialisation' locale=$locale}, NULL, NULL), + (177, '{$locale}', {intl l='Product loop - at the top' locale=$locale}, NULL, NULL), + (178, '{$locale}', {intl l='Product loop - at the bottom' locale=$locale}, NULL, NULL), + (179, '{$locale}', {intl l='Category page - at the top of the sidebar' locale=$locale}, NULL, NULL), + (180, '{$locale}', {intl l='Category page - the body of the sidebar' locale=$locale}, NULL, NULL), + (181, '{$locale}', {intl l='Category page - at the bottom of the sidebar' locale=$locale}, NULL, NULL), + (182, '{$locale}', {intl l='Content page - at the top of the sidebar' locale=$locale}, NULL, NULL), + (183, '{$locale}', {intl l='Content page - the body of the sidebar' locale=$locale}, NULL, NULL), + (184, '{$locale}', {intl l='Content page - at the bottom of the sidebar' locale=$locale}, NULL, NULL), + (185, '{$locale}', {intl l='Delivery choice - extra area' locale=$locale}, NULL, NULL), + (186, '{$locale}', {intl l='Delivery choice - javascript' locale=$locale}, NULL, NULL), + (187, '{$locale}', {intl l='Category page - before the main content area' locale=$locale}, NULL, NULL), + (188, '{$locale}', {intl l='Category page - after the main content area' locale=$locale}, NULL, NULL), + (189, '{$locale}', {intl l='Content page - before the main content area' locale=$locale}, NULL, NULL), + (190, '{$locale}', {intl l='Content page - after the main content area' locale=$locale}, NULL, NULL), + (191, '{$locale}', {intl l='Folder page - before the main content area' locale=$locale}, NULL, NULL), + (192, '{$locale}', {intl l='Folder page - after the main content area' locale=$locale}, NULL, NULL), + (193, '{$locale}', {intl l='Brands page - at the top' locale=$locale}, NULL, NULL), + (194, '{$locale}', {intl l='Brands page - at the bottom' locale=$locale}, NULL, NULL), + (195, '{$locale}', {intl l='Brands page - at the top of the main area' locale=$locale}, NULL, NULL), + (196, '{$locale}', {intl l='Brands page - at the bottom of the main area' locale=$locale}, NULL, NULL), + (197, '{$locale}', {intl l='Brands page - before the main content area' locale=$locale}, NULL, NULL), + (198, '{$locale}', {intl l='Brands page - after the main content area' locale=$locale}, NULL, NULL), + (199, '{$locale}', {intl l='Brands page - CSS stylesheet' locale=$locale}, NULL, NULL), + (200, '{$locale}', {intl l='Brands page - after javascript include' locale=$locale}, NULL, NULL), + (201, '{$locale}', {intl l='Brands page - javascript initialization' locale=$locale}, NULL, NULL), + (202, '{$locale}', {intl l='Brands page - at the top of the sidebar' locale=$locale}, NULL, NULL), + (203, '{$locale}', {intl l='Brands page - the body of the sidebar' locale=$locale}, NULL, NULL), + (204, '{$locale}', {intl l='Brands page - at the bottom of the sidebar' locale=$locale}, NULL, NULL), + (205, '{$locale}', {intl l='Order details - at the top' locale=$locale}, NULL, NULL), + (206, '{$locale}', {intl l='Order details - additional information' locale=$locale}, NULL, NULL), + (207, '{$locale}', {intl l='Order details - after global information' locale=$locale}, NULL, NULL), + (208, '{$locale}', {intl l='Order details - additional delivery information' locale=$locale}, NULL, NULL), + (209, '{$locale}', {intl l='Order details - delivery address' locale=$locale}, NULL, NULL), + (210, '{$locale}', {intl l='Order details - additional invoice information' locale=$locale}, NULL, NULL), + (211, '{$locale}', {intl l='Order details - invoice address' locale=$locale}, NULL, NULL), + (212, '{$locale}', {intl l='Order details - after addresses' locale=$locale}, NULL, NULL), + (213, '{$locale}', {intl l='Order details - before products list' locale=$locale}, NULL, NULL), + (214, '{$locale}', {intl l='Order details - additional product information' locale=$locale}, NULL, NULL), + (215, '{$locale}', {intl l='Order details - after products list' locale=$locale}, NULL, NULL), + (216, '{$locale}', {intl l='Order details - after products' locale=$locale}, NULL, NULL), + (217, '{$locale}', {intl l='Order details - at the bottom' locale=$locale}, NULL, NULL), + (218, '{$locale}', {intl l='Order details - CSS stylesheet' locale=$locale}, NULL, NULL), + (219, '{$locale}', {intl l='Order details - after javascript include' locale=$locale}, NULL, NULL), + (220, '{$locale}', {intl l='Order details - javascript initialization' locale=$locale}, NULL, NULL), + (221, '{$locale}', {intl l='Customer account - additional information' locale=$locale}, NULL, NULL), + (222, '{$locale}', {intl l='Order details - after product' locale=$locale}, NULL, NULL), + (223, '{$locale}', {intl l='Mini cart' locale=$locale}, NULL, NULL), + (224, '{$locale}', {intl l='Sale - at the top' locale=$locale}, NULL, NULL), + (225, '{$locale}', {intl l='Sale - at the bottom' locale=$locale}, NULL, NULL), + (226, '{$locale}', {intl l='Sale - at the top of the main area' locale=$locale}, NULL, NULL), + (227, '{$locale}', {intl l='Sale - at the bottom of the main area' locale=$locale}, NULL, NULL), + (228, '{$locale}', {intl l='Sale - before the main content area' locale=$locale}, NULL, NULL), + (229, '{$locale}', {intl l='Sale - after the main content area' locale=$locale}, NULL, NULL), + (230, '{$locale}', {intl l='Sale - CSS stylesheet' locale=$locale}, NULL, NULL), + (231, '{$locale}', {intl l='Sale - after javascript include' locale=$locale}, NULL, NULL), + (232, '{$locale}', {intl l='Sale - javascript initialization' locale=$locale}, NULL, NULL), + (233, '{$locale}', {intl l='Order details - after invoice address' locale=$locale}, NULL, NULL), + (234, '{$locale}', {intl l='Order details - after delivery address' locale=$locale}, NULL, NULL), + (235, '{$locale}', {intl l='Newsletter unsubscribe page - at the top' locale=$locale}, NULL, NULL), + (236, '{$locale}', {intl l='Newsletter unsubscribe page - at the bottom' locale=$locale}, NULL, NULL), + (237, '{$locale}', {intl l='Newsletter unsubscribe page - CSS stylesheet' locale=$locale}, NULL, NULL), + (238, '{$locale}', {intl l='Newsletter unsubscribe page - after javascript include' locale=$locale}, NULL, NULL), + (239, '{$locale}', {intl l='Newsletter unsubscribe page - after javascript initialisation' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Insert I18n admin hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES +{foreach $locales as $locale} + (1000, '{$locale}', {intl l='Category - content' locale=$locale}, NULL, NULL), + (1001, '{$locale}', {intl l='Content - content' locale=$locale}, NULL, NULL), + (1002, '{$locale}', {intl l='Folder - content' locale=$locale}, NULL, NULL), + (1003, '{$locale}', {intl l='Order - content' locale=$locale}, NULL, NULL), + (1004, '{$locale}', {intl l='Product - content' locale=$locale}, NULL, NULL), + (1005, '{$locale}', {intl l='Features value - table header' locale=$locale}, NULL, NULL), + (1006, '{$locale}', {intl l='Features value - table row' locale=$locale}, NULL, NULL), + (1007, '{$locale}', {intl l='Feature - Value create form' locale=$locale}, NULL, NULL), + (1008, '{$locale}', {intl l='Feature - Edit JavaScript' locale=$locale}, NULL, NULL), + (1009, '{$locale}', {intl l='Product - Edit JavaScript' locale=$locale}, NULL, NULL), + (1010, '{$locale}', {intl l='Coupon - create JavaScript' locale=$locale}, NULL, NULL), + (1011, '{$locale}', {intl l='Taxes - update form' locale=$locale}, NULL, NULL), + (1012, '{$locale}', {intl l='tax rule - Edit JavaScript' locale=$locale}, NULL, NULL), + (1013, '{$locale}', {intl l='Tools - at the top' locale=$locale}, NULL, NULL), + (1014, '{$locale}', {intl l='Tools - at the top of the column' locale=$locale}, NULL, NULL), + (1015, '{$locale}', {intl l='Tools - at the bottom of column 1' locale=$locale}, NULL, NULL), + (1016, '{$locale}', {intl l='Tools - bottom' locale=$locale}, NULL, NULL), + (1017, '{$locale}', {intl l='Tools - JavaScript' locale=$locale}, NULL, NULL), + (1018, '{$locale}', {intl l='Messages - at the top' locale=$locale}, NULL, NULL), + (1019, '{$locale}', {intl l='Messages - table header' locale=$locale}, NULL, NULL), + (1020, '{$locale}', {intl l='Messages - table row' locale=$locale}, NULL, NULL), + (1021, '{$locale}', {intl l='Messages - bottom' locale=$locale}, NULL, NULL), + (1022, '{$locale}', {intl l='Message - create form' locale=$locale}, NULL, NULL), + (1023, '{$locale}', {intl l='Message - delete form' locale=$locale}, NULL, NULL), + (1024, '{$locale}', {intl l='Messages - JavaScript' locale=$locale}, NULL, NULL), + (1025, '{$locale}', {intl l='Taxes rules - at the top' locale=$locale}, NULL, NULL), + (1026, '{$locale}', {intl l='Taxes rules - bottom' locale=$locale}, NULL, NULL), + (1027, '{$locale}', {intl l='Tax - create form' locale=$locale}, NULL, NULL), + (1028, '{$locale}', {intl l='Tax - delete form' locale=$locale}, NULL, NULL), + (1029, '{$locale}', {intl l='tax rule - create form' locale=$locale}, NULL, NULL), + (1030, '{$locale}', {intl l='tax rule - delete form' locale=$locale}, NULL, NULL), + (1031, '{$locale}', {intl l='Taxes rules - JavaScript' locale=$locale}, NULL, NULL), + (1032, '{$locale}', {intl l='Exports - at the top' locale=$locale}, NULL, NULL), + (1033, '{$locale}', {intl l='Exports - at the bottom of a category' locale=$locale}, NULL, NULL), + (1034, '{$locale}', {intl l='Exports - at the bottom of column 1' locale=$locale}, NULL, NULL), + (1035, '{$locale}', {intl l='Exports - JavaScript' locale=$locale}, NULL, NULL), + (1036, '{$locale}', {intl l='Export - JavaScript' locale=$locale}, NULL, NULL), + (1037, '{$locale}', {intl l='Product - folders table header' locale=$locale}, NULL, NULL), + (1038, '{$locale}', {intl l='Product - folders table row' locale=$locale}, NULL, NULL), + (1039, '{$locale}', {intl l='Product - details pricing form' locale=$locale}, NULL, NULL), + (1040, '{$locale}', {intl l='Product - stock edit form' locale=$locale}, NULL, NULL), + (1041, '{$locale}', {intl l='Product - details promotion form' locale=$locale}, NULL, NULL), + (1042, '{$locale}', {intl l='Product - before combinations' locale=$locale}, NULL, NULL), + (1043, '{$locale}', {intl l='Product - combinations list caption' locale=$locale}, NULL, NULL), + (1044, '{$locale}', {intl l='Product - after combinations' locale=$locale}, NULL, NULL), + (1045, '{$locale}', {intl l='Product - combination delete form' locale=$locale}, NULL, NULL), + (1046, '{$locale}', {intl l='Modules - table header' locale=$locale}, NULL, NULL), + (1047, '{$locale}', {intl l='Modules - table row' locale=$locale}, NULL, NULL), + (1048, '{$locale}', {intl l='Currency - Edit JavaScript' locale=$locale}, NULL, NULL), + (1049, '{$locale}', {intl l='Category - contents table header' locale=$locale}, NULL, NULL), + (1050, '{$locale}', {intl l='Category - contents table row' locale=$locale}, NULL, NULL), + (1051, '{$locale}', {intl l='Category - Edit JavaScript' locale=$locale}, NULL, NULL), + (1052, '{$locale}', {intl l='Document - Edit JavaScript' locale=$locale}, NULL, NULL), + (1053, '{$locale}', {intl l='Customer - at the top' locale=$locale}, NULL, NULL), + (1054, '{$locale}', {intl l='Customers - caption' locale=$locale}, NULL, NULL), + (1055, '{$locale}', {intl l='Customers - header' locale=$locale}, NULL, NULL), + (1056, '{$locale}', {intl l='Customers - row' locale=$locale}, NULL, NULL), + (1057, '{$locale}', {intl l='Customer - bottom' locale=$locale}, NULL, NULL), + (1058, '{$locale}', {intl l='Customer - create form' locale=$locale}, NULL, NULL), + (1059, '{$locale}', {intl l='Customer - delete form' locale=$locale}, NULL, NULL), + (1060, '{$locale}', {intl l='Customers - JavaScript' locale=$locale}, NULL, NULL), + (1061, '{$locale}', {intl l='Product - contents table header' locale=$locale}, NULL, NULL), + (1062, '{$locale}', {intl l='Product - contents table row' locale=$locale}, NULL, NULL), + (1063, '{$locale}', {intl l='Product - accessories table header' locale=$locale}, NULL, NULL), + (1064, '{$locale}', {intl l='Product - accessories table row' locale=$locale}, NULL, NULL), + (1065, '{$locale}', {intl l='Product - categories table header' locale=$locale}, NULL, NULL), + (1066, '{$locale}', {intl l='Product - categories table row' locale=$locale}, NULL, NULL), + (1067, '{$locale}', {intl l='Product - attributes table header' locale=$locale}, NULL, NULL), + (1068, '{$locale}', {intl l='Product - attributes table row' locale=$locale}, NULL, NULL), + (1069, '{$locale}', {intl l='Product - features-table-header' locale=$locale}, NULL, NULL), + (1070, '{$locale}', {intl l='Product - features table row' locale=$locale}, NULL, NULL), + (1071, '{$locale}', {intl l='Template - attributes table header' locale=$locale}, NULL, NULL), + (1072, '{$locale}', {intl l='Template - attributes table row' locale=$locale}, NULL, NULL), + (1073, '{$locale}', {intl l='Template - features-table-header' locale=$locale}, NULL, NULL), + (1074, '{$locale}', {intl l='Template - features table row' locale=$locale}, NULL, NULL), + (1075, '{$locale}', {intl l='Templates - at the top' locale=$locale}, NULL, NULL), + (1076, '{$locale}', {intl l='Templates - table header' locale=$locale}, NULL, NULL), + (1077, '{$locale}', {intl l='Templates - table row' locale=$locale}, NULL, NULL), + (1078, '{$locale}', {intl l='Templates - bottom' locale=$locale}, NULL, NULL), + (1079, '{$locale}', {intl l='Template - create form' locale=$locale}, NULL, NULL), + (1080, '{$locale}', {intl l='Template - delete form' locale=$locale}, NULL, NULL), + (1081, '{$locale}', {intl l='Templates - JavaScript' locale=$locale}, NULL, NULL), + (1082, '{$locale}', {intl l='Configuration - at the top' locale=$locale}, NULL, NULL), + (1083, '{$locale}', {intl l='Configuration - at the top of the catalog area' locale=$locale}, NULL, NULL), + (1084, '{$locale}', {intl l='Configuration - at the bottom of the catalog' locale=$locale}, NULL, NULL), + (1085, '{$locale}', {intl l='Configuration - at the top of the shipping area' locale=$locale}, NULL, NULL), + (1086, '{$locale}', {intl l='Configuration - at the bottom of the shipping area' locale=$locale}, NULL, NULL), + (1087, '{$locale}', {intl l='Configuration - at the top of the system area' locale=$locale}, NULL, NULL), + (1088, '{$locale}', {intl l='Configuration - at the bottom of the system area' locale=$locale}, NULL, NULL), + (1089, '{$locale}', {intl l='Configuration - bottom' locale=$locale}, NULL, NULL), + (1090, '{$locale}', {intl l='Configuration - JavaScript' locale=$locale}, NULL, NULL), + (1091, '{$locale}', {intl l='Dashboard - at the top' locale=$locale}, NULL, NULL), + (1092, '{$locale}', {intl l='Dashboard - middle' locale=$locale}, NULL, NULL), + (1093, '{$locale}', {intl l='Dashboard - bottom' locale=$locale}, NULL, NULL), + (1094, '{$locale}', {intl l='Orders - at the top' locale=$locale}, NULL, NULL), + (1095, '{$locale}', {intl l='Orders - table header' locale=$locale}, NULL, NULL), + (1096, '{$locale}', {intl l='Orders - table row' locale=$locale}, NULL, NULL), + (1097, '{$locale}', {intl l='Orders - bottom' locale=$locale}, NULL, NULL), + (1098, '{$locale}', {intl l='Orders - JavaScript' locale=$locale}, NULL, NULL), + (1099, '{$locale}', {intl l='Delivery zone - at the top' locale=$locale}, NULL, NULL), + (1100, '{$locale}', {intl l='Delivery zone - table header' locale=$locale}, NULL, NULL), + (1101, '{$locale}', {intl l='Delivery zone - table row' locale=$locale}, NULL, NULL), + (1102, '{$locale}', {intl l='Delivery zone - bottom' locale=$locale}, NULL, NULL), + (1103, '{$locale}', {intl l='Delivery zone - JavaScript' locale=$locale}, NULL, NULL), + (1104, '{$locale}', {intl l='Content - Edit JavaScript' locale=$locale}, NULL, NULL), + (1105, '{$locale}', {intl l='Home - at the top' locale=$locale}, NULL, NULL), + (1106, '{$locale}', {intl l='Home - bottom' locale=$locale}, NULL, NULL), + (1107, '{$locale}', {intl l='Home - JavaScript' locale=$locale}, NULL, NULL), + (1108, '{$locale}', {intl l='Modules - at the top' locale=$locale}, NULL, NULL), + (1109, '{$locale}', {intl l='Modules - bottom' locale=$locale}, NULL, NULL), + (1110, '{$locale}', {intl l='Modules - JavaScript' locale=$locale}, NULL, NULL), + (1111, '{$locale}', {intl l='Languages - at the top' locale=$locale}, NULL, NULL), + (1112, '{$locale}', {intl l='Languages - bottom' locale=$locale}, NULL, NULL), + (1113, '{$locale}', {intl l='Language - create form' locale=$locale}, NULL, NULL), + (1114, '{$locale}', {intl l='Languages - delete form' locale=$locale}, NULL, NULL), + (1115, '{$locale}', {intl l='Languages - JavaScript' locale=$locale}, NULL, NULL), + (1116, '{$locale}', {intl l='Zone - delete form' locale=$locale}, NULL, NULL), + (1117, '{$locale}', {intl l='Delivery zone - Edit JavaScript' locale=$locale}, NULL, NULL), + (1118, '{$locale}', {intl l='System - logs JavaScript' locale=$locale}, NULL, NULL), + (1119, '{$locale}', {intl l='Search - at the top' locale=$locale}, NULL, NULL), + (1120, '{$locale}', {intl l='Search - bottom' locale=$locale}, NULL, NULL), + (1121, '{$locale}', {intl l='Search - JavaScript' locale=$locale}, NULL, NULL), + (1122, '{$locale}', {intl l='Administrators - at the top' locale=$locale}, NULL, NULL), + (1123, '{$locale}', {intl l='Administrators - bottom' locale=$locale}, NULL, NULL), + (1124, '{$locale}', {intl l='Administrator - create form' locale=$locale}, NULL, NULL), + (1125, '{$locale}', {intl l='Administrator - update form' locale=$locale}, NULL, NULL), + (1126, '{$locale}', {intl l='Administrator - delete form' locale=$locale}, NULL, NULL), + (1127, '{$locale}', {intl l='Administrators - JavaScript' locale=$locale}, NULL, NULL), + (1128, '{$locale}', {intl l='Module hook - Edit JavaScript' locale=$locale}, NULL, NULL), + (1129, '{$locale}', {intl l='Shipping configuration - at the top' locale=$locale}, NULL, NULL), + (1130, '{$locale}', {intl l='Shipping configuration - table header' locale=$locale}, NULL, NULL), + (1131, '{$locale}', {intl l='Shipping configuration - table row' locale=$locale}, NULL, NULL), + (1132, '{$locale}', {intl l='Shipping configuration - bottom' locale=$locale}, NULL, NULL), + (1133, '{$locale}', {intl l='Shipping configuration - create form' locale=$locale}, NULL, NULL), + (1134, '{$locale}', {intl l='Shipping configuration - delete form' locale=$locale}, NULL, NULL), + (1135, '{$locale}', {intl l='Shipping configuration - JavaScript' locale=$locale}, NULL, NULL), + (1136, '{$locale}', {intl l='Features - at the top' locale=$locale}, NULL, NULL), + (1137, '{$locale}', {intl l='Features - table header' locale=$locale}, NULL, NULL), + (1138, '{$locale}', {intl l='Features - table row' locale=$locale}, NULL, NULL), + (1139, '{$locale}', {intl l='Features - bottom' locale=$locale}, NULL, NULL), + (1140, '{$locale}', {intl l='Feature - create form' locale=$locale}, NULL, NULL), + (1141, '{$locale}', {intl l='Feature - delete form' locale=$locale}, NULL, NULL), + (1142, '{$locale}', {intl l='Feature - add to all form' locale=$locale}, NULL, NULL), + (1143, '{$locale}', {intl l='Feature - remove to all form' locale=$locale}, NULL, NULL), + (1144, '{$locale}', {intl l='Features - JavaScript' locale=$locale}, NULL, NULL), + (1145, '{$locale}', {intl l='Module - Edit JavaScript' locale=$locale}, NULL, NULL), + (1146, '{$locale}', {intl l='Module hook - create form' locale=$locale}, NULL, NULL), + (1147, '{$locale}', {intl l='Module hook - delete form' locale=$locale}, NULL, NULL), + (1148, '{$locale}', {intl l='Module hook - JavaScript' locale=$locale}, NULL, NULL), + (1149, '{$locale}', {intl l='Shipping configuration - Edit' locale=$locale}, NULL, NULL), + (1150, '{$locale}', {intl l='Shipping configuration - country delete form' locale=$locale}, NULL, NULL), + (1151, '{$locale}', {intl l='Shipping configuration - Edit JavaScript' locale=$locale}, NULL, NULL), + (1152, '{$locale}', {intl l='Mailing system - at the top' locale=$locale}, NULL, NULL), + (1153, '{$locale}', {intl l='Mailing system - bottom' locale=$locale}, NULL, NULL), + (1154, '{$locale}', {intl l='Mailing system - JavaScript' locale=$locale}, NULL, NULL), + (1155, '{$locale}', {intl l='Categories - at the top' locale=$locale}, NULL, NULL), + (1156, '{$locale}', {intl l='Categories - caption' locale=$locale}, NULL, NULL), + (1157, '{$locale}', {intl l='Categories - header' locale=$locale}, NULL, NULL), + (1158, '{$locale}', {intl l='Categories - row' locale=$locale}, NULL, NULL), + (1159, '{$locale}', {intl l='Products - caption' locale=$locale}, NULL, NULL), + (1160, '{$locale}', {intl l='Products - header' locale=$locale}, NULL, NULL), + (1161, '{$locale}', {intl l='Products - row' locale=$locale}, NULL, NULL), + (1162, '{$locale}', {intl l='Categories - bottom' locale=$locale}, NULL, NULL), + (1163, '{$locale}', {intl l='Categories - at the bottom of the catalog' locale=$locale}, NULL, NULL), + (1164, '{$locale}', {intl l='Category - create form' locale=$locale}, NULL, NULL), + (1165, '{$locale}', {intl l='Product - create form' locale=$locale}, NULL, NULL), + (1166, '{$locale}', {intl l='Category - delete form' locale=$locale}, NULL, NULL), + (1167, '{$locale}', {intl l='Product - delete form' locale=$locale}, NULL, NULL), + (1168, '{$locale}', {intl l='Categories - JavaScript' locale=$locale}, NULL, NULL), + (1169, '{$locale}', {intl l='Variables - at the top' locale=$locale}, NULL, NULL), + (1170, '{$locale}', {intl l='Variables - table header' locale=$locale}, NULL, NULL), + (1171, '{$locale}', {intl l='Variables - table row' locale=$locale}, NULL, NULL), + (1172, '{$locale}', {intl l='Variables - bottom' locale=$locale}, NULL, NULL), + (1173, '{$locale}', {intl l='Variable - create form' locale=$locale}, NULL, NULL), + (1174, '{$locale}', {intl l='Variable - delete form' locale=$locale}, NULL, NULL), + (1175, '{$locale}', {intl l='Variables - JavaScript' locale=$locale}, NULL, NULL), + (1176, '{$locale}', {intl l='Order - product list' locale=$locale}, NULL, NULL), + (1177, '{$locale}', {intl l='Order - Edit JavaScript' locale=$locale}, NULL, NULL), + (1178, '{$locale}', {intl l='Store Information - JavaScript' locale=$locale}, NULL, NULL), + (1179, '{$locale}', {intl l='Translations - JavaScript' locale=$locale}, NULL, NULL), + (1180, '{$locale}', {intl l='Folder - at the top' locale=$locale}, NULL, NULL), + (1181, '{$locale}', {intl l='Folder - caption' locale=$locale}, NULL, NULL), + (1182, '{$locale}', {intl l='Folder - header' locale=$locale}, NULL, NULL), + (1183, '{$locale}', {intl l='Folder - row' locale=$locale}, NULL, NULL), + (1184, '{$locale}', {intl l='Contents - caption' locale=$locale}, NULL, NULL), + (1185, '{$locale}', {intl l='Contents - header' locale=$locale}, NULL, NULL), + (1186, '{$locale}', {intl l='Contents - row' locale=$locale}, NULL, NULL), + (1187, '{$locale}', {intl l='Folder - bottom' locale=$locale}, NULL, NULL), + (1188, '{$locale}', {intl l='Folder - create form' locale=$locale}, NULL, NULL), + (1189, '{$locale}', {intl l='Content - create form' locale=$locale}, NULL, NULL), + (1190, '{$locale}', {intl l='Folder - delete form' locale=$locale}, NULL, NULL), + (1191, '{$locale}', {intl l='Content - delete form' locale=$locale}, NULL, NULL), + (1192, '{$locale}', {intl l='Folder - JavaScript' locale=$locale}, NULL, NULL), + (1193, '{$locale}', {intl l='Template - Edit JavaScript' locale=$locale}, NULL, NULL), + (1194, '{$locale}', {intl l='Tax - Edit JavaScript' locale=$locale}, NULL, NULL), + (1195, '{$locale}', {intl l='Hook - Edit JavaScript' locale=$locale}, NULL, NULL), + (1196, '{$locale}', {intl l='Countries - at the top' locale=$locale}, NULL, NULL), + (1197, '{$locale}', {intl l='Countries - table header' locale=$locale}, NULL, NULL), + (1198, '{$locale}', {intl l='Countries - table row' locale=$locale}, NULL, NULL), + (1199, '{$locale}', {intl l='Countries - bottom' locale=$locale}, NULL, NULL), + (1200, '{$locale}', {intl l='Country - create form' locale=$locale}, NULL, NULL), + (1201, '{$locale}', {intl l='Country - delete form' locale=$locale}, NULL, NULL), + (1202, '{$locale}', {intl l='Countries - JavaScript' locale=$locale}, NULL, NULL), + (1203, '{$locale}', {intl l='Currencies - at the top' locale=$locale}, NULL, NULL), + (1204, '{$locale}', {intl l='Currencies - table header' locale=$locale}, NULL, NULL), + (1205, '{$locale}', {intl l='Currencies - table row' locale=$locale}, NULL, NULL), + (1206, '{$locale}', {intl l='Currencies - bottom' locale=$locale}, NULL, NULL), + (1207, '{$locale}', {intl l='Currency - create form' locale=$locale}, NULL, NULL), + (1208, '{$locale}', {intl l='Currency - delete form' locale=$locale}, NULL, NULL), + (1209, '{$locale}', {intl l='Currencies - JavaScript' locale=$locale}, NULL, NULL), + (1210, '{$locale}', {intl l='Customer - Edit' locale=$locale}, NULL, NULL), + (1211, '{$locale}', {intl l='Customer - address create form' locale=$locale}, NULL, NULL), + (1212, '{$locale}', {intl l='Customer - address update form' locale=$locale}, NULL, NULL), + (1213, '{$locale}', {intl l='Customer - address delete form' locale=$locale}, NULL, NULL), + (1214, '{$locale}', {intl l='Customer - Edit JavaScript' locale=$locale}, NULL, NULL), + (1215, '{$locale}', {intl l='Attributes value - table header' locale=$locale}, NULL, NULL), + (1216, '{$locale}', {intl l='Attributes value - table row' locale=$locale}, NULL, NULL), + (1217, '{$locale}', {intl l='Attribute value - create form' locale=$locale}, NULL, NULL), + (1218, '{$locale}', {intl l='Attribut - id delete form' locale=$locale}, NULL, NULL), + (1219, '{$locale}', {intl l='Attribut - Edit JavaScript' locale=$locale}, NULL, NULL), + (1220, '{$locale}', {intl l='Profiles - at the top' locale=$locale}, NULL, NULL), + (1221, '{$locale}', {intl l='Profiles - bottom' locale=$locale}, NULL, NULL), + (1222, '{$locale}', {intl l='Profile - create form' locale=$locale}, NULL, NULL), + (1223, '{$locale}', {intl l='Profile - delete form' locale=$locale}, NULL, NULL), + (1224, '{$locale}', {intl l='Profiles - JavaScript' locale=$locale}, NULL, NULL), + (1225, '{$locale}', {intl l='Country - Edit JavaScript' locale=$locale}, NULL, NULL), + (1226, '{$locale}', {intl l='Profile - Edit JavaScript' locale=$locale}, NULL, NULL), + (1227, '{$locale}', {intl l='Variable - Edit JavaScript' locale=$locale}, NULL, NULL), + (1228, '{$locale}', {intl l='Coupon - update JavaScript' locale=$locale}, NULL, NULL), + (1229, '{$locale}', {intl l='Coupon - at the top' locale=$locale}, NULL, NULL), + (1230, '{$locale}', {intl l='Coupon - list caption' locale=$locale}, NULL, NULL), + (1231, '{$locale}', {intl l='Coupon - table header' locale=$locale}, NULL, NULL), + (1232, '{$locale}', {intl l='Coupon - table row' locale=$locale}, NULL, NULL), + (1233, '{$locale}', {intl l='Coupon - bottom' locale=$locale}, NULL, NULL), + (1234, '{$locale}', {intl l='Coupon - list JavaScript' locale=$locale}, NULL, NULL), + (1235, '{$locale}', {intl l='Module - configuration' locale=$locale}, NULL, NULL), + (1236, '{$locale}', {intl l='Module - configuration JavaScript' locale=$locale}, NULL, NULL), + (1237, '{$locale}', {intl l='Message - Edit JavaScript' locale=$locale}, NULL, NULL), + (1238, '{$locale}', {intl l='Image - Edit JavaScript' locale=$locale}, NULL, NULL), + (1239, '{$locale}', {intl l='Attributes - at the top' locale=$locale}, NULL, NULL), + (1240, '{$locale}', {intl l='Attributes - table header' locale=$locale}, NULL, NULL), + (1241, '{$locale}', {intl l='Attributes - table row' locale=$locale}, NULL, NULL), + (1242, '{$locale}', {intl l='Attributes - bottom' locale=$locale}, NULL, NULL), + (1243, '{$locale}', {intl l='Attribut - create form' locale=$locale}, NULL, NULL), + (1244, '{$locale}', {intl l='Attribut - delete form' locale=$locale}, NULL, NULL), + (1245, '{$locale}', {intl l='Attribut - add to all form' locale=$locale}, NULL, NULL), + (1246, '{$locale}', {intl l='Attribut - remove to all form' locale=$locale}, NULL, NULL), + (1247, '{$locale}', {intl l='Attributes - JavaScript' locale=$locale}, NULL, NULL), + (1248, '{$locale}', {intl l='Logs - at the top' locale=$locale}, NULL, NULL), + (1249, '{$locale}', {intl l='Logs - bottom' locale=$locale}, NULL, NULL), + (1250, '{$locale}', {intl l='Logs - JavaScript' locale=$locale}, NULL, NULL), + (1251, '{$locale}', {intl l='Folder - Edit JavaScript' locale=$locale}, NULL, NULL), + (1252, '{$locale}', {intl l='Hooks - at the top' locale=$locale}, NULL, NULL), + (1253, '{$locale}', {intl l='Hooks - table header' locale=$locale}, NULL, NULL), + (1254, '{$locale}', {intl l='Hooks - table row' locale=$locale}, NULL, NULL), + (1255, '{$locale}', {intl l='Hooks - bottom' locale=$locale}, NULL, NULL), + (1256, '{$locale}', {intl l='Hook - create form' locale=$locale}, NULL, NULL), + (1257, '{$locale}', {intl l='Hook - delete form' locale=$locale}, NULL, NULL), + (1258, '{$locale}', {intl l='Hooks - JavaScript' locale=$locale}, NULL, NULL), + (1259, '{$locale}', {intl l='Layout - CSS' locale=$locale}, NULL, NULL), + (1260, '{$locale}', {intl l='Layout - before topbar' locale=$locale}, NULL, NULL), + (1261, '{$locale}', {intl l='Layout - inside top bar' locale=$locale}, NULL, NULL), + (1262, '{$locale}', {intl l='Layout - after top bar' locale=$locale}, NULL, NULL), + (1263, '{$locale}', {intl l='Layout - before top menu' locale=$locale}, NULL, NULL), + (1264, '{$locale}', {intl l='Layout - in top menu items' locale=$locale}, NULL, NULL), + (1265, '{$locale}', {intl l='Layout - after top menu' locale=$locale}, NULL, NULL), + (1266, '{$locale}', {intl l='Layout - before footer' locale=$locale}, NULL, NULL), + (1267, '{$locale}', {intl l='Layout - in footer' locale=$locale}, NULL, NULL), + (1268, '{$locale}', {intl l='Layout - after footer' locale=$locale}, NULL, NULL), + (1269, '{$locale}', {intl l='Layout - JavaScript' locale=$locale}, NULL, NULL), + (1270, '{$locale}', {intl l='Layout - at the top of the top bar' locale=$locale}, NULL, NULL), + (1271, '{$locale}', {intl l='Layout - at the bottom of the top bar' locale=$locale}, NULL, NULL), + (1272, '{$locale}', {intl l='Layout - in the menu customers' locale=$locale}, NULL, NULL), + (1273, '{$locale}', {intl l='Layout - in the menu orders' locale=$locale}, NULL, NULL), + (1274, '{$locale}', {intl l='Layout - in the menu catalog' locale=$locale}, NULL, NULL), + (1275, '{$locale}', {intl l='Layout - in the menu folders' locale=$locale}, NULL, NULL), + (1276, '{$locale}', {intl l='Layout - in the menu tools' locale=$locale}, NULL, NULL), + (1277, '{$locale}', {intl l='Layout - in the menu modules' locale=$locale}, NULL, NULL), + (1278, '{$locale}', {intl l='Layout - in the menu configuration' locale=$locale}, NULL, NULL), + (1279, '{$locale}', {intl l='Brand - Edit JavaScript' locale=$locale}, NULL, NULL), + (1280, '{$locale}', {intl l='Home - block' locale=$locale}, NULL, NULL), + (1281, '{$locale}', {intl l='Brands - at the top' locale=$locale}, NULL, NULL), + (1282, '{$locale}', {intl l='Brands - table header' locale=$locale}, NULL, NULL), + (1283, '{$locale}', {intl l='Brands - table row' locale=$locale}, NULL, NULL), + (1284, '{$locale}', {intl l='Brands - bottom' locale=$locale}, NULL, NULL), + (1285, '{$locale}', {intl l='Brand - create form' locale=$locale}, NULL, NULL), + (1286, '{$locale}', {intl l='Brand - delete form' locale=$locale}, NULL, NULL), + (1287, '{$locale}', {intl l='Brand - JavaScript' locale=$locale}, NULL, NULL), + (1288, '{$locale}', {intl l='Exports - at the top' locale=$locale}, NULL, NULL), + (1289, '{$locale}', {intl l='Exports - at the bottom of a category' locale=$locale}, NULL, NULL), + (1290, '{$locale}', {intl l='Exports - at the bottom of column 1' locale=$locale}, NULL, NULL), + (1291, '{$locale}', {intl l='Exports - JavaScript' locale=$locale}, NULL, NULL), + (1292, '{$locale}', {intl l='Export - JavaScript' locale=$locale}, NULL, NULL), + (1293, '{$locale}', {intl l='Brand - content' locale=$locale}, NULL, NULL), + (1294, '{$locale}', {intl l='Customer - order table header' locale=$locale}, NULL, NULL), + (1295, '{$locale}', {intl l='Customer - order table row' locale=$locale}, NULL, NULL), + (1296, '{$locale}', {intl l='Sales - at the top' locale=$locale}, NULL, NULL), + (1297, '{$locale}', {intl l='Sales - table header' locale=$locale}, NULL, NULL), + (1298, '{$locale}', {intl l='Sales - table row' locale=$locale}, NULL, NULL), + (1299, '{$locale}', {intl l='Sales - at the bottom' locale=$locale}, NULL, NULL), + (1300, '{$locale}', {intl l='Sale - create form' locale=$locale}, NULL, NULL), + (1301, '{$locale}', {intl l='Sale - delete form' locale=$locale}, NULL, NULL), + (1302, '{$locale}', {intl l='Sales - JavaScript' locale=$locale}, NULL, NULL), + (1303, '{$locale}', {intl l='Product - at the bottom of a product combination' locale=$locale}, NULL, NULL), + (1304, '{$locale}', {intl l='Layout - Before the main content' locale=$locale}, NULL, NULL), + (1305, '{$locale}', {intl l='Admin layout - After the main content' locale=$locale}, NULL, NULL), + (1306, '{$locale}', {intl l='Category - Tab' locale=$locale}, NULL, NULL), + (1307, '{$locale}', {intl l='Product - Tab' locale=$locale}, NULL, NULL), + (1308, '{$locale}', {intl l='Folder - Tab' locale=$locale}, NULL, NULL), + (1309, '{$locale}', {intl l='Content - Tab' locale=$locale}, NULL, NULL), + (1310, '{$locale}', {intl l='Brand - Tab' locale=$locale}, NULL, NULL), + (1311, '{$locale}', {intl l='Order edit - delivery address' locale=$locale}, NULL, NULL), + (1312, '{$locale}', {intl l='Product page - On the top of the form' locale=$locale}, NULL, NULL), + (1313, '{$locale}', {intl l='Product page - On the bottom of the form' locale=$locale}, NULL, NULL), + (1314, '{$locale}', {intl l='Brand edit page - in the form' locale=$locale}, NULL, NULL), + (1315, '{$locale}', {intl l='Sale edit page - javascript last call block' locale=$locale}, NULL, NULL), + (1316, '{$locale}', {intl l='Api page - at top' locale=$locale}, NULL, NULL), + (1317, '{$locale}', {intl l='Api page - at bottom' locale=$locale}, NULL, NULL), + (1318, '{$locale}', {intl l='Api page - in deletion form' locale=$locale}, NULL, NULL), + (1319, '{$locale}', {intl l='Coupon page - in deletion form' locale=$locale}, NULL, NULL), + (1320, '{$locale}', {intl l='Order - Tab' locale=$locale}, NULL, NULL), + (1321, '{$locale}', {intl l='Profile - table header' locale=$locale}, '', ''), + (1322, '{$locale}', {intl l='Profile - table row' locale=$locale}, '', ''), + (1323, '{$locale}', {intl l='Import - table header' locale=$locale}, '', ''), + (1324, '{$locale}', {intl l='Import - table row' locale=$locale}, '', ''), + (1325, '{$locale}', {intl l='Export - table header' locale=$locale}, '', ''), + (1326, '{$locale}', {intl l='Export - table row' locale=$locale}, '', ''), + (1327, '{$locale}', {intl l='Category edit - top' locale=$locale}, '', ''), + (1328, '{$locale}', {intl l='Category edit - bottom' locale=$locale}, '', ''), + (1329, '{$locale}', {intl l='Brand edit - top' locale=$locale}, '', ''), + (1330, '{$locale}', {intl l='Brand edit - bottom' locale=$locale}, '', ''), + (1331, '{$locale}', {intl l='Attribute edit - top' locale=$locale}, '', ''), + (1332, '{$locale}', {intl l='Attribute edit - bottom' locale=$locale}, '', ''), + (1333, '{$locale}', {intl l='Currency edit - top' locale=$locale}, '', ''), + (1334, '{$locale}', {intl l='Currency edit - bottom' locale=$locale}, '', ''), + (1335, '{$locale}', {intl l='Country edit - top' locale=$locale}, '', ''), + (1336, '{$locale}', {intl l='Country edit - bottom' locale=$locale}, '', ''), + (1337, '{$locale}', {intl l='Content edit - top' locale=$locale}, '', ''), + (1338, '{$locale}', {intl l='Content edit - bottom' locale=$locale}, '', ''), + (1339, '{$locale}', {intl l='Feature edit - top' locale=$locale}, '', ''), + (1340, '{$locale}', {intl l='Feature edit - bottom' locale=$locale}, '', ''), + (1341, '{$locale}', {intl l='Document edit - top' locale=$locale}, '', ''), + (1342, '{$locale}', {intl l='Document edit - bottom' locale=$locale}, '', ''), + (1343, '{$locale}', {intl l='Client edit - top' locale=$locale}, '', ''), + (1344, '{$locale}', {intl l='Client edit - bottom' locale=$locale}, '', ''), + (1345, '{$locale}', {intl l='Image edit - top' locale=$locale}, '', ''), + (1346, '{$locale}', {intl l='Image edit - bottom' locale=$locale}, '', ''), + (1347, '{$locale}', {intl l='Hook edit - top' locale=$locale}, '', ''), + (1348, '{$locale}', {intl l='Hook edit - bottom' locale=$locale}, '', ''), + (1349, '{$locale}', {intl l='Folder edit - top' locale=$locale}, '', ''), + (1350, '{$locale}', {intl l='Folder edit - bottom' locale=$locale}, '', ''), + (1351, '{$locale}', {intl l='Module hook edit - top' locale=$locale}, '', ''), + (1352, '{$locale}', {intl l='Module hook edit - bottom' locale=$locale}, '', ''), + (1353, '{$locale}', {intl l='Module edit - top' locale=$locale}, '', ''), + (1354, '{$locale}', {intl l='Module edit - bottom' locale=$locale}, '', ''), + (1355, '{$locale}', {intl l='Message edit - top' locale=$locale}, '', ''), + (1356, '{$locale}', {intl l='Message edit - bottom' locale=$locale}, '', ''), + (1357, '{$locale}', {intl l='Profile edit - top' locale=$locale}, '', ''), + (1358, '{$locale}', {intl l='Profile edit - bottom' locale=$locale}, '', ''), + (1359, '{$locale}', {intl l='Product edit - top' locale=$locale}, '', ''), + (1360, '{$locale}', {intl l='Product edit - bottom' locale=$locale}, '', ''), + (1361, '{$locale}', {intl l='Order edit - top' locale=$locale}, '', ''), + (1362, '{$locale}', {intl l='Order edit - bottom' locale=$locale}, '', ''), + (1363, '{$locale}', {intl l='Shipping zones edit - top' locale=$locale}, '', ''), + (1364, '{$locale}', {intl l='Shipping zones edit - bottom' locale=$locale}, '', ''), + (1365, '{$locale}', {intl l='Shipping configuration edit - top' locale=$locale}, '', ''), + (1366, '{$locale}', {intl l='Shipping configuration edit - bottom' locale=$locale}, '', ''), + (1367, '{$locale}', {intl l='Sale edit - top' locale=$locale}, '', ''), + (1368, '{$locale}', {intl l='Sale edit - bottom' locale=$locale}, '', ''), + (1369, '{$locale}', {intl l='Variable edit - top' locale=$locale}, '', ''), + (1370, '{$locale}', {intl l='Variable edit - bottom' locale=$locale}, '', ''), + (1371, '{$locale}', {intl l='Template edit - top' locale=$locale}, '', ''), + (1372, '{$locale}', {intl l='Template edit - bottom' locale=$locale}, '', ''), + (1373, '{$locale}', {intl l='Tax rule edit - top' locale=$locale}, '', ''), + (1374, '{$locale}', {intl l='Tax rule edit - bottom' locale=$locale}, '', ''), + (1375, '{$locale}', {intl l='Tax edit - top' locale=$locale}, '', ''), + (1376, '{$locale}', {intl l='Tax edit - bottom' locale=$locale}, '', ''), + (1377, '{$locale}', {intl l='Order edit - displayed after product information' locale=$locale}, '', ''), + (1378, '{$locale}', {intl l='Tab SEO - top' locale=$locale}, '', ''), + (1379, '{$locale}', {intl l='Tab SEO - bottom' locale=$locale}, '', ''), + (1380, '{$locale}', {intl l='Tab image - top' locale=$locale}, '', ''), + (1381, '{$locale}', {intl l='Tab image - bottom' locale=$locale}, '', ''), + (1382, '{$locale}', {intl l='Tab document - top' locale=$locale}, '', ''), + (1383, '{$locale}', {intl l='Tab document - bottom' locale=$locale}, '', ''), + (1384, '{$locale}', {intl l='Export modal or page - top' locale=$locale}, '', ''), + (1385, '{$locale}', {intl l='Export modal or page - bottom' locale=$locale}, '', ''), + (1386, '{$locale}', {intl l='Order - customer information bottom' locale=$locale}, '', ''), + (1387, '{$locale}', {intl l='Order - payment module bottom' locale=$locale}, '', ''), + (1388, '{$locale}', {intl l='Order - delivery module bottom' locale=$locale}, '', ''), + (1389, '{$locale}', {intl l='Tab SEO - update form' locale=$locale}, '', ''), + (1390, '{$locale}', {intl l='Order edit - order product table header' locale=$locale}, '', ''), + (1391, '{$locale}', {intl l='Order edit - order product table row' locale=$locale}, '', ''), + (1392, '{$locale}', {intl l='Administrators - header' locale=$locale}, '', ''), + (1393, '{$locale}', {intl l='Administrators - row' locale=$locale}, '', ''), + (1394, '{$locale}', {intl l='Advanced Configuration' locale=$locale}, '', ''), + (1395, '{$locale}', {intl l='Advanced Configuration - Javascript' locale=$locale}, '', ''), + (1396, '{$locale}', {intl l='Brand edit - right column top' locale=$locale}, NULL, NULL), + (1397, '{$locale}', {intl l='Brand edit - right column bottom' locale=$locale}, NULL, NULL), + (1398, '{$locale}', {intl l='Category edit - right column top' locale=$locale}, NULL, NULL), + (1399, '{$locale}', {intl l='Category edit - right column bottom' locale=$locale}, NULL, NULL), + (1400, '{$locale}', {intl l='Content edit - right column top' locale=$locale}, NULL, NULL), + (1401, '{$locale}', {intl l='Content edit - right column bottom' locale=$locale}, NULL, NULL), + (1402, '{$locale}', {intl l='Folder edit - right column top' locale=$locale}, NULL, NULL), + (1403, '{$locale}', {intl l='Folder edit - right column bottom' locale=$locale}, NULL, NULL), + (1404, '{$locale}', {intl l='Product edit - right column top' locale=$locale}, NULL, NULL), + (1405, '{$locale}', {intl l='Product edit - right column bottom' locale=$locale}, NULL, NULL), + (1406, '{$locale}', {intl l='state-edit - at the top' locale=$locale}, '', ''), + (1407, '{$locale}', {intl l='state-edit - bottom' locale=$locale}, '', ''), + (1408, '{$locale}', {intl l='state - Edit JavaScript' locale=$locale}, '', ''), + (1409, '{$locale}', {intl l='states - at the top' locale=$locale}, '', ''), + (1410, '{$locale}', {intl l='states - table header' locale=$locale}, '', ''), + (1411, '{$locale}', {intl l='states - table row' locale=$locale}, '', ''), + (1412, '{$locale}', {intl l='states - bottom' locale=$locale}, '', ''), + (1413, '{$locale}', {intl l='state - creation form' locale=$locale}, '', ''), + (1414, '{$locale}', {intl l='state - delete form' locale=$locale}, '', ''), + (1415, '{$locale}', {intl l='states - JavaScript' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +-- Insert I18n pdf hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES +{foreach $locales as $locale} + (2001, '{$locale}', {intl l='Invoice - CSS' locale=$locale}, NULL, NULL), + (2002, '{$locale}', {intl l='Invoice - in the header' locale=$locale}, NULL, NULL), + (2003, '{$locale}', {intl l='Invoice - at the top of the footer' locale=$locale}, NULL, NULL), + (2004, '{$locale}', {intl l='Invoice - imprint' locale=$locale}, NULL, NULL), + (2005, '{$locale}', {intl l='Invoice - at the bottom of the footer' locale=$locale}, NULL, NULL), + (2006, '{$locale}', {intl l='Invoice - at the bottom of information area' locale=$locale}, NULL, NULL), + (2007, '{$locale}', {intl l='Invoice - after the information area' locale=$locale}, NULL, NULL), + (2008, '{$locale}', {intl l='Invoice - delivery address' locale=$locale}, NULL, NULL), + (2009, '{$locale}', {intl l='Invoice - after addresse area' locale=$locale}, NULL, NULL), + (2010, '{$locale}', {intl l='Invoice - after product listing' locale=$locale}, NULL, NULL), + (2011, '{$locale}', {intl l='Invoice - after the order summary' locale=$locale}, NULL, NULL), + (2012, '{$locale}', {intl l='Delivery - CSS' locale=$locale}, NULL, NULL), + (2013, '{$locale}', {intl l='Delivery - in the header' locale=$locale}, NULL, NULL), + (2014, '{$locale}', {intl l='Delivery - at the top of the footer' locale=$locale}, NULL, NULL), + (2015, '{$locale}', {intl l='Delivery - imprint' locale=$locale}, NULL, NULL), + (2016, '{$locale}', {intl l='Delivery - at the bottom of the footer' locale=$locale}, NULL, NULL), + (2017, '{$locale}', {intl l='Delivery - at the bottom of information area' locale=$locale}, NULL, NULL), + (2018, '{$locale}', {intl l='Delivery - after the information area' locale=$locale}, NULL, NULL), + (2019, '{$locale}', {intl l='Delivery - delivery address' locale=$locale}, NULL, NULL), + (2020, '{$locale}', {intl l='Delivery - after addresse area' locale=$locale}, NULL, NULL), + (2021, '{$locale}', {intl l='Delivery - after the order summary' locale=$locale}, NULL, NULL), + (2022, '{$locale}', {intl l='Order confirmation - after the order summary' locale=$locale}, NULL, NULL), + (2023, '{$locale}', {intl l='Where the WYSIWYG editor is required' locale=$locale}, NULL, NULL), + (2024, '{$locale}', {intl l='Order - cart top' locale=$locale}, NULL, NULL), + (2025, '{$locale}', {intl l='Order - cart bottom' locale=$locale}, NULL, NULL), + (2026, '{$locale}', {intl l='Order - bill top' locale=$locale}, NULL, NULL), + (2027, '{$locale}', {intl l='Order - bill bottom' locale=$locale}, NULL, NULL), + (2028, '{$locale}', {intl l='Order - Before product list' locale=$locale}, NULL, NULL), + (2029, '{$locale}', {intl l='Order - Before starting product row' locale=$locale}, NULL, NULL), + (2030, '{$locale}', {intl l='Order - After closing product row' locale=$locale}, NULL, NULL), + (2031, '{$locale}', {intl l='Order - After product list' locale=$locale}, NULL, NULL), + (2032, '{$locale}', {intl l='Invoice - After payment module' locale=$locale}, NULL, NULL), + (2033, '{$locale}', {intl l='Invoice - After delivery module' locale=$locale}, NULL, NULL), + (2034, '{$locale}', {intl l='Delivery - After delivery module' locale=$locale}, NULL, NULL), + (2035, '{$locale}', {intl l='Invoice - additional product information' locale=$locale}, NULL, NULL), + (2036, '{$locale}', {intl l='Delivery - additional product information' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Insert I18n email hooks +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES +{foreach $locales as $locale} + (3000, '{$locale}', {intl l='Email html - layout - CSS' locale=$locale}, NULL, NULL), + (3001, '{$locale}', {intl l='Email html - layout - footer' locale=$locale}, NULL, NULL), + (3002, '{$locale}', {intl l='Email html - order confirmation - before address' locale=$locale}, NULL, NULL), + (3003, '{$locale}', {intl l='Email html - order confirmation - delivery address' locale=$locale}, NULL, NULL), + (3004, '{$locale}', {intl l='Email html - order confirmation - after address' locale=$locale}, NULL, NULL), + (3005, '{$locale}', {intl l='Email html - order confirmation - order product' locale=$locale}, NULL, NULL), + (3006, '{$locale}', {intl l='Email html - order confirmation - before products' locale=$locale}, NULL, NULL), + (3007, '{$locale}', {intl l='Email html - order confirmation - after products' locale=$locale}, NULL, NULL), + (3008, '{$locale}', {intl l='Email html - order confirmation - footer' locale=$locale}, NULL, NULL), + (3009, '{$locale}', {intl l='Email html - order notification - before address' locale=$locale}, NULL, NULL), + (3010, '{$locale}', {intl l='Email html - order notification - delivery address' locale=$locale}, NULL, NULL), + (3011, '{$locale}', {intl l='Email html - order notification - after address' locale=$locale}, NULL, NULL), + (3012, '{$locale}', {intl l='Email html - order notification - order product' locale=$locale}, NULL, NULL), + (3013, '{$locale}', {intl l='Email html - order notification - before products' locale=$locale}, NULL, NULL), + (3014, '{$locale}', {intl l='Email html - order notification - after products' locale=$locale}, NULL, NULL), + (3015, '{$locale}', {intl l='Email txt - order confirmation - before address' locale=$locale}, NULL, NULL), + (3016, '{$locale}', {intl l='Email txt - order confirmation - delivery address' locale=$locale}, NULL, NULL), + (3017, '{$locale}', {intl l='Email txt - order confirmation - after address' locale=$locale}, NULL, NULL), + (3018, '{$locale}', {intl l='Email txt - order confirmation - order product' locale=$locale}, NULL, NULL), + (3019, '{$locale}', {intl l='Email txt - order confirmation - before products' locale=$locale}, NULL, NULL), + (3020, '{$locale}', {intl l='Email txt - order confirmation - after products' locale=$locale}, NULL, NULL), + (3021, '{$locale}', {intl l='Email txt - order notification - before address' locale=$locale}, NULL, NULL), + (3022, '{$locale}', {intl l='Email txt - order notification - delivery address' locale=$locale}, NULL, NULL), + (3023, '{$locale}', {intl l='Email txt - order notification - after address' locale=$locale}, NULL, NULL), + (3024, '{$locale}', {intl l='Email txt - order notification - order product' locale=$locale}, NULL, NULL), + (3025, '{$locale}', {intl l='Email txt - order notification - before products' locale=$locale}, NULL, NULL), + (3026, '{$locale}', {intl l='Email txt - order notification - after products' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `customer_title_i18n` (`id`, `locale`, `short`, `long`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Mr.' locale=$locale}, {intl l='Mister' locale=$locale}), + (2, '{$locale}', {intl l='Mrs' locale=$locale}, {intl l='Misses' locale=$locale}), + (3, '{$locale}', {intl l='Miss_short' locale=$locale}, {intl l='Miss' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `currency_i18n` (`id`, `locale`, `name`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Euro' locale=$locale}), + (2, '{$locale}', {intl l='United States Dollar' locale=$locale}), + (3, '{$locale}', {intl l='UK Pound' locale=$locale}), + (4, '{$locale}', {intl l='Franc' locale=$locale}), + (5, '{$locale}', {intl l='Peso' locale=$locale}), + (6, '{$locale}', {intl l='Złoty' locale=$locale}), + (7, '{$locale}', {intl l='Yuan' locale=$locale}), + (8, '{$locale}', {intl l='Krone' locale=$locale}), + (9, '{$locale}', {intl l='Lei' locale=$locale}), + (10, '{$locale}', {intl l='Guaraní' locale=$locale}), + (11, '{$locale}', {intl l='Peso Argentino' locale=$locale}), + (12, '{$locale}', {intl l='Belarusian ruble' locale=$locale}), + (13, '{$locale}', {intl l='Dollar' locale=$locale}), + (14, '{$locale}', {intl l='Dinar' locale=$locale}), + (15, '{$locale}', {intl l='Krona' locale=$locale}), + (16, '{$locale}', {intl l='Croatian Kuna' locale=$locale}), + (17, '{$locale}', {intl l='Danish krone' locale=$locale}), + (18, '{$locale}', {intl l='Nigerian naira' locale=$locale}), + (19, '{$locale}', {intl l='Hong Kong Dollar' locale=$locale}), + (20, '{$locale}', {intl l='Dollar (CAD)' locale=$locale}), + (21, '{$locale}', {intl l='Riyal' locale=$locale}), + (22, '{$locale}', {intl l='Czech koruna' locale=$locale}), + (23, '{$locale}', {intl l='Colón' locale=$locale}), + (24, '{$locale}', {intl l='Manat' locale=$locale}), + (25, '{$locale}', {intl l='Rupiah' locale=$locale}), + (26, '{$locale}', {intl l='Rupee' locale=$locale}), + (27, '{$locale}', {intl l='Real' locale=$locale}), + (28, '{$locale}', {intl l='Đồng' locale=$locale}), + (29, '{$locale}', {intl l='Philippine Peso' locale=$locale}), + (30, '{$locale}', {intl l='Quetzal' locale=$locale}), + (31, '{$locale}', {intl l='Lira' locale=$locale}), + (32, '{$locale}', {intl l='Yen' locale=$locale}), + (33, '{$locale}', {intl l='Ruble' locale=$locale}), + (34, '{$locale}', {intl l='Nuevo Sol' locale=$locale}), + (35, '{$locale}', {intl l='Pound' locale=$locale}), + (36, '{$locale}', {intl l='Lari' locale=$locale}), + (37, '{$locale}', {intl l='Boliviano' locale=$locale}), + (38, '{$locale}', {intl l='United Arab Emirates dirham' locale=$locale}), + (39, '{$locale}', {intl l='Baht' locale=$locale}), + (40, '{$locale}', {intl l='Shekel' locale=$locale}), + (41, '{$locale}', {intl l='Ringgit' locale=$locale}), + (42, '{$locale}', {intl l='Bolívar fuerte' locale=$locale}), + (43, '{$locale}', {intl l='Forint' locale=$locale}), + (44, '{$locale}', {intl l='Kenyan shilling' locale=$locale}), + (45, '{$locale}', {intl l='Гривна' locale=$locale}), + (46, '{$locale}', {intl l='Tunisian Dinar' locale=$locale}), + (47, '{$locale}', {intl l='Lev' locale=$locale}), + (48, '{$locale}', {intl l='Indian Rupee' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `country_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Afghanistan' locale=$locale}, NULL, NULL, NULL), + (2, '{$locale}', {intl l='South Africa' locale=$locale}, NULL, NULL, NULL), + (3, '{$locale}', {intl l='Albania' locale=$locale}, NULL, NULL, NULL), + (4, '{$locale}', {intl l='Algeria' locale=$locale}, NULL, NULL, NULL), + (5, '{$locale}', {intl l='Germany' locale=$locale}, NULL, NULL, NULL), + (6, '{$locale}', {intl l='Andorra' locale=$locale}, NULL, NULL, NULL), + (7, '{$locale}', {intl l='Angola' locale=$locale}, NULL, NULL, NULL), + (8, '{$locale}', {intl l='Antigua and Barbuda' locale=$locale}, NULL, NULL, NULL), + (9, '{$locale}', {intl l='Saudi Arabia' locale=$locale}, NULL, NULL, NULL), + (10, '{$locale}', {intl l='Argentina' locale=$locale}, NULL, NULL, NULL), + (11, '{$locale}', {intl l='Armenia' locale=$locale}, NULL, NULL, NULL), + (12, '{$locale}', {intl l='Australia' locale=$locale}, NULL, NULL, NULL), + (13, '{$locale}', {intl l='Austria' locale=$locale}, NULL, NULL, NULL), + (14, '{$locale}', {intl l='Azerbaijan' locale=$locale}, NULL, NULL, NULL), + (15, '{$locale}', {intl l='Bahamas' locale=$locale}, NULL, NULL, NULL), + (16, '{$locale}', {intl l='Bahrain' locale=$locale}, NULL, NULL, NULL), + (17, '{$locale}', {intl l='Bangladesh' locale=$locale}, NULL, NULL, NULL), + (18, '{$locale}', {intl l='Barbados' locale=$locale}, NULL, NULL, NULL), + (19, '{$locale}', {intl l='Belarus' locale=$locale}, NULL, NULL, NULL), + (20, '{$locale}', {intl l='Belgium' locale=$locale}, NULL, NULL, NULL), + (21, '{$locale}', {intl l='Belize' locale=$locale}, NULL, NULL, NULL), + (22, '{$locale}', {intl l='Benin' locale=$locale}, NULL, NULL, NULL), + (23, '{$locale}', {intl l='Bhutan' locale=$locale}, NULL, NULL, NULL), + (24, '{$locale}', {intl l='Bielorussia' locale=$locale}, NULL, NULL, NULL), + (25, '{$locale}', {intl l='Burma' locale=$locale}, NULL, NULL, NULL), + (26, '{$locale}', {intl l='Bolivia' locale=$locale}, NULL, NULL, NULL), + (27, '{$locale}', {intl l='Bosnia and Herzegovina' locale=$locale}, NULL, NULL, NULL), + (28, '{$locale}', {intl l='Botswana' locale=$locale}, NULL, NULL, NULL), + (29, '{$locale}', {intl l='Brazil' locale=$locale}, NULL, NULL, NULL), + (30, '{$locale}', {intl l='Brunei' locale=$locale}, NULL, NULL, NULL), + (31, '{$locale}', {intl l='Bulgaria' locale=$locale}, NULL, NULL, NULL), + (32, '{$locale}', {intl l='Burkina' locale=$locale}, NULL, NULL, NULL), + (33, '{$locale}', {intl l='Burundi' locale=$locale}, NULL, NULL, NULL), + (34, '{$locale}', {intl l='Cambodia' locale=$locale}, NULL, NULL, NULL), + (35, '{$locale}', {intl l='Cameroon' locale=$locale}, NULL, NULL, NULL), + (37, '{$locale}', {intl l='Cape Verde' locale=$locale}, NULL, NULL, NULL), + (38, '{$locale}', {intl l='Chile' locale=$locale}, NULL, NULL, NULL), + (39, '{$locale}', {intl l='China' locale=$locale}, NULL, NULL, NULL), + (40, '{$locale}', {intl l='Cyprus' locale=$locale}, NULL, NULL, NULL), + (41, '{$locale}', {intl l='Colombia' locale=$locale}, NULL, NULL, NULL), + (42, '{$locale}', {intl l='Comoros' locale=$locale}, NULL, NULL, NULL), + (43, '{$locale}', {intl l='Congo' locale=$locale}, NULL, NULL, NULL), + (44, '{$locale}', {intl l='Cook Islands' locale=$locale}, NULL, NULL, NULL), + (45, '{$locale}', {intl l='North Korea' locale=$locale}, NULL, NULL, NULL), + (46, '{$locale}', {intl l='South Korea' locale=$locale}, NULL, NULL, NULL), + (47, '{$locale}', {intl l='Costa Rica' locale=$locale}, NULL, NULL, NULL), + (48, '{$locale}', {intl l='Ivory Coast' locale=$locale}, NULL, NULL, NULL), + (49, '{$locale}', {intl l='Croatia' locale=$locale}, NULL, NULL, NULL), + (50, '{$locale}', {intl l='Cuba' locale=$locale}, NULL, NULL, NULL), + (51, '{$locale}', {intl l='Denmark' locale=$locale}, NULL, NULL, NULL), + (52, '{$locale}', {intl l='Djibouti' locale=$locale}, NULL, NULL, NULL), + (53, '{$locale}', {intl l='Dominica' locale=$locale}, NULL, NULL, NULL), + (54, '{$locale}', {intl l='Egypt' locale=$locale}, NULL, NULL, NULL), + (55, '{$locale}', {intl l='United Arab Emirates' locale=$locale}, NULL, NULL, NULL), + (56, '{$locale}', {intl l='Ecuador' locale=$locale}, NULL, NULL, NULL), + (57, '{$locale}', {intl l='Eritrea' locale=$locale}, NULL, NULL, NULL), + (58, '{$locale}', {intl l='Spain' locale=$locale}, NULL, NULL, NULL), + (59, '{$locale}', {intl l='Estonia' locale=$locale}, NULL, NULL, NULL), + (61, '{$locale}', {intl l='Ethiopia' locale=$locale}, NULL, NULL, NULL), + (62, '{$locale}', {intl l='Fiji' locale=$locale}, NULL, NULL, NULL), + (63, '{$locale}', {intl l='Finland' locale=$locale}, NULL, NULL, NULL), + (64, '{$locale}', {intl l='France metropolitan' locale=$locale}, NULL, NULL, NULL), + (65, '{$locale}', {intl l='Gabon' locale=$locale}, NULL, NULL, NULL), + (66, '{$locale}', {intl l='Gambia' locale=$locale}, NULL, NULL, NULL), + (67, '{$locale}', {intl l='Georgia' locale=$locale}, NULL, NULL, NULL), + (68, '{$locale}', {intl l='Ghana' locale=$locale}, NULL, NULL, NULL), + (69, '{$locale}', {intl l='Greece' locale=$locale}, NULL, NULL, NULL), + (70, '{$locale}', {intl l='Grenada' locale=$locale}, NULL, NULL, NULL), + (71, '{$locale}', {intl l='Guatemala' locale=$locale}, NULL, NULL, NULL), + (72, '{$locale}', {intl l='Guinea' locale=$locale}, NULL, NULL, NULL), + (73, '{$locale}', {intl l='Guinea-Bissau' locale=$locale}, NULL, NULL, NULL), + (74, '{$locale}', {intl l='Equatorial Guinea' locale=$locale}, NULL, NULL, NULL), + (75, '{$locale}', {intl l='Guyana' locale=$locale}, NULL, NULL, NULL), + (76, '{$locale}', {intl l='Haiti' locale=$locale}, NULL, NULL, NULL), + (77, '{$locale}', {intl l='Honduras' locale=$locale}, NULL, NULL, NULL), + (78, '{$locale}', {intl l='Hungary' locale=$locale}, NULL, NULL, NULL), + (79, '{$locale}', {intl l='India' locale=$locale}, NULL, NULL, NULL), + (80, '{$locale}', {intl l='Indonesia' locale=$locale}, NULL, NULL, NULL), + (81, '{$locale}', {intl l='Iran' locale=$locale}, NULL, NULL, NULL), + (82, '{$locale}', {intl l='Iraq' locale=$locale}, NULL, NULL, NULL), + (83, '{$locale}', {intl l='Ireland' locale=$locale}, NULL, NULL, NULL), + (84, '{$locale}', {intl l='Iceland' locale=$locale}, NULL, NULL, NULL), + (85, '{$locale}', {intl l='Israel' locale=$locale}, NULL, NULL, NULL), + (86, '{$locale}', {intl l='Italy' locale=$locale}, NULL, NULL, NULL), + (87, '{$locale}', {intl l='Jamaica' locale=$locale}, NULL, NULL, NULL), + (88, '{$locale}', {intl l='Japan' locale=$locale}, NULL, NULL, NULL), + (89, '{$locale}', {intl l='Jordan' locale=$locale}, NULL, NULL, NULL), + (90, '{$locale}', {intl l='Kazakhstan' locale=$locale}, NULL, NULL, NULL), + (91, '{$locale}', {intl l='Kenya' locale=$locale}, NULL, NULL, NULL), + (92, '{$locale}', {intl l='Kyrgyzstan' locale=$locale}, NULL, NULL, NULL), + (93, '{$locale}', {intl l='Kiribati' locale=$locale}, NULL, NULL, NULL), + (94, '{$locale}', {intl l='Kuwait' locale=$locale}, NULL, NULL, NULL), + (95, '{$locale}', {intl l='Laos' locale=$locale}, NULL, NULL, NULL), + (96, '{$locale}', {intl l='Lesotho' locale=$locale}, NULL, NULL, NULL), + (97, '{$locale}', {intl l='Latvia' locale=$locale}, NULL, NULL, NULL), + (98, '{$locale}', {intl l='Lebanon' locale=$locale}, NULL, NULL, NULL), + (99, '{$locale}', {intl l='Liberia' locale=$locale}, NULL, NULL, NULL), + (100, '{$locale}', {intl l='Libya' locale=$locale}, NULL, NULL, NULL), + (101, '{$locale}', {intl l='Liechtenstein' locale=$locale}, NULL, NULL, NULL), + (102, '{$locale}', {intl l='Lithuania' locale=$locale}, NULL, NULL, NULL), + (103, '{$locale}', {intl l='Luxembourg' locale=$locale}, NULL, NULL, NULL), + (104, '{$locale}', {intl l='Macedonia' locale=$locale}, NULL, NULL, NULL), + (105, '{$locale}', {intl l='Madagascar' locale=$locale}, NULL, NULL, NULL), + (106, '{$locale}', {intl l='Malaysia' locale=$locale}, NULL, NULL, NULL), + (107, '{$locale}', {intl l='Malawi' locale=$locale}, NULL, NULL, NULL), + (108, '{$locale}', {intl l='Maldives' locale=$locale}, NULL, NULL, NULL), + (109, '{$locale}', {intl l='Mali' locale=$locale}, NULL, NULL, NULL), + (110, '{$locale}', {intl l='Malta' locale=$locale}, NULL, NULL, NULL), + (111, '{$locale}', {intl l='Morocco' locale=$locale}, NULL, NULL, NULL), + (112, '{$locale}', {intl l='Marshall Islands' locale=$locale}, NULL, NULL, NULL), + (113, '{$locale}', {intl l='Mauritius' locale=$locale}, NULL, NULL, NULL), + (114, '{$locale}', {intl l='Mauritania' locale=$locale}, NULL, NULL, NULL), + (115, '{$locale}', {intl l='Mexico' locale=$locale}, NULL, NULL, NULL), + (116, '{$locale}', {intl l='Micronesia' locale=$locale}, NULL, NULL, NULL), + (117, '{$locale}', {intl l='Moldova' locale=$locale}, NULL, NULL, NULL), + (118, '{$locale}', {intl l='Monaco' locale=$locale}, NULL, NULL, NULL), + (119, '{$locale}', {intl l='Mongolia' locale=$locale}, NULL, NULL, NULL), + (120, '{$locale}', {intl l='Mozambique' locale=$locale}, NULL, NULL, NULL), + (121, '{$locale}', {intl l='Namibia' locale=$locale}, NULL, NULL, NULL), + (122, '{$locale}', {intl l='Nauru' locale=$locale}, NULL, NULL, NULL), + (123, '{$locale}', {intl l='Nepal' locale=$locale}, NULL, NULL, NULL), + (124, '{$locale}', {intl l='Nicaragua' locale=$locale}, NULL, NULL, NULL), + (125, '{$locale}', {intl l='Niger' locale=$locale}, NULL, NULL, NULL), + (126, '{$locale}', {intl l='Nigeria' locale=$locale}, NULL, NULL, NULL), + (127, '{$locale}', {intl l='Niue' locale=$locale}, NULL, NULL, NULL), + (128, '{$locale}', {intl l='Norway' locale=$locale}, NULL, NULL, NULL), + (129, '{$locale}', {intl l='New Zealand' locale=$locale}, NULL, NULL, NULL), + (130, '{$locale}', {intl l='Oman' locale=$locale}, NULL, NULL, NULL), + (131, '{$locale}', {intl l='Uganda' locale=$locale}, NULL, NULL, NULL), + (132, '{$locale}', {intl l='Uzbekistan' locale=$locale}, NULL, NULL, NULL), + (133, '{$locale}', {intl l='Pakistan' locale=$locale}, NULL, NULL, NULL), + (134, '{$locale}', {intl l='Panama' locale=$locale}, NULL, NULL, NULL), + (135, '{$locale}', {intl l='Papua Nueva Guinea' locale=$locale}, NULL, NULL, NULL), + (136, '{$locale}', {intl l='Paraguay' locale=$locale}, NULL, NULL, NULL), + (137, '{$locale}', {intl l='Netherlands' locale=$locale}, NULL, NULL, NULL), + (138, '{$locale}', {intl l='Peru' locale=$locale}, NULL, NULL, NULL), + (139, '{$locale}', {intl l='Philippines' locale=$locale}, NULL, NULL, NULL), + (140, '{$locale}', {intl l='Poland' locale=$locale}, NULL, NULL, NULL), + (141, '{$locale}', {intl l='Portugal' locale=$locale}, NULL, NULL, NULL), + (142, '{$locale}', {intl l='Qatar' locale=$locale}, NULL, NULL, NULL), + (143, '{$locale}', {intl l='Central African Republic' locale=$locale}, NULL, NULL, NULL), + (144, '{$locale}', {intl l='Dominican Republic' locale=$locale}, NULL, NULL, NULL), + (145, '{$locale}', {intl l='Czech Republic' locale=$locale}, NULL, NULL, NULL), + (146, '{$locale}', {intl l='Romania' locale=$locale}, NULL, NULL, NULL), + (147, '{$locale}', {intl l='United Kingdom' locale=$locale}, NULL, NULL, NULL), + (148, '{$locale}', {intl l='Russia' locale=$locale}, NULL, NULL, NULL), + (149, '{$locale}', {intl l='Rwanda' locale=$locale}, NULL, NULL, NULL), + (150, '{$locale}', {intl l='Saint Kitts and Nevis' locale=$locale}, NULL, NULL, NULL), + (151, '{$locale}', {intl l='Saint Lucia' locale=$locale}, NULL, NULL, NULL), + (152, '{$locale}', {intl l='San Marino' locale=$locale}, NULL, NULL, NULL), + (153, '{$locale}', {intl l='Saint Vincent and the Grenadines' locale=$locale}, NULL, NULL, NULL), + (154, '{$locale}', {intl l='Solomon Islands' locale=$locale}, NULL, NULL, NULL), + (155, '{$locale}', {intl l='El Salvador' locale=$locale}, NULL, NULL, NULL), + (156, '{$locale}', {intl l='Western Samoa' locale=$locale}, NULL, NULL, NULL), + (157, '{$locale}', {intl l='Sao Tome and Principe' locale=$locale}, NULL, NULL, NULL), + (158, '{$locale}', {intl l='Senegal' locale=$locale}, NULL, NULL, NULL), + (159, '{$locale}', {intl l='Seychelles' locale=$locale}, NULL, NULL, NULL), + (160, '{$locale}', {intl l='Sierra Leone' locale=$locale}, NULL, NULL, NULL), + (161, '{$locale}', {intl l='Singapore' locale=$locale}, NULL, NULL, NULL), + (162, '{$locale}', {intl l='Slovakia' locale=$locale}, NULL, NULL, NULL), + (163, '{$locale}', {intl l='Slovenia' locale=$locale}, NULL, NULL, NULL), + (164, '{$locale}', {intl l='Somalia' locale=$locale}, NULL, NULL, NULL), + (165, '{$locale}', {intl l='Sudan' locale=$locale}, NULL, NULL, NULL), + (166, '{$locale}', {intl l='Sri Lanka' locale=$locale}, NULL, NULL, NULL), + (167, '{$locale}', {intl l='Sweden' locale=$locale}, NULL, NULL, NULL), + (168, '{$locale}', {intl l='Switzerland' locale=$locale}, NULL, NULL, NULL), + (169, '{$locale}', {intl l='Suriname' locale=$locale}, NULL, NULL, NULL), + (170, '{$locale}', {intl l='Swaziland' locale=$locale}, NULL, NULL, NULL), + (171, '{$locale}', {intl l='Syria' locale=$locale}, NULL, NULL, NULL), + (172, '{$locale}', {intl l='Tajikistan' locale=$locale}, NULL, NULL, NULL), + (173, '{$locale}', {intl l='Tanzania' locale=$locale}, NULL, NULL, NULL), + (174, '{$locale}', {intl l='Chad' locale=$locale}, NULL, NULL, NULL), + (175, '{$locale}', {intl l='Thailand' locale=$locale}, NULL, NULL, NULL), + (176, '{$locale}', {intl l='Togo' locale=$locale}, NULL, NULL, NULL), + (177, '{$locale}', {intl l='Tonga' locale=$locale}, NULL, NULL, NULL), + (178, '{$locale}', {intl l='Trinidad and Tobago' locale=$locale}, NULL, NULL, NULL), + (179, '{$locale}', {intl l='Tunisia' locale=$locale}, NULL, NULL, NULL), + (180, '{$locale}', {intl l='Turkmenistan' locale=$locale}, NULL, NULL, NULL), + (181, '{$locale}', {intl l='Turkey' locale=$locale}, NULL, NULL, NULL), + (182, '{$locale}', {intl l='Tuvalu' locale=$locale}, NULL, NULL, NULL), + (183, '{$locale}', {intl l='Ukraine' locale=$locale}, NULL, NULL, NULL), + (184, '{$locale}', {intl l='Uruguay' locale=$locale}, NULL, NULL, NULL), + (185, '{$locale}', {intl l='The Vatican' locale=$locale}, NULL, NULL, NULL), + (186, '{$locale}', {intl l='Vanuatu' locale=$locale}, NULL, NULL, NULL), + (187, '{$locale}', {intl l='Venezuela' locale=$locale}, NULL, NULL, NULL), + (188, '{$locale}', {intl l='Vietnam' locale=$locale}, NULL, NULL, NULL), + (189, '{$locale}', {intl l='Yemen' locale=$locale}, NULL, NULL, NULL), + (191, '{$locale}', {intl l='Zaire' locale=$locale}, NULL, NULL, NULL), + (192, '{$locale}', {intl l='Zambia' locale=$locale}, NULL, NULL, NULL), + (193, '{$locale}', {intl l='Zimbabwe' locale=$locale}, NULL, NULL, NULL), + (196, '{$locale}', {intl l='USA' locale=$locale}, NULL, NULL, NULL), + (246, '{$locale}', {intl l='Canada' locale=$locale}, NULL, NULL, NULL), + (259, '{$locale}', {intl l='Guadeloupe' locale=$locale}, NULL, NULL, NULL), + (260, '{$locale}', {intl l='Guyane Française' locale=$locale}, NULL, NULL, NULL), + (261, '{$locale}', {intl l='Martinique' locale=$locale}, NULL, NULL, NULL), + (262, '{$locale}', {intl l='Mayotte' locale=$locale}, NULL, NULL, NULL), + (263, '{$locale}', {intl l='Réunion(La)' locale=$locale}, NULL, NULL, NULL), + (264, '{$locale}', {intl l='St Pierre et Miquelon' locale=$locale}, NULL, NULL, NULL), + (265, '{$locale}', {intl l='Nouvelle-Calédonie' locale=$locale}, NULL, NULL, NULL), + (266, '{$locale}', {intl l='Polynésie française' locale=$locale}, NULL, NULL, NULL), + (267, '{$locale}', {intl l='Wallis-et-Futuna' locale=$locale}, NULL, NULL, NULL), + (269, '{$locale}', {intl l='Hong Kong' locale=$locale}, NULL, NULL, NULL), + (270, '{$locale}', {intl l='Saint Barthélemy' locale=$locale}, NULL, NULL, NULL), + (271, '{$locale}', {intl l='Saint Martin (French part)' locale=$locale}, NULL, NULL, NULL), + (272, '{$locale}', {intl l='French Southern Territories' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `state_i18n` (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} + + (1, '{$locale}', {intl l='Alabama' locale=$locale}), + (2, '{$locale}', {intl l='Alaska' locale=$locale}), + (3, '{$locale}', {intl l='Arizona' locale=$locale}), + (4, '{$locale}', {intl l='Arkansas' locale=$locale}), + (5, '{$locale}', {intl l='California' locale=$locale}), + (6, '{$locale}', {intl l='Colorado' locale=$locale}), + (7, '{$locale}', {intl l='Connecticut' locale=$locale}), + (8, '{$locale}', {intl l='Delaware' locale=$locale}), + (9, '{$locale}', {intl l='Florida' locale=$locale}), + (10, '{$locale}', {intl l='Georgia' locale=$locale}), + (11, '{$locale}', {intl l='Hawaii' locale=$locale}), + (12, '{$locale}', {intl l='Idaho' locale=$locale}), + (13, '{$locale}', {intl l='Illinois' locale=$locale}), + (14, '{$locale}', {intl l='Indiana' locale=$locale}), + (15, '{$locale}', {intl l='Iowa' locale=$locale}), + (16, '{$locale}', {intl l='Kansas' locale=$locale}), + (17, '{$locale}', {intl l='Kentucky' locale=$locale}), + (18, '{$locale}', {intl l='Louisiana' locale=$locale}), + (19, '{$locale}', {intl l='Maine' locale=$locale}), + (20, '{$locale}', {intl l='Maryland' locale=$locale}), + (21, '{$locale}', {intl l='Massachusetts' locale=$locale}), + (22, '{$locale}', {intl l='Michigan' locale=$locale}), + (23, '{$locale}', {intl l='Minnesota' locale=$locale}), + (24, '{$locale}', {intl l='Mississippi' locale=$locale}), + (25, '{$locale}', {intl l='Missouri' locale=$locale}), + (26, '{$locale}', {intl l='Montana' locale=$locale}), + (27, '{$locale}', {intl l='Nebraska' locale=$locale}), + (28, '{$locale}', {intl l='Nevada' locale=$locale}), + (29, '{$locale}', {intl l='New Hampshire' locale=$locale}), + (30, '{$locale}', {intl l='New Jersey' locale=$locale}), + (31, '{$locale}', {intl l='New Mexico' locale=$locale}), + (32, '{$locale}', {intl l='New York' locale=$locale}), + (33, '{$locale}', {intl l='North Carolina' locale=$locale}), + (34, '{$locale}', {intl l='North Dakota' locale=$locale}), + (35, '{$locale}', {intl l='Ohio' locale=$locale}), + (36, '{$locale}', {intl l='Oklahoma' locale=$locale}), + (37, '{$locale}', {intl l='Oregon' locale=$locale}), + (38, '{$locale}', {intl l='Pennsylvania' locale=$locale}), + (39, '{$locale}', {intl l='Rhode Island' locale=$locale}), + (40, '{$locale}', {intl l='South Carolina' locale=$locale}), + (41, '{$locale}', {intl l='South Dakota' locale=$locale}), + (42, '{$locale}', {intl l='Tennessee' locale=$locale}), + (43, '{$locale}', {intl l='Texas' locale=$locale}), + (44, '{$locale}', {intl l='Utah' locale=$locale}), + (45, '{$locale}', {intl l='Vermont' locale=$locale}), + (46, '{$locale}', {intl l='Virginia' locale=$locale}), + (47, '{$locale}', {intl l='Washington' locale=$locale}), + (48, '{$locale}', {intl l='West Virginia' locale=$locale}), + (49, '{$locale}', {intl l='Wisconsin' locale=$locale}), + (50, '{$locale}', {intl l='Wyoming' locale=$locale}), + (51, '{$locale}', {intl l='Puerto Rico' locale=$locale}), + (52, '{$locale}', {intl l='US Virgin Islands' locale=$locale}), + (53, '{$locale}', {intl l='District of Columbia' locale=$locale}), + (54, '{$locale}', {intl l='Aguascalientes' locale=$locale}), + (55, '{$locale}', {intl l='Baja California' locale=$locale}), + (56, '{$locale}', {intl l='Baja California Sur' locale=$locale}), + (57, '{$locale}', {intl l='Campeche' locale=$locale}), + (58, '{$locale}', {intl l='Chiapas' locale=$locale}), + (59, '{$locale}', {intl l='Chihuahua' locale=$locale}), + (60, '{$locale}', {intl l='Coahuila' locale=$locale}), + (61, '{$locale}', {intl l='Colima' locale=$locale}), + (62, '{$locale}', {intl l='Distrito Federal' locale=$locale}), + (63, '{$locale}', {intl l='Durango' locale=$locale}), + (64, '{$locale}', {intl l='Guanajuato' locale=$locale}), + (65, '{$locale}', {intl l='Guerrero' locale=$locale}), + (66, '{$locale}', {intl l='Hidalgo' locale=$locale}), + (67, '{$locale}', {intl l='Jalisco' locale=$locale}), + (68, '{$locale}', {intl l='Estado de México' locale=$locale}), + (69, '{$locale}', {intl l='Michoacán' locale=$locale}), + (70, '{$locale}', {intl l='Morelos' locale=$locale}), + (71, '{$locale}', {intl l='Nayarit' locale=$locale}), + (72, '{$locale}', {intl l='Nuevo León' locale=$locale}), + (73, '{$locale}', {intl l='Oaxaca' locale=$locale}), + (74, '{$locale}', {intl l='Puebla' locale=$locale}), + (75, '{$locale}', {intl l='Querétaro' locale=$locale}), + (76, '{$locale}', {intl l='Quintana Roo' locale=$locale}), + (77, '{$locale}', {intl l='San Luis Potosí' locale=$locale}), + (78, '{$locale}', {intl l='Sinaloa' locale=$locale}), + (79, '{$locale}', {intl l='Sonora' locale=$locale}), + (80, '{$locale}', {intl l='Tabasco' locale=$locale}), + (81, '{$locale}', {intl l='Tamaulipas' locale=$locale}), + (82, '{$locale}', {intl l='Tlaxcala' locale=$locale}), + (83, '{$locale}', {intl l='Veracruz' locale=$locale}), + (84, '{$locale}', {intl l='Yucatán' locale=$locale}), + (85, '{$locale}', {intl l='Zacatecas' locale=$locale}), + (86, '{$locale}', {intl l='Ontario' locale=$locale}), + (87, '{$locale}', {intl l='Quebec' locale=$locale}), + (88, '{$locale}', {intl l='British Columbia' locale=$locale}), + (89, '{$locale}', {intl l='Alberta' locale=$locale}), + (90, '{$locale}', {intl l='Manitoba' locale=$locale}), + (91, '{$locale}', {intl l='Saskatchewan' locale=$locale}), + (92, '{$locale}', {intl l='Nova Scotia' locale=$locale}), + (93, '{$locale}', {intl l='New Brunswick' locale=$locale}), + (94, '{$locale}', {intl l='Newfoundland and Labrador' locale=$locale}), + (95, '{$locale}', {intl l='Prince Edward Island' locale=$locale}), + (96, '{$locale}', {intl l='Northwest Territories' locale=$locale}), + (97, '{$locale}', {intl l='Yukon' locale=$locale}), + (98, '{$locale}', {intl l='Nunavut' locale=$locale}), + (99, '{$locale}', {intl l='Buenos Aires' locale=$locale}), + (100, '{$locale}', {intl l='Catamarca' locale=$locale}), + (101, '{$locale}', {intl l='Chaco' locale=$locale}), + (102, '{$locale}', {intl l='Chubut' locale=$locale}), + (103, '{$locale}', {intl l='Ciudad de Buenos Aires' locale=$locale}), + (104, '{$locale}', {intl l='Córdoba' locale=$locale}), + (105, '{$locale}', {intl l='Corrientes' locale=$locale}), + (106, '{$locale}', {intl l='Entre Ríos' locale=$locale}), + (107, '{$locale}', {intl l='Formosa' locale=$locale}), + (108, '{$locale}', {intl l='Jujuy' locale=$locale}), + (109, '{$locale}', {intl l='La Pampa' locale=$locale}), + (110, '{$locale}', {intl l='La Rioja' locale=$locale}), + (111, '{$locale}', {intl l='Mendoza' locale=$locale}), + (112, '{$locale}', {intl l='Misiones' locale=$locale}), + (113, '{$locale}', {intl l='Neuquén' locale=$locale}), + (114, '{$locale}', {intl l='Río Negro' locale=$locale}), + (115, '{$locale}', {intl l='Salta' locale=$locale}), + (116, '{$locale}', {intl l='San Juan' locale=$locale}), + (117, '{$locale}', {intl l='San Luis' locale=$locale}), + (118, '{$locale}', {intl l='Santa Cruz' locale=$locale}), + (119, '{$locale}', {intl l='Santa Fe' locale=$locale}), + (120, '{$locale}', {intl l='Santiago del Estero' locale=$locale}), + (121, '{$locale}', {intl l='Tierra del Fuego' locale=$locale}), + (122, '{$locale}', {intl l='Tucumán' locale=$locale}), + (123, '{$locale}', {intl l='Agrigento' locale=$locale}), + (124, '{$locale}', {intl l='Alessandria' locale=$locale}), + (125, '{$locale}', {intl l='Ancona' locale=$locale}), + (126, '{$locale}', {intl l='Aosta' locale=$locale}), + (127, '{$locale}', {intl l='Arezzo' locale=$locale}), + (128, '{$locale}', {intl l='Ascoli Piceno' locale=$locale}), + (129, '{$locale}', {intl l='Asti' locale=$locale}), + (130, '{$locale}', {intl l='Avellino' locale=$locale}), + (131, '{$locale}', {intl l='Bari' locale=$locale}), + (132, '{$locale}', {intl l='Barletta-Andria-Trani' locale=$locale}), + (133, '{$locale}', {intl l='Belluno' locale=$locale}), + (134, '{$locale}', {intl l='Benevento' locale=$locale}), + (135, '{$locale}', {intl l='Bergamo' locale=$locale}), + (136, '{$locale}', {intl l='Biella' locale=$locale}), + (137, '{$locale}', {intl l='Bologna' locale=$locale}), + (138, '{$locale}', {intl l='Bolzano' locale=$locale}), + (139, '{$locale}', {intl l='Brescia' locale=$locale}), + (140, '{$locale}', {intl l='Brindisi' locale=$locale}), + (141, '{$locale}', {intl l='Cagliari' locale=$locale}), + (142, '{$locale}', {intl l='Caltanissetta' locale=$locale}), + (143, '{$locale}', {intl l='Campobasso' locale=$locale}), + (144, '{$locale}', {intl l='Carbonia-Iglesias' locale=$locale}), + (145, '{$locale}', {intl l='Caserta' locale=$locale}), + (146, '{$locale}', {intl l='Catania' locale=$locale}), + (147, '{$locale}', {intl l='Catanzaro' locale=$locale}), + (148, '{$locale}', {intl l='Chieti' locale=$locale}), + (149, '{$locale}', {intl l='Como' locale=$locale}), + (150, '{$locale}', {intl l='Cosenza' locale=$locale}), + (151, '{$locale}', {intl l='Cremona' locale=$locale}), + (152, '{$locale}', {intl l='Crotone' locale=$locale}), + (153, '{$locale}', {intl l='Cuneo' locale=$locale}), + (154, '{$locale}', {intl l='Enna' locale=$locale}), + (155, '{$locale}', {intl l='Fermo' locale=$locale}), + (156, '{$locale}', {intl l='Ferrara' locale=$locale}), + (157, '{$locale}', {intl l='Firenze' locale=$locale}), + (158, '{$locale}', {intl l='Foggia' locale=$locale}), + (159, '{$locale}', {intl l='Forlì-Cesena' locale=$locale}), + (160, '{$locale}', {intl l='Frosinone' locale=$locale}), + (161, '{$locale}', {intl l='Genova' locale=$locale}), + (162, '{$locale}', {intl l='Gorizia' locale=$locale}), + (163, '{$locale}', {intl l='Grosseto' locale=$locale}), + (164, '{$locale}', {intl l='Imperia' locale=$locale}), + (165, '{$locale}', {intl l='Isernia' locale=$locale}), + (166, '{$locale}', {intl l='L\'Aquila' locale=$locale}), + (167, '{$locale}', {intl l='La Spezia' locale=$locale}), + (168, '{$locale}', {intl l='Latina' locale=$locale}), + (169, '{$locale}', {intl l='Lecce' locale=$locale}), + (170, '{$locale}', {intl l='Lecco' locale=$locale}), + (171, '{$locale}', {intl l='Livorno' locale=$locale}), + (172, '{$locale}', {intl l='Lodi' locale=$locale}), + (173, '{$locale}', {intl l='Lucca' locale=$locale}), + (174, '{$locale}', {intl l='Macerata' locale=$locale}), + (175, '{$locale}', {intl l='Mantova' locale=$locale}), + (176, '{$locale}', {intl l='Massa' locale=$locale}), + (177, '{$locale}', {intl l='Matera' locale=$locale}), + (178, '{$locale}', {intl l='Medio Campidano' locale=$locale}), + (179, '{$locale}', {intl l='Messina' locale=$locale}), + (180, '{$locale}', {intl l='Milano' locale=$locale}), + (181, '{$locale}', {intl l='Modena' locale=$locale}), + (182, '{$locale}', {intl l='Monza e della Brianza' locale=$locale}), + (183, '{$locale}', {intl l='Napoli' locale=$locale}), + (184, '{$locale}', {intl l='Novara' locale=$locale}), + (185, '{$locale}', {intl l='Nuoro' locale=$locale}), + (186, '{$locale}', {intl l='Ogliastra' locale=$locale}), + (187, '{$locale}', {intl l='Olbia-Tempio' locale=$locale}), + (188, '{$locale}', {intl l='Oristano' locale=$locale}), + (189, '{$locale}', {intl l='Padova' locale=$locale}), + (190, '{$locale}', {intl l='Palermo' locale=$locale}), + (191, '{$locale}', {intl l='Parma' locale=$locale}), + (192, '{$locale}', {intl l='Pavia' locale=$locale}), + (193, '{$locale}', {intl l='Perugia' locale=$locale}), + (194, '{$locale}', {intl l='Pesaro-Urbino' locale=$locale}), + (195, '{$locale}', {intl l='Pescara' locale=$locale}), + (196, '{$locale}', {intl l='Piacenza' locale=$locale}), + (197, '{$locale}', {intl l='Pisa' locale=$locale}), + (198, '{$locale}', {intl l='Pistoia' locale=$locale}), + (199, '{$locale}', {intl l='Pordenone' locale=$locale}), + (200, '{$locale}', {intl l='Potenza' locale=$locale}), + (201, '{$locale}', {intl l='Prato' locale=$locale}), + (202, '{$locale}', {intl l='Ragusa' locale=$locale}), + (203, '{$locale}', {intl l='Ravenna' locale=$locale}), + (204, '{$locale}', {intl l='Reggio Calabria' locale=$locale}), + (205, '{$locale}', {intl l='Reggio Emilia' locale=$locale}), + (206, '{$locale}', {intl l='Rieti' locale=$locale}), + (207, '{$locale}', {intl l='Rimini' locale=$locale}), + (208, '{$locale}', {intl l='Roma' locale=$locale}), + (209, '{$locale}', {intl l='Rovigo' locale=$locale}), + (210, '{$locale}', {intl l='Salerno' locale=$locale}), + (211, '{$locale}', {intl l='Sassari' locale=$locale}), + (212, '{$locale}', {intl l='Savona' locale=$locale}), + (213, '{$locale}', {intl l='Siena' locale=$locale}), + (214, '{$locale}', {intl l='Siracusa' locale=$locale}), + (215, '{$locale}', {intl l='Sondrio' locale=$locale}), + (216, '{$locale}', {intl l='Taranto' locale=$locale}), + (217, '{$locale}', {intl l='Teramo' locale=$locale}), + (218, '{$locale}', {intl l='Terni' locale=$locale}), + (219, '{$locale}', {intl l='Torino' locale=$locale}), + (220, '{$locale}', {intl l='Trapani' locale=$locale}), + (221, '{$locale}', {intl l='Trento' locale=$locale}), + (222, '{$locale}', {intl l='Treviso' locale=$locale}), + (223, '{$locale}', {intl l='Trieste' locale=$locale}), + (224, '{$locale}', {intl l='Udine' locale=$locale}), + (225, '{$locale}', {intl l='Varese' locale=$locale}), + (226, '{$locale}', {intl l='Venezia' locale=$locale}), + (227, '{$locale}', {intl l='Verbano-Cusio-Ossola' locale=$locale}), + (228, '{$locale}', {intl l='Vercelli' locale=$locale}), + (229, '{$locale}', {intl l='Verona' locale=$locale}), + (230, '{$locale}', {intl l='Vibo Valentia' locale=$locale}), + (231, '{$locale}', {intl l='Vicenza' locale=$locale}), + (232, '{$locale}', {intl l='Viterbo' locale=$locale}), + (233, '{$locale}', {intl l='Aceh' locale=$locale}), + (234, '{$locale}', {intl l='Bali' locale=$locale}), + (235, '{$locale}', {intl l='Bangka' locale=$locale}), + (236, '{$locale}', {intl l='Banten' locale=$locale}), + (237, '{$locale}', {intl l='Bengkulu' locale=$locale}), + (238, '{$locale}', {intl l='Central Java' locale=$locale}), + (239, '{$locale}', {intl l='Central Kalimantan' locale=$locale}), + (240, '{$locale}', {intl l='Central Sulawesi' locale=$locale}), + (241, '{$locale}', {intl l='Coat of arms of East Java' locale=$locale}), + (242, '{$locale}', {intl l='East kalimantan' locale=$locale}), + (243, '{$locale}', {intl l='East Nusa Tenggara' locale=$locale}), + (244, '{$locale}', {intl l='Lambang propinsi' locale=$locale}), + (245, '{$locale}', {intl l='Jakarta' locale=$locale}), + (246, '{$locale}', {intl l='Jambi' locale=$locale}), + (247, '{$locale}', {intl l='Lampung' locale=$locale}), + (248, '{$locale}', {intl l='Maluku' locale=$locale}), + (249, '{$locale}', {intl l='North Maluku' locale=$locale}), + (250, '{$locale}', {intl l='North Sulawesi' locale=$locale}), + (251, '{$locale}', {intl l='North Sumatra' locale=$locale}), + (252, '{$locale}', {intl l='Papua' locale=$locale}), + (253, '{$locale}', {intl l='Riau' locale=$locale}), + (254, '{$locale}', {intl l='Lambang Riau' locale=$locale}), + (255, '{$locale}', {intl l='Southeast Sulawesi' locale=$locale}), + (256, '{$locale}', {intl l='South Kalimantan' locale=$locale}), + (257, '{$locale}', {intl l='South Sulawesi' locale=$locale}), + (258, '{$locale}', {intl l='South Sumatra' locale=$locale}), + (259, '{$locale}', {intl l='West Java' locale=$locale}), + (260, '{$locale}', {intl l='West Kalimantan' locale=$locale}), + (261, '{$locale}', {intl l='West Nusa Tenggara' locale=$locale}), + (262, '{$locale}', {intl l='Lambang Provinsi Papua Barat' locale=$locale}), + (263, '{$locale}', {intl l='West Sulawesi' locale=$locale}), + (264, '{$locale}', {intl l='West Sumatra' locale=$locale}), + (265, '{$locale}', {intl l='Yogyakarta' locale=$locale}), + (266, '{$locale}', {intl l='Aichi' locale=$locale}), + (267, '{$locale}', {intl l='Akita' locale=$locale}), + (268, '{$locale}', {intl l='Aomori' locale=$locale}), + (269, '{$locale}', {intl l='Chiba' locale=$locale}), + (270, '{$locale}', {intl l='Ehime' locale=$locale}), + (271, '{$locale}', {intl l='Fukui' locale=$locale}), + (272, '{$locale}', {intl l='Fukuoka' locale=$locale}), + (273, '{$locale}', {intl l='Fukushima' locale=$locale}), + (274, '{$locale}', {intl l='Gifu' locale=$locale}), + (275, '{$locale}', {intl l='Gunma' locale=$locale}), + (276, '{$locale}', {intl l='Hiroshima' locale=$locale}), + (277, '{$locale}', {intl l='Hokkaido' locale=$locale}), + (278, '{$locale}', {intl l='Hyogo' locale=$locale}), + (279, '{$locale}', {intl l='Ibaraki' locale=$locale}), + (280, '{$locale}', {intl l='Ishikawa' locale=$locale}), + (281, '{$locale}', {intl l='Iwate' locale=$locale}), + (282, '{$locale}', {intl l='Kagawa' locale=$locale}), + (283, '{$locale}', {intl l='Kagoshima' locale=$locale}), + (284, '{$locale}', {intl l='Kanagawa' locale=$locale}), + (285, '{$locale}', {intl l='Kochi' locale=$locale}), + (286, '{$locale}', {intl l='Kumamoto' locale=$locale}), + (287, '{$locale}', {intl l='Kyoto' locale=$locale}), + (288, '{$locale}', {intl l='Mie' locale=$locale}), + (289, '{$locale}', {intl l='Miyagi' locale=$locale}), + (290, '{$locale}', {intl l='Miyazaki' locale=$locale}), + (291, '{$locale}', {intl l='Nagano' locale=$locale}), + (292, '{$locale}', {intl l='Nagasaki' locale=$locale}), + (293, '{$locale}', {intl l='Nara' locale=$locale}), + (294, '{$locale}', {intl l='Niigata' locale=$locale}), + (295, '{$locale}', {intl l='Oita' locale=$locale}), + (296, '{$locale}', {intl l='Okayama' locale=$locale}), + (297, '{$locale}', {intl l='Okinawa' locale=$locale}), + (298, '{$locale}', {intl l='Osaka' locale=$locale}), + (299, '{$locale}', {intl l='Saga' locale=$locale}), + (300, '{$locale}', {intl l='Saitama' locale=$locale}), + (301, '{$locale}', {intl l='Shiga' locale=$locale}), + (302, '{$locale}', {intl l='Shimane' locale=$locale}), + (303, '{$locale}', {intl l='Shizuoka' locale=$locale}), + (304, '{$locale}', {intl l='Tochigi' locale=$locale}), + (305, '{$locale}', {intl l='Tokushima' locale=$locale}), + (306, '{$locale}', {intl l='Tokyo' locale=$locale}), + (307, '{$locale}', {intl l='Tottori' locale=$locale}), + (308, '{$locale}', {intl l='Toyama' locale=$locale}), + (309, '{$locale}', {intl l='Wakayama' locale=$locale}), + (310, '{$locale}', {intl l='Yamagata' locale=$locale}), + (311, '{$locale}', {intl l='Yamaguchi' locale=$locale}), + (312, '{$locale}', {intl l='Yamanashi' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + + +INSERT INTO `tax_i18n` (`id`, `locale`, `title`, `description`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='French 20% VAT' locale=$locale}, NULL), + (2, '{$locale}', {intl l='French 10% VAT' locale=$locale}, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `tax_rule_i18n` (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='French 20% VAT' locale=$locale}), + (2, '{$locale}', {intl l='French 10% VAT' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `order_status_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Not paid' locale=$locale}, '', '', ''), + (2, '{$locale}', {intl l='Paid' locale=$locale}, '', '', ''), + (3, '{$locale}', {intl l='Processing' locale=$locale}, '', '', ''), + (4, '{$locale}', {intl l='Sent' locale=$locale}, '', '', ''), + (5, '{$locale}', {intl l='Canceled' locale=$locale}, '', '', ''), + (6, '{$locale}', {intl l='Refunded' locale=$locale}, '', '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `resource_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Address' locale=$locale}, NULL, NULL, NULL), + (2, '{$locale}', {intl l='Configuration / Administrator' locale=$locale}, NULL, NULL, NULL), + (3, '{$locale}', {intl l='Configuration / Area' locale=$locale}, NULL, NULL, NULL), + (4, '{$locale}', {intl l='Configuration / Attribute' locale=$locale}, NULL, NULL, NULL), + (5, '{$locale}', {intl l='Category' locale=$locale}, NULL, NULL, NULL), + (6, '{$locale}', {intl l='Configuration' locale=$locale}, NULL, NULL, NULL), + (7, '{$locale}', {intl l='Content' locale=$locale}, NULL, NULL, NULL), + (8, '{$locale}', {intl l='Configuration / Country' locale=$locale}, NULL, NULL, NULL), + (9, '{$locale}', {intl l='Coupon' locale=$locale}, NULL, NULL, NULL), + (10, '{$locale}', {intl l='Configuration / Currency' locale=$locale}, NULL, NULL, NULL), + (11, '{$locale}', {intl l='Customer' locale=$locale}, NULL, NULL, NULL), + (12, '{$locale}', {intl l='Configuration / Feature' locale=$locale}, NULL, NULL, NULL), + (13, '{$locale}', {intl l='Folder' locale=$locale}, NULL, NULL, NULL), + (14, '{$locale}', {intl l='Configuration / Language' locale=$locale}, NULL, NULL, NULL), + (15, '{$locale}', {intl l='Configuration / Mailing-system' locale=$locale}, NULL, NULL, NULL), + (16, '{$locale}', {intl l='Configuration / Message' locale=$locale}, NULL, NULL, NULL), + (17, '{$locale}', {intl l='Configuration / Module' locale=$locale}, NULL, NULL, NULL), + (18, '{$locale}', {intl l='Order' locale=$locale}, NULL, NULL, NULL), + (19, '{$locale}', {intl l='Product' locale=$locale}, NULL, NULL, NULL), + (20, '{$locale}', {intl l='Configuration / Profile' locale=$locale}, NULL, NULL, NULL), + (21, '{$locale}', {intl l='Configuration / Shipping-zone' locale=$locale}, NULL, NULL, NULL), + (22, '{$locale}', {intl l='Configuration / Tax' locale=$locale}, NULL, NULL, NULL), + (23, '{$locale}', {intl l='Configuration / Template' locale=$locale}, NULL, NULL, NULL), + (24, '{$locale}', {intl l='Configuration / System Log' locale=$locale}, NULL, NULL, NULL), + (25, '{$locale}', {intl l='Configuration / Cache' locale=$locale}, NULL, NULL, NULL), + (26, '{$locale}', {intl l='Back-office home page' locale=$locale}, NULL, NULL, NULL), + (27, '{$locale}', {intl l='Store information configuration' locale=$locale}, NULL, NULL, NULL), + (28, '{$locale}', {intl l='Configuration variables' locale=$locale}, NULL, NULL, NULL), + (29, '{$locale}', {intl l='View administration logs' locale=$locale}, NULL, NULL, NULL), + (30, '{$locale}', {intl l='Logging system configuration' locale=$locale}, NULL, NULL, NULL), + (31, '{$locale}', {intl l='Advanced configuration' locale=$locale}, NULL, NULL, NULL), + (32, '{$locale}', {intl l='Translations' locale=$locale}, NULL, NULL, NULL), + (33, '{$locale}', {intl l='Back-office export management' locale=$locale}, NULL, NULL, NULL), + (34, '{$locale}', {intl l='Tools panel' locale=$locale}, NULL, NULL, NULL), + (35, '{$locale}', {intl l='Brands management' locale=$locale}, NULL, NULL, NULL), + (36, '{$locale}', {intl l='Hooks' locale=$locale}, NULL, NULL, NULL), + (37, '{$locale}', {intl l='Hook positions' locale=$locale}, NULL, NULL, NULL), + (38, '{$locale}', {intl l='Sales management' locale=$locale}, NULL, NULL, NULL), + (39, '{$locale}', {intl l='Administatros list' locale=$locale}, NULL, NULL, NULL), + (40, '{$locale}', {intl l='Category configuration' locale=$locale}, NULL, NULL, NULL), + (41, '{$locale}', {intl l='Shipping configuration' locale=$locale}, NULL, NULL, NULL), + (42, '{$locale}', {intl l='Tax rules configuration' locale=$locale}, NULL, NULL, NULL), + (43, '{$locale}', {intl l='Hooks management' locale=$locale}, NULL, NULL, NULL), + (44, '{$locale}', {intl l='Data import / export' locale=$locale}, NULL, NULL, NULL), + (45, '{$locale}', {intl l='Modules maagement' locale=$locale}, NULL, NULL, NULL), + (46, '{$locale}', {intl l='Administration profiles management' locale=$locale}, NULL, NULL, NULL), + (47, '{$locale}', {intl l='Back-office search function' locale=$locale}, NULL, NULL, NULL), + (48, '{$locale}', {intl l='API Configuration' locale=$locale}, NULL, NULL, NULL), + (49, '{$locale}', {intl l='Customer title' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Order confirmation sent to the customer' locale=$locale}, {intl l='Your order {$order_ref} at {config key="store_name"}' locale=$locale}, NULL, NULL), + (2, '{$locale}', {intl l='Your new password' locale=$locale}, {intl l='Your new password for {config key="store_name"}' locale=$locale}, NULL, NULL), + (3, '{$locale}', {intl l='Message sent to the shop owner when a new order is placed' locale=$locale}, {intl l='New order {$order_ref} placed on {config key="store_name"}' locale=$locale}, NULL, NULL), + (4, '{$locale}', {intl l='Mail sent to the customer when its password or email is changed in the back-office' locale=$locale}, {intl l='Your account information on {config key="store_name"} has been changed.' locale=$locale}, NULL, NULL), + (5, '{$locale}', {intl l='Mail sent to the customer when its account is created by an administrator in the back-office' locale=$locale}, {intl l='A {config key="store_name"} account has been created for you' locale=$locale}, NULL, NULL), + (6, '{$locale}', {intl l='Mail sent to an administrator who requested a new password' locale=$locale}, {intl l='New password request on %store' store={config key="store_name"} locale=$locale}, NULL, NULL), + (7, '{$locale}', {intl l='Newsletter subscription confirmation mail' locale=$locale}, {intl l='Your subscription to %store newsletter' store={config key="store_name"} locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; diff --git a/setup/tax_faker.php b/setup/tax_faker.php new file mode 100644 index 00000000..cbf166d9 --- /dev/null +++ b/setup/tax_faker.php @@ -0,0 +1,137 @@ +boot(); + +$faker = Faker\Factory::create(); + +$con = \Propel\Runtime\Propel::getConnection( + Thelia\Model\Map\ProductTableMap::DATABASE_NAME +); +$con->beginTransaction(); + +$currency = \Thelia\Model\CurrencyQuery::create()->filterByCode('EUR')->findOne(); + +try { + $stmt = $con->prepare("SET foreign_key_checks = 0"); + $stmt->execute(); + + \Thelia\Model\TaxQuery::create() + ->find() + ->delete(); + + \Thelia\Model\Base\TaxRuleQuery::create() + ->find() + ->delete(); + + \Thelia\Model\Base\TaxRuleCountryQuery::create() + ->find() + ->delete(); + + $stmt = $con->prepare("SET foreign_key_checks = 1"); + $stmt->execute(); + + /* 10% tax */ + $tax10p = new \Thelia\Model\Tax(); + $tax10p->setType('PricePercentTaxType') + ->setRequirements(array('percent' => 10)) + ->save(); + + /* 8% tax */ + $tax8p = new \Thelia\Model\Tax(); + $tax8p->setType('PricePercentTaxType') + ->setRequirements(array('percent' => 8)) + ->save(); + + /* fix 5 tax */ + $tax5 = new \Thelia\Model\Tax(); + $tax5->setType('FixAmountTaxType') + ->setRequirements(array('amount' => 5)) + ->save(); + + /* 1% tax */ + $tax1p = new \Thelia\Model\Tax(); + $tax1p->setType('PricePercentTaxType') + ->setRequirements(array('percent' => 1)) + ->save(); + + /* tax rule */ + $taxRule = new \Thelia\Model\TaxRule(); + $taxRule->save(); + + /* add 4 taxes to the rule for France (64) */ + $taxRuleCountry = new \Thelia\Model\TaxRuleCountry(); + $taxRuleCountry->setTaxRule($taxRule) + ->setCountryId(64) + ->setTax($tax10p) + ->setPosition(1) + ->save(); + + $taxRuleCountry = new \Thelia\Model\TaxRuleCountry(); + $taxRuleCountry->setTaxRule($taxRule) + ->setCountryId(64) + ->setTax($tax8p) + ->setPosition(1) + ->save(); + + $taxRuleCountry = new \Thelia\Model\TaxRuleCountry(); + $taxRuleCountry->setTaxRule($taxRule) + ->setCountryId(64) + ->setTax($tax5) + ->setPosition(2) + ->save(); + + $taxRuleCountry = new \Thelia\Model\TaxRuleCountry(); + $taxRuleCountry->setTaxRule($taxRule) + ->setCountryId(64) + ->setTax($tax1p) + ->setPosition(3) + ->save(); + + foreach (\Thelia\Model\ProductQuery::create()->find() as $productActiveRecord) { + $productActiveRecord->setTaxRule($taxRule) + ->save(); + } + + $con->commit(); + +} catch (Exception $e) { + echo "error : ".$e->getMessage()."\n"; + $con->rollBack(); +} diff --git a/setup/thelia.sql b/setup/thelia.sql new file mode 100644 index 00000000..e129130b --- /dev/null +++ b/setup/thelia.sql @@ -0,0 +1,3452 @@ + +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +-- --------------------------------------------------------------------- +-- category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category`; + +CREATE TABLE `category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `parent` INTEGER DEFAULT 0 NOT NULL, + `visible` TINYINT NOT NULL, + `position` INTEGER NOT NULL, + `default_template_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`), + INDEX `idx_parent` (`parent`), + INDEX `idx_parent_position` (`parent`, `position`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product`; + +CREATE TABLE `product` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `tax_rule_id` INTEGER, + `ref` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 0 NOT NULL, + `position` INTEGER DEFAULT 0 NOT NULL, + `template_id` INTEGER, + `brand_id` INTEGER, + `virtual` TINYINT DEFAULT 0 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_product_tax_rule_id` (`tax_rule_id`), + INDEX `fk_product_template_id` (`template_id`), + INDEX `fk_product_brand1_idx` (`brand_id`), + CONSTRAINT `fk_product_tax_rule_id` + FOREIGN KEY (`tax_rule_id`) + REFERENCES `tax_rule` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_product_template` + FOREIGN KEY (`template_id`) + REFERENCES `template` (`id`) + ON DELETE SET NULL, + CONSTRAINT `fk_product_brand` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE SET NULL +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_category`; + +CREATE TABLE `product_category` +( + `product_id` INTEGER NOT NULL, + `category_id` INTEGER NOT NULL, + `default_category` TINYINT(1), + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`product_id`,`category_id`), + INDEX `idx_product_has_category_category1` (`category_id`), + INDEX `idx_product_has_category_product1` (`product_id`), + INDEX `idx_product_has_category_default` (`default_category`), + CONSTRAINT `fk_product_has_category_product1` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_product_has_category_category1` + FOREIGN KEY (`category_id`) + REFERENCES `category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- country +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `country`; + +CREATE TABLE `country` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT DEFAULT 0 NOT NULL, + `isocode` VARCHAR(4) NOT NULL, + `isoalpha2` VARCHAR(2), + `isoalpha3` VARCHAR(4), + `has_states` TINYINT DEFAULT 0, + `need_zip_code` TINYINT DEFAULT 0, + `zip_code_format` VARCHAR(20), + `by_default` TINYINT DEFAULT 0, + `shop_country` TINYINT(1) DEFAULT 0 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_country_by_default` (`by_default`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- tax +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `tax`; + +CREATE TABLE `tax` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `type` VARCHAR(255) NOT NULL, + `serialized_requirements` TEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- tax_rule +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `tax_rule`; + +CREATE TABLE `tax_rule` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `is_default` TINYINT(1) DEFAULT 0 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- tax_rule_country +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `tax_rule_country`; + +CREATE TABLE `tax_rule_country` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `tax_rule_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + `state_id` INTEGER, + `tax_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_tax_rule_country_tax_id` (`tax_id`), + INDEX `idx_tax_rule_country_tax_rule_id` (`tax_rule_id`), + INDEX `idx_tax_rule_country_country_id` (`country_id`), + INDEX `idx_tax_rule_country_tax_rule_id_country_id_position` (`tax_rule_id`, `country_id`, `position`), + INDEX `idx_tax_rule_country_state_id` (`state_id`), + CONSTRAINT `fk_tax_rule_country_tax_id` + FOREIGN KEY (`tax_id`) + REFERENCES `tax` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_tax_rule_country_tax_rule_id` + FOREIGN KEY (`tax_rule_id`) + REFERENCES `tax_rule` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_tax_rule_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_tax_rule_country_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- feature +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `feature`; + +CREATE TABLE `feature` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` INTEGER DEFAULT 0, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- feature_av +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `feature_av`; + +CREATE TABLE `feature_av` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `feature_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_feature_av_feature_id` (`feature_id`), + CONSTRAINT `fk_feature_av_feature_id` + FOREIGN KEY (`feature_id`) + REFERENCES `feature` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- feature_product +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `feature_product`; + +CREATE TABLE `feature_product` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `feature_id` INTEGER NOT NULL, + `feature_av_id` INTEGER, + `free_text_value` TEXT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_feature_prod_product_id` (`product_id`), + INDEX `idx_feature_prod_feature_id` (`feature_id`), + INDEX `idx_feature_prod_feature_av_id` (`feature_av_id`), + INDEX `idx_feature_product_product_id_feature_id_position` (`product_id`, `feature_id`, `position`), + CONSTRAINT `fk_feature_prod_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_feature_prod_feature_id` + FOREIGN KEY (`feature_id`) + REFERENCES `feature` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_feature_prod_feature_av_id` + FOREIGN KEY (`feature_av_id`) + REFERENCES `feature_av` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- feature_template +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `feature_template`; + +CREATE TABLE `feature_template` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `feature_id` INTEGER NOT NULL, + `template_id` INTEGER NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_feature_template_id` (`feature_id`), + INDEX `fk_feature_template_idx` (`template_id`), + INDEX `idx_feature_template_template_id_position` (`template_id`, `position`), + CONSTRAINT `fk_feature_template_id` + FOREIGN KEY (`feature_id`) + REFERENCES `feature` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_feature_template` + FOREIGN KEY (`template_id`) + REFERENCES `template` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- attribute +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `attribute`; + +CREATE TABLE `attribute` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- attribute_av +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `attribute_av`; + +CREATE TABLE `attribute_av` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `attribute_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_attribute_av_attribute_id` (`attribute_id`), + CONSTRAINT `fk_attribute_av_attribute_id` + FOREIGN KEY (`attribute_id`) + REFERENCES `attribute` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- attribute_combination +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `attribute_combination`; + +CREATE TABLE `attribute_combination` +( + `attribute_id` INTEGER NOT NULL, + `attribute_av_id` INTEGER NOT NULL, + `product_sale_elements_id` INTEGER NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`attribute_id`,`attribute_av_id`,`product_sale_elements_id`), + INDEX `idx_attribute_combination_attribute_id` (`attribute_id`), + INDEX `idx_attribute_combination_attribute_av_id` (`attribute_av_id`), + INDEX `idx_attribute_combination_product_sale_elements_id` (`product_sale_elements_id`), + CONSTRAINT `fk_attribute_combination_attribute_id` + FOREIGN KEY (`attribute_id`) + REFERENCES `attribute` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_attribute_combination_attribute_av_id` + FOREIGN KEY (`attribute_av_id`) + REFERENCES `attribute_av` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_attribute_combination_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_sale_elements +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements`; + +CREATE TABLE `product_sale_elements` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `ref` VARCHAR(255) NOT NULL, + `quantity` FLOAT NOT NULL, + `promo` TINYINT DEFAULT 0, + `newness` TINYINT DEFAULT 0, + `weight` FLOAT DEFAULT 0, + `is_default` TINYINT(1) DEFAULT 0, + `ean_code` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_product_sale_element_product_id` (`product_id`), + INDEX `ref` (`ref`), + INDEX `idx_product_elements_product_id_promo_is_default` (`product_id`, `promo`, `is_default`), + CONSTRAINT `fk_product_sale_element_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- attribute_template +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `attribute_template`; + +CREATE TABLE `attribute_template` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `attribute_id` INTEGER NOT NULL, + `template_id` INTEGER NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_attribute_template_id` (`attribute_id`), + INDEX `fk_attribute_template_idx` (`template_id`), + CONSTRAINT `fk_attribute_template_id` + FOREIGN KEY (`attribute_id`) + REFERENCES `attribute` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_attribute_template` + FOREIGN KEY (`template_id`) + REFERENCES `template` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- config +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `config`; + +CREATE TABLE `config` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `value` TEXT NOT NULL, + `secured` TINYINT DEFAULT 1 NOT NULL, + `hidden` TINYINT DEFAULT 1 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- customer +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `customer`; + +CREATE TABLE `customer` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `title_id` INTEGER NOT NULL, + `lang_id` INTEGER, + `ref` VARCHAR(50), + `firstname` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(255) NOT NULL, + `email` VARCHAR(255), + `password` VARCHAR(255), + `algo` VARCHAR(128), + `reseller` TINYINT, + `sponsor` VARCHAR(50), + `discount` DECIMAL(16,6) DEFAULT 0.000000, + `remember_me_token` VARCHAR(255), + `remember_me_serial` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_customer_customer_title_id` (`title_id`), + INDEX `idx_customer_lang_id` (`lang_id`), + INDEX `idx_email` (`email`), + CONSTRAINT `fk_customer_customer_title_id` + FOREIGN KEY (`title_id`) + REFERENCES `customer_title` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_customer_lang_id` + FOREIGN KEY (`lang_id`) + REFERENCES `lang` (`id`) + ON UPDATE RESTRICT + ON DELETE SET NULL +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- address +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `address`; + +CREATE TABLE `address` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `label` VARCHAR(255), + `customer_id` INTEGER NOT NULL, + `title_id` INTEGER NOT NULL, + `company` VARCHAR(255), + `firstname` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(255) NOT NULL, + `address1` VARCHAR(255) NOT NULL, + `address2` VARCHAR(255) NOT NULL, + `address3` VARCHAR(255) NOT NULL, + `zipcode` VARCHAR(10) NOT NULL, + `city` VARCHAR(255) NOT NULL, + `country_id` INTEGER NOT NULL, + `state_id` INTEGER, + `phone` VARCHAR(20), + `cellphone` VARCHAR(20), + `is_default` TINYINT DEFAULT 0, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_address_customer_id` (`customer_id`), + INDEX `idx_address_customer_title_id` (`title_id`), + INDEX `idx_address_country_id` (`country_id`), + INDEX `fk_address_state_id_idx` (`state_id`), + CONSTRAINT `fk_address_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_address_customer_title_id` + FOREIGN KEY (`title_id`) + REFERENCES `customer_title` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_address_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_address_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- customer_title +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `customer_title`; + +CREATE TABLE `customer_title` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `by_default` INTEGER DEFAULT 0 NOT NULL, + `position` VARCHAR(45) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- lang +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `lang`; + +CREATE TABLE `lang` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `title` VARCHAR(100), + `code` VARCHAR(10), + `locale` VARCHAR(45), + `url` VARCHAR(255), + `date_format` VARCHAR(45), + `time_format` VARCHAR(45), + `datetime_format` VARCHAR(45), + `decimal_separator` VARCHAR(45), + `thousands_separator` VARCHAR(45), + `active` TINYINT(1) DEFAULT 0, + `visible` TINYINT DEFAULT 0, + `decimals` VARCHAR(45), + `by_default` TINYINT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_lang_by_default` (`by_default`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder`; + +CREATE TABLE `folder` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `parent` INTEGER DEFAULT 0 NOT NULL, + `visible` TINYINT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content`; + +CREATE TABLE `content` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_image`; + +CREATE TABLE `product_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_product_image_product_id` (`product_id`), + INDEX `idx_product_image_product_id_position` (`product_id`, `position`), + CONSTRAINT `fk_product_image_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_document`; + +CREATE TABLE `product_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_product_document_product_id` (`product_id`), + CONSTRAINT `fk_product_document_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order`; + +CREATE TABLE `order` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(45), + `customer_id` INTEGER NOT NULL, + `invoice_order_address_id` INTEGER NOT NULL, + `delivery_order_address_id` INTEGER NOT NULL, + `invoice_date` DATETIME, + `currency_id` INTEGER NOT NULL, + `currency_rate` FLOAT NOT NULL, + `transaction_ref` VARCHAR(100) COMMENT 'transaction reference - usually use to identify a transaction with banking modules', + `delivery_ref` VARCHAR(100) COMMENT 'delivery reference - usually use to identify a delivery progress on a distant delivery tracker website', + `invoice_ref` VARCHAR(100) COMMENT 'the invoice reference', + `discount` DECIMAL(16,6) DEFAULT 0.000000, + `postage` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `postage_tax` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `postage_tax_rule_title` VARCHAR(255), + `payment_module_id` INTEGER NOT NULL, + `delivery_module_id` INTEGER NOT NULL, + `status_id` INTEGER NOT NULL, + `lang_id` INTEGER NOT NULL, + `cart_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_order_currency_id` (`currency_id`), + INDEX `idx_order_customer_id` (`customer_id`), + INDEX `idx_order_invoice_order_address_id` (`invoice_order_address_id`), + INDEX `idx_order_delivery_order_address_id` (`delivery_order_address_id`), + INDEX `idx_order_status_id` (`status_id`), + INDEX `fk_order_payment_module_id_idx` (`payment_module_id`), + INDEX `fk_order_delivery_module_id_idx` (`delivery_module_id`), + INDEX `fk_order_lang_id_idx` (`lang_id`), + INDEX `idx_order_cart_fk` (`cart_id`), + CONSTRAINT `fk_order_currency_id` + FOREIGN KEY (`currency_id`) + REFERENCES `currency` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_invoice_order_address_id` + FOREIGN KEY (`invoice_order_address_id`) + REFERENCES `order_address` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_delivery_order_address_id` + FOREIGN KEY (`delivery_order_address_id`) + REFERENCES `order_address` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_status_id` + FOREIGN KEY (`status_id`) + REFERENCES `order_status` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_payment_module_id` + FOREIGN KEY (`payment_module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_delivery_module_id` + FOREIGN KEY (`delivery_module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_lang_id` + FOREIGN KEY (`lang_id`) + REFERENCES `lang` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- currency +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `currency`; + +CREATE TABLE `currency` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(45), + `symbol` VARCHAR(45), + `format` CHAR(10), + `rate` FLOAT, + `visible` TINYINT DEFAULT 0, + `position` INTEGER, + `by_default` TINYINT DEFAULT 0, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_currency_by_default` (`by_default`), + INDEX `idx_currency_code` (`code`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_address +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_address`; + +CREATE TABLE `order_address` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customer_title_id` INTEGER, + `company` VARCHAR(255), + `firstname` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(255) NOT NULL, + `address1` VARCHAR(255) NOT NULL, + `address2` VARCHAR(255), + `address3` VARCHAR(255), + `zipcode` VARCHAR(10) NOT NULL, + `city` VARCHAR(255) NOT NULL, + `phone` VARCHAR(20), + `cellphone` VARCHAR(20), + `country_id` INTEGER NOT NULL, + `state_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `fk_order_address_customer_title_id_idx` (`customer_title_id`), + INDEX `fk_order_address_country_id_idx` (`country_id`), + INDEX `fk_order_address_state_id_idx` (`state_id`), + CONSTRAINT `fk_order_address_customer_title_id` + FOREIGN KEY (`customer_title_id`) + REFERENCES `customer_title` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_address_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_order_address_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_product +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_product`; + +CREATE TABLE `order_product` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_id` INTEGER NOT NULL, + `product_ref` VARCHAR(255) NOT NULL, + `product_sale_elements_ref` VARCHAR(255) NOT NULL, + `product_sale_elements_id` INTEGER, + `title` VARCHAR(255), + `chapo` TEXT, + `description` LONGTEXT, + `postscriptum` TEXT, + `quantity` FLOAT NOT NULL, + `price` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `promo_price` DECIMAL(16,6) DEFAULT 0.000000, + `was_new` TINYINT NOT NULL, + `was_in_promo` TINYINT NOT NULL, + `weight` VARCHAR(45), + `ean_code` VARCHAR(255), + `tax_rule_title` VARCHAR(255), + `tax_rule_description` LONGTEXT, + `parent` INTEGER COMMENT 'not managed yet', + `virtual` TINYINT DEFAULT 0 NOT NULL, + `virtual_document` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_order_product_order_id` (`order_id`), + CONSTRAINT `fk_order_product_order_id` + FOREIGN KEY (`order_id`) + REFERENCES `order` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_status +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_status`; + +CREATE TABLE `order_status` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(45) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_product_attribute_combination +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_product_attribute_combination`; + +CREATE TABLE `order_product_attribute_combination` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_product_id` INTEGER NOT NULL, + `attribute_title` VARCHAR(255) NOT NULL, + `attribute_chapo` TEXT, + `attribute_description` LONGTEXT, + `attribute_postscriptum` TEXT, + `attribute_av_title` VARCHAR(255) NOT NULL, + `attribute_av_chapo` TEXT, + `attribute_av_description` LONGTEXT, + `attribute_av_postscriptum` TEXT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_order_product_attribute_combination_order_product_id` (`order_product_id`), + CONSTRAINT `fk_order_product_attribute_combination_order_product_id` + FOREIGN KEY (`order_product_id`) + REFERENCES `order_product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module`; + +CREATE TABLE `module` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(55) NOT NULL, + `version` VARCHAR(25) DEFAULT '' NOT NULL, + `type` TINYINT NOT NULL, + `category` VARCHAR(50) DEFAULT 'classic' NOT NULL, + `activate` TINYINT, + `position` INTEGER, + `full_namespace` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`), + INDEX `idx_module_activate` (`activate`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- accessory +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `accessory`; + +CREATE TABLE `accessory` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `accessory` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_address_product_id` (`product_id`), + INDEX `idx_address_accessory` (`accessory`), + CONSTRAINT `fk_accessory_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_accessory_accessory` + FOREIGN KEY (`accessory`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- area +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `area`; + +CREATE TABLE `area` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `postage` FLOAT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- area_delivery_module +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `area_delivery_module`; + +CREATE TABLE `area_delivery_module` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `area_id` INTEGER NOT NULL, + `delivery_module_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `area_id_delivery_module_id_UNIQUE` (`area_id`, `delivery_module_id`), + INDEX `idx_area_delivery_module_area_id` (`area_id`), + INDEX `idx_area_delivery_module_delivery_module_id_idx` (`delivery_module_id`), + CONSTRAINT `fk_area_delivery_module_area_id` + FOREIGN KEY (`area_id`) + REFERENCES `area` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `idx_area_delivery_module_delivery_module_id` + FOREIGN KEY (`delivery_module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- profile +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `profile`; + +CREATE TABLE `profile` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(30) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- resource +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `resource`; + +CREATE TABLE `resource` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- admin +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `admin`; + +CREATE TABLE `admin` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `profile_id` INTEGER, + `firstname` VARCHAR(100) NOT NULL, + `lastname` VARCHAR(100) NOT NULL, + `login` VARCHAR(100) NOT NULL, + `password` VARCHAR(128) NOT NULL, + `locale` VARCHAR(45) NOT NULL, + `algo` VARCHAR(128), + `salt` VARCHAR(128), + `remember_me_token` VARCHAR(255), + `remember_me_serial` VARCHAR(255), + `email` VARCHAR(255) NOT NULL, + `password_renew_token` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `login_UNIQUE` (`login`), + UNIQUE INDEX `email_UNIQUE` (`email`), + INDEX `idx_admin_profile_id` (`profile_id`), + CONSTRAINT `fk_admin_profile_id` + FOREIGN KEY (`profile_id`) + REFERENCES `profile` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- profile_resource +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `profile_resource`; + +CREATE TABLE `profile_resource` +( + `profile_id` INTEGER NOT NULL, + `resource_id` INTEGER NOT NULL, + `access` INTEGER DEFAULT 0 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`profile_id`,`resource_id`), + INDEX `idx_profile_resource_profile_id` (`profile_id`), + INDEX `idx_profile_resource_resource_id` (`resource_id`), + CONSTRAINT `fk_profile_resource_profile_id` + FOREIGN KEY (`profile_id`) + REFERENCES `profile` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_profile_resource_resource_id` + FOREIGN KEY (`resource_id`) + REFERENCES `resource` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- profile_module +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `profile_module`; + +CREATE TABLE `profile_module` +( + `profile_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + `access` TINYINT DEFAULT 0, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`profile_id`,`module_id`), + INDEX `idx_profile_module_profile_id` (`profile_id`), + INDEX `idx_profile_module_module_id` (`module_id`), + CONSTRAINT `fk_profile_module_profile_id` + FOREIGN KEY (`profile_id`) + REFERENCES `profile` (`id`) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT `fk_profile_module_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- message +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `message`; + +CREATE TABLE `message` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `secured` TINYINT, + `text_layout_file_name` VARCHAR(255), + `text_template_file_name` VARCHAR(255), + `html_layout_file_name` VARCHAR(255), + `html_template_file_name` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- coupon +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `coupon`; + +CREATE TABLE `coupon` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(45) NOT NULL, + `type` VARCHAR(255) NOT NULL, + `serialized_effects` LONGTEXT NOT NULL, + `is_enabled` TINYINT(1) NOT NULL, + `start_date` DATETIME, + `expiration_date` DATETIME, + `max_usage` INTEGER NOT NULL, + `is_cumulative` TINYINT(1) NOT NULL, + `is_removing_postage` TINYINT(1) NOT NULL, + `is_available_on_special_offers` TINYINT(1) NOT NULL, + `is_used` TINYINT(1) NOT NULL, + `serialized_conditions` TEXT NOT NULL, + `per_customer_usage_count` TINYINT(1) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`), + INDEX `idx_is_enabled` (`is_enabled`), + INDEX `idx_is_used` (`is_used`), + INDEX `idx_type` (`type`), + INDEX `idx_start_date` (`start_date`), + INDEX `idx_expiration_date` (`expiration_date`), + INDEX `idx_is_cumulative` (`is_cumulative`), + INDEX `idx_is_removing_postage` (`is_removing_postage`), + INDEX `idx_max_usage` (`max_usage`), + INDEX `idx_is_available_on_special_offers` (`is_available_on_special_offers`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- admin_log +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `admin_log`; + +CREATE TABLE `admin_log` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `admin_login` VARCHAR(255), + `admin_firstname` VARCHAR(255), + `admin_lastname` VARCHAR(255), + `resource` VARCHAR(255), + `resource_id` INTEGER, + `action` VARCHAR(255), + `message` TEXT, + `request` LONGTEXT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_folder +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_folder`; + +CREATE TABLE `content_folder` +( + `content_id` INTEGER NOT NULL, + `folder_id` INTEGER NOT NULL, + `default_folder` TINYINT(1), + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`content_id`,`folder_id`), + INDEX `idx_content_folder_content_id` (`content_id`), + INDEX `idx_content_folder_folder_id` (`folder_id`), + INDEX `idx_content_folder_default` (`default_folder`), + CONSTRAINT `fk_content_folder_content_id` + FOREIGN KEY (`content_id`) + REFERENCES `content` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_content_folder_folder_id` + FOREIGN KEY (`folder_id`) + REFERENCES `folder` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- cart +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `cart`; + +CREATE TABLE `cart` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `token` VARCHAR(255), + `customer_id` INTEGER, + `address_delivery_id` INTEGER, + `address_invoice_id` INTEGER, + `currency_id` INTEGER, + `discount` DECIMAL(16,6) DEFAULT 0.000000, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `token_UNIQUE` (`token`), + INDEX `idx_cart_customer_id` (`customer_id`), + INDEX `idx_cart_address_delivery_id` (`address_delivery_id`), + INDEX `idx_cart_address_invoice_id` (`address_invoice_id`), + INDEX `idx_cart_currency_id` (`currency_id`), + CONSTRAINT `fk_cart_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_cart_address_delivery_id` + FOREIGN KEY (`address_delivery_id`) + REFERENCES `address` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_cart_address_invoice_id` + FOREIGN KEY (`address_invoice_id`) + REFERENCES `address` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT `fk_cart_currency_id` + FOREIGN KEY (`currency_id`) + REFERENCES `currency` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- cart_item +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `cart_item`; + +CREATE TABLE `cart_item` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `cart_id` INTEGER NOT NULL, + `product_id` INTEGER NOT NULL, + `quantity` FLOAT DEFAULT 1, + `product_sale_elements_id` INTEGER NOT NULL, + `price` DECIMAL(16,6) DEFAULT 0.000000, + `promo_price` DECIMAL(16,6) DEFAULT 0.000000, + `price_end_of_life` DATETIME, + `promo` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_cart_item_cart_id` (`cart_id`), + INDEX `idx_cart_item_product_id` (`product_id`), + INDEX `idx_cart_item_product_sale_elements_id` (`product_sale_elements_id`), + CONSTRAINT `fk_cart_item_cart_id` + FOREIGN KEY (`cart_id`) + REFERENCES `cart` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_cart_item_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_cart_item_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_price +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_price`; + +CREATE TABLE `product_price` +( + `product_sale_elements_id` INTEGER NOT NULL, + `currency_id` INTEGER NOT NULL, + `price` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `promo_price` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `from_default_currency` TINYINT(1) DEFAULT 1 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`product_sale_elements_id`,`currency_id`), + INDEX `idx_product_price_product_sale_elements_id` (`product_sale_elements_id`), + INDEX `idx_product_price_currency_id` (`currency_id`), + CONSTRAINT `fk_product_price_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_product_price_currency_id` + FOREIGN KEY (`currency_id`) + REFERENCES `currency` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_image`; + +CREATE TABLE `category_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `category_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_category_image_category_id` (`category_id`), + INDEX `idx_category_image_category_id_position` (`category_id`, `position`), + CONSTRAINT `fk_category_image_category_id` + FOREIGN KEY (`category_id`) + REFERENCES `category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder_image`; + +CREATE TABLE `folder_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `folder_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_folder_image_folder_id` (`folder_id`), + INDEX `idx_folder_image_folder_id_position` (`folder_id`, `position`), + CONSTRAINT `fk_folder_image_folder_id` + FOREIGN KEY (`folder_id`) + REFERENCES `folder` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_image`; + +CREATE TABLE `content_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `content_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_content_image_content_id` (`content_id`), + INDEX `idx_content_image_content_id_position` (`content_id`, `position`), + CONSTRAINT `fk_content_image_content_id` + FOREIGN KEY (`content_id`) + REFERENCES `content` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_document`; + +CREATE TABLE `category_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `category_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_category_document_category_id` (`category_id`), + CONSTRAINT `fk_catgory_document_category_id` + FOREIGN KEY (`category_id`) + REFERENCES `category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_document`; + +CREATE TABLE `content_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `content_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_content_document_content_id` (`content_id`), + CONSTRAINT `fk_content_document_content_id` + FOREIGN KEY (`content_id`) + REFERENCES `content` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder_document`; + +CREATE TABLE `folder_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `folder_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_folder_document_folder_id` (`folder_id`), + CONSTRAINT `fk_folder_document_folder_id` + FOREIGN KEY (`folder_id`) + REFERENCES `folder` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_associated_content +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_associated_content`; + +CREATE TABLE `product_associated_content` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_id` INTEGER NOT NULL, + `content_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_product_associated_content_product_id` (`product_id`), + INDEX `idx_product_associated_content_content_id` (`content_id`), + CONSTRAINT `fk_product_associated_content_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_product_associated_content_content_id` + FOREIGN KEY (`content_id`) + REFERENCES `content` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_associated_content +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_associated_content`; + +CREATE TABLE `category_associated_content` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `category_id` INTEGER NOT NULL, + `content_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_category_associated_content_category_id` (`category_id`), + INDEX `idx_category_associated_content_content_id` (`content_id`), + CONSTRAINT `fk_category_associated_content_category_id` + FOREIGN KEY (`category_id`) + REFERENCES `category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_category_associated_content_content_id` + FOREIGN KEY (`content_id`) + REFERENCES `content` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- rewriting_url +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `rewriting_url`; + +CREATE TABLE `rewriting_url` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `url` VARBINARY(255) NOT NULL, + `view` VARCHAR(255), + `view_id` VARCHAR(255), + `view_locale` VARCHAR(255), + `redirected` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `url_UNIQUE` (`url`), + INDEX `idx_rewriting_url_redirected` (`redirected`), + INDEX `idx_rewriting_url` (`view_locale`, `view`, `view_id`, `redirected`), + CONSTRAINT `fk_rewriting_url_redirected` + FOREIGN KEY (`redirected`) + REFERENCES `rewriting_url` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- rewriting_argument +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `rewriting_argument`; + +CREATE TABLE `rewriting_argument` +( + `rewriting_url_id` INTEGER NOT NULL, + `parameter` VARCHAR(255) NOT NULL, + `value` VARCHAR(255) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`rewriting_url_id`,`parameter`,`value`), + INDEX `idx_rewriting_argument_rewirting_url_id` (`rewriting_url_id`), + CONSTRAINT `fk_rewriting_argument_rewirting_url_id` + FOREIGN KEY (`rewriting_url_id`) + REFERENCES `rewriting_url` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- template +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `template`; + +CREATE TABLE `template` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_image`; + +CREATE TABLE `module_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_module_image_module_id` (`module_id`), + INDEX `idx_module_image_module_id_position` (`module_id`, `position`), + CONSTRAINT `fk_module_image_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_product_tax +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_product_tax`; + +CREATE TABLE `order_product_tax` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_product_id` INTEGER NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + `amount` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `promo_amount` DECIMAL(16,6) DEFAULT 0.000000, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_ order_product_tax_order_product_id` (`order_product_id`), + CONSTRAINT `fk_ order_product_tax_order_product_id0` + FOREIGN KEY (`order_product_id`) + REFERENCES `order_product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- newsletter +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `newsletter`; + +CREATE TABLE `newsletter` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `email` VARCHAR(255) NOT NULL, + `firstname` VARCHAR(255), + `lastname` VARCHAR(255), + `locale` VARCHAR(5), + `unsubscribed` TINYINT(1) DEFAULT 0 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `email_UNIQUE` (`email`), + INDEX `idx_unsubscribed` (`unsubscribed`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_coupon +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_coupon`; + +CREATE TABLE `order_coupon` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_id` INTEGER NOT NULL, + `code` VARCHAR(45) NOT NULL, + `type` VARCHAR(255) NOT NULL, + `amount` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `title` VARCHAR(255) NOT NULL, + `short_description` TEXT NOT NULL, + `description` LONGTEXT NOT NULL, + `start_date` DATETIME, + `expiration_date` DATETIME NOT NULL, + `is_cumulative` TINYINT(1) NOT NULL, + `is_removing_postage` TINYINT(1) NOT NULL, + `is_available_on_special_offers` TINYINT(1) NOT NULL, + `serialized_conditions` TEXT NOT NULL, + `per_customer_usage_count` TINYINT(1) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_order_coupon_order_id` (`order_id`), + CONSTRAINT `fk_order_coupon_order_id` + FOREIGN KEY (`order_id`) + REFERENCES `order` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- coupon_country +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `coupon_country`; + +CREATE TABLE `coupon_country` +( + `coupon_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`country_id`), + INDEX `fk_country_id_idx` (`country_id`), + CONSTRAINT `fk_coupon_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_country_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- coupon_module +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `coupon_module`; + +CREATE TABLE `coupon_module` +( + `coupon_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`module_id`), + INDEX `fk_module_id_idx` (`module_id`), + CONSTRAINT `fk_coupon_module_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_module_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_coupon_country +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_coupon_country`; + +CREATE TABLE `order_coupon_country` +( + `coupon_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`country_id`), + INDEX `fk_country_id_idx` (`country_id`), + CONSTRAINT `fk_order_coupon_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_order_coupon_country_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `order_coupon` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_coupon_module +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_coupon_module`; + +CREATE TABLE `order_coupon_module` +( + `coupon_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`module_id`), + INDEX `fk_module_id_idx` (`module_id`), + CONSTRAINT `fk_coupon_module_coupon_id0` + FOREIGN KEY (`coupon_id`) + REFERENCES `order_coupon` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_module_module_id0` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- coupon_customer_count +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `coupon_customer_count`; + +CREATE TABLE `coupon_customer_count` +( + `coupon_id` INTEGER NOT NULL, + `customer_id` INTEGER NOT NULL, + `count` INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (`coupon_id`,`customer_id`), + INDEX `fk_coupon_customer_customer_id_idx` (`customer_id`), + INDEX `fk_coupon_customer_coupon_id_idx` (`coupon_id`), + CONSTRAINT `fk_coupon_customer_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_customer_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- brand +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand`; + +CREATE TABLE `brand` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT, + `position` INTEGER, + `logo_image_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `fk_brand_brand_image_idx` (`logo_image_id`), + CONSTRAINT `fk_logo_image_id_brand_image` + FOREIGN KEY (`logo_image_id`) + REFERENCES `brand_image` (`id`) + ON UPDATE RESTRICT + ON DELETE SET NULL +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- brand_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_document`; + +CREATE TABLE `brand_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `brand_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_brand_document_brand_id` (`brand_id`), + CONSTRAINT `fk_brand_document_brand_id` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- brand_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_image`; + +CREATE TABLE `brand_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `brand_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 1 NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_brand_image_brand_id` (`brand_id`), + CONSTRAINT `fk_brand_image_brand_id` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- form_firewall +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `form_firewall`; + +CREATE TABLE `form_firewall` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `form_name` VARCHAR(255) NOT NULL, + `ip_address` VARCHAR(15) NOT NULL, + `attempts` TINYINT DEFAULT 1, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_form_firewall_form_name` (`form_name`), + INDEX `idx_form_firewall_ip_address` (`ip_address`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale`; + +CREATE TABLE `sale` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) DEFAULT 0 NOT NULL, + `display_initial_price` TINYINT(1) DEFAULT 1 NOT NULL, + `start_date` DATETIME, + `end_date` DATETIME, + `price_offset_type` TINYINT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_sales_active_start_end_date` (`active`, `start_date`, `end_date`), + INDEX `idx_sales_active` (`active`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_offset_currency +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_offset_currency`; + +CREATE TABLE `sale_offset_currency` +( + `sale_id` INTEGER NOT NULL, + `currency_id` INTEGER NOT NULL, + `price_offset_value` FLOAT DEFAULT 0, + PRIMARY KEY (`sale_id`,`currency_id`), + INDEX `fk_sale_offset_currency_currency1_idx` (`currency_id`), + CONSTRAINT `fk_sale_offset_currency_sales_id` + FOREIGN KEY (`sale_id`) + REFERENCES `sale` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_sale_offset_currency_currency_id` + FOREIGN KEY (`currency_id`) + REFERENCES `currency` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_product +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_product`; + +CREATE TABLE `sale_product` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `sale_id` INTEGER NOT NULL, + `product_id` INTEGER NOT NULL, + `attribute_av_id` INTEGER, + PRIMARY KEY (`id`), + INDEX `fk_sale_product_product_idx` (`product_id`), + INDEX `fk_sale_product_attribute_av_idx` (`attribute_av_id`), + INDEX `idx_sale_product_sales_id_product_id` (`sale_id`, `product_id`), + CONSTRAINT `fk_sale_product_sales_id` + FOREIGN KEY (`sale_id`) + REFERENCES `sale` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_sale_product_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_sale_product_attribute_av_id` + FOREIGN KEY (`attribute_av_id`) + REFERENCES `attribute_av` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- export_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_category`; + +CREATE TABLE `export_category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- export +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export`; + +CREATE TABLE `export` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `export_category_id` INTEGER NOT NULL, + `handle_class` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `fk_export_1_idx` (`export_category_id`), + CONSTRAINT `fk_export_export_category_id` + FOREIGN KEY (`export_category_id`) + REFERENCES `export_category` (`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- import_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_category`; + +CREATE TABLE `import_category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- import +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import`; + +CREATE TABLE `import` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `import_category_id` INTEGER NOT NULL, + `handle_class` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `fk_export_1_idx` (`import_category_id`), + CONSTRAINT `fk_import_import_category_id` + FOREIGN KEY (`import_category_id`) + REFERENCES `import_category` (`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_sale_elements_product_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements_product_image`; + +CREATE TABLE `product_sale_elements_product_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_sale_elements_id` INTEGER NOT NULL, + `product_image_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_pse_product_image_product_image_id_idx` (`product_image_id`), + INDEX `fk_pse_product_image_product_sale_element_idx` (`product_sale_elements_id`), + CONSTRAINT `fk_pse_product_image_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_pse_product_image_product_image_id` + FOREIGN KEY (`product_image_id`) + REFERENCES `product_image` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_sale_elements_product_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements_product_document`; + +CREATE TABLE `product_sale_elements_product_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_sale_elements_id` INTEGER NOT NULL, + `product_document_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_pse_product_document_product_document__idx` (`product_document_id`), + INDEX `fk_pse_product_document_product_sale_elem_idx` (`product_sale_elements_id`), + CONSTRAINT `fk_pse_product_document_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_pse_product_document_product_document_id` + FOREIGN KEY (`product_document_id`) + REFERENCES `product_document` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `hook`; + +CREATE TABLE `hook` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL, + `type` TINYINT, + `by_module` TINYINT(1), + `native` TINYINT(1), + `activate` TINYINT(1), + `block` TINYINT(1), + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`, `type`), + INDEX `idx_module_activate` (`activate`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_hook`; + +CREATE TABLE `module_hook` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `hook_id` INTEGER NOT NULL, + `classname` VARCHAR(255), + `method` VARCHAR(255), + `active` TINYINT(1) NOT NULL, + `hook_active` TINYINT(1) NOT NULL, + `module_active` TINYINT(1) NOT NULL, + `position` INTEGER NOT NULL, + `templates` TEXT, + PRIMARY KEY (`id`), + INDEX `idx_module_hook_active` (`active`), + INDEX `fk_module_hook_module_id_idx` (`module_id`), + INDEX `fk_module_hook_hook_id_idx` (`hook_id`), + CONSTRAINT `fk_module_hook_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_module_hook_hook_id` + FOREIGN KEY (`hook_id`) + REFERENCES `hook` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- meta_data +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `meta_data`; + +CREATE TABLE `meta_data` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `meta_key` VARCHAR(100) NOT NULL, + `element_key` VARCHAR(100) NOT NULL, + `element_id` INTEGER NOT NULL, + `is_serialized` TINYINT(1) NOT NULL, + `value` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `meta_data_key_element_idx` (`meta_key`, `element_key`, `element_id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_config +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_config`; + +CREATE TABLE `module_config` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `name` VARCHAR(255) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_module_id_name` (`module_id`, `name`), + CONSTRAINT `fk_module_config_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- api +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `api`; + +CREATE TABLE `api` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `label` VARCHAR(255), + `api_key` VARCHAR(100), + `profile_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_api_profile_id` (`profile_id`), + CONSTRAINT `fk_api_profile_id` + FOREIGN KEY (`profile_id`) + REFERENCES `profile` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- country_area +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `country_area`; + +CREATE TABLE `country_area` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `country_id` INTEGER NOT NULL, + `state_id` INTEGER, + `area_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `country_area_area_id_idx` (`area_id`), + INDEX `fk_country_area_country_id_idx` (`country_id`), + INDEX `fk_country_area_state_id_idx` (`state_id`), + CONSTRAINT `fk_country_area_area_id` + FOREIGN KEY (`area_id`) + REFERENCES `area` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_country_area_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- ignored_module_hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `ignored_module_hook`; + +CREATE TABLE `ignored_module_hook` +( + `module_id` INTEGER NOT NULL, + `hook_id` INTEGER NOT NULL, + `method` VARCHAR(255), + `classname` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`module_id`,`hook_id`), + INDEX `fk_deleted_module_hook_module_id_idx` (`module_id`), + INDEX `fk_deleted_module_hook_hook_id_idx` (`hook_id`), + CONSTRAINT `fk_deleted_module_hook_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_deleted_module_hook_hook_id` + FOREIGN KEY (`hook_id`) + REFERENCES `hook` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- state +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `state`; + +CREATE TABLE `state` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT DEFAULT 0 NOT NULL, + `isocode` VARCHAR(4), + `country_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `fk_state_country_id_idx` (`country_id`), + CONSTRAINT `fk_state_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_i18n`; + +CREATE TABLE `category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_i18n`; + +CREATE TABLE `product_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `product_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `product` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- country_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `country_i18n`; + +CREATE TABLE `country_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `country_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- tax_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `tax_i18n`; + +CREATE TABLE `tax_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `tax_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `tax` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- tax_rule_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `tax_rule_i18n`; + +CREATE TABLE `tax_rule_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `tax_rule_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `tax_rule` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- feature_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `feature_i18n`; + +CREATE TABLE `feature_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `feature_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `feature` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- feature_av_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `feature_av_i18n`; + +CREATE TABLE `feature_av_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `feature_av_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `feature_av` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- attribute_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `attribute_i18n`; + +CREATE TABLE `attribute_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `attribute_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `attribute` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- attribute_av_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `attribute_av_i18n`; + +CREATE TABLE `attribute_av_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `attribute_av_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `attribute_av` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- config_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `config_i18n`; + +CREATE TABLE `config_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `config_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `config` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- customer_title_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `customer_title_i18n`; + +CREATE TABLE `customer_title_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `short` VARCHAR(10), + `long` VARCHAR(45), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `customer_title_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `customer_title` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder_i18n`; + +CREATE TABLE `folder_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `folder_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `folder` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_i18n`; + +CREATE TABLE `content_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `content_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `content` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_image_i18n`; + +CREATE TABLE `product_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `product_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `product_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_document_i18n`; + +CREATE TABLE `product_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `product_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `product_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- currency_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `currency_i18n`; + +CREATE TABLE `currency_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `name` VARCHAR(45), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `currency_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `currency` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_status_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_status_i18n`; + +CREATE TABLE `order_status_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `order_status_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `order_status` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_i18n`; + +CREATE TABLE `module_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `module_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- profile_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `profile_i18n`; + +CREATE TABLE `profile_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `profile_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `profile` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- resource_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `resource_i18n`; + +CREATE TABLE `resource_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `resource_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `resource` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- message_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `message_i18n`; + +CREATE TABLE `message_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` TEXT, + `subject` TEXT, + `text_message` LONGTEXT, + `html_message` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `message_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `message` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- coupon_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `coupon_i18n`; + +CREATE TABLE `coupon_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `short_description` TEXT NOT NULL, + `description` LONGTEXT NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `coupon_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_image_i18n`; + +CREATE TABLE `category_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `category_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `category_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder_image_i18n`; + +CREATE TABLE `folder_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `folder_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `folder_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_image_i18n`; + +CREATE TABLE `content_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `content_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `content_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_document_i18n`; + +CREATE TABLE `category_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `category_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `category_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_document_i18n`; + +CREATE TABLE `content_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `content_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `content_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder_document_i18n`; + +CREATE TABLE `folder_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `folder_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `folder_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- template_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `template_i18n`; + +CREATE TABLE `template_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `name` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `template_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `template` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_image_i18n`; + +CREATE TABLE `module_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `module_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `module_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- brand_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_i18n`; + +CREATE TABLE `brand_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- brand_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_document_i18n`; + +CREATE TABLE `brand_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- brand_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_image_i18n`; + +CREATE TABLE `brand_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_i18n`; + +CREATE TABLE `sale_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `sale_label` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `sale_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `sale` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- export_category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_category_i18n`; + +CREATE TABLE `export_category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `export_category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `export_category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- export_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_i18n`; + +CREATE TABLE `export_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `export_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `export` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- import_category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_category_i18n`; + +CREATE TABLE `import_category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `import_category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `import_category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- import_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_i18n`; + +CREATE TABLE `import_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `import_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `import` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- hook_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `hook_i18n`; + +CREATE TABLE `hook_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `hook_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `hook` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_config_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_config_i18n`; + +CREATE TABLE `module_config_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `value` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `module_config_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `module_config` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- state_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `state_i18n`; + +CREATE TABLE `state_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `state_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `state` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- category_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `category_version`; + +CREATE TABLE `category_version` +( + `id` INTEGER NOT NULL, + `parent` INTEGER DEFAULT 0 NOT NULL, + `visible` TINYINT NOT NULL, + `position` INTEGER NOT NULL, + `default_template_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `category_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_version`; + +CREATE TABLE `product_version` +( + `id` INTEGER NOT NULL, + `tax_rule_id` INTEGER, + `ref` VARCHAR(255) NOT NULL, + `visible` TINYINT DEFAULT 0 NOT NULL, + `position` INTEGER DEFAULT 0 NOT NULL, + `template_id` INTEGER, + `brand_id` INTEGER, + `virtual` TINYINT DEFAULT 0 NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `product_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `product` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- customer_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `customer_version`; + +CREATE TABLE `customer_version` +( + `id` INTEGER NOT NULL, + `title_id` INTEGER NOT NULL, + `lang_id` INTEGER, + `ref` VARCHAR(50), + `firstname` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(255) NOT NULL, + `email` VARCHAR(255), + `password` VARCHAR(255), + `algo` VARCHAR(128), + `reseller` TINYINT, + `sponsor` VARCHAR(50), + `discount` DECIMAL(16,6) DEFAULT 0.000000, + `remember_me_token` VARCHAR(255), + `remember_me_serial` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + `order_ids` TEXT, + `order_versions` TEXT, + PRIMARY KEY (`id`,`version`), + CONSTRAINT `customer_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `customer` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- folder_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `folder_version`; + +CREATE TABLE `folder_version` +( + `id` INTEGER NOT NULL, + `parent` INTEGER DEFAULT 0 NOT NULL, + `visible` TINYINT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `folder_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `folder` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- content_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `content_version`; + +CREATE TABLE `content_version` +( + `id` INTEGER NOT NULL, + `visible` TINYINT, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `content_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `content` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- order_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `order_version`; + +CREATE TABLE `order_version` +( + `id` INTEGER NOT NULL, + `ref` VARCHAR(45), + `customer_id` INTEGER NOT NULL, + `invoice_order_address_id` INTEGER NOT NULL, + `delivery_order_address_id` INTEGER NOT NULL, + `invoice_date` DATETIME, + `currency_id` INTEGER NOT NULL, + `currency_rate` FLOAT NOT NULL, + `transaction_ref` VARCHAR(100) COMMENT 'transaction reference - usually use to identify a transaction with banking modules', + `delivery_ref` VARCHAR(100) COMMENT 'delivery reference - usually use to identify a delivery progress on a distant delivery tracker website', + `invoice_ref` VARCHAR(100) COMMENT 'the invoice reference', + `discount` DECIMAL(16,6) DEFAULT 0.000000, + `postage` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `postage_tax` DECIMAL(16,6) DEFAULT 0.000000 NOT NULL, + `postage_tax_rule_title` VARCHAR(255), + `payment_module_id` INTEGER NOT NULL, + `delivery_module_id` INTEGER NOT NULL, + `status_id` INTEGER NOT NULL, + `lang_id` INTEGER NOT NULL, + `cart_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + `customer_id_version` INTEGER DEFAULT 0, + PRIMARY KEY (`id`,`version`), + CONSTRAINT `order_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `order` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- message_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `message_version`; + +CREATE TABLE `message_version` +( + `id` INTEGER NOT NULL, + `name` VARCHAR(255) NOT NULL, + `secured` TINYINT, + `text_layout_file_name` VARCHAR(255), + `text_template_file_name` VARCHAR(255), + `html_layout_file_name` VARCHAR(255), + `html_template_file_name` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `message_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `message` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- coupon_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `coupon_version`; + +CREATE TABLE `coupon_version` +( + `id` INTEGER NOT NULL, + `code` VARCHAR(45) NOT NULL, + `type` VARCHAR(255) NOT NULL, + `serialized_effects` LONGTEXT NOT NULL, + `is_enabled` TINYINT(1) NOT NULL, + `start_date` DATETIME, + `expiration_date` DATETIME, + `max_usage` INTEGER NOT NULL, + `is_cumulative` TINYINT(1) NOT NULL, + `is_removing_postage` TINYINT(1) NOT NULL, + `is_available_on_special_offers` TINYINT(1) NOT NULL, + `is_used` TINYINT(1) NOT NULL, + `serialized_conditions` TEXT NOT NULL, + `per_customer_usage_count` TINYINT(1) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `coupon_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update.php b/setup/update.php new file mode 100644 index 00000000..e94acafa --- /dev/null +++ b/setup/update.php @@ -0,0 +1,300 @@ +. */ +/* */ +/*************************************************************************************/ + +$bootstrapToggle = false; +$bootstraped = false; + +// Autoload bootstrap + +foreach ($argv as $arg) { + if ($arg === '-b') { + $bootstrapToggle = true; + + continue; + } + + if ($bootstrapToggle) { + require __DIR__ . DIRECTORY_SEPARATOR . $arg; + + $bootstraped = true; + } +} + +if (!$bootstraped) { + if (isset($bootstrapFile)) { + require $bootstrapFile; + } elseif (is_file($file = __DIR__ . '/../core/vendor/autoload.php')) { + require $file; + } elseif (is_file($file = __DIR__ . '/../../bootstrap.php')) { + // Here we are on a thelia/thelia-project + require $file; + } else { + cliOutput('No autoload file found. Please use the -b argument to include yours', 'error'); + exit(1); + } +} + +if (php_sapi_name() != 'cli') { + cliOutput('this script can only be launched with cli sapi', 'error'); + exit(1); +} + +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Finder\Finder; +use Thelia\Install\Exception\UpdateException; + +/*************************************************** + * Load Update class + ***************************************************/ + +try { + $update = new \Thelia\Install\Update(false); +} catch (UpdateException $ex) { + cliOutput($ex->getMessage(), 'error'); + exit(2); +} + +/*************************************************** + * Check if update is needed + ***************************************************/ + +if ($update->isLatestVersion()) { + cliOutput("You already have the latest version of Thelia : " . $update->getCurrentVersion(), 'success'); + exit(3); +} + +$current = $update->getCurrentVersion(); +$files = $update->getLatestVersion(); +$web = $update->getWebVersion(); + +while (1) { + + if ($files != $web) { + cliOutput(sprintf( + "Thelia server is reporting the current stable release version is %s ", + $web + ), 'warning'); + } + + cliOutput(sprintf( + "You are going to update Thelia from version %s to version %s.", + $current, + $files + ), 'info'); + + if ($files < $web) { + + cliOutput(sprintf( + "Your files belongs to version %s, which is not the latest stable release.", + $web + ), 'warning'); + cliOutput(sprintf( + "It is recommended to upgrade your files first then run this script again." . PHP_EOL + . "The latest version is available at http://thelia.net/#download ." + ), 'warning'); + cliOutput("Continue update process anyway ? (Y/n)"); + } else { + cliOutput("Continue update process ? (Y/n)"); + } + + $rep = readStdin(true); + if ($rep == 'y') { + break; + } elseif ($rep == 'n') { + cliOutput("Update aborted", 'warning'); + exit(0); + } +} + +$backup = false; +while (1) { + cliOutput(sprintf("Would you like to backup the current database before proceeding ? (Y/n)")); + + $rep = readStdin(true); + if ($rep == 'y') { + $backup = true; + break; + } elseif ($rep == 'n') { + $backup = false; + break; + } +} + +/*************************************************** + * Update + ***************************************************/ + +$updateError = null; + +try { + // backup db + if (true === $backup) { + try { + $update->backupDb(); + cliOutput(sprintf('Your database has been backed up. The sql file : %s', $update->getBackupFile()), 'info'); + } catch (\Exception $e) { + cliOutput('Sorry, your database can\'t be backed up. Reason : ' . $e->getMessage(), 'error'); + exit(4); + } + } + // update + $update->process($backup); +} catch (UpdateException $ex) { + $updateError = $ex; +} + + + +foreach ($update->getMessages() as $message) { + cliOutput($message[0], $message[1]); +} + +if (null === $updateError) { + cliOutput(sprintf('Thelia as been successfully updated to version %s', $update->getCurrentVersion()), 'success'); + if ($update->hasPostInstructions()) { + cliOutput('==================================='); + cliOutput($update->getPostInstructions()); + cliOutput('==================================='); + } + +} else { + cliOutput(sprintf('Sorry, an unexpected error has occured : %s', $updateError->getMessage()), 'error'); + print $updateError->getTraceAsString() . PHP_EOL; + print "Trace: " . PHP_EOL; + foreach ($update->getLogs() as $log) { + cliOutput(sprintf('[%s] %s' . PHP_EOL, $log[0], $log[1]), 'error'); + } + + if (true === $backup) { + while (1) { + cliOutput("Would you like to restore the backup database ? (Y/n)"); + + $rep = readStdin(true); + if ($rep == 'y') { + cliOutput("Database restore started. Wait, it could take a while..."); + + if (false === $update->restoreDb()) { + cliOutput(sprintf( + 'Sorry, your database can\'t be restore. Try to do it manually : %s', + $update->getBackupFile() + ), 'error'); + exit(5); + } else { + cliOutput("Database successfully restore."); + exit(5); + } + break; + } elseif ($rep == 'n') { + exit(0); + } + } + + } +} + +/*************************************************** + * Try to delete cache + ***************************************************/ + +$finder = new Finder(); +$fs = new Filesystem(); +$hasDeleteError = false; + +$finder->files()->in(THELIA_CACHE_DIR); + +cliOutput(sprintf("Try to delete cache in : %s", THELIA_CACHE_DIR), 'info'); + +foreach ($finder as $file) { + try { + $fs->remove($file); + } catch (\Symfony\Component\Filesystem\Exception\IOException $ex) { + $hasDeleteError = true; + } +} + +if (true === $hasDeleteError) { + cliOutput("The cache has not been cleared properly. Try to run the command manually : " . + "(sudo) php Thelia cache:clear (--env=prod)."); +} + +cliOutput("Update process finished.", 'info'); +exit(0); + + +/*************************************************** + * Utils + ***************************************************/ + +function readStdin($normalize = false) +{ + $fr = fopen("php://stdin", "r"); + $input = fgets($fr, 128); + $input = rtrim($input); + fclose($fr); + + if ($normalize) { + $input = strtolower(trim($input)); + } + + return $input; +} + +function joinPaths() +{ + $args = func_get_args(); + $paths = []; + + foreach ($args as $arg) { + $paths[] = trim($arg, '/\\'); + } + + $path = join(DIRECTORY_SEPARATOR, $paths); + if (substr($args[0], 0, 1) === '/') { + $path = DIRECTORY_SEPARATOR . $path; + } + + return $path; +} + +function cliOutput($message, $type = null) +{ + switch ($type) { + case 'success': + $color = "\033[0;32m"; + break; + case 'info': + $color = "\033[0;34m"; + break; + case 'error': + $color = "\033[0;31m"; + break; + case 'warning': + $color = "\033[1;33m"; + break; + default: + $color = "\033[0m"; + } + + echo PHP_EOL . $color . $message . "\033[0m" . PHP_EOL; +} diff --git a/setup/update/instruction/2.3.0-alpha1.md b/setup/update/instruction/2.3.0-alpha1.md new file mode 100644 index 00000000..5ca3c9c4 --- /dev/null +++ b/setup/update/instruction/2.3.0-alpha1.md @@ -0,0 +1,10 @@ +The system of country has changed. +Countries has been split in countries and states. + +The migration process is tricky and couldn't be automated. + +The update proccess has created new countries (even if it exists) and associated states. +A module (**TheliaMigrateCountry**) has been created to help you to migrate between the 2 systems. + +If you want to use states/provinces please activate the module **TheliaMigrateCountry** in your backoffice, +and go to the *migrate country* page to execute the migration process. \ No newline at end of file diff --git a/setup/update/php/.gitkeep b/setup/update/php/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/setup/update/php/2.0.7.php b/setup/update/php/2.0.7.php new file mode 100644 index 00000000..605182b6 --- /dev/null +++ b/setup/update/php/2.0.7.php @@ -0,0 +1,7 @@ +execute($sql, [$secret]); diff --git a/setup/update/php/2.1.3.php b/setup/update/php/2.1.3.php new file mode 100644 index 00000000..605182b6 --- /dev/null +++ b/setup/update/php/2.1.3.php @@ -0,0 +1,7 @@ +execute($sql, [$secret]); diff --git a/setup/update/php/2.2.0-beta1.php b/setup/update/php/2.2.0-beta1.php new file mode 100644 index 00000000..29b28b01 --- /dev/null +++ b/setup/update/php/2.2.0-beta1.php @@ -0,0 +1,42 @@ +getConnection(); + +// Get locale +$locale = 'fr_FR'; + +$sqlGetLocale = "SELECT `locale` FROM `lang` WHERE `by_default` = :by_default"; +$stmtGetLocale = $pdo->prepare($sqlGetLocale); +$stmtGetLocale->execute([':by_default' => 1]); +$resultLocales = $stmtGetLocale->fetchAll(); + +foreach ($resultLocales as $defaultLocale) { + $locale = $defaultLocale['locale']; +} + +// Get id, feature_id and free_text_value from feature_product +$sqlGetFeatureProduct = "SELECT `id`, `feature_id`, `free_text_value` FROM `feature_product` WHERE `feature_av_id` IS NULL"; +$stmtGetFeatureProduct = $pdo->prepare($sqlGetFeatureProduct); +$stmtGetFeatureProduct->execute([':feature_av_id' => NULL]); + +while ($featureProduct = $stmtGetFeatureProduct->fetch(PDO::FETCH_ASSOC)) { + + // Create new feature_av with the feature_id + $sqlCreateFeatureAv = "INSERT INTO `feature_av` (feature_id, `position`) VALUES (:feature_id, :feature_position)"; + $stmtCreateFeatureAv = $pdo->prepare($sqlCreateFeatureAv); + $stmtCreateFeatureAv->execute([':feature_id' => $featureProduct['feature_id'], ':feature_position' => 1]); + + // Get id from created feature_av + $createdFeatureAvId = $pdo->lastInsertId(); + + // Create new feature_av_i18n + $sqlCreateFeatureAvI18n = "INSERT INTO `feature_av_i18n` (id, locale, title) VALUES (:id, :locale, :title)"; + $stmtCreateFeatureAvI18n = $pdo->prepare($sqlCreateFeatureAvI18n); + $stmtCreateFeatureAvI18n->execute([':id' => $createdFeatureAvId, ':locale' => $locale, ':title' => $featureProduct['free_text_value']]); + + // Update old NULL feature_av_id and textual free_text_value values from feature_product + $sqlUpdateFeatureProduct = "UPDATE feature_product SET feature_av_id = :feature_av_id, free_text_value = :free_text_value WHERE id = :featureProductId"; + $stmtUpdateFeatureProduct = $pdo->prepare($sqlUpdateFeatureProduct); + $stmtUpdateFeatureProduct->execute([':feature_av_id' => $createdFeatureAvId, ':free_text_value' => 1, ':featureProductId' => $featureProduct['id']]); +} + diff --git a/setup/update/php/2.2.0-beta3.php b/setup/update/php/2.2.0-beta3.php new file mode 100644 index 00000000..81087202 --- /dev/null +++ b/setup/update/php/2.2.0-beta3.php @@ -0,0 +1,53 @@ +getConnection(); + +// Test if price columns are in float +$sqlGetFloat = "SELECT COLUMN_NAME " + . "FROM INFORMATION_SCHEMA.COLUMNS " + . "WHERE TABLE_SCHEMA LIKE DATABASE() AND TABLE_NAME LIKE 'product_price' AND COLUMN_NAME LIKE 'price' AND COLUMN_TYPE LIKE 'float%'"; + +$stmtGetFloat = $pdo->query($sqlGetFloat); + +// alter tables to convert float to decimal +if ($stmtGetFloat->rowCount() !== 0) { + $columns = [ + ['product_price', 'price'], + ['product_price', 'promo_price'], + ['order_product', 'price'], + ['order', 'discount'], + ['order', 'postage'], + ['order', 'postage_tax'], + ['order_version', 'discount'], + ['order_version', 'postage'], + ['order_version', 'postage_tax'], + ['order_product_tax', 'amount'], + ['order_product_tax', 'promo_amount'], + ['cart', 'discount'], + ['cart_item', 'price'], + ['cart_item', 'promo_price'], + ['order_coupon', 'amount'] + ]; + + $queries = [ + "ALTER TABLE `:table:` ADD COLUMN `:column:_temp` DECIMAL( 16, 6 ) NOT NULL DEFAULT '0.00000000' AFTER `:column:`", + "UPDATE `:table:` SET `:column:_temp` = CAST(`:column:` as CHAR)", + "ALTER TABLE `:table:` DROP COLUMN `:column:`", + "ALTER TABLE `:table:` CHANGE COLUMN `:column:_temp` `:column:` DECIMAL( 16, 6 ) NOT NULL DEFAULT '0.00000000'", + ]; + + foreach ($columns as $column) { + $args = [ + ':table:' => $column[0], + ':column:' => $column[1] + ]; + + foreach ($queries as $query) { + $stmtConvert = $pdo->prepare(strtr($query, $args)); + $stmtConvert->execute(); + } + } + + $stmtConvert = $pdo->prepare("ALTER TABLE `order_product` CHANGE `promo_price` `promo_price` DECIMAL( 16, 6 ) NOT NULL DEFAULT '0.00000000'"); + $stmtConvert->execute(); +} diff --git a/setup/update/php/2.3.0-alpha2.php b/setup/update/php/2.3.0-alpha2.php new file mode 100644 index 00000000..3506f7c3 --- /dev/null +++ b/setup/update/php/2.3.0-alpha2.php @@ -0,0 +1,29 @@ +exists($path)) { + try { + $fs->remove($path); + } catch (Exception $e) { + $message = sprintf( + $this->trans('The update cannot delete the folder : "%s". Please delete this folder manually.'), + $path + ); + $this->log('warning', $message); + $this->setMessage($message, 'warning'); + } + } +} diff --git a/setup/update/sql/.gitkeep b/setup/update/sql/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/setup/update/sql/2.0.0-RC1.sql b/setup/update/sql/2.0.0-RC1.sql new file mode 100644 index 00000000..818d06eb --- /dev/null +++ b/setup/update/sql/2.0.0-RC1.sql @@ -0,0 +1,24 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +ALTER TABLE `product` CHANGE `position` `position` INT( 11 ) NOT NULL DEFAULT '0'; +ALTER TABLE `product_version` CHANGE `position` `position` INT( 11 ) NOT NULL DEFAULT '0'; + +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +INSERT INTO `message` (`id`, `name`, `secured`, `created_at`, `updated_at`, `version`, `version_created_at`, `version_created_by`) VALUES +(@max, 'lost_password', NULL, NOW(), NOW(), 2, NOW(), NULL); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +(@max, 'de_DE', 'Ihr neues Passwort', 'Ihr neues Passwort', 'Ihr neues Passwort ist : {$password}', '\r\n\r\n\r\n\r\nPasswort Änderung für {config key="urlsite"} \r\n{literal}\r\n\r\n{/literal}\r\n\r\n\r\n
    \r\n
    \r\n

    {config key="store_name"}

    \r\n

    Passwort Änderung für

    \r\n
    Sie haben Ihr Passwort vergessen
    \\r\\nIhr neues Passwort ist {$password}.
    \r\n
    \r\n
    \r\n

    Sie können Ihnen anmelden bei {config key="urlsite"}.
    Sie haben Ihr Passwort vergessen br />\\r\\nBitte ändern Sie das Passwort nach Ihre erste Anmeldung

    \r\n\r\n'), +(@max, 'en_US', 'Your new password', 'Your new password', 'Your new passord is : {$password}', '\r\n\r\n\r\n\r\nchanging password email for {config key="urlsite"} \r\n{literal}\r\n\r\n{/literal}\r\n\r\n\r\n
    \r\n
    \r\n

    {config key="store_name"}

    \r\n

    changing password email for

    \r\n
    You have lost your password
    \\r\\nYour new password is {$password}.
    \r\n
    \r\n
    \r\n

    You can now login at {config key="urlsite"}.
    You have lost your password
    \\r\\nPlease, change this password after your first connection

    \r\n\r\n'), +(@max, 'es_ES', 'Su nueva contraseña', 'Su nueva contraseña', 'Su nueva contraseña es: {$password}', '\r\n\r\n\r\n\r\ncambio de correo electrónico contraseña para {config key="urlsite"} \r\n{literal}\r\n\r\n{/literal}\r\n\r\n\r\n
    \r\n
    \r\n

    {config key="store_name"}

    \r\n

    cambio de correo electrónico contraseña para

    \r\n
    Ha perdido su contraseña < br / > \\r\\nSu nueva contraseña es {$password}.
    \r\n
    \r\n
    \r\n

    Ahora puede entrar {config key="urlsite"}.
    Ha perdido su contraseña < br / > \\r\\nPor favor, cambiar esta contraseña después de su primera conexión

    \r\n\r\n'), +(@max, 'fr_FR', 'Votre nouveau mot de passe', 'Votre nouveau mot de passe', 'Votre nouveau mot de passe est : {$password}', '\r\n\r\n\r\n\r\nChangement du mot de passe pour {config key="urlsite"} \r\n{literal}\r\n\r\n{/literal}\r\n\r\n\r\n
    \r\n
    \r\n

    {config key="store_name"}

    \r\n

    Changement du mot de passe pour

    \r\n
    Vous avez oublié votre mot de passe
    \\r\\nVotre nouveau mot de passe est {$password}.
    \r\n
    \r\n
    \r\n

    Vous pouvez maintenant vous connecter sur {config key="urlsite"}.
    Vous avez oublié votre mot de passe
    \\r\\nVeuillez modifier ce mot de passe après votre première connexion

    \r\n\r\n') +; + +UPDATE `config` SET `value`='2.0.0-RC1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='RC1' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.0-beta2.sql b/setup/update/sql/2.0.0-beta2.sql new file mode 100644 index 00000000..a34ee4c2 --- /dev/null +++ b/setup/update/sql/2.0.0-beta2.sql @@ -0,0 +1,362 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +# config table +ALTER TABLE `config` CHANGE `value` `value` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; + +# admin table +ALTER TABLE `admin` ADD UNIQUE index `login_UNIQUE`(`login`); + +# message table +ALTER TABLE `message` ADD `text_layout_file_name` VARCHAR( 255 ) AFTER `secured` ; +ALTER TABLE `message` ADD `text_template_file_name` VARCHAR( 255 ) AFTER `text_layout_file_name` ; +ALTER TABLE `message` ADD `html_layout_file_name` VARCHAR( 255 ) AFTER `text_template_file_name` ; +ALTER TABLE `message` ADD `html_template_file_name` VARCHAR( 255 ) AFTER `html_layout_file_name` ; + +# message_version table +ALTER TABLE `message_version` ADD `text_layout_file_name` VARCHAR( 255 ) AFTER `secured` ; +ALTER TABLE `message_version` ADD `text_template_file_name` VARCHAR( 255 ) AFTER `text_layout_file_name` ; +ALTER TABLE `message_version` ADD `html_layout_file_name` VARCHAR( 255 ) AFTER `text_template_file_name` ; +ALTER TABLE `message_version` ADD `html_template_file_name` VARCHAR( 255 ) AFTER `html_layout_file_name` ; + +# admin_log table +ALTER TABLE `admin_log` ADD `resource` VARCHAR( 255 ) AFTER `admin_lastname` ; +ALTER TABLE `admin_log` ADD `message` TEXT AFTER `action` ; +ALTER TABLE `admin_log` CHANGE `request` `request` LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci ; + +# category_i18n table +ALTER TABLE `category_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `category_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `category_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + +# product_i18n table +ALTER TABLE `product_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `product_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `product_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + +# folder_i18n table +ALTER TABLE `folder_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `folder_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `folder_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + +# content_i18n table +ALTER TABLE `content_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `content_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `content_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + + +# config content + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('active-admin-template', 'default', 0, 0, NOW(), NOW()), +('active-pdf-template', 'default', 0, 0, NOW(), NOW()), +('active-mail-template', 'default', 0, 0, NOW(), NOW()), +('pdf_invoice_file', 'invoice', 0, 0, NOW(), NOW()), +('pdf_delivery_file', 'delivery', 0, 0, NOW(), NOW()) +; + +UPDATE `config` SET `name`='active-front-template' WHERE `name`='active-template'; +UPDATE `config` SET `name`='obsolete_rewriten_url_view', `value`='obsolete-rewritten-url' WHERE `name`='passed_url_view'; +UPDATE `config` SET `name`='store_name' WHERE `name`='company_name'; +UPDATE `config` SET `name`='store_email' WHERE `name`='company_email'; +UPDATE `config` SET `value`='2.0.0-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; + +INSERT INTO `module` (`code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +('Front', 1, 1, 2, 'Front\\Front', NOW(), NOW()); + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(LAST_INSERT_ID(), 'en_US', 'Front office integration', NULL, NULL, NULL), +(LAST_INSERT_ID(), 'fr_FR', 'Module Front office', NULL, NULL, NULL); + +TRUNCATE TABLE `area`; + +INSERT INTO `area` (`id`, `name`, `postage`, `created_at`, `updated_at`) VALUES +(1, 'France', NULL, NOW(), NOW()), +(2, 'A Zone', NULL, NOW(), NOW()), +(3, 'B Zone', NULL, NOW(), NOW()), +(4, 'C Zone', NULL, NOW(), NOW()), +(5, 'D Zone', NULL, NOW(), NOW()), +(6, 'France OM1', NULL, NOW(), NOW()), +(7, 'France OM2', NULL, NOW(), NOW()); + +TRUNCATE TABLE `area_delivery_module`; + +INSERT INTO `area_delivery_module` (`id`, `area_id`, `delivery_module_id`, `created_at`, `updated_at`) VALUES +(1, 1, 2, NOW(), NOW()), +(2, 2, 2, NOW(), NOW()), +(3, 3, 2, NOW(), NOW()), +(4, 4, 2, NOW(), NOW()), +(5, 5, 2, NOW(), NOW()), +(6, 6, 2, NOW(), NOW()); + +TRUNCATE TABLE `country`; + +INSERT INTO `country` (`id`, `area_id`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `created_at`, `updated_at`) VALUES +(1, 5, '4', 'AF', 'AFG', 0, 0, NOW(), NOW()), +(2, 4, '710', 'ZA', 'ZAF', 0, 0, NOW(), NOW()), +(3, 3, '8', 'AL', 'ALB', 0, 0, NOW(), NOW()), +(4, 3, '12', 'DZ', 'DZA', 0, 0, NOW(), NOW()), +(5, 2, '276', 'DE', 'DEU', 0, 0, NOW(), NOW()), +(6, 1, '20', 'AD', 'AND', 0, 0, NOW(), NOW()), +(7, 4, '24', 'AO', 'AGO', 0, 0, NOW(), NOW()), +(8, 5, '28', 'AG', 'ATG', 0, 0, NOW(), NOW()), +(9, 4, '682', 'SA', 'SAU', 0, 0, NOW(), NOW()), +(10, 5, '32', 'AR', 'ARG', 0, 0, NOW(), NOW()), +(11, 3, '51', 'AM', 'ARM', 0, 0, NOW(), NOW()), +(12, 5, '36', 'AU', 'AUS', 0, 0, NOW(), NOW()), +(13, 2, '40', 'AT', 'AUT', 0, 0, NOW(), NOW()), +(14, 3, '31', 'AZ', 'AZE', 0, 0, NOW(), NOW()), +(15, 5, '44', 'BS', 'BHS', 0, 0, NOW(), NOW()), +(16, 4, '48', 'BR', 'BHR', 0, 0, NOW(), NOW()), +(17, 5, '50', 'BD', 'BGD', 0, 0, NOW(), NOW()), +(18, 5, '52', 'BB', 'BRB', 0, 0, NOW(), NOW()), +(19, 3, '585', 'PW', 'PLW', 0, 0, NOW(), NOW()), +(20, 5, '56', 'BE', 'BEL', 0, 0, NOW(), NOW()), +(21, 5, '84', 'BL', 'BLZ', 0, 0, NOW(), NOW()), +(22, 4, '204', 'BJ', 'BEN', 0, 0, NOW(), NOW()), +(23, NULL, '64', 'BT', 'BTN', 0, 0, NOW(), NOW()), +(24, 3, '112', 'BY', 'BLR', 0, 0, NOW(), NOW()), +(25, 5, '104', 'MM', 'MMR', 0, 0, NOW(), NOW()), +(26, 5, '68', 'BO', 'BOL', 0, 0, NOW(), NOW()), +(27, 3, '70', 'BA', 'BIH', 0, 0, NOW(), NOW()), +(28, 4, '72', 'BW', 'BWA', 0, 0, NOW(), NOW()), +(29, 5, '76', 'BR', 'BRA', 0, 0, NOW(), NOW()), +(30, 5, '96', 'BN', 'BRN', 0, 0, NOW(), NOW()), +(31, 3, '100', 'BG', 'BGR', 0, 0, NOW(), NOW()), +(32, 5, '854', 'BF', 'BFA', 0, 0, NOW(), NOW()), +(33, 4, '108', 'BI', 'BDI', 0, 0, NOW(), NOW()), +(34, 5, '116', 'KH', 'KHM', 0, 0, NOW(), NOW()), +(35, 4, '120', 'CM', 'CMR', 0, 0, NOW(), NOW()), +(37, 4, '132', 'CV', 'CPV', 0, 0, NOW(), NOW()), +(38, 5, '152', 'CL', 'CHL', 0, 0, NOW(), NOW()), +(39, 5, '156', 'CN', 'CHN', 0, 0, NOW(), NOW()), +(40, 2, '196', 'CY', 'CYP', 0, 0, NOW(), NOW()), +(41, 5, '170', 'CO', 'COL', 0, 0, NOW(), NOW()), +(42, 4, '174', 'KM', 'COM', 0, 0, NOW(), NOW()), +(43, 4, '178', 'CG', 'COG', 0, 0, NOW(), NOW()), +(44, 5, '184', 'CK', 'COK', 0, 0, NOW(), NOW()), +(45, 5, '408', 'KP', 'PRK', 0, 0, NOW(), NOW()), +(46, 5, '410', 'KR', 'KOR', 0, 0, NOW(), NOW()), +(47, 5, '188', 'CR', 'CRI', 0, 0, NOW(), NOW()), +(48, 4, '384', 'CI', 'CIV', 0, 0, NOW(), NOW()), +(49, 2, '191', 'HR', 'HRV', 0, 0, NOW(), NOW()), +(50, 5, '192', 'CU', 'CUB', 0, 0, NOW(), NOW()), +(51, 2, '208', 'DK', 'DNK', 0, 0, NOW(), NOW()), +(52, 5, '262', 'DJ', 'DJI', 0, 0, NOW(), NOW()), +(53, 5, '212', 'DM', 'DMA', 0, 0, NOW(), NOW()), +(54, 4, '818', 'EG', 'EGY', 0, 0, NOW(), NOW()), +(55, 4, '784', 'AE', 'ARE', 0, 0, NOW(), NOW()), +(56, 5, '218', 'EC', 'ECU', 0, 0, NOW(), NOW()), +(57, 4, '232', 'ER', 'ERI', 0, 0, NOW(), NOW()), +(58, 2, '724', 'ES', 'ESP', 0, 0, NOW(), NOW()), +(59, 2, '233', 'EE', 'EST', 0, 0, NOW(), NOW()), +(61, 4, '231', 'ET', 'ETH', 0, 0, NOW(), NOW()), +(62, 5, '242', 'FJ', 'FJI', 0, 0, NOW(), NOW()), +(63, 2, '246', 'FI', 'FIN', 0, 0, NOW(), NOW()), +(64, 1, '250', 'FR', 'FRA', 1, 1, NOW(), NOW()), +(65, 4, '266', 'GA', 'GAB', 0, 0, NOW(), NOW()), +(66, 4, '270', 'GM', 'GMB', 0, 0, NOW(), NOW()), +(67, 3, '268', 'GE', 'GEO', 0, 0, NOW(), NOW()), +(68, 4, '288', 'GH', 'GHA', 0, 0, NOW(), NOW()), +(69, 2, '300', 'GR', 'GRC', 0, 0, NOW(), NOW()), +(70, 5, '308', 'GD', 'GRD', 0, 0, NOW(), NOW()), +(71, 5, '320', 'GT', 'GTM', 0, 0, NOW(), NOW()), +(72, 4, '324', 'GN', 'GIN', 0, 0, NOW(), NOW()), +(73, 4, '624', 'GW', 'GNB', 0, 0, NOW(), NOW()), +(74, 4, '226', 'GQ', 'GNQ', 0, 0, NOW(), NOW()), +(75, 5, '328', 'GY', 'GUY', 0, 0, NOW(), NOW()), +(76, 5, '332', 'HT', 'HTI', 0, 0, NOW(), NOW()), +(77, 5, '340', 'HN', 'HND', 0, 0, NOW(), NOW()), +(78, 2, '348', 'HU', 'HUN', 0, 0, NOW(), NOW()), +(79, 5, '356', 'IN', 'IND', 0, 0, NOW(), NOW()), +(80, 5, '360', 'ID', 'IDN', 0, 0, NOW(), NOW()), +(81, 4, '364', 'IR', 'IRN', 0, 0, NOW(), NOW()), +(82, 4, '368', 'IQ', 'IRQ', 0, 0, NOW(), NOW()), +(83, 2, '372', 'IE', 'IRL', 0, 0, NOW(), NOW()), +(84, 3, '352', 'IS', 'ISL', 0, 0, NOW(), NOW()), +(85, 4, '376', 'IL', 'ISR', 0, 0, NOW(), NOW()), +(86, 2, '380', 'IT', 'ITA', 0, 0, NOW(), NOW()), +(87, 5, '388', 'JM', 'JAM', 0, 0, NOW(), NOW()), +(88, 5, '392', 'JP', 'JPN', 0, 0, NOW(), NOW()), +(89, 4, '400', 'JO', 'JOR', 0, 0, NOW(), NOW()), +(90, 5, '398', 'KZ', 'KAZ', 0, 0, NOW(), NOW()), +(91, 4, '404', 'KE', 'KEN', 0, 0, NOW(), NOW()), +(92, 5, '417', 'KG', 'KGZ', 0, 0, NOW(), NOW()), +(93, 5, '296', 'KI', 'KIR', 0, 0, NOW(), NOW()), +(94, 4, '414', 'KW', 'KWT', 0, 0, NOW(), NOW()), +(95, 5, '418', 'LA', 'LAO', 0, 0, NOW(), NOW()), +(96, 4, '426', 'LS', 'LSO', 0, 0, NOW(), NOW()), +(97, 2, '428', 'LV', 'LVA', 0, 0, NOW(), NOW()), +(98, 4, '422', 'LB', 'LBN', 0, 0, NOW(), NOW()), +(99, 4, '430', 'LR', 'LBR', 0, 0, NOW(), NOW()), +(100, 4, '343', 'LY', 'LBY', 0, 0, NOW(), NOW()), +(101, 2, '438', 'LI', 'LIE', 0, 0, NOW(), NOW()), +(102, 2, '440', 'LT', 'LTU', 0, 0, NOW(), NOW()), +(103, 2, '442', 'LU', 'LUX', 0, 0, NOW(), NOW()), +(104, 3, '807', 'MK', 'MKD', 0, 0, NOW(), NOW()), +(105, 4, '450', 'MD', 'MDG', 0, 0, NOW(), NOW()), +(106, 5, '458', 'MY', 'MYS', 0, 0, NOW(), NOW()), +(107, 4, '454', 'MW', 'MWI', 0, 0, NOW(), NOW()), +(108, 5, '462', 'MV', 'MDV', 0, 0, NOW(), NOW()), +(109, 4, '466', 'ML', 'MLI', 0, 0, NOW(), NOW()), +(110, 2, '470', 'MT', 'MLT', 0, 0, NOW(), NOW()), +(111, 3, '504', 'MA', 'MAR', 0, 0, NOW(), NOW()), +(112, 5, '584', 'MH', 'MHL', 0, 0, NOW(), NOW()), +(113, 4, '480', 'MU', 'MUS', 0, 0, NOW(), NOW()), +(114, 4, '478', 'MR', 'MRT', 0, 0, NOW(), NOW()), +(115, 5, '484', 'MX', 'MEX', 0, 0, NOW(), NOW()), +(116, NULL, '583', 'FM', 'FSM', 0, 0, NOW(), NOW()), +(117, 3, '498', 'MD', 'MDA', 0, 0, NOW(), NOW()), +(118, 1, '492', 'MC', 'MCO', 0, 0, NOW(), NOW()), +(119, 5, '496', 'MN', 'MNG', 0, 0, NOW(), NOW()), +(120, 4, '508', 'MZ', 'MOZ', 0, 0, NOW(), NOW()), +(121, 4, '516', 'NA', 'NAM', 0, 0, NOW(), NOW()), +(122, 5, '520', 'NR', 'NRU', 0, 0, NOW(), NOW()), +(123, 5, '524', 'NP', 'NPL', 0, 0, NOW(), NOW()), +(124, 5, '558', 'NI', 'NIC', 0, 0, NOW(), NOW()), +(125, 4, '562', 'NE', 'NER', 0, 0, NOW(), NOW()), +(126, 4, '566', 'NG', 'NGA', 0, 0, NOW(), NOW()), +(127, NULL, '570', 'NU', 'NIU', 0, 0, NOW(), NOW()), +(128, 3, '578', 'NO', 'NOR', 0, 0, NOW(), NOW()), +(129, 5, '554', 'NZ', 'NZL', 0, 0, NOW(), NOW()), +(130, 4, '512', 'OM', 'OMN', 0, 0, NOW(), NOW()), +(131, 4, '800', 'UG', 'UGA', 0, 0, NOW(), NOW()), +(132, 5, '860', 'UZ', 'UZB', 0, 0, NOW(), NOW()), +(133, 5, '586', 'PK', 'PAK', 0, 0, NOW(), NOW()), +(134, 5, '591', 'PA', 'PAN', 0, 0, NOW(), NOW()), +(135, 5, '598', 'PG', 'PNG', 0, 0, NOW(), NOW()), +(136, 5, '600', 'PY', 'PRY', 0, 0, NOW(), NOW()), +(137, 2, '528', 'NL', 'NLD', 0, 0, NOW(), NOW()), +(138, 5, '604', 'PE', 'PER', 0, 0, NOW(), NOW()), +(139, 5, '608', 'PH', 'PHL', 0, 0, NOW(), NOW()), +(140, 2, '616', 'PL', 'POL', 0, 0, NOW(), NOW()), +(141, 2, '620', 'PT', 'PRT', 0, 0, NOW(), NOW()), +(142, 4, '634', 'QA', 'QAT', 0, 0, NOW(), NOW()), +(143, 4, '140', 'CF', 'CAF', 0, 0, NOW(), NOW()), +(144, 5, '214', 'DO', 'DOM', 0, 0, NOW(), NOW()), +(145, 2, '203', 'CZ', 'CZE', 0, 0, NOW(), NOW()), +(146, 2, '642', 'RO', 'ROU', 0, 0, NOW(), NOW()), +(147, 2, '826', 'GB', 'GBR', 0, 0, NOW(), NOW()), +(148, 3, '643', 'RU', 'RUS', 0, 0, NOW(), NOW()), +(149, 4, '646', 'RW', 'RWA', 0, 0, NOW(), NOW()), +(150, 5, '659', 'KN', 'KNA', 0, 0, NOW(), NOW()), +(151, 5, '662', 'LC', 'LCA', 0, 0, NOW(), NOW()), +(152, 2, '674', 'SM', 'SMR', 0, 0, NOW(), NOW()), +(153, 5, '670', 'VC', 'VCT', 0, 0, NOW(), NOW()), +(154, 5, '90', 'SB', 'SLB', 0, 0, NOW(), NOW()), +(155, NULL, '222', 'SV', 'SLV', 0, 0, NOW(), NOW()), +(156, 5, '882', 'WS', 'WSM', 0, 0, NOW(), NOW()), +(157, 4, '678', 'ST', 'STP', 0, 0, NOW(), NOW()), +(158, 4, '686', 'SN', 'SEN', 0, 0, NOW(), NOW()), +(159, 4, '690', 'SC', 'SYC', 0, 0, NOW(), NOW()), +(160, 4, '694', 'SL', 'SLE', 0, 0, NOW(), NOW()), +(161, 5, '702', 'SG', 'SGP', 0, 0, NOW(), NOW()), +(162, 2, '703', 'SK', 'SVK', 0, 0, NOW(), NOW()), +(163, 2, '705', 'SI', 'SVN', 0, 0, NOW(), NOW()), +(164, 4, '706', 'SO', 'SOM', 0, 0, NOW(), NOW()), +(165, 4, '729', 'SD', 'SDN', 0, 0, NOW(), NOW()), +(166, 5, '144', 'LK', 'LKA', 0, 0, NOW(), NOW()), +(167, 2, '752', 'SE', 'SWE', 0, 0, NOW(), NOW()), +(168, 2, '756', 'CH', 'CHE', 0, 0, NOW(), NOW()), +(169, 5, '740', 'SR', 'SUR', 0, 0, NOW(), NOW()), +(170, 4, '748', 'SZ', 'SWZ', 0, 0, NOW(), NOW()), +(171, 4, '760', 'SY', 'SYR', 0, 0, NOW(), NOW()), +(172, 5, '762', 'TJ', 'TJK', 0, 0, NOW(), NOW()), +(173, 5, '834', 'TZ', 'TZA', 0, 0, NOW(), NOW()), +(174, 4, '148', 'TD', 'TCD', 0, 0, NOW(), NOW()), +(175, 5, '764', 'TH', 'THA', 0, 0, NOW(), NOW()), +(176, 4, '768', 'TG', 'TGO', 0, 0, NOW(), NOW()), +(177, 5, '776', 'TO', 'TON', 0, 0, NOW(), NOW()), +(178, 5, '780', 'TT', 'TTO', 0, 0, NOW(), NOW()), +(179, 3, '788', 'TN', 'TUN', 0, 0, NOW(), NOW()), +(180, 5, '795', 'TM', 'TKM', 0, 0, NOW(), NOW()), +(181, 3, '792', 'TR', 'TUR', 0, 0, NOW(), NOW()), +(182, 5, '798', 'TV', 'TUV', 0, 0, NOW(), NOW()), +(183, 2, '804', 'UA', 'UKR', 0, 0, NOW(), NOW()), +(184, 5, '858', 'UY', 'URY', 0, 0, NOW(), NOW()), +(185, 2, '336', 'VA', 'VAT', 0, 0, NOW(), NOW()), +(186, 5, '548', 'VU', 'VUT', 0, 0, NOW(), NOW()), +(187, 5, '862', 'VE', 'VEN', 0, 0, NOW(), NOW()), +(188, 5, '704', 'VN', 'VNM', 0, 0, NOW(), NOW()), +(189, 4, '887', 'YE', 'YEM', 0, 0, NOW(), NOW()), +(191, 4, '180', 'CD', 'COD', 0, 0, NOW(), NOW()), +(192, 4, '894', 'ZM', 'ZMB', 0, 0, NOW(), NOW()), +(193, 4, '716', 'ZW', 'ZWE', 0, 0, NOW(), NOW()), +(196, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(197, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(198, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(199, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(200, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(201, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(202, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(203, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(204, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(205, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(206, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(207, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(208, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(209, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(210, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(211, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(212, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(213, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(214, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(215, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(216, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(217, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(218, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(219, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(220, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(221, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(222, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(223, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(224, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(225, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(226, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(227, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(228, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(229, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(230, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(231, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(232, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(233, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(234, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(235, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(236, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(237, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(238, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(239, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(240, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(241, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(242, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(243, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(244, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(245, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(246, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(247, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(248, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(249, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(250, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(251, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(252, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(253, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(254, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(255, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(256, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(257, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(258, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(259, 6, '312', 'GP', 'GLP', 0, 0, NOW(), NOW()), +(260, 6, '254', 'GF', 'GUF', 0, 0, NOW(), NOW()), +(261, 6, '474', 'MQ', 'MTQ', 0, 0, NOW(), NOW()), +(262, 6, '175', 'YT', 'MYT', 0, 0, NOW(), NOW()), +(263, 6, '638', 'RE', 'REU', 0, 0, NOW(), NOW()), +(264, 6, '666', 'PM', 'SPM', 0, 0, NOW(), NOW()), +(265, 7, '540', 'NC', 'NCL', 0, 0, NOW(), NOW()), +(266, 7, '258', 'PF', 'PYF', 0, 0, NOW(), NOW()), +(267, 7, '876', 'WF', 'WLF', 0, 0, NOW(), NOW()), +(268, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()); + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.0.0-beta3.sql b/setup/update/sql/2.0.0-beta3.sql new file mode 100644 index 00000000..c829165f --- /dev/null +++ b/setup/update/sql/2.0.0-beta3.sql @@ -0,0 +1,53 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +# order table +ALTER TABLE `order` ADD `discount` FLOAT AFTER `invoice_ref` ; + +# coupon table +ALTER TABLE `coupon` DROP INDEX `idx_amount`; +ALTER TABLE `coupon` DROP `amount`; +ALTER TABLE `coupon` ADD `serialized_effects` TEXT AFTER `type` ; + +ALTER TABLE `coupon_version` DROP `amount`; +ALTER TABLE `coupon_version` ADD `serialized_effects` TEXT AFTER `type` ; + +DROP TABLE IF EXISTS `coupon_order`; + +# cart_item table +ALTER TABLE `cart_item` DROP `discount`; + +DROP TABLE IF EXISTS `order_coupon`; + +CREATE TABLE `order_coupon` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_id` INTEGER NOT NULL, + `code` VARCHAR(45) NOT NULL, + `type` VARCHAR(255) NOT NULL, + `amount` FLOAT NOT NULL, + `title` VARCHAR(255) NOT NULL, + `short_description` TEXT NOT NULL, + `description` LONGTEXT NOT NULL, + `expiration_date` DATETIME NOT NULL, + `is_cumulative` TINYINT(1) NOT NULL, + `is_removing_postage` TINYINT(1) NOT NULL, + `is_available_on_special_offers` TINYINT(1) NOT NULL, + `serialized_conditions` TEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_order_coupon_order_id` (`order_id`), + CONSTRAINT `fk_order_coupon_order_id` + FOREIGN KEY (`order_id`) + REFERENCES `order` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +UPDATE `config` SET `value`='2.0.0-beta3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta3' WHERE `name`='thelia_extra_version'; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.0.0-beta4.sql b/setup/update/sql/2.0.0-beta4.sql new file mode 100644 index 00000000..ce1f3fb3 --- /dev/null +++ b/setup/update/sql/2.0.0-beta4.sql @@ -0,0 +1,26 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +INSERT INTO `module` (`code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +( 'Tinymce', 1, 0, 1, 'Tinymce\\Tinymce', NOW(), NOW()); + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(LAST_INSERT_ID(), 'de_DE', 'Tinymce Wysiwyg Editor', NULL, NULL, NULL), +(LAST_INSERT_ID(), 'en_US', 'tinymce wysiwyg editor', NULL, NULL, NULL), +(LAST_INSERT_ID(), 'es_ES', 'editor tinymce wysiwyg', NULL, NULL, NULL), +(LAST_INSERT_ID(), 'fr_FR', 'Editeur TinyMCE', NULL, NULL, NULL) +; + +UPDATE `config` SET `value`='2.0.0-beta4' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta4' WHERE `name`='thelia_extra_version'; + +-- Preferred locale for admin users +ALTER TABLE `admin` ADD `locale` VARCHAR(45) NOT NULL AFTER `password`; +UPDATE `admin` SET `locale`='en_US'; + +-- Unknown flag image path +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('unknown-flag-path','assets/img/flags/unknown.png', 1, 1, NOW(), NOW()); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.0.sql b/setup/update/sql/2.0.0.sql new file mode 100644 index 00000000..5bfefd00 --- /dev/null +++ b/setup/update/sql/2.0.0.sql @@ -0,0 +1,60 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `country` ADD INDEX `idx_country_by_default` (`by_default`); +ALTER TABLE `currency` ADD INDEX `idx_currency_by_default` (`by_default`); +ALTER TABLE `lang` ADD INDEX `idx_lang_by_default` (`by_default`); + +ALTER TABLE `tax_rule_country` ADD INDEX `idx_tax_rule_country_tax_rule_id_country_id_position` (`tax_rule_id`, `country_id`, `position`); + +ALTER TABLE `product_sale_elements` ADD INDEX `idx_product_elements_product_id_promo_is_default` (`product_id`, `promo`, `is_default`); + +ALTER TABLE `product_image` ADD INDEX `idx_product_image_product_id_position` (`product_id`, `position`); +ALTER TABLE `category_image` ADD INDEX `idx_category_image_category_id_position` (`category_id`, `position`); +ALTER TABLE `content_image` ADD INDEX `idx_content_image_content_id_position` (`content_id`, `position`); +ALTER TABLE `folder_image` ADD INDEX `idx_folder_image_folder_id_position` (`folder_id`, `position`); +ALTER TABLE `module_image` ADD INDEX `idx_module_image_module_id_position` (`module_id`, `position`); + +ALTER TABLE `rewriting_url` ADD INDEX `idx_rewriting_url_view_updated_at` (`view`, `updated_at`); +ALTER TABLE `rewriting_url` ADD INDEX `idx_rewriting_url_view_id_view_view_locale_updated_at` (`view_id`, `view`, `view_locale`, `updated_at`); +ALTER TABLE `rewriting_url` DROP INDEX `idx_view_id`; + +ALTER TABLE `feature_product` ADD INDEX `idx_feature_product_product_id_feature_id_position` (`product_id`, `feature_id`, `position`); +ALTER TABLE `feature_template` ADD INDEX `idx_feature_template_template_id_position` (`template_id`, `position`); + +ALTER TABLE `currency` ADD INDEX `idx_currency_code` (`code`); + +ALTER TABLE `customer` CHANGE `ref` `ref` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ; + +ALTER TABLE `order` CHANGE `ref` `ref` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ; + +SELECT @max := MAX(`id`) FROM `resource`; +SET @max := @max+1; + +INSERT INTO `resource` (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max, 'admin.cache', NOW(), NOW()); + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +(@max, 'de_DE', 'Konfiguration / Cache'), +(@max, 'en_US', 'Configuration / Cache'), +(@max, 'es_ES', 'Configuración / caché'), +(@max, 'fr_FR', 'Configuration / Cache') +; + +SET @max := @max+1; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max, 'admin.home', NOW(), NOW()); + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +(@max, 'de_DE', 'Back-Office Startseite'), +(@max, 'en_US', 'Back-office home page'), +(@max, 'es_ES', 'Página de inicio de back office'), +(@max, 'fr_FR', 'Page d\'acceuil de l\'administration') +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.1.sql b/setup/update/sql/2.0.1.sql new file mode 100644 index 00000000..dc944515 --- /dev/null +++ b/setup/update/sql/2.0.1.sql @@ -0,0 +1,86 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('front_cart_country_cookie_name','fcccn', 1, 1, NOW(), NOW()); +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('front_cart_country_cookie_expires','2592000', 1, 1, NOW(), NOW()); +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('sitemap_ttl','7200', 1, 1, NOW(), NOW()); +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('feed_ttl','7200', 1, 1, NOW(), NOW()); + +ALTER TABLE `module` ADD INDEX `idx_module_activate` (`activate`); + +SELECT @max := MAX(`id`) FROM `resource`; +SET @max := @max+1; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max, 'admin.configuration.store', NOW(), NOW()), +(@max+1, 'admin.configuration.variable', NOW(), NOW()), +(@max+2, 'admin.configuration.admin-logs', NOW(), NOW()), +(@max+3, 'admin.configuration.system-logs', NOW(), NOW()), +(@max+4, 'admin.configuration.advanced', NOW(), NOW()), +(@max+5, 'admin.configuration.translations', NOW(), NOW()), +(@max+6, 'admin.tools', NOW(), NOW()), +(@max+7, 'admin.export', NOW(), NOW()), +(@max+8, 'admin.export.customer.newsletter', NOW(), NOW()) +; + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +(@max, 'de_DE', 'Shop Informationen'), +(@max+1, 'de_DE', 'Konfigurations Variablen'), +(@max+2, 'de_DE', 'Administration Logs ansehen'), +(@max+3, 'de_DE', 'Logs System Konfiguration'), +(@max+4, 'de_DE', 'Erweiterte Konfiguration'), +(@max+5, 'de_DE', 'Übersetzungen'), +(@max+6, 'de_DE', 'Tools'), +(@max+7, 'de_DE', 'Exporten-Verwaltung'), +(@max+8, 'de_DE', 'Export für die Newsletter Angemeldeten'), +(@max, 'en_US', 'Store information configuration'), +(@max+1, 'en_US', 'Configuration variables'), +(@max+2, 'en_US', 'View administration logs'), +(@max+3, 'en_US', 'Logging system configuration'), +(@max+4, 'en_US', 'Advanced configuration'), +(@max+5, 'en_US', 'Translations'), +(@max+6, 'en_US', 'Tools panel'), +(@max+7, 'en_US', 'Back-office export management'), +(@max+8, 'en_US', 'export of newsletter subscribers'), +(@max, 'es_ES', 'Configuración de la información de tienda'), +(@max+1, 'es_ES', 'Variables de configuración'), +(@max+2, 'es_ES', 'Ver logs de administración'), +(@max+3, 'es_ES', 'Configuración de sistema de registro'), +(@max+4, 'es_ES', 'Configuración avanzada'), +(@max+5, 'es_ES', 'Traducciones'), +(@max+6, 'es_ES', 'Panel de herramientas'), +(@max+7, 'es_ES', 'Gestor de exportación de Back Office'), +(@max+8, 'es_ES', 'exportación de los suscriptores del boletín de noticias'), +(@max, 'fr_FR', 'Configuration des informations sur la boutique'), +(@max+1, 'fr_FR', 'Variables de configuration'), +(@max+2, 'fr_FR', 'Consulter les logs d\'administration'), +(@max+3, 'fr_FR', 'Configuration du système de log'), +(@max+4, 'fr_FR', 'Configuration avancée'), +(@max+5, 'fr_FR', 'Traductions'), +(@max+6, 'fr_FR', 'Outils'), +(@max+7, 'fr_FR', 'gestion des exports'), +(@max+8, 'fr_FR', 'Export des inscrits à la newsletter') +; + +SELECT @max := MAX(`id`) FROM `lang`; +SET @max := @max+1; + +INSERT INTO `lang`(`id`,`title`,`code`,`locale`,`url`,`date_format`,`time_format`,`datetime_format`,`decimal_separator`,`thousands_separator`,`decimals`,`by_default`,`created_at`,`updated_at`)VALUES +(@max, 'Russian', 'ru', 'ru_RU', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', 0, NOW(), NOW()); + +SET @max := @max+1; + +INSERT INTO `lang`(`id`,`title`,`code`,`locale`,`url`,`date_format`,`time_format`,`datetime_format`,`decimal_separator`,`thousands_separator`,`decimals`,`by_default`,`created_at`,`updated_at`)VALUES +(@max, 'Czech', 'cs', 'cs_CZ', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', 0, NOW(), NOW()); + + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.0.10.sql b/setup/update/sql/2.0.10.sql new file mode 100644 index 00000000..5c8987e6 --- /dev/null +++ b/setup/update/sql/2.0.10.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.10' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='10' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.11.sql b/setup/update/sql/2.0.11.sql new file mode 100644 index 00000000..53280953 --- /dev/null +++ b/setup/update/sql/2.0.11.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.11' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='11' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.12.sql b/setup/update/sql/2.0.12.sql new file mode 100644 index 00000000..9eca9da2 --- /dev/null +++ b/setup/update/sql/2.0.12.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.12' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='12' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.2.sql b/setup/update/sql/2.0.2.sql new file mode 100644 index 00000000..707305e8 --- /dev/null +++ b/setup/update/sql/2.0.2.sql @@ -0,0 +1,129 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +# Remove useless rewriting_url indexes +ALTER TABLE `rewriting_url` DROP INDEX `idx_rewriting_url_view_updated_at`; +ALTER TABLE `rewriting_url` DROP INDEX `idx_rewriting_url_view_id_view_view_locale_updated_at`; + +# Add coupon country/modules crossref tables +# ------------------------------------------ + +DROP TABLE IF EXISTS `coupon_country`; + +CREATE TABLE `coupon_country` +( + `coupon_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`country_id`), + INDEX `fk_country_id_idx` (`country_id`), + CONSTRAINT `fk_coupon_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_country_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +DROP TABLE IF EXISTS `coupon_module`; + +CREATE TABLE `coupon_module` +( + `coupon_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`module_id`), + INDEX `fk_module_id_idx` (`module_id`), + CONSTRAINT `fk_coupon_module_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_module_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +DROP TABLE IF EXISTS `order_coupon_country`; + +CREATE TABLE `order_coupon_country` +( + `coupon_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`country_id`), + INDEX `fk_country_id_idx` (`country_id`), + CONSTRAINT `fk_order_coupon_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_order_coupon_country_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `order_coupon` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +DROP TABLE IF EXISTS `order_coupon_module`; + +CREATE TABLE `order_coupon_module` +( + `coupon_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`module_id`), + INDEX `fk_module_id_idx` (`module_id`), + CONSTRAINT `fk_coupon_module_coupon_id0` + FOREIGN KEY (`coupon_id`) + REFERENCES `order_coupon` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_module_module_id0` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +# Per customer usage count +# ------------------------ + +# Add new column to coupon tables (coupon, order_coupon, coupon_version) + +ALTER TABLE `coupon` ADD `per_customer_usage_count` BOOLEAN NOT NULL DEFAULT FALSE AFTER `serialized_conditions`; +ALTER TABLE `order_coupon` ADD `per_customer_usage_count` BOOLEAN NOT NULL DEFAULT FALSE AFTER `serialized_conditions`; +ALTER TABLE `coupon_version` ADD `per_customer_usage_count` BOOLEAN NOT NULL DEFAULT FALSE AFTER `serialized_conditions`; + +DROP TABLE IF EXISTS `coupon_customer_count`; + +CREATE TABLE `coupon_customer_count` +( + `coupon_id` INTEGER NOT NULL, + `customer_id` INTEGER NOT NULL, + `count` INTEGER DEFAULT 0 NOT NULL, + INDEX `fk_coupon_customer_customer_id_idx` (`customer_id`), + INDEX `fk_coupon_customer_coupon_id_idx` (`coupon_id`), + CONSTRAINT `fk_coupon_customer_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_customer_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +SELECT @max := MAX(`id`) FROM `country`; +SET @max := @max+1; + +INSERT INTO `country` (`id`, `area_id`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `created_at`, `updated_at`) VALUES +(@max, 5, '344', 'HK', 'HKG', 0, 0, NOW(), NOW()); + +INSERT INTO `country_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max, 'de_DE', 'Hong Kong', '', '', ''), +(@max, 'en_US', 'Hong Kong', '', '', ''), +(@max, 'es_ES', 'Hong Kong', '', '', ''), +(@max, 'fr_FR', 'Hong Kong', '', '', '') +; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.0.3-beta.sql b/setup/update/sql/2.0.3-beta.sql new file mode 100644 index 00000000..dc77e669 --- /dev/null +++ b/setup/update/sql/2.0.3-beta.sql @@ -0,0 +1,596 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.3-beta' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta' WHERE `name`='thelia_extra_version'; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('store_description', '', 0, 0, NOW(), NOW()); + +# default available stock + +SELECT @max := MAX(`id`) FROM `config`; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('default_available_stock', '100', 0, 0, NOW(), NOW()), +('information_folder_id', '', 0, 0, NOW(), NOW()), +('terms_conditions_content_id', '', 0, 0, NOW(), NOW()); + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max + 1, 'de_DE', 'Standart verfügbaren Bestand wenn check-available-stock gleich 0.', NULL, NULL, NULL), +(@max + 2, 'de_DE', 'Die ID des Ordners mit Ihren Informations-Seiten: AGB, Impressum, ...', NULL, NULL, NULL), +(@max + 3, 'de_DE', 'Ihr \'Allgemeine Geschäftsbedingungen \' ID.', NULL, NULL, NULL), +(@max + 1, 'en_US', 'Default available stock when check-available-stock is set to 0.', NULL, NULL, NULL), +(@max + 2, 'en_US', 'The ID of the folder containing your information pages : terms, imprint, ...', NULL, NULL, NULL), +(@max + 3, 'en_US', 'The ID of the \'Terms & Conditions\' content.', NULL, NULL, NULL), +(@max + 1, 'es_ES', 'Cuando check-available-stock es 0 stock disponible por defecto.', NULL, NULL, NULL), +(@max + 2, 'es_ES', 'El ID de la carpeta que contiene sus páginas de información: términos, impresión,...', NULL, NULL, NULL), +(@max + 3, 'es_ES', 'El ID de los contenidos de \'Términos y condiciones\'.', NULL, NULL, NULL), +(@max + 1, 'fr_FR', 'Stock disponible par défaut quand check-available-stock est à 0.', NULL, NULL, NULL), +(@max + 2, 'fr_FR', 'L\'ID du dossier contenant vos pages d\'informations : CGV, mentions légales, ...', NULL, NULL, NULL), +(@max + 3, 'fr_FR', 'L\'ID du contenu de vos \'CGV\'.', NULL, NULL, NULL) +; + +# Add new column to order (version, version_created_at, version_created_by) + +ALTER TABLE `order` ADD `version` INT DEFAULT 0 AFTER `updated_at`; +ALTER TABLE `order` ADD `version_created_at` DATE AFTER `version`; +ALTER TABLE `order` ADD `version_created_by` VARCHAR(100) AFTER `version_created_at`; + +ALTER TABLE `order_address` + ADD CONSTRAINT `fk_order_address_customer_title_id` + FOREIGN KEY (`customer_title_id`) + REFERENCES `customer_title` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +; +ALTER TABLE `order_address` + ADD CONSTRAINT `fk_order_address_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +; + +DROP TABLE IF EXISTS `order_version`; + +CREATE TABLE `order_version` +( + `id` INTEGER NOT NULL, + `ref` VARCHAR(45), + `customer_id` INTEGER NOT NULL, + `invoice_order_address_id` INTEGER NOT NULL, + `delivery_order_address_id` INTEGER NOT NULL, + `invoice_date` DATE, + `currency_id` INTEGER NOT NULL, + `currency_rate` FLOAT NOT NULL, + `transaction_ref` VARCHAR(100) COMMENT 'transaction reference - usually use to identify a transaction with banking modules', + `delivery_ref` VARCHAR(100) COMMENT 'delivery reference - usually use to identify a delivery progress on a distant delivery tracker website', + `invoice_ref` VARCHAR(100) COMMENT 'the invoice reference', + `discount` FLOAT, + `postage` FLOAT NOT NULL, + `payment_module_id` INTEGER NOT NULL, + `delivery_module_id` INTEGER NOT NULL, + `status_id` INTEGER NOT NULL, + `lang_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `order_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `order` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; +UPDATE `order` SET + `version` = 1, + `version_created_at` = NOW(), + `version_created_by` = 'Thelia' +WHERE `version` = 0; + +INSERT INTO `order_version`( + `id`, + `ref`, + `customer_id`, + `invoice_order_address_id`, + `delivery_order_address_id`, + `invoice_date`, + `currency_id`, + `currency_rate`, + `transaction_ref`, + `delivery_ref`, + `invoice_ref`, + `discount`, + `postage`, + `payment_module_id`, + `delivery_module_id`, + `status_id`, + `lang_id`, + `created_at`, + `updated_at`, + `version`, + `version_created_at`, + `version_created_by`) + SELECT + `id`, + `ref`, + `customer_id`, + `invoice_order_address_id`, + `delivery_order_address_id`, + `invoice_date`, + `currency_id`, + `currency_rate`, + `transaction_ref`, + `delivery_ref`, + `invoice_ref`, + `discount`, + `postage`, + `payment_module_id`, + `delivery_module_id`, + `status_id`, + `lang_id`, + `created_at`, + `updated_at`, + `version`, + `version_created_at`, + `version_created_by` + FROM `order`; + + +# Add missing columns to coupon (version_created_at, version_created_by) +ALTER TABLE `coupon` ADD `version_created_at` DATE AFTER `version`; +ALTER TABLE `coupon` ADD `version_created_by` VARCHAR(100) AFTER `version_created_at`; + +ALTER TABLE `coupon_version` ADD `version_created_at` DATE AFTER `version`; +ALTER TABLE `coupon_version` ADD `version_created_by` VARCHAR(100) AFTER `version_created_at`; + +# Add coupon_customer_count table +# ------------------------------- + +ALTER TABLE `coupon_customer_count` + DROP FOREIGN KEY `fk_coupon_customer_customer_id`; + +ALTER TABLE `coupon_customer_count` + DROP FOREIGN KEY `fk_coupon_customer_coupon_id`; + +ALTER TABLE `coupon_customer_count` + ADD CONSTRAINT `fk_coupon_customer_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE; + +ALTER TABLE `coupon_customer_count` + ADD CONSTRAINT `fk_coupon_customer_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE; + +# --------------------------------------------------------------------- +# Add Brand tables and related resources +# --------------------------------------------------------------------- + +# Add the "brand" resource +INSERT INTO resource (`code`, `created_at`, `updated_at`) VALUES ('admin.brand', NOW(), NOW()); + +-- --------------------------------------------------------------------- +-- brand +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand`; + +CREATE TABLE `brand` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT, + `position` INTEGER, + `logo_image_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `fk_brand_brand_image_idx` (`logo_image_id`), + CONSTRAINT `fk_logo_image_id_brand_image` + FOREIGN KEY (`logo_image_id`) + REFERENCES `brand_image` (`id`) + ON UPDATE RESTRICT + ON DELETE SET NULL +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_document`; + +CREATE TABLE `brand_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `brand_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_brand_document_brand_id` (`brand_id`), + CONSTRAINT `fk_brand_document_brand_id` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_image`; + +CREATE TABLE `brand_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `brand_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_brand_image_brand_id` (`brand_id`), + CONSTRAINT `fk_brand_image_brand_id` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_i18n`; + +CREATE TABLE `brand_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_document_i18n`; + +CREATE TABLE `brand_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_image_i18n`; + +CREATE TABLE `brand_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------- +-- Add brand field to product table, and related constraint. +-- --------------------------------------------------------- + +ALTER TABLE `product` ADD `brand_id` INTEGER AFTER `template_id`; +ALTER TABLE `product` ADD CONSTRAINT `fk_product_brand` FOREIGN KEY (`brand_id`) REFERENCES `brand` (`id`) ON DELETE SET NULL; + +ALTER TABLE `product_version` ADD `brand_id` INTEGER AFTER `template_id`; +ALTER TABLE `product_version` ADD CONSTRAINT `fk_product_version_brand` FOREIGN KEY (`brand_id`) REFERENCES `brand` (`id`) ON DELETE SET NULL; + + +# Add html_output_trim_level config variable +# ------------------------------------------ + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES + ('html_output_trim_level','1', 0, 0, NOW(), NOW()); + +SELECT @max := MAX(`id`) FROM `config`; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@max, 'en_US', 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)', NULL, NULL, NULL); + +-- --------------------------------------------------------------------- +-- form_firewall +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `form_firewall`; + +CREATE TABLE `form_firewall` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `form_name` VARCHAR(255) NOT NULL, + `ip_address` VARCHAR(15) NOT NULL, + `attempts` TINYINT DEFAULT 1, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_form_firewall_form_name` (`form_name`), + INDEX `idx_form_firewall_ip_address` (`ip_address`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- import_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_category`; + +CREATE TABLE `import_category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_category`; + +CREATE TABLE `export_category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- import +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import`; + +CREATE TABLE `import` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `import_category_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `handle_class` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_import_import_category_id` (`import_category_id`), + CONSTRAINT `fk_import_import_category_id` + FOREIGN KEY (`import_category_id`) + REFERENCES `import_category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export`; + +CREATE TABLE `export` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `export_category_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `handle_class` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_export_export_category_id` (`export_category_id`), + CONSTRAINT `fk_export_export_category_id` + FOREIGN KEY (`export_category_id`) + REFERENCES `export_category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + + + +-- --------------------------------------------------------------------- +-- import_category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_category_i18n`; + +CREATE TABLE `import_category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `import_category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `import_category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export_category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_category_i18n`; + +CREATE TABLE `export_category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `export_category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `export_category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- import_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_i18n`; + +CREATE TABLE `import_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `import_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `import` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_i18n`; + +CREATE TABLE `export_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `export_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `export` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + + + +INSERT INTO `config`(`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('form_firewall_bruteforce_time_to_wait', '10', 0, 0, NOW(), NOW()), +('form_firewall_time_to_wait', '60', 0, 0, NOW(), NOW()), +('form_firewall_bruteforce_attempts', '10', 0, 0, NOW(), NOW()), +('form_firewall_attempts', '6', 0, 0, NOW(), NOW()), +('form_firewall_active', '1', 0, 0, NOW(), NOW()) +; + +SELECT @bf_time := `id` FROM `config` WHERE `name` = 'form_firewall_bruteforce_time_to_wait'; +SELECT @time := `id` FROM `config` WHERE `name` = 'form_firewall_time_to_wait'; +SELECT @bf_attempts := `id` FROM `config` WHERE `name` = 'form_firewall_bruteforce_attempts'; +SELECT @attempts := `id` FROM `config` WHERE `name` = 'form_firewall_attempts'; +SELECT @active := `id` FROM `config` WHERE `name` = 'form_firewall_active'; + + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@time, 'en_US', '[Firewall] Time to wait between X attempts', NULL, NULL, NULL), + (@time, 'fr_FR', '[Pare-feu] Temps à attendre entre X essais', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@bf_time, 'en_US', '[Firewall/Bruteforce] Time to wait between X attempts', NULL, NULL, NULL), + (@bf_time, 'fr_FR', '[Pare-feu/Bruteforce] Temps à attendre entre X essais', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@attempts, 'en_US', '[Firewall] Number of allowed attemps', NULL, NULL, NULL), + (@attempts, 'fr_FR', '[Pare-feu] Nombre de tentatives autorisées', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@bf_attempts, 'en_US', '[Firewall/Bruteforce] Number of allowed attemps', NULL, NULL, NULL), + (@bf_attempts, 'fr_FR', '[Pare-feu/Bruteforce] Nombre de tentatives autorisées', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@active, 'en_US', '[Firewall] Activate the firewall', NULL, NULL, NULL), + (@active, 'fr_FR', '[Pare-feu] Activer le pare-feu', NULL, NULL, NULL) +; + + +-- --------------------------------------------------------------------- +-- missing config_i18n translation for standards variables. +-- --------------------------------------------------------------------- +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(1, 'fr_FR', 'Nom de la classe du gestionnaire de session', NULL, NULL, NULL), +(2, 'fr_FR', 'Vérifier la présence de produits en stock (1) ou l''ignorer (0) lors de l''affichage et la modification des quantités commandées', NULL, NULL, NULL), +(3, 'fr_FR', 'Nom du modèle de front-office actif', NULL, NULL, NULL), +(4, 'fr_FR', 'Nom du modèle de back-office actif', NULL, NULL, NULL), +(5, 'fr_FR', 'Nom du modèle PDF actif', NULL, NULL, NULL), +(6, 'fr_FR', 'Nom du modèle d''e-mail actif', NULL, NULL, NULL), +(7, 'fr_FR', 'Activer (1) ou désactiver (0) la réécriture d''URL', NULL, NULL, NULL), +(8, 'fr_FR', 'Nom du pilote graphique utilisé par la bibliothèque Imagine (voir https://imagine.readthedocs.org)', NULL, NULL, NULL), +(9, 'fr_FR', 'La qualité par défaut (en %) dans les images générées', NULL, NULL, NULL), +(10, 'fr_FR', 'Comment les images originales (pleine résolution) sont-elles fournises dans l''espace web (lien symbolique ou copie)', NULL, NULL, NULL), +(11, 'fr_FR', 'Comment les documents sont-ils fournis dans l''espace web (lien symbolique ou copie)', NULL, NULL, NULL), +(12, 'fr_FR', 'Chemin vers le répertoire où les images sont stockées', NULL, NULL, NULL), +(13, 'fr_FR', 'Chemin vers le répertoire où sont stockés les documents', NULL, NULL, NULL), +(14, 'fr_FR', 'Chemin vers le répertoire de cache d''image dans l''espace web', NULL, NULL, NULL), +(15, 'fr_FR', 'Chemin d''accès au répertoire de cache de document dans l''espace web', NULL, NULL, NULL), +(16, 'fr_FR', 'L''URL pour mettre à jour les taux de change', NULL, NULL, NULL), +(17, 'fr_FR', 'Nom de la page 404 (introuvable) dans le modèle actuel (avec l''extension, par exemple, 404.html)', NULL, NULL, NULL), +(18, 'fr_FR', 'Nom de la page du modèle retournée lorsqu''une URL obsolète (ou inactive) est invoquée', NULL, NULL, NULL), +(19, 'fr_FR', 'Affiche et traite les prix avec(0) ou sans (1) les taxes', NULL, NULL, NULL), +(20, 'fr_FR', 'Compiler les resources du modèle actif à chaque changement (1 = oui, 2 = non)', NULL, NULL, NULL), +(21, 'fr_FR', 'Nom du cookie "Remember me" pour les utilisateurs d''administration', NULL, NULL, NULL), +(22, 'fr_FR', 'Délai d''expiration du cookie "Remember me", en secondes, pour les utilisateurs d''administration', NULL, NULL, NULL), +(23, 'fr_FR', 'Nom du cookie "Remember me" pour les clients', NULL, NULL, NULL), +(24, 'fr_FR', 'Délai d''expiration du cookie "Remember me", en secondes, pour les clients', NULL, NULL, NULL), +(25, 'fr_FR', 'URL de base pour la boutique (par exemple http://www.yourshopdomain.com)', NULL, NULL, NULL), +(26, 'fr_FR', 'Nom de la vue de la facture dans le modèle PDF en cours (sans extension)', NULL, NULL, NULL), +(27, 'fr_FR', 'Nom de la vue de la livraison dans le modèle PDF en cours (sans extension)', NULL, NULL, NULL), +(28, 'fr_FR', 'Le chemin (par rapport au modèle de back-office par défaut) vers l''image utilisée lorsque aucune image de drapeau ne peut être trouvée pour un pays', NULL, NULL, NULL), +(29, 'fr_FR', 'Niveau de découpe des espaces dans le code HTML généré (0 = aucun, 1 = moyen, 2 = maximum)', NULL, NULL, NULL); + +# Done ! +# ------ +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.3-beta2.sql b/setup/update/sql/2.0.3-beta2.sql new file mode 100644 index 00000000..7075cca6 --- /dev/null +++ b/setup/update/sql/2.0.3-beta2.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.3-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `export` ADD INDEX `fk_export_1_idx` (`export_category_id`); +ALTER TABLE `import` ADD INDEX `fk_import_1_idx` (`import_category_id`); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.3.sql b/setup/update/sql/2.0.3.sql new file mode 100644 index 00000000..1a472692 --- /dev/null +++ b/setup/update/sql/2.0.3.sql @@ -0,0 +1,6 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.4.sql b/setup/update/sql/2.0.4.sql new file mode 100644 index 00000000..6750510e --- /dev/null +++ b/setup/update/sql/2.0.4.sql @@ -0,0 +1,42 @@ +SET FOREIGN_KEY_CHECKS = 0; + +# ====================================================================================================================== +# Add relation between order and cart +# ====================================================================================================================== +ALTER TABLE `order` + ADD COLUMN `cart_id` INTEGER NOT NULL + AFTER `lang_id` +; + +ALTER TABLE `order_version` + ADD COLUMN `cart_id` INTEGER NOT NULL + AFTER `lang_id` +; + +ALTER TABLE `order` + ADD CONSTRAINT `fk_order_cart_id` + FOREIGN KEY (`cart_id`) REFERENCES `cart`(`id`) +; + +ALTER TABLE `order` + ADD INDEX idx_order_cart_fk + (`cart_id`) +; + +# ====================================================================================================================== +# Add product_sale_elements_id IN order_product +# ====================================================================================================================== + +ALTER TABLE `order_product` + ADD `product_sale_elements_id` INT NOT NULL + AFTER `product_sale_elements_ref`; + +UPDATE `config` SET `value`='2.0.4' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='4' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +# ====================================================================================================================== +# End of changes +# ====================================================================================================================== + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.0.5.sql b/setup/update/sql/2.0.5.sql new file mode 100644 index 00000000..9c10f60b --- /dev/null +++ b/setup/update/sql/2.0.5.sql @@ -0,0 +1,24 @@ +SET FOREIGN_KEY_CHECKS = 0; + +ALTER TABLE `order` DROP FOREIGN KEY `fk_order_cart_id`; + +UPDATE `config` SET `value`='2.0.5' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='5' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +UPDATE `config` SET `name`='form_firewall_active' WHERE `name`='from_firewall_active'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `resource`; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'admin.search', NOW(), NOW()); + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +(@max_id + 1, 'de_DE', 'Suchen'), +(@max_id + 1, 'en_US', 'Search'), +(@max_id + 1, 'es_ES', 'Buscar'), +(@max_id + 1, 'fr_FR', 'Recherche') +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.6.sql b/setup/update/sql/2.0.6.sql new file mode 100644 index 00000000..9d3fd810 --- /dev/null +++ b/setup/update/sql/2.0.6.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.6' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='6' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.7.sql b/setup/update/sql/2.0.7.sql new file mode 100644 index 00000000..0183cd7b --- /dev/null +++ b/setup/update/sql/2.0.7.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.7' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='7' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.8.sql b/setup/update/sql/2.0.8.sql new file mode 100644 index 00000000..da7594b2 --- /dev/null +++ b/setup/update/sql/2.0.8.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.8' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='8' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.0.9.sql b/setup/update/sql/2.0.9.sql new file mode 100644 index 00000000..6e91adf2 --- /dev/null +++ b/setup/update/sql/2.0.9.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.9' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='9' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.0-alpha1.sql b/setup/update/sql/2.1.0-alpha1.sql new file mode 100644 index 00000000..644a6506 --- /dev/null +++ b/setup/update/sql/2.1.0-alpha1.sql @@ -0,0 +1,3209 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0-alpha1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha1' WHERE `name`='thelia_extra_version'; + + +# ====================================================================================================================== +# Add sale related tables +# ====================================================================================================================== + +-- --------------------------------------------------------------------- +-- sale +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale`; + +CREATE TABLE `sale` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) DEFAULT 0 NOT NULL, + `display_initial_price` TINYINT(1) DEFAULT 1 NOT NULL, + `start_date` DATETIME, + `end_date` DATETIME, + `price_offset_type` TINYINT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_sales_active_start_end_date` (`active`, `start_date`, `end_date`), + INDEX `idx_sales_active` (`active`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_i18n`; + +CREATE TABLE `sale_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `sale_label` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `sale_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `sale` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_offset_currency +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_offset_currency`; + +CREATE TABLE `sale_offset_currency` +( + `sale_id` INTEGER NOT NULL, + `currency_id` INTEGER NOT NULL, + `price_offset_value` FLOAT DEFAULT 0, + PRIMARY KEY (`sale_id`,`currency_id`), + INDEX `fk_sale_offset_currency_currency1_idx` (`currency_id`), + CONSTRAINT `fk_sale_offset_currency_sales_id` + FOREIGN KEY (`sale_id`) + REFERENCES `sale` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_sale_offset_currency_currency_id` + FOREIGN KEY (`currency_id`) + REFERENCES `currency` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_product +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_product`; + +CREATE TABLE `sale_product` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `sale_id` INTEGER NOT NULL, + `product_id` INTEGER NOT NULL, + `attribute_av_id` INTEGER, + PRIMARY KEY (`id`), + INDEX `fk_sale_product_product_idx` (`product_id`), + INDEX `fk_sale_product_attribute_av_idx` (`attribute_av_id`), + INDEX `idx_sale_product_sales_id_product_id` (`sale_id`, `product_id`), + CONSTRAINT `fk_sale_product_sales_id` + FOREIGN KEY (`sale_id`) + REFERENCES `sale` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_sale_product_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_sale_product_attribute_av_id` + FOREIGN KEY (`attribute_av_id`) + REFERENCES `attribute_av` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +# ====================================================================================================================== +# Product sale elements images and documents +# ====================================================================================================================== + +-- --------------------------------------------------------------------- +-- product_sale_elements_product_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements_product_image`; + +CREATE TABLE `product_sale_elements_product_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_sale_elements_id` INTEGER NOT NULL, + `product_image_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_pse_product_image_product_image_id_idx` (`product_image_id`), + INDEX `fk_pse_product_image_product_sale_element_idx` (`product_sale_elements_id`), + CONSTRAINT `fk_pse_product_image_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`), + CONSTRAINT `fk_pse_product_image_product_image_id` + FOREIGN KEY (`product_image_id`) + REFERENCES `product_image` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_sale_elements_product_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements_product_document`; + +CREATE TABLE `product_sale_elements_product_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_sale_elements_id` INTEGER NOT NULL, + `product_document_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_pse_product_document_product_document__idx` (`product_document_id`), + INDEX `fk_pse_product_document_product_sale_elem_idx` (`product_sale_elements_id`), + CONSTRAINT `fk_pse_product_document_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`), + CONSTRAINT `fk_pse_product_document_product_document_id` + FOREIGN KEY (`product_document_id`) + REFERENCES `product_document` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +# ====================================================================================================================== +# Hooks +# ====================================================================================================================== + +SELECT @max_pos := IFNULL(MAX(`position`),0) FROM `module`; +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `module`; + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'HookNavigation', 1, 1, @max_pos+1, 'HookNavigation\\HookNavigation', NOW(), NOW()), + (@max_id+2, 'HookCurrency', 1, 1, @max_pos+2, 'HookCurrency\\HookCurrency', NOW(), NOW()), + (@max_id+3, 'HookLang', 1, 1, @max_pos+3, 'HookLang\\HookLang', NOW(), NOW()), + (@max_id+4, 'HookSearch', 1, 1, @max_pos+4, 'HookSearch\\HookSearch', NOW(), NOW()), + (@max_id+5, 'HookCustomer', 1, 1, @max_pos+5, 'HookCustomer\\HookCustomer', NOW(), NOW()), + (@max_id+6, 'HookCart', 1, 1, @max_pos+6, 'HookCart\\HookCart', NOW(), NOW()), + (@max_id+7, 'HookAnalytics', 1, 1, @max_pos+7, 'HookAnalytics\\HookAnalytics', NOW(), NOW()), + (@max_id+8, 'HookContact', 1, 1, @max_pos+8, 'HookContact\\HookContact', NOW(), NOW()), + (@max_id+9, 'HookLinks', 1, 1, @max_pos+9, 'HookLinks\\HookLinks', NOW(), NOW()), + (@max_id+10, 'HookNewsletter', 1, 1, @max_pos+10, 'HookNewsletter\\HookNewsletter', NOW(), NOW()), + (@max_id+11, 'HookSocial', 1, 1, @max_pos+11, 'HookSocial\\HookSocial', NOW(), NOW()), + (@max_id+12, 'HookProductsNew', 1, 1, @max_pos+12, 'HookProductsNew\\HookProductsNew', NOW(), NOW()), + (@max_id+13, 'HookProductsOffer', 1, 1, @max_pos+13, 'HookProductsOffer\\HookProductsOffer', NOW(), NOW()) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@max_id+1, 'de_DE', 'Menü Block', NULL, NULL, NULL), + (@max_id+2, 'de_DE', 'Währungensblock', NULL, NULL, NULL), + (@max_id+3, 'de_DE', 'Sprachen Block', NULL, NULL, NULL), + (@max_id+4, 'de_DE', 'Suche-Block', NULL, NULL, NULL), + (@max_id+5, 'de_DE', 'Kundenkonto-Block', NULL, NULL, NULL), + (@max_id+6, 'de_DE', 'Warenkorb Block', NULL, NULL, NULL), + (@max_id+7, 'de_DE', 'Google Analytics Block', NULL, NULL, NULL), + (@max_id+8, 'de_DE', 'Kontakt-Block', NULL, NULL, NULL), + (@max_id+9, 'de_DE', 'Links Block', NULL, NULL, NULL), + (@max_id+10, 'de_DE', 'Newsletter Block', NULL, NULL, NULL), + (@max_id+11, 'de_DE', 'Social Networks Block', NULL, NULL, NULL), + (@max_id+12, 'de_DE', 'Neue Produkte Block', NULL, NULL, NULL), + (@max_id+13, 'de_DE', 'Sonderangebot-Block', NULL, NULL, NULL), + (@max_id+1, 'en_US', 'Navigation block', NULL, NULL, NULL), + (@max_id+2, 'en_US', 'Currency block', NULL, NULL, NULL), + (@max_id+3, 'en_US', 'Languages block', NULL, NULL, NULL), + (@max_id+4, 'en_US', 'Search block', NULL, NULL, NULL), + (@max_id+5, 'en_US', 'Customer account block', NULL, NULL, NULL), + (@max_id+6, 'en_US', 'Cart block', NULL, NULL, NULL), + (@max_id+7, 'en_US', 'Google Analytics block', NULL, NULL, NULL), + (@max_id+8, 'en_US', 'Contact block', NULL, NULL, NULL), + (@max_id+9, 'en_US', 'Links block', NULL, NULL, NULL), + (@max_id+10, 'en_US', 'Newsletter block', NULL, NULL, NULL), + (@max_id+11, 'en_US', 'Social Networks block', NULL, NULL, NULL), + (@max_id+12, 'en_US', 'New Products block', NULL, NULL, NULL), + (@max_id+13, 'en_US', 'Products offer block', NULL, NULL, NULL), + (@max_id+1, 'es_ES', 'Bloque de navegación', NULL, NULL, NULL), + (@max_id+2, 'es_ES', 'Bloque de monedas', NULL, NULL, NULL), + (@max_id+3, 'es_ES', 'Bloque de idiomas', NULL, NULL, NULL), + (@max_id+4, 'es_ES', 'Bloque de búsqueda', NULL, NULL, NULL), + (@max_id+5, 'es_ES', 'Bloque de cuenta de cliente', NULL, NULL, NULL), + (@max_id+6, 'es_ES', 'Bloque de carrito', NULL, NULL, NULL), + (@max_id+7, 'es_ES', 'Bloque Google Analytics', NULL, NULL, NULL), + (@max_id+8, 'es_ES', 'Bloque de contacto', NULL, NULL, NULL), + (@max_id+9, 'es_ES', 'Bloque de enlaces', NULL, NULL, NULL), + (@max_id+10, 'es_ES', 'Bloque del boletín de noticias', NULL, NULL, NULL), + (@max_id+11, 'es_ES', 'Bloque de Redes Sociales', NULL, NULL, NULL), + (@max_id+12, 'es_ES', 'Bloque de nuevos productos', NULL, NULL, NULL), + (@max_id+13, 'es_ES', 'Bloque de oferta de productos', NULL, NULL, NULL), + (@max_id+1, 'fr_FR', 'Bloc menu', NULL, NULL, NULL), + (@max_id+2, 'fr_FR', 'Bloc des devises', NULL, NULL, NULL), + (@max_id+3, 'fr_FR', 'Bloc des langues', NULL, NULL, NULL), + (@max_id+4, 'fr_FR', 'Bloc de recherche', NULL, NULL, NULL), + (@max_id+5, 'fr_FR', 'Bloc compte client', NULL, NULL, NULL), + (@max_id+6, 'fr_FR', 'Bloc panier', NULL, NULL, NULL), + (@max_id+7, 'fr_FR', 'Bloc Google Analytics', NULL, NULL, NULL), + (@max_id+8, 'fr_FR', 'Bloc contact', NULL, NULL, NULL), + (@max_id+9, 'fr_FR', 'Bloc liens', NULL, NULL, NULL), + (@max_id+10, 'fr_FR', 'Bloc newsletter', NULL, NULL, NULL), + (@max_id+11, 'fr_FR', 'Bloc réseaux sociaux', NULL, NULL, NULL), + (@max_id+12, 'fr_FR', 'Bloc nouveaux produits', NULL, NULL, NULL), + (@max_id+13, 'fr_FR', 'Bloc promotions', NULL, NULL, NULL) +; + + + +-- --------------------------------------------------------------------- +-- hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `hook`; + +CREATE TABLE `hook` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL, + `type` TINYINT, + `by_module` TINYINT(1), + `native` TINYINT(1), + `activate` TINYINT(1), + `block` TINYINT(1), + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`, `type`), + INDEX `idx_module_activate` (`activate`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_hook`; + +CREATE TABLE `module_hook` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `hook_id` INTEGER NOT NULL, + `classname` VARCHAR(255), + `method` VARCHAR(255), + `active` TINYINT(1) NOT NULL, + `hook_active` TINYINT(1) NOT NULL, + `module_active` TINYINT(1) NOT NULL, + `position` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_module_hook_active` (`active`), + INDEX `fk_module_hook_module_id_idx` (`module_id`), + INDEX `fk_module_hook_hook_id_idx` (`hook_id`), + CONSTRAINT `fk_module_hook_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_module_hook_hook_id` + FOREIGN KEY (`hook_id`) + REFERENCES `hook` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +-- --------------------------------------------------------------------- +-- hook_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `hook_i18n`; + +CREATE TABLE `hook_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `hook_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `hook` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (1, 'order-invoice.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (2, 'order-invoice.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (3, 'order-invoice.payment-extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (4, 'order-invoice.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (5, 'order-invoice.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (6, 'order-invoice.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (7, 'order-invoice.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (8, 'order-payment-gateway.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (9, 'order-payment-gateway.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (10, 'order-payment-gateway.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (11, 'order-payment-gateway.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (12, 'order-payment-gateway.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (13, 'sitemap.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (14, 'currency.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (15, 'currency.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (16, 'currency.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (17, 'currency.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (18, 'currency.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (19, 'login.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (20, 'login.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (21, 'login.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (22, 'login.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (23, 'login.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (24, 'login.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (25, 'login.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (26, 'login.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (27, 'login.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (28, 'account-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (29, 'account-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (30, 'account-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (31, 'account-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (32, 'account-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (33, 'account-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (34, 'account-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (35, 'cart.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (36, 'cart.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (37, 'cart.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (38, 'cart.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (39, 'cart.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (40, 'contact.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (41, 'contact.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (42, 'contact.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (43, 'contact.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (44, 'contact.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (45, 'contact.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (46, 'contact.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (47, 'order-placed.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (48, 'order-placed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (49, 'order-placed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (50, 'order-placed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (51, 'search.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (52, 'search.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (53, 'search.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (54, 'register.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (55, 'register.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (56, 'register.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (57, 'register.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (58, 'register.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (59, 'register.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (60, 'register.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (61, 'password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (62, 'password.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (63, 'password.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (64, 'password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (65, 'password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (66, 'password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (67, 'password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (68, 'language.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (69, 'language.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (70, 'language.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (71, 'language.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (72, 'language.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (73, 'contact.success', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (74, 'newsletter.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (75, 'newsletter.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (76, 'newsletter.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (77, 'newsletter.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (78, 'newsletter.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (79, 'badresponseorder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (80, 'badresponseorder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (81, 'badresponseorder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (82, 'content.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (83, 'content.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (84, 'content.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (85, 'content.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (86, 'content.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (87, 'content.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (88, 'content.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (89, 'main.head-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (90, 'main.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (91, 'main.head-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (92, 'main.body-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (93, 'main.header-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (94, 'main.navbar-secondary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (95, 'main.navbar-primary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (96, 'main.header-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (97, 'main.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (98, 'main.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (99, 'main.footer-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (100, 'main.footer-body', 1, 0, 1, 1, 1, 1, NOW(), NOW()), + (101, 'main.footer-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (102, 'main.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (103, 'main.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (104, 'main.body-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (105, '404.content', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (106, '404.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (107, '404.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (108, '404.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (109, 'order-delivery.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (110, 'order-delivery.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (111, 'order-delivery.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (112, 'order-delivery.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (113, 'order-delivery.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (114, 'order-delivery.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (115, 'order-delivery.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (116, 'address-create.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (117, 'address-create.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (118, 'address-create.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (119, 'address-create.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (120, 'address-create.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (121, 'address-create.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (122, 'address-create.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (123, 'folder.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (124, 'folder.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (125, 'folder.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (126, 'folder.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (127, 'folder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (128, 'folder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (129, 'folder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (130, 'order-failed.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (131, 'order-failed.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (132, 'order-failed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (133, 'order-failed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (134, 'order-failed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (135, 'category.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (136, 'category.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (137, 'category.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (138, 'category.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (139, 'category.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (140, 'category.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (141, 'category.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (142, 'address-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (143, 'address-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (144, 'address-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (145, 'address-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (146, 'address-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (147, 'address-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (148, 'address-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (149, 'home.body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (150, 'home.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (151, 'home.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (152, 'home.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (153, 'account-password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (154, 'account-password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (155, 'account-password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (156, 'account-password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (157, 'account-password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (158, 'product.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (159, 'product.gallery', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (160, 'product.details-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (161, 'product.details-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (162, 'product.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), + (163, 'product.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (164, 'product.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (165, 'product.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (166, 'product.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (167, 'account.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (168, 'account.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (169, 'account.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (170, 'account.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (171, 'account.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (172, 'viewall.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (173, 'viewall.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (174, 'viewall.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (175, 'viewall.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (176, 'viewall.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (177, 'singleproduct.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (178, 'singleproduct.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (179, 'category.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (180, 'category.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (181, 'category.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (182, 'content.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (183, 'content.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (184, 'content.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (185, 'order-delivery.extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (186, 'order-delivery.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + + (1000, 'category.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1001, 'content.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1002, 'folder.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1003, 'order.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1004, 'product.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1005, 'features-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1006, 'features-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1007, 'feature.value-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1008, 'feature.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1009, 'product.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1010, 'coupon.create-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1011, 'taxes.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1012, 'tax-rule.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1013, 'tools.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1014, 'tools.col1-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1015, 'tools.col1-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1016, 'tools.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1017, 'tools.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1018, 'messages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1019, 'messages.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1020, 'messages.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1021, 'messages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1022, 'message.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1023, 'message.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1024, 'messages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1025, 'taxes-rules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1026, 'taxes-rules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1027, 'tax.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1028, 'tax.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1029, 'tax-rule.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1030, 'tax-rule.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1031, 'taxes-rules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1032, 'exports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1033, 'exports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1034, 'exports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1035, 'exports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1036, 'export.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1037, 'product.folders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1038, 'product.folders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1039, 'product.details-pricing-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1040, 'product.details-details-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1041, 'product.details-promotion-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1042, 'product.before-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1043, 'product.combinations-list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1044, 'product.after-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1045, 'product.combination-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1046, 'modules.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1047, 'modules.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1048, 'currency.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1049, 'category.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1050, 'category.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1051, 'category.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1052, 'document.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1053, 'customer.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1054, 'customers.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1055, 'customers.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1056, 'customers.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1057, 'customer.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1058, 'customer.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1059, 'customer.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1060, 'customers.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1061, 'product.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1062, 'product.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1063, 'product.accessories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1064, 'product.accessories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1065, 'product.categories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1066, 'product.categories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1067, 'product.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1068, 'product.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1069, 'product.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1070, 'product.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1071, 'template.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1072, 'template.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1073, 'template.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1074, 'template.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1075, 'templates.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1076, 'templates.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1077, 'templates.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1078, 'templates.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1079, 'template.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1080, 'template.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1081, 'templates.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1082, 'configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1083, 'configuration.catalog-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1084, 'configuration.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1085, 'configuration.shipping-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1086, 'configuration.shipping-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1087, 'configuration.system-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1088, 'configuration.system-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1089, 'configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1090, 'configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1091, 'index.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1092, 'index.middle', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1093, 'index.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1094, 'orders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1095, 'orders.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1096, 'orders.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1097, 'orders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1098, 'orders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1099, 'shipping-zones.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1100, 'shipping-zones.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1101, 'shipping-zones.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1102, 'shipping-zones.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1103, 'shipping-zones.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1104, 'content.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1105, 'home.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1106, 'home.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1107, 'home.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1108, 'modules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1109, 'modules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1110, 'modules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1111, 'languages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1112, 'languages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1113, 'language.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1114, 'languages.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1115, 'languages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1116, 'zone.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1117, 'shipping-zones.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1118, 'system.logs-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1119, 'search.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1120, 'search.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1121, 'search.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1122, 'administrators.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1123, 'administrators.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1124, 'administrator.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1125, 'administrator.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1126, 'administrator.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1127, 'administrators.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1128, 'module-hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1129, 'shipping-configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1130, 'shipping-configuration.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1131, 'shipping-configuration.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1132, 'shipping-configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1133, 'shipping-configuration.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1134, 'shipping-configuration.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1135, 'shipping-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1136, 'features.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1137, 'features.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1138, 'features.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1139, 'features.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1140, 'feature.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1141, 'feature.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1142, 'feature.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1143, 'feature.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1144, 'features.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1145, 'module.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1146, 'module-hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1147, 'module-hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1148, 'module-hook.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1149, 'shipping-configuration.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1150, 'shipping-configuration.country-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1151, 'shipping-configuration.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1152, 'mailing-system.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1153, 'mailing-system.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1154, 'mailing-system.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1155, 'categories.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1156, 'categories.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1157, 'categories.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1158, 'categories.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1159, 'products.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1160, 'products.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1161, 'products.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1162, 'categories.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1163, 'categories.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1164, 'category.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1165, 'product.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1166, 'category.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1167, 'product.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1168, 'categories.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1169, 'variables.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1170, 'variables.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1171, 'variables.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1172, 'variables.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1173, 'variable.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1174, 'variable.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1175, 'variables.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1176, 'order.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1177, 'order.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1178, 'config-store.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1179, 'translations.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1180, 'folders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1181, 'folders.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1182, 'folders.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1183, 'folders.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1184, 'contents.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1185, 'contents.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1186, 'contents.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1187, 'folders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1188, 'folder.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1189, 'content.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1190, 'folder.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1191, 'content.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1192, 'folders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1193, 'template.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1194, 'tax.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1195, 'hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1196, 'countries.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1197, 'countries.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1198, 'countries.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1199, 'countries.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1200, 'country.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1201, 'country.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1202, 'countries.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1203, 'currencies.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1204, 'currencies.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1205, 'currencies.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1206, 'currencies.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1207, 'currency.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1208, 'currency.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1209, 'currencies.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1210, 'customer.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1211, 'customer.address-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1212, 'customer.address-update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1213, 'customer.address-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1214, 'customer.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1215, 'attributes-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1216, 'attributes-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1217, 'attribute-value.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1218, 'attribute.id-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1219, 'attribute.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1220, 'profiles.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1221, 'profiles.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1222, 'profile.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1223, 'profile.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1224, 'profiles.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1225, 'country.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1226, 'profile.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1227, 'variable.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1228, 'coupon.update-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1229, 'coupon.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1230, 'coupon.list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1231, 'coupon.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1232, 'coupon.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1233, 'coupon.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1234, 'coupon.list-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1235, 'module.configuration', 2, 1, 0, 1, 1, 1, NOW(), NOW()), + (1236, 'module.config-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1237, 'message.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1238, 'image.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1239, 'attributes.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1240, 'attributes.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1241, 'attributes.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1242, 'attributes.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1243, 'attribute.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1244, 'attribute.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1245, 'attribute.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1246, 'attribute.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1247, 'attributes.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1248, 'admin-logs.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1249, 'admin-logs.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1250, 'admin-logs.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1251, 'folder.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1252, 'hooks.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1253, 'hooks.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1254, 'hooks.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1255, 'hooks.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1256, 'hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1257, 'hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1258, 'hooks.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1259, 'main.head-css', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1260, 'main.before-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1261, 'main.inside-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1262, 'main.after-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1263, 'main.before-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1264, 'main.in-top-menu-items', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1265, 'main.after-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1266, 'main.before-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1267, 'main.in-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1268, 'main.after-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1269, 'main.footer-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1270, 'main.topbar-top', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1271, 'main.topbar-bottom', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1272, 'main.top-menu-customer', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1273, 'main.top-menu-order', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1274, 'main.top-menu-catalog', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1275, 'main.top-menu-content', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1276, 'main.top-menu-tools', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1277, 'main.top-menu-modules', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1278, 'main.top-menu-configuration', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1279, 'brand.edit-js', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1280, 'home.block', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1281, 'brands.top', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1282, 'brands.table-header', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1283, 'brands.table-row', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1284, 'brands.bottom', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1285, 'brand.create-form', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1286, 'brand.delete-form', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1287, 'brand.js', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1288, 'imports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1289, 'imports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1290, 'imports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1291, 'imports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1292, 'import.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1293, 'brand.tab-content', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1294, 'customer.orders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1295, 'customer.orders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + + (2001, 'invoice.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2002, 'invoice.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2003, 'invoice.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2004, 'invoice.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2005, 'invoice.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2006, 'invoice.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), + (2007, 'invoice.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2008, 'invoice.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), + (2009, 'invoice.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2010, 'invoice.after-products', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2011, 'invoice.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + + (2012, 'delivery.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2013, 'delivery.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2014, 'delivery.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2015, 'delivery.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2016, 'delivery.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2017, 'delivery.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), + (2018, 'delivery.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2019, 'delivery.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), + (2020, 'delivery.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2021, 'delivery.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + + (2022, 'order-placed.additional-payment-info', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + + (2023, 'wysiwyg.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES + (1, 'de_DE', 'Bezahlungsmethode - oben', '', ''), + (2, 'de_DE', 'Bezahlungsmethode - Lieferadresse', '', ''), + (3, 'de_DE', 'Bezahlungsmethode - extra payment zone', '', ''), + (4, 'de_DE', 'Bezahlungsmethode - unten', '', ''), + (5, 'de_DE', 'Bezahlungsmethode - nach der Initialisierung von Javascript', '', ''), + (6, 'de_DE', 'Bezahlungsmethode - CSS-Stylesheet', '', ''), + (7, 'de_DE', 'Bezahlungsmethode - Nach Integration von JavaScript', '', ''), + (8, 'de_DE', 'Zahlung-Gateway - Hauptbereich', '', ''), + (9, 'de_DE', 'Zahlung-Gateway - Javascript', '', ''), + (10, 'de_DE', 'Zahlung-Gateway - nach der Initialisierung von Javascript', '', ''), + (11, 'de_DE', 'Zahlung-Gateway - CSS-Stylesheet', '', ''), + (12, 'de_DE', 'Zahlung-Gateway - Nach Integration von JavaScript', '', ''), + (13, 'de_DE', 'Sitemap - unten', '', ''), + (14, 'de_DE', 'Währungswahl-Seite - oben', '', ''), + (15, 'de_DE', 'Währungswahl-Seite - unten', '', ''), + (16, 'de_DE', 'Währungswahl-Seite - CSS-Stylesheet', '', ''), + (17, 'de_DE', 'Währungswahl-Seite - Nach Integration von JavaScript', '', ''), + (18, 'de_DE', 'Währungswahl-Seite - nach der Initialisierung von Javascript', '', ''), + (19, 'de_DE', 'Anmeldeseite - oben', '', ''), + (20, 'de_DE', 'Anmeldeseite - oben an dem Hauptbereich', '', ''), + (21, 'de_DE', 'Anmeldeseite - oben im Formular', '', ''), + (22, 'de_DE', 'Anmeldeseite - unten an dem Formular', '', ''), + (23, 'de_DE', 'Anmeldeseite - unten an dem Hauptbereich', '', ''), + (24, 'de_DE', 'Anmeldeseite - unten', '', ''), + (25, 'de_DE', 'Anmeldeseite - CSS-Stylesheet', '', ''), + (26, 'de_DE', 'Anmeldeseite - Nach Integration von JavaScript', '', ''), + (27, 'de_DE', 'Anmeldeseite - nach der Initialisierung von Javascript', '', ''), + (28, 'de_DE', 'Kundenkonto Änderung - oben', '', ''), + (29, 'de_DE', 'Kundenkonto Änderung - oben im Formular', '', ''), + (30, 'de_DE', 'Kundenkonto Änderung - unten an dem Formular', '', ''), + (31, 'de_DE', 'Kundenkonto Änderung - unten', '', ''), + (32, 'de_DE', 'Kundenkonto Änderung - CSS-Stylesheet', '', ''), + (33, 'de_DE', 'Kundenkonto Änderung - Nach Integration von JavaScript', '', ''), + (34, 'de_DE', 'Kundenkonto Änderung - nach der Initialisierung von Javascript', '', ''), + (35, 'de_DE', 'Warenkorb - oben ', '', ''), + (36, 'de_DE', 'Warenkorb - unten', '', ''), + (37, 'de_DE', 'Warenkorb - Nach Integration von JavaScript', '', ''), + (38, 'de_DE', 'Warenkorb - CSS-Stylesheet', '', ''), + (39, 'de_DE', 'Warenkorb - Initialisierung von Javascript', '', ''), + (40, 'de_DE', 'Kontaktseite - oben', '', ''), + (41, 'de_DE', 'Kontaktseite - oben an dem Formular', '', ''), + (42, 'de_DE', 'Kontaktseite - unten an dem Formular', '', ''), + (43, 'de_DE', 'Kontaktseite - unten', '', ''), + (44, 'de_DE', 'Kontaktseite - CSS-Stylesheet', '', ''), + (45, 'de_DE', 'Kontaktseite - Nach Integration von JavaScript', '', ''), + (46, 'de_DE', 'Kontaktseite - nach der Initialisierung von Javascript', '', ''), + (47, 'de_DE', 'Erteilten Auftrag - Hauptbereich', '', ''), + (48, 'de_DE', 'Erteilten Auftrag - CSS-Stylesheet', '', ''), + (49, 'de_DE', 'Erteilten Auftrag - nach Integration von JavaScript', '', ''), + (50, 'de_DE', 'Erteilten Auftrag - nach der Initialisierung von Javascript', '', ''), + (51, 'de_DE', 'Suche-Seite - CSS-Stylesheet', '', ''), + (52, 'de_DE', 'Suche-Seite - Nach Integration von JavaScript', '', ''), + (53, 'de_DE', 'Suche-Seite - nach der Initialisierung von Javascript', '', ''), + (54, 'de_DE', 'Konto-Erstellung - oben', '', ''), + (55, 'de_DE', 'Konto-Erstellung - oben im Formular', '', ''), + (56, 'de_DE', 'Konto-Erstellung - unten an dem Formular', '', ''), + (57, 'de_DE', 'Konto-Erstellung - unten', '', ''), + (58, 'de_DE', 'Konto-Erstellung - CSS-Stylesheet', '', ''), + (59, 'de_DE', 'Konto-Erstellung - Nach Integration von JavaScript', '', ''), + (60, 'de_DE', 'Konto-Erstellung - nach der Initialisierung von Javascript', '', ''), + (61, 'de_DE', 'Passwort verloren - oben', '', ''), + (62, 'de_DE', 'Passwort verloren - oben im Formular', '', ''), + (63, 'de_DE', 'Passwort verloren - unten an dem Formular', '', ''), + (64, 'de_DE', 'Passwort verloren - unten', '', ''), + (65, 'de_DE', 'Passwort verloren - CSS-Stylesheet', '', ''), + (66, 'de_DE', 'Passwort verloren - Nach Integration von JavaScript', '', ''), + (67, 'de_DE', 'Passwort verloren - Initialisierung von Javascript', '', ''), + (68, 'de_DE', 'Sprachwahl Seite - oben', '', ''), + (69, 'de_DE', 'Sprachwahl Seite - unten', '', ''), + (70, 'de_DE', 'Sprachwahl Seite - CSS-Stylesheet', '', ''), + (71, 'de_DE', 'Sprachwahl Seite - Nach Integration von JavaScript', '', ''), + (72, 'de_DE', 'Sprachwahl Seite - nach der Initialisierung von Javascript', '', ''), + (73, 'de_DE', 'Kontaktseite - wenn erfolgreich', '', ''), + (74, 'de_DE', 'Newletter-Seite - oben', '', ''), + (75, 'de_DE', 'Newletter-Seite - unten', '', ''), + (76, 'de_DE', 'Newletter-Seite - CSS-Stylesheet', '', ''), + (77, 'de_DE', 'Newletter-Seite - Nach Integration von JavaScript', '', ''), + (78, 'de_DE', 'Newletter-Seite - nach der Initialisierung von Javascript', '', ''), + (79, 'de_DE', 'Bezahlungs-Fehlschlagen - CSS-Stylesheet', '', ''), + (80, 'de_DE', 'Bezahlungs-Fehlschlagen - Nach Integration von JavaScript', '', ''), + (81, 'de_DE', 'Bezahlungs-Fehlschlagen - Initialisierung von Javascript', '', ''), + (82, 'de_DE', 'Inhaltseite - oben', '', ''), + (83, 'de_DE', 'Inhaltseite - oben an dem Hauptbereich', '', ''), + (84, 'de_DE', 'Inhaltseite - unten an dem Hauptbereich', '', ''), + (85, 'de_DE', 'Inhaltseite - unten', '', ''), + (86, 'de_DE', 'Inhaltseite - CSS-Stylesheet', '', ''), + (87, 'de_DE', 'Inhaltseite - Nach Integration von JavaScript', '', ''), + (88, 'de_DE', 'Inhaltseite - nach der Initialisierung von Javascript', '', ''), + (89, 'de_DE', 'HTML Struktur - nach der Eröffnung des Head-Tag', '', ''), + (90, 'de_DE', 'HTML Struktur - CSS-Stylesheet', '', ''), + (91, 'de_DE', 'HTML Struktur - vor dem Ende des Head-Tag', '', ''), + (92, 'de_DE', 'HTML Struktur - nach der Eröffnung des Body-Tag', '', ''), + (93, 'de_DE', 'HTML Struktur - oben an dem Header', '', ''), + (94, 'de_DE', 'HTML Struktur - Sekundärenavigation', '', ''), + (95, 'de_DE', 'HTML Struktur - Hauptnavigation', '', ''), + (96, 'de_DE', 'HTML Struktur - unten an dem Header', '', ''), + (97, 'de_DE', 'HTML Struktur - vor dem Hauptinhaltsbereich', '', ''), + (98, 'de_DE', 'HTML Struktur - nach dem Hauptinhaltsbereich', '', ''), + (99, 'de_DE', 'HTML Struktur - oben an dem Footer', '', ''), + (100, 'de_DE', 'HTML Struktur - Footer Body', '', ''), + (101, 'de_DE', 'HTML Struktur - unten an dem Footer', '', ''), + (102, 'de_DE', 'HTML Struktur - Nach Integration von JavaScript', '', ''), + (103, 'de_DE', 'HTML Struktur - Initialisierung von Javascript', '', ''), + (104, 'de_DE', 'HTML Struktur - vor dem Ende des Body-Tag', '', ''), + (105, 'de_DE', 'Seite nicht gefunden - Inhalts-Bereich', '', ''), + (106, 'de_DE', 'Seite nicht gefunden - CSS-Stylesheet', '', ''), + (107, 'de_DE', 'Seite nicht gefunden - Nach Integration von JavaScript', '', ''), + (108, 'de_DE', 'Seite nicht gefunden - nach der Initialisierung von Javascript', '', ''), + (109, 'de_DE', 'Lieferwahl - oben', '', ''), + (110, 'de_DE', 'Lieferwahl - oben an dem Formular', '', ''), + (111, 'de_DE', 'Lieferwahl - unten an dem Formular', '', ''), + (112, 'de_DE', 'Lieferwahl - unten', '', ''), + (113, 'de_DE', 'Lieferwahl - nach der Initialisierung von Javascript', '', ''), + (114, 'de_DE', 'Lieferwahl - CSS-Stylesheet', '', ''), + (115, 'de_DE', 'Lieferwahl - Nach Integration von JavaScript', '', ''), + (116, 'de_DE', 'Adresse Erstellung - oben', '', ''), + (117, 'de_DE', 'Adresse Erstellung - oben im Formular', '', ''), + (118, 'de_DE', 'Adresse Erstellung - unten im Formular', '', ''), + (119, 'de_DE', 'Adresse Erstellung - unten', '', ''), + (120, 'de_DE', 'Adresse Erstellung - CSS-Stylesheet', '', ''), + (121, 'de_DE', 'Adresse Erstellung - nach der Integration von Javascript', '', ''), + (122, 'de_DE', 'Adresse Erstellung - nach der Initialisierung von Javascript', '', ''), + (123, 'de_DE', 'Ordnerseite - oben', '', ''), + (124, 'de_DE', 'Ordnerseite - oben an dem Hauptbereich', '', ''), + (125, 'de_DE', 'Ordnerseite - unten an dem Hauptbereich', '', ''), + (126, 'de_DE', 'Ordnerseite - unten', '', ''), + (127, 'de_DE', 'Ordnerseite - CSS-Stylesheet', '', ''), + (128, 'de_DE', 'Ordnerseite - Nach Integration von JavaScript', '', ''), + (129, 'de_DE', 'Ordnerseite - nach der Initialisierung von Javascript', '', ''), + (130, 'de_DE', 'Fehlschlag der Bestellung - oben', '', ''), + (131, 'de_DE', 'Fehlschlag der Bestellung - unten', '', ''), + (132, 'de_DE', 'Fehlschlag der Bestellung - CSS-Stylesheet', '', ''), + (133, 'de_DE', 'Fehlschlag der Bestellung - Nach Integration von JavaScript', '', ''), + (134, 'de_DE', 'Fehlschlag der Bestellung - nach der Initialisierung von Javascript', '', ''), + (135, 'de_DE', 'Kategorieseite - oben', '', ''), + (136, 'de_DE', 'Kategorieseite - oben an dem Hauptbereich', '', ''), + (137, 'de_DE', 'Kategorieseite - unten an dem Hauptbereich', '', ''), + (138, 'de_DE', 'Kategorieseite - unten', '', ''), + (139, 'de_DE', 'Kategorieseite - CSS-Stylesheet', '', ''), + (140, 'de_DE', 'Kategorieseite - Nach Integration von JavaScript', '', ''), + (141, 'de_DE', 'Kategorieseite - nach der Initialisierung von Javascript', '', ''), + (142, 'de_DE', 'Adresseänderung - oben', '', ''), + (143, 'de_DE', 'Adressänderung - oben im Formular', '', ''), + (144, 'de_DE', 'Adresseänderung - unten im Formular', '', ''), + (145, 'de_DE', 'Adresseänderung - unten', '', ''), + (146, 'de_DE', 'Adresseänderung - CSS-Stylesheet', '', ''), + (147, 'de_DE', 'Adresseänderung - nach der Integration von Javascript', '', ''), + (148, 'de_DE', 'Adresseänderung - nach der Initialisierung von Javascript', '', ''), + (149, 'de_DE', 'Startseite - Hauptbereich', '', ''), + (150, 'de_DE', 'Startseite - CSS-Stylesheet', '', ''), + (151, 'de_DE', 'Startseite - Nach Integration von JavaScript', '', ''), + (152, 'de_DE', 'Startseite - nach der Initialisierung von Javascript', '', ''), + (153, 'de_DE', 'Passwort Änderung - oben', '', ''), + (154, 'de_DE', 'Passwort Änderung - unten', '', ''), + (155, 'de_DE', 'Passwort Änderung - CSS-Stylesheet', '', ''), + (156, 'de_DE', 'Passwort Änderung - Nach Integration von JavaScript', '', ''), + (157, 'de_DE', 'Passwort Änderung - nach der Initialisierung von Javascript', '', ''), + (158, 'de_DE', 'Produktseite - oben', '', ''), + (159, 'de_DE', 'Produktseite - Bilder-Gallerie', '', ''), + (160, 'de_DE', 'Produktseite - oben dem Details-Bereich', '', ''), + (161, 'de_DE', 'Produktseite - unten dem Details-Bereich', '', ''), + (162, 'de_DE', 'Produktseite - erweitere Informationen', '', ''), + (163, 'de_DE', 'Produktseite - unten', '', ''), + (164, 'de_DE', 'Produktseite - CSS-Stylesheet', '', ''), + (165, 'de_DE', 'Produktseite - Nach Integration von JavaScript', '', ''), + (166, 'de_DE', 'Produktseite - nach der Initialisierung von Javascript', '', ''), + (167, 'de_DE', 'Kundenkonto - oben', '', ''), + (168, 'de_DE', 'Kundenkonto - unten', '', ''), + (169, 'de_DE', 'Kundenkonto - CSS-Stylesheet', '', ''), + (170, 'de_DE', 'Kundenkonto - Nach Integration von JavaScript', '', ''), + (171, 'de_DE', 'Kundenkonto - nach der Initialisierung von Javascript', '', ''), + (172, 'de_DE', 'Alle Produkte - oben', '', ''), + (173, 'de_DE', 'Alle Produkte - unten', '', ''), + (174, 'de_DE', 'Alle Produkte - CSS-Stylesheet', '', ''), + (175, 'de_DE', 'Alle Produkte - nach der Integration von Javascript', '', ''), + (176, 'de_DE', 'Alle Produkte - nach der Initialisierung von Javascript', '', ''), + (177, 'de_DE', 'Produkt-Loop - oben', '', ''), + (178, 'de_DE', 'Produkt-Loop - unten', '', ''), + (179, 'de_DE', 'Kategorieseite - oben an der Sidebar', '', ''), + (180, 'de_DE', 'Kategorieseite - Sidebars Body', '', ''), + (181, 'de_DE', 'Kategorieseite - unten an der Sidebar', '', ''), + (182, 'de_DE', 'Inhaltseite - oben an der Sidebar', '', ''), + (183, 'de_DE', 'Inhaltseite - Sidebars Body', '', ''), + (184, 'de_DE', 'Inhaltseite - unten an der Sidebar', '', ''), + (185, 'de_DE', 'Lieferwahl - Erweiteren Bereich', '', ''), + (186, 'de_DE', 'Lieferwahl - Javascript', '', ''), + (1000, 'de_DE', 'Kategorie - Inhalt', '', ''), + (1001, 'de_DE', 'Inhalt - Inhalt', '', ''), + (1002, 'de_DE', 'Ordner - Inhalt', '', ''), + (1003, 'de_DE', 'Bestellung - Inhalt', '', ''), + (1004, 'de_DE', 'Produkt - Inhalt', '', ''), + (1005, 'de_DE', 'Karakteristiken-Angaben - Tabellenkopf', '', ''), + (1006, 'de_DE', 'Karakteristiken-Angaben - Tabellenzeile', '', ''), + (1007, 'de_DE', 'Karakteristik - Angabe-Erstellungsformular', '', ''), + (1008, 'de_DE', 'Karakteristik - JavaScript Änderung', '', ''), + (1009, 'de_DE', 'Produkt - JavaScript Änderung', '', ''), + (1010, 'de_DE', 'Gutschein - JavaScript erstellen', '', ''), + (1011, 'de_DE', 'Taxes - Änderungs-Formular', '', ''), + (1012, 'de_DE', 'Taxregel - JavaScript Änderung', '', ''), + (1013, 'de_DE', 'Tools - oben', '', ''), + (1014, 'de_DE', 'Tools - oben der Spalte', '', ''), + (1015, 'de_DE', 'Tools - unten der Spalte 1', '', ''), + (1016, 'de_DE', 'Tools - unten', '', ''), + (1017, 'de_DE', 'Tools - JavaScript', '', ''), + (1018, 'de_DE', 'Nachrichten - oben', '', ''), + (1019, 'de_DE', 'Nachrichten - Tabellenkopf', '', ''), + (1020, 'de_DE', 'Nachrichten - Tabellenzeile', '', ''), + (1021, 'de_DE', 'Nachrichten - unten', '', ''), + (1022, 'de_DE', 'Nachricht - Erstellungsformular', '', ''), + (1023, 'de_DE', 'Nachricht - Löschungsformular', '', ''), + (1024, 'de_DE', 'Nachrichten - JavaScript', '', ''), + (1025, 'de_DE', 'Taxeregeln - oben', '', ''), + (1026, 'de_DE', 'Taxeregeln - unten', '', ''), + (1027, 'de_DE', 'Taxe - Erstellungsformular', '', ''), + (1028, 'de_DE', 'Taxe - Löschungsformular', '', ''), + (1029, 'de_DE', 'Taxregel - Erstellungsformular', '', ''), + (1030, 'de_DE', 'Taxregel - Löschungsformular', '', ''), + (1031, 'de_DE', 'Taxeregeln - JavaScript', '', ''), + (1032, 'de_DE', 'Exporte - oben', '', ''), + (1033, 'de_DE', 'Exporte - unten einer Kategorie', '', ''), + (1034, 'de_DE', 'Exporte - unten der Spalte 1', '', ''), + (1035, 'de_DE', 'Exporte - JavaScript', '', ''), + (1036, 'de_DE', 'Export - JavaScript', '', ''), + (1037, 'de_DE', 'Produkt - Ordner Tabellenkopf', '', ''), + (1038, 'de_DE', 'Produkt - Ordner Tabellenzeile', '', ''), + (1039, 'de_DE', 'Produkt - Preisedetails Formular', '', ''), + (1040, 'de_DE', 'Produkt - Bestandänderung Formular', '', ''), + (1041, 'de_DE', 'Produkt - Sonderangebotdetails Formular', '', ''), + (1042, 'de_DE', 'Produkt - vor den Kombinationen', '', ''), + (1043, 'de_DE', 'Produkt - Kombinationsliste-Bildunterschrift', '', ''), + (1044, 'de_DE', 'Produkt - nach den Kombinationen', '', ''), + (1045, 'de_DE', 'Produkt - Kombinations-Löschungsformular', '', ''), + (1046, 'de_DE', 'Modulen - Tabellenkopf', '', ''), + (1047, 'de_DE', 'Modulen - Tabellenzeile', '', ''), + (1048, 'de_DE', 'Währung - JavaScript Änderung', '', ''), + (1049, 'de_DE', 'Kategorie - Inhalts Tabellenkopf', '', ''), + (1050, 'de_DE', 'Kategorie - Inhalts Tabellenzeile', '', ''), + (1051, 'de_DE', 'Kategorie - JavaScript Änderung', '', ''), + (1052, 'de_DE', 'Dokument - JavaScript Änderung', '', ''), + (1053, 'de_DE', 'Kunde - oben', '', ''), + (1054, 'de_DE', 'Kunden - Bildunterschrift', '', ''), + (1055, 'de_DE', 'Kunden - Tabellenkopf', '', ''), + (1056, 'de_DE', 'Kunden - Zeile', '', ''), + (1057, 'de_DE', 'Kunde - unten', '', ''), + (1058, 'de_DE', 'Kunde - Erstellungsformular', '', ''), + (1059, 'de_DE', 'Kunde - Löschungsformular', '', ''), + (1060, 'de_DE', 'Kunden - JavaScript', '', ''), + (1061, 'de_DE', 'Produkt - Inhalte Tabellenkopf', '', ''), + (1062, 'de_DE', 'Produkt - Inhalte Tabellenzeile', '', ''), + (1063, 'de_DE', 'Produkt - Zubehör Tabellenkopf', '', ''), + (1064, 'de_DE', 'Produkt - Zubehör Tabellenzeile', '', ''), + (1065, 'de_DE', 'Produkt - Kategorien Tabellenkopf', '', ''), + (1066, 'de_DE', 'Produkt - Kategorien Tabellenzeile', '', ''), + (1067, 'de_DE', 'Produkt - Deklination Tabellenkopf', '', ''), + (1068, 'de_DE', 'Produkt - Deklination Tabellenzeile', '', ''), + (1069, 'de_DE', 'Produkt - Charakteristiken Tabellenkopf', '', ''), + (1070, 'de_DE', 'Produkt - Charakteristiken Tabellenzeile', '', ''), + (1071, 'de_DE', 'Template - Tabellenkopf attributs', '', ''), + (1072, 'de_DE', 'Template - Tabellenzeile attributs', '', ''), + (1073, 'de_DE', 'Template - Charakteristiken Tabellenkopf', '', ''), + (1074, 'de_DE', 'Template - Charakteristiken Tabellenzeile', '', ''), + (1075, 'de_DE', 'Templates - oben', '', ''), + (1076, 'de_DE', 'Templates - Tabellenkopf', '', ''), + (1077, 'de_DE', 'Templates - Tabellenzeile', '', ''), + (1078, 'de_DE', 'Templates - unten', '', ''), + (1079, 'de_DE', 'Template - Erstellungsformular', '', ''), + (1080, 'de_DE', 'Template - Löschungsformular', '', ''), + (1081, 'de_DE', 'Templates - JavaScript', '', ''), + (1082, 'de_DE', 'Konfiguration - oben', '', ''), + (1083, 'de_DE', 'Konfiguration - oben an dem Katalogsbereich', '', ''), + (1084, 'de_DE', 'Konfiguration - unten an dem katalog', '', ''), + (1085, 'de_DE', 'Konfiguration - oben an der Lieferzone', '', ''), + (1086, 'de_DE', 'Konfiguration - unten an der Lieferzone', '', ''), + (1087, 'de_DE', 'Konfiguration - oben an dem Systembereich', '', ''), + (1088, 'de_DE', 'Konfiguration - unten an dem Systembereich', '', ''), + (1089, 'de_DE', 'Konfiguration - unten', '', ''), + (1090, 'de_DE', 'Konfiguration - JavaScript', '', ''), + (1091, 'de_DE', 'Dashboard - oben', '', ''), + (1092, 'de_DE', 'Dashboard - in der Mitte', '', ''), + (1093, 'de_DE', 'Dashboard - unten', '', ''), + (1094, 'de_DE', 'Bestellungen - oben', '', ''), + (1095, 'de_DE', 'Bestellungen - Tabellenkopf', '', ''), + (1096, 'de_DE', 'Bestellungen - Tabellenzeile', '', ''), + (1097, 'de_DE', 'Bestellungen - unten', '', ''), + (1098, 'de_DE', 'Bestellungen - JavaScript', '', ''), + (1099, 'de_DE', 'Lieferzone - oben', '', ''), + (1100, 'de_DE', 'Lieferzone - Tabellenkopf', '', ''), + (1101, 'de_DE', 'Lieferzone - Tabellenzeile', '', ''), + (1102, 'de_DE', 'Lieferzone - unten', '', ''), + (1103, 'de_DE', 'Lieferzone - JavaScript', '', ''), + (1104, 'de_DE', 'Inhalt - JavaScript Änderung', '', ''), + (1105, 'de_DE', 'Accueil - oben', '', ''), + (1106, 'de_DE', 'Accueil - unten', '', ''), + (1107, 'de_DE', 'Accueil - JavaScript', '', ''), + (1108, 'de_DE', 'Modulen - oben', '', ''), + (1109, 'de_DE', 'Modulen - unten', '', ''), + (1110, 'de_DE', 'Modulen - JavaScript', '', ''), + (1111, 'de_DE', 'Sprachen - oben', '', ''), + (1112, 'de_DE', 'Sprachen - unten', '', ''), + (1113, 'de_DE', 'Sprache - Erstellungsformular', '', ''), + (1114, 'de_DE', 'Sprachen - Löschungsformular', '', ''), + (1115, 'de_DE', 'Sprachen - JavaScript', '', ''), + (1116, 'de_DE', 'Zone - Löschungsformular', '', ''), + (1117, 'de_DE', 'Lieferzone - JavaScript Änderung', '', ''), + (1118, 'de_DE', 'System - JavaScript Logs', '', ''), + (1119, 'de_DE', 'Suche - oben', '', ''), + (1120, 'de_DE', 'Suche - unten', '', ''), + (1121, 'de_DE', 'Suche - JavaScript', '', ''), + (1122, 'de_DE', 'Administratoren - oben', '', ''), + (1123, 'de_DE', 'Administratoren - unten', '', ''), + (1124, 'de_DE', 'Administrator - Erstellungsformular', '', ''), + (1125, 'de_DE', 'Administrator - Änderungsformular', '', ''), + (1126, 'de_DE', 'Administrator - Löschungsformular', '', ''), + (1127, 'de_DE', 'Administratoren - JavaScript', '', ''), + (1128, 'de_DE', 'Modul Hook - JavaScript Änderung', '', ''), + (1129, 'de_DE', 'Versandkonfiguration - oben', '', ''), + (1130, 'de_DE', 'Versandkonfiguration - Tabellenkopf', '', ''), + (1131, 'de_DE', 'Versandkonfiguration - Tabellenzeile', '', ''), + (1132, 'de_DE', 'Versandkonfiguration - unten', '', ''), + (1133, 'de_DE', 'Versandkonfiguration - Erstellungsformular', '', ''), + (1134, 'de_DE', 'Versandkonfiguration - Löschungsformular', '', ''), + (1135, 'de_DE', 'Versandkonfiguration - JavaScript', '', ''), + (1136, 'de_DE', 'Karakteristiken - oben', '', ''), + (1137, 'de_DE', 'Karakteristiken - Tabellenkopf', '', ''), + (1138, 'de_DE', 'Karakteristiken - Tabellenzeile', '', ''), + (1139, 'de_DE', 'Karakteristiken - unten', '', ''), + (1140, 'de_DE', 'Karakteristik - Erstellungsformular', '', ''), + (1141, 'de_DE', 'Karakteristik - Löschungsformular', '', ''), + (1142, 'de_DE', 'Karakteristik - zu allen hinzufügen Formular', '', ''), + (1143, 'de_DE', 'Karakteristik - multipel Löschungsformular', '', ''), + (1144, 'de_DE', 'Karakteristiken - JavaScript', '', ''), + (1145, 'de_DE', 'Modul - JavaScript Änderung', '', ''), + (1146, 'de_DE', 'Modul Hook - Erstellungsformular', '', ''), + (1147, 'de_DE', 'Modul Hook - Löschungsformular', '', ''), + (1148, 'de_DE', 'Modul Hook - JavaScript', '', ''), + (1149, 'de_DE', 'Versandkonfiguration - Änderung', '', ''), + (1150, 'de_DE', 'Versandkonfiguration - Länder Löschungsfomular', '', ''), + (1151, 'de_DE', 'Versandkonfiguration - JavaScript Änderung', '', ''), + (1152, 'de_DE', 'E-Mail Sendung - oben', '', ''), + (1153, 'de_DE', 'E-Mail Sendung - unten', '', ''), + (1154, 'de_DE', 'E-Mail Sendung - JavaScript', '', ''), + (1155, 'de_DE', 'Kategorien - oben', '', ''), + (1156, 'de_DE', 'Kategorien - Bildunterschrift', '', ''), + (1157, 'de_DE', 'Kategorien - Kopfzeile', '', ''), + (1158, 'de_DE', 'Kategorien - Zeile', '', ''), + (1159, 'de_DE', 'Produkte - Bildunterschrift', '', ''), + (1160, 'de_DE', 'Produkte - Header', '', ''), + (1161, 'de_DE', 'Produkte - Zeile', '', ''), + (1162, 'de_DE', 'Kategorien - unten', '', ''), + (1163, 'de_DE', 'Kategorien - unten an dem Katalog', '', ''), + (1164, 'de_DE', 'Kategorie - Erstellungsformular', '', ''), + (1165, 'de_DE', 'Produkt - Erstellungsformular', '', ''), + (1166, 'de_DE', 'Kategorie - Löschungsformular', '', ''), + (1167, 'de_DE', 'Produkt - Löschungsformular', '', ''), + (1168, 'de_DE', 'Kategorien - JavaScript', '', ''), + (1169, 'de_DE', 'Variablen - oben', '', ''), + (1170, 'de_DE', 'Variablen - Tabellenkopf', '', ''), + (1171, 'de_DE', 'Variablen - Tabellenzeile', '', ''), + (1172, 'de_DE', 'Variablen - unten', '', ''), + (1173, 'de_DE', 'Variable - Erstellungsformular', '', ''), + (1174, 'de_DE', 'Variable - Löschungsformular', '', ''), + (1175, 'de_DE', 'Variablen - JavaScript', '', ''), + (1176, 'de_DE', 'Bestellung - Produktliste', '', ''), + (1177, 'de_DE', 'Bestellung - JavaScript Änderung', '', ''), + (1178, 'de_DE', 'Shop Informationen - JavaScript', '', ''), + (1179, 'de_DE', 'Übersetzungen - JavaScript', '', ''), + (1180, 'de_DE', 'Ordner - oben', '', ''), + (1181, 'de_DE', 'Ordner - Bildunterschrift', '', ''), + (1182, 'de_DE', 'Ordner - Header', '', ''), + (1183, 'de_DE', 'Ordner - Zeile', '', ''), + (1184, 'de_DE', 'Inhalte - Bildunterschrift', '', ''), + (1185, 'de_DE', 'Inhalte - Kopfzeile', '', ''), + (1186, 'de_DE', 'Inhalte - Zeile', '', ''), + (1187, 'de_DE', 'Ordner - unten', '', ''), + (1188, 'de_DE', 'Ordner - Erstellungsformular', '', ''), + (1189, 'de_DE', 'Inhalt - Erstellungsformular', '', ''), + (1190, 'de_DE', 'Ordner - Löschungsformular', '', ''), + (1191, 'de_DE', 'Inhalt - Löschungsformular', '', ''), + (1192, 'de_DE', 'Ordner - JavaScript', '', ''), + (1193, 'de_DE', 'Template - JavaScript Änderung', '', ''), + (1194, 'de_DE', 'Taxe - JavaScript Änderung', '', ''), + (1195, 'de_DE', 'Hook - JavaScript Änderung', '', ''), + (1196, 'de_DE', 'Länder - oben', '', ''), + (1197, 'de_DE', 'Länder - Tabellenkopf', '', ''), + (1198, 'de_DE', 'Länder - Tabellenzeile', '', ''), + (1199, 'de_DE', 'Länder - unten', '', ''), + (1200, 'de_DE', 'Land - Erstellungsformular', '', ''), + (1201, 'de_DE', 'Land - Löschungsformular', '', ''), + (1202, 'de_DE', 'Länder - JavaScript', '', ''), + (1203, 'de_DE', 'Währungen - oben', '', ''), + (1204, 'de_DE', 'Währungen - Tabellenkopf', '', ''), + (1205, 'de_DE', 'Währungen - Tabellenzeile', '', ''), + (1206, 'de_DE', 'Währungen - unten', '', ''), + (1207, 'de_DE', 'Währung - Erstellungsformular', '', ''), + (1208, 'de_DE', 'Währung - Löschungsformular', '', ''), + (1209, 'de_DE', 'Währungen - JavaScript', '', ''), + (1210, 'de_DE', 'Kunde - Modification', '', ''), + (1211, 'de_DE', 'Kunde - Adresse-Erstellungsformular', '', ''), + (1212, 'de_DE', 'Kunde - Adresse-Änderungsformular', '', ''), + (1213, 'de_DE', 'Kunde - Adresse-Löschungsformular', '', ''), + (1214, 'de_DE', 'Kunde - JavaScript Änderung', '', ''), + (1215, 'de_DE', 'Deklinationenangaben - Tabellenkopf', '', ''), + (1216, 'de_DE', 'Deklinationenangaben - Tabellenzeile', '', ''), + (1217, 'de_DE', 'Deklinationsangabe - Erstellungsformular', '', ''), + (1218, 'de_DE', 'Deklination - ID Löschungsformular', '', ''), + (1219, 'de_DE', 'Deklination - JavaScript Änderung', '', ''), + (1220, 'de_DE', 'Profile - oben', '', ''), + (1221, 'de_DE', 'Profile - unten', '', ''), + (1222, 'de_DE', 'Profil - Erstellungsformular', '', ''), + (1223, 'de_DE', 'Profil - Löschungsformular', '', ''), + (1224, 'de_DE', 'Profile - JavaScript', '', ''), + (1225, 'de_DE', 'Land - JavaScript Änderung', '', ''), + (1226, 'de_DE', 'Profil - JavaScript Änderung', '', ''), + (1227, 'de_DE', 'Variable - JavaScript Änderung', '', ''), + (1228, 'de_DE', 'Gutschein - JavaScript Änderung', '', ''), + (1229, 'de_DE', 'Gutschein - oben', '', ''), + (1230, 'de_DE', 'Gutschein - Bildunterschrift', '', ''), + (1231, 'de_DE', 'Gutschein - Tabellenkopf', '', ''), + (1232, 'de_DE', 'Gutschein - Tabellenzeile', '', ''), + (1233, 'de_DE', 'Gutschein - unten', '', ''), + (1234, 'de_DE', 'Gutschein - JavaScript den Listen', '', ''), + (1235, 'de_DE', 'Modul - Konfiguration', '', ''), + (1236, 'de_DE', 'Modul - JavaScript Konfiguration', '', ''), + (1237, 'de_DE', 'Nachricht - JavaScript Änderung', '', ''), + (1238, 'de_DE', 'Bild - JavaScript Änderung', '', ''), + (1239, 'de_DE', 'Deklinationen - oben', '', ''), + (1240, 'de_DE', 'Deklinationen - Tabellenkopf', '', ''), + (1241, 'de_DE', 'Deklinationen - Tabellenzeile', '', ''), + (1242, 'de_DE', 'Deklinationen - unten', '', ''), + (1243, 'de_DE', 'Deklination - Erstellungsformular', '', ''), + (1244, 'de_DE', 'Deklination - Löschungsformular', '', ''), + (1245, 'de_DE', 'Deklination - zu allen hinzufügen Formular', '', ''), + (1246, 'de_DE', 'Deklination - multipel Löschungsformular', '', ''), + (1247, 'de_DE', 'Deklinationen - JavaScript', '', ''), + (1248, 'de_DE', 'Logs - oben', '', ''), + (1249, 'de_DE', 'Logs - unten', '', ''), + (1250, 'de_DE', 'Protokolle - JavaScript', '', ''), + (1251, 'de_DE', 'Ordner - JavaScript Änderung', '', ''), + (1252, 'de_DE', 'Hooks - oben', '', ''), + (1253, 'de_DE', 'Hooks - Tabellenkopf', '', ''), + (1254, 'de_DE', 'Hooks - Tabellenzeile', '', ''), + (1255, 'de_DE', 'Hooks - unten', '', ''), + (1256, 'de_DE', 'Hook - Erstellungsformular', '', ''), + (1257, 'de_DE', 'Hook - Löschungsformular', '', ''), + (1258, 'de_DE', 'Hooks - JavaScript', '', ''), + (1259, 'de_DE', 'Layout - CSS', '', ''), + (1260, 'de_DE', 'Layout - vor der Titelleiste', '', ''), + (1261, 'de_DE', 'Layout - in der Titelleiste', '', ''), + (1262, 'de_DE', 'Layout - nach der Titelleiste', '', ''), + (1263, 'de_DE', 'Layout - vor dem Top Menü', '', ''), + (1264, 'de_DE', 'Layout - in Top-Menü Elementen', '', ''), + (1265, 'de_DE', 'Layout - nach dem Top Menü', '', ''), + (1266, 'de_DE', 'Layout - vor dem Footer', '', ''), + (1267, 'de_DE', 'Layout - Im Footer', '', ''), + (1268, 'de_DE', 'Layout - nach dem Footer', '', ''), + (1269, 'de_DE', 'Layout - JavaScript', '', ''), + (1270, 'de_DE', 'Layout - oben an der Titelleiste', '', ''), + (1271, 'de_DE', 'Layout - unten an der Titelleiste', '', ''), + (1272, 'de_DE', 'Layout - im Kundes-Menü', '', ''), + (1273, 'de_DE', 'Layout - im Bestellungsmenü', '', ''), + (1274, 'de_DE', 'Layout - im Katalogs-Menü', '', ''), + (1275, 'de_DE', 'Layout - im Ordners-Menü', '', ''), + (1276, 'de_DE', 'Layout - im Tools-Menü', '', ''), + (1277, 'de_DE', 'Layout - im Moduls-Menü', '', ''), + (1278, 'de_DE', 'Layout - im konfigurations-Menü', '', ''), + (1279, 'de_DE', 'Marke - JavaScript Änderung', '', ''), + (1280, 'de_DE', 'Accueil - Block', '', ''), + (1281, 'de_DE', 'Marken - oben', '', ''), + (1282, 'de_DE', 'Marken - Tabellenkopf', '', ''), + (1283, 'de_DE', 'Marken - Tabellzeilen', '', ''), + (1284, 'de_DE', 'Marken - unten', '', ''), + (1285, 'de_DE', 'Marke - Erstellungsformular', '', ''), + (1286, 'de_DE', 'Marke - Löschungsformular', '', ''), + (1287, 'de_DE', 'Marke - JavaScript', '', ''), + (1288, 'de_DE', 'Exporte - oben', '', ''), + (1289, 'de_DE', 'Exporte - unten einer Kategorie', '', ''), + (1290, 'de_DE', 'Exporte - unten der Spalte 1', '', ''), + (1291, 'de_DE', 'Exporte - JavaScript', '', ''), + (1292, 'de_DE', 'Export - JavaScript', '', ''), + (1293, 'de_DE', 'Marke - Inhalt', '', ''), + (1294, 'de_DE', 'Kunde - Bestellungs-Tabellenkopf', '', ''), + (1295, 'de_DE', 'Kunde - Bestellungs-Tabellenzeile', '', ''), + + (2001, 'de_DE', 'Rechnung - CSS', '', ''), + (2002, 'de_DE', 'Rechnung - im Header', '', ''), + (2003, 'de_DE', 'Rechnung - oben an dem Footer', '', ''), + (2004, 'de_DE', 'Rechnung - Impressum', '', ''), + (2005, 'de_DE', 'Rechnung - unten an dem Footer', '', ''), + (2006, 'de_DE', 'Rechnung - unten an dem Informationsbereich', '', ''), + (2007, 'de_DE', 'Rechnung - nach dem Informationsbereich', '', ''), + (2008, 'de_DE', 'Rechnung - Bestellungsadresse', '', ''), + (2009, 'de_DE', 'Rechnung - nach dem Adressebereich', '', ''), + (2010, 'de_DE', 'Rechnung - nach der Produktliste', '', ''), + (2011, 'de_DE', 'Rechnung - nach der Bestellungs-Zusammenfassung', '', ''), + (2012, 'de_DE', 'Lieferung - CSS', '', ''), + (2013, 'de_DE', 'Lieferung - im Header', '', ''), + (2014, 'de_DE', 'Lieferung - oben an dem Footer', '', ''), + (2015, 'de_DE', 'Lieferung - Impressum', '', ''), + (2016, 'de_DE', 'Lieferung - unten an dem Footer', '', ''), + (2017, 'de_DE', 'Lieferung - unten an dem Informationsbereich', '', ''), + (2018, 'de_DE', 'Lieferung - Nach dem Informationsbereich', '', ''), + (2019, 'de_DE', 'Lieferung - Lieferadresse', '', ''), + (2020, 'de_DE', 'Lieferung - Nach dem Adresse-Bereich', '', ''), + (2021, 'de_DE', 'Lieferung - Nach der Zusammenfassung der Bestellung', '', ''), + + (2022, 'de_DE', 'Bestellbestätigung - nach den Bestellungszusammenfassungen', '', ''), + + (2023, 'de_DE', 'Überall wo WYSIWYG editor ist nötig', '', ''), + (1, 'en_US', 'Invoice choice - at the top', '', ''), + (2, 'en_US', 'Invoice choice - delivery address', '', ''), + (3, 'en_US', 'Invoice choice - extra payment zone', '', ''), + (4, 'en_US', 'Invoice choice - at the bottom', '', ''), + (5, 'en_US', 'Invoice choice - after javascript initialisation', '', ''), + (6, 'en_US', 'Invoice choice - CSS stylesheet', '', ''), + (7, 'en_US', 'Invoice choice - after javascript include', '', ''), + (8, 'en_US', 'Payment gateway - main area', '', ''), + (9, 'en_US', 'Payment gateway - javascript', '', ''), + (10, 'en_US', 'Payment gateway - after javascript initialisation', '', ''), + (11, 'en_US', 'Payment gateway - CSS stylesheet', '', ''), + (12, 'en_US', 'Payment gateway - after javascript include', '', ''), + (13, 'en_US', 'Sitemap - at the bottom', '', ''), + (14, 'en_US', 'Curency selection page - at the top', '', ''), + (15, 'en_US', 'Curency selection page - at the bottom', '', ''), + (16, 'en_US', 'Curency selection page - CSS stylesheet', '', ''), + (17, 'en_US', 'Curency selection page - after javascript include', '', ''), + (18, 'en_US', 'Curency selection page - after javascript initialisation', '', ''), + (19, 'en_US', 'Login page - at the top', '', ''), + (20, 'en_US', 'Login page - at the top of the main area', '', ''), + (21, 'en_US', 'Login page - at the top of the form', '', ''), + (22, 'en_US', 'Login page - at the bottom of the form', '', ''), + (23, 'en_US', 'Login page - at the bottom of the main area', '', ''), + (24, 'en_US', 'Login page - at the bottom', '', ''), + (25, 'en_US', 'Login page - CSS stylesheet', '', ''), + (26, 'en_US', 'Login page - after javascript include', '', ''), + (27, 'en_US', 'Login page - after javascript initialisation', '', ''), + (28, 'en_US', 'Update customer account - at the top', '', ''), + (29, 'en_US', 'Update customer account - at the top of the form', '', ''), + (30, 'en_US', 'Update customer account - at the bottom of the form', '', ''), + (31, 'en_US', 'Update customer account - at the bottom', '', ''), + (32, 'en_US', 'Update customer account - CSS stylesheet', '', ''), + (33, 'en_US', 'Update customer account - after javascript include', '', ''), + (34, 'en_US', 'Update customer account - after javascript initialisation', '', ''), + (35, 'en_US', 'Cart - at the top', '', ''), + (36, 'en_US', 'Cart - at the bottom', '', ''), + (37, 'en_US', 'Cart - after javascript include', '', ''), + (38, 'en_US', 'Cart - CSS stylesheet', '', ''), + (39, 'en_US', 'Cart - javascript initialization', '', ''), + (40, 'en_US', 'Contact page - at the top', '', ''), + (41, 'en_US', 'Contact page - at the top of the form', '', ''), + (42, 'en_US', 'Contact page - at the bottom of the form', '', ''), + (43, 'en_US', 'Contact page - at the bottom', '', ''), + (44, 'en_US', 'Contact page - CSS stylesheet', '', ''), + (45, 'en_US', 'Contact page - after javascript include', '', ''), + (46, 'en_US', 'Contact page - after javascript initialisation', '', ''), + (47, 'en_US', 'Placed order - main area', '', ''), + (48, 'en_US', 'Placed order - CSS stylesheet', '', ''), + (49, 'en_US', 'Placed order - after javascript include', '', ''), + (50, 'en_US', 'Placed order - after javascript initialisation', '', ''), + (51, 'en_US', 'Search page - CSS stylesheet', '', ''), + (52, 'en_US', 'Search page - after javascript include', '', ''), + (53, 'en_US', 'Search page - after javascript initialisation', '', ''), + (54, 'en_US', 'Register - at the top', '', ''), + (55, 'en_US', 'Register - at the top of the form', '', ''), + (56, 'en_US', 'Register - at the bottom of the form', '', ''), + (57, 'en_US', 'Register - at the bottom', '', ''), + (58, 'en_US', 'Register - CSS stylesheet', '', ''), + (59, 'en_US', 'Register - after javascript include', '', ''), + (60, 'en_US', 'Register - after javascript initialisation', '', ''), + (61, 'en_US', 'Lost password - at the top', '', ''), + (62, 'en_US', 'Lost password - at the top of the form', '', ''), + (63, 'en_US', 'Lost password - at the bottom of the form', '', ''), + (64, 'en_US', 'Lost password - at the bottom', '', ''), + (65, 'en_US', 'Lost password - CSS stylesheet', '', ''), + (66, 'en_US', 'Lost password - after javascript include', '', ''), + (67, 'en_US', 'Lost password - javascript initialization', '', ''), + (68, 'en_US', 'language selection page - at the top', '', ''), + (69, 'en_US', 'language selection page - at the bottom', '', ''), + (70, 'en_US', 'language selection page - CSS stylesheet', '', ''), + (71, 'en_US', 'language selection page - after javascript include', '', ''), + (72, 'en_US', 'language selection page - after javascript initialisation', '', ''), + (73, 'en_US', 'Contact page - if successful response', '', ''), + (74, 'en_US', 'Newsletter page - at the top', '', ''), + (75, 'en_US', 'Newsletter page - at the bottom', '', ''), + (76, 'en_US', 'Newsletter page - CSS stylesheet', '', ''), + (77, 'en_US', 'Newsletter page - after javascript include', '', ''), + (78, 'en_US', 'Newsletter page - after javascript initialisation', '', ''), + (79, 'en_US', 'Payment failed - CSS stylesheet', '', ''), + (80, 'en_US', 'Payment failed - after javascript include', '', ''), + (81, 'en_US', 'Payment failed - javascript initialization', '', ''), + (82, 'en_US', 'Content page - at the top', '', ''), + (83, 'en_US', 'Content page - at the top of the main area', '', ''), + (84, 'en_US', 'Content page - at the bottom of the main area', '', ''), + (85, 'en_US', 'Content page - at the bottom', '', ''), + (86, 'en_US', 'Content page - CSS stylesheet', '', ''), + (87, 'en_US', 'Content page - after javascript include', '', ''), + (88, 'en_US', 'Content page - after javascript initialisation', '', ''), + (89, 'en_US', 'HTML layout - after the opening of the head tag', '', ''), + (90, 'en_US', 'HTML layout - CSS stylesheet', '', ''), + (91, 'en_US', 'HTML layout - before the end of the head tag', '', ''), + (92, 'en_US', 'HTML layout - after the opening of the body tag', '', ''), + (93, 'en_US', 'HTML layout - at the top of the header', '', ''), + (94, 'en_US', 'HTML layout - secondary navigation', '', ''), + (95, 'en_US', 'HTML layout - primary navigation', '', ''), + (96, 'en_US', 'HTML layout - at the bottom of the header', '', ''), + (97, 'en_US', 'HTML layout - before the main content area', '', ''), + (98, 'en_US', 'HTML layout - after the main content area', '', ''), + (99, 'en_US', 'HTML layout - at the top of the footer', '', ''), + (100, 'en_US', 'HTML layout - footer body', '', ''), + (101, 'en_US', 'HTML layout - bottom of the footer', '', ''), + (102, 'en_US', 'HTML layout - after javascript include', '', ''), + (103, 'en_US', 'HTML layout - javascript initialization', '', ''), + (104, 'en_US', 'HTML layout - before the end body tag', '', ''), + (105, 'en_US', 'Page 404 - content area', '', ''), + (106, 'en_US', 'Page 404 - CSS stylesheet', '', ''), + (107, 'en_US', 'Page 404 - after javascript include', '', ''), + (108, 'en_US', 'Page 404 - after javascript initialisation', '', ''), + (109, 'en_US', 'Delivery choice - at the top', '', ''), + (110, 'en_US', 'Delivery choice - at the top of the form', '', ''), + (111, 'en_US', 'Delivery choice - at the bottom of the form', '', ''), + (112, 'en_US', 'Delivery choice - at the bottom', '', ''), + (113, 'en_US', 'Delivery choice - after javascript initialisation', '', ''), + (114, 'en_US', 'Delivery choice - CSS stylesheet', '', ''), + (115, 'en_US', 'Delivery choice - after javascript include', '', ''), + (116, 'en_US', 'Address creation - at the top', '', ''), + (117, 'en_US', 'Address creation - at the top of the form', '', ''), + (118, 'en_US', 'Address creation - at the bottom of the form', '', ''), + (119, 'en_US', 'Address creation - at the bottom', '', ''), + (120, 'en_US', 'Address creation - CSS stylesheet', '', ''), + (121, 'en_US', 'Address creation - after javascript include', '', ''), + (122, 'en_US', 'Address creation - after javascript initialisation', '', ''), + (123, 'en_US', 'Folder page - at the top', '', ''), + (124, 'en_US', 'Folder page - at the top of the main area', '', ''), + (125, 'en_US', 'Folder page - at the bottom of the main area', '', ''), + (126, 'en_US', 'Folder page - at the bottom', '', ''), + (127, 'en_US', 'Folder page - CSS stylesheet', '', ''), + (128, 'en_US', 'Folder page - after javascript include', '', ''), + (129, 'en_US', 'Folder page - after javascript initialisation', '', ''), + (130, 'en_US', 'Order failed - at the top', '', ''), + (131, 'en_US', 'Order failed - at the bottom', '', ''), + (132, 'en_US', 'Order failed - CSS stylesheet', '', ''), + (133, 'en_US', 'Order failed - after javascript include', '', ''), + (134, 'en_US', 'Order failed - after javascript initialisation', '', ''), + (135, 'en_US', 'Category page - at the top', '', ''), + (136, 'en_US', 'Category page - at the top of the main area', '', ''), + (137, 'en_US', 'Category page - at the bottom of the main area', '', ''), + (138, 'en_US', 'Category page - at the bottom', '', ''), + (139, 'en_US', 'Category page - CSS stylesheet', '', ''), + (140, 'en_US', 'Category page - after javascript include', '', ''), + (141, 'en_US', 'Category page - after javascript initialisation', '', ''), + (142, 'en_US', 'Address update - at the top', '', ''), + (143, 'en_US', 'Address update - at the top of the form', '', ''), + (144, 'en_US', 'Address update - at the bottom of the form', '', ''), + (145, 'en_US', 'Address update - at the bottom', '', ''), + (146, 'en_US', 'Address update - CSS stylesheet', '', ''), + (147, 'en_US', 'Address update - after javascript include', '', ''), + (148, 'en_US', 'Address update - after javascript initialisation', '', ''), + (149, 'en_US', 'Home page - main area', '', ''), + (150, 'en_US', 'Home page - CSS stylesheet', '', ''), + (151, 'en_US', 'Home page - after javascript include', '', ''), + (152, 'en_US', 'Home page - after javascript initialisation', '', ''), + (153, 'en_US', 'Change password - at the top', '', ''), + (154, 'en_US', 'Change password - at the bottom', '', ''), + (155, 'en_US', 'Change password - CSS stylesheet', '', ''), + (156, 'en_US', 'Change password - after javascript include', '', ''), + (157, 'en_US', 'Change password - after javascript initialisation', '', ''), + (158, 'en_US', 'Product page - at the top', '', ''), + (159, 'en_US', 'Product page - photo gallery', '', ''), + (160, 'en_US', 'Product page - at the top of the detail', '', ''), + (161, 'en_US', 'Product page - at the bottom of the detail area', '', ''), + (162, 'en_US', 'Product page - additional information', '', ''), + (163, 'en_US', 'Product page - at the bottom', '', ''), + (164, 'en_US', 'Product page - CSS stylesheet', '', ''), + (165, 'en_US', 'Product page - after javascript include', '', ''), + (166, 'en_US', 'Product page - after javascript initialisation', '', ''), + (167, 'en_US', 'customer account - at the top', '', ''), + (168, 'en_US', 'customer account - at the bottom', '', ''), + (169, 'en_US', 'customer account - CSS stylesheet', '', ''), + (170, 'en_US', 'customer account - after javascript include', '', ''), + (171, 'en_US', 'customer account - after javascript initialisation', '', ''), + (172, 'en_US', 'All Products - at the top', '', ''), + (173, 'en_US', 'All Products - at the bottom', '', ''), + (174, 'en_US', 'All Products - CSS stylesheet', '', ''), + (175, 'en_US', 'All Products - after javascript include', '', ''), + (176, 'en_US', 'All Products - after javascript initialisation', '', ''), + (177, 'en_US', 'Product loop - at the top', '', ''), + (178, 'en_US', 'Product loop - at the bottom', '', ''), + (179, 'en_US', 'Category page - at the top of the sidebar', '', ''), + (180, 'en_US', 'Category page - the body of the sidebar', '', ''), + (181, 'en_US', 'Category page - at the bottom of the sidebar', '', ''), + (182, 'en_US', 'Content page - at the top of the sidebar', '', ''), + (183, 'en_US', 'Content page - the body of the sidebar', '', ''), + (184, 'en_US', 'Content page - at the bottom of the sidebar', '', ''), + (185, 'en_US', 'Delivery choice - extra area', '', ''), + (186, 'en_US', 'Delivery choice - javascript', '', ''), + (1000, 'en_US', 'Category - content', '', ''), + (1001, 'en_US', 'Content - content', '', ''), + (1002, 'en_US', 'Folder - content', '', ''), + (1003, 'en_US', 'Order - content', '', ''), + (1004, 'en_US', 'Product - content', '', ''), + (1005, 'en_US', 'Features value - table header', '', ''), + (1006, 'en_US', 'Features value - table row', '', ''), + (1007, 'en_US', 'Feature - Value create form', '', ''), + (1008, 'en_US', 'Feature - Edit JavaScript', '', ''), + (1009, 'en_US', 'Product - Edit JavaScript', '', ''), + (1010, 'en_US', 'Coupon - create JavaScript', '', ''), + (1011, 'en_US', 'Taxes - update form', '', ''), + (1012, 'en_US', 'tax rule - Edit JavaScript', '', ''), + (1013, 'en_US', 'Tools - at the top', '', ''), + (1014, 'en_US', 'Tools - at the top of the column', '', ''), + (1015, 'en_US', 'Tools - at the bottom of column 1', '', ''), + (1016, 'en_US', 'Tools - bottom', '', ''), + (1017, 'en_US', 'Tools - JavaScript', '', ''), + (1018, 'en_US', 'Messages - at the top', '', ''), + (1019, 'en_US', 'Messages - table header', '', ''), + (1020, 'en_US', 'Messages - table row', '', ''), + (1021, 'en_US', 'Messages - bottom', '', ''), + (1022, 'en_US', 'Message - create form', '', ''), + (1023, 'en_US', 'Message - delete form', '', ''), + (1024, 'en_US', 'Messages - JavaScript', '', ''), + (1025, 'en_US', 'Taxes rules - at the top', '', ''), + (1026, 'en_US', 'Taxes rules - bottom', '', ''), + (1027, 'en_US', 'Tax - create form', '', ''), + (1028, 'en_US', 'Tax - delete form', '', ''), + (1029, 'en_US', 'tax rule - create form', '', ''), + (1030, 'en_US', 'tax rule - delete form', '', ''), + (1031, 'en_US', 'Taxes rules - JavaScript', '', ''), + (1032, 'en_US', 'Exports - at the top', '', ''), + (1033, 'en_US', 'Exports - at the bottom of a category', '', ''), + (1034, 'en_US', 'Exports - at the bottom of column 1', '', ''), + (1035, 'en_US', 'Exports - JavaScript', '', ''), + (1036, 'en_US', 'Export - JavaScript', '', ''), + (1037, 'en_US', 'Product - folders table header', '', ''), + (1038, 'en_US', 'Product - folders table row', '', ''), + (1039, 'en_US', 'Product - details pricing form', '', ''), + (1040, 'en_US', 'Product - stock edit form', '', ''), + (1041, 'en_US', 'Product - details promotion form', '', ''), + (1042, 'en_US', 'Product - before combinations', '', ''), + (1043, 'en_US', 'Product - combinations list caption', '', ''), + (1044, 'en_US', 'Product - after combinations', '', ''), + (1045, 'en_US', 'Product - combination delete form', '', ''), + (1046, 'en_US', 'Modules - table header', '', ''), + (1047, 'en_US', 'Modules - table row', '', ''), + (1048, 'en_US', 'Currency - Edit JavaScript', '', ''), + (1049, 'en_US', 'Category - contents table header', '', ''), + (1050, 'en_US', 'Category - contents table row', '', ''), + (1051, 'en_US', 'Category - Edit JavaScript', '', ''), + (1052, 'en_US', 'Document - Edit JavaScript', '', ''), + (1053, 'en_US', 'Customer - at the top', '', ''), + (1054, 'en_US', 'Customers - caption', '', ''), + (1055, 'en_US', 'Customers - header', '', ''), + (1056, 'en_US', 'Customers - row', '', ''), + (1057, 'en_US', 'Customer - bottom', '', ''), + (1058, 'en_US', 'Customer - create form', '', ''), + (1059, 'en_US', 'Customer - delete form', '', ''), + (1060, 'en_US', 'Customers - JavaScript', '', ''), + (1061, 'en_US', 'Product - contents table header', '', ''), + (1062, 'en_US', 'Product - contents table row', '', ''), + (1063, 'en_US', 'Product - accessories table header', '', ''), + (1064, 'en_US', 'Product - accessories table row', '', ''), + (1065, 'en_US', 'Product - categories table header', '', ''), + (1066, 'en_US', 'Product - categories table row', '', ''), + (1067, 'en_US', 'Product - attributes table header', '', ''), + (1068, 'en_US', 'Product - attributes table row', '', ''), + (1069, 'en_US', 'Product - features-table-header', '', ''), + (1070, 'en_US', 'Product - features table row', '', ''), + (1071, 'en_US', 'Template - attributes table header', '', ''), + (1072, 'en_US', 'Template - attributes table row', '', ''), + (1073, 'en_US', 'Template - features-table-header', '', ''), + (1074, 'en_US', 'Template - features table row', '', ''), + (1075, 'en_US', 'Templates - at the top', '', ''), + (1076, 'en_US', 'Templates - table header', '', ''), + (1077, 'en_US', 'Templates - table row', '', ''), + (1078, 'en_US', 'Templates - bottom', '', ''), + (1079, 'en_US', 'Template - create form', '', ''), + (1080, 'en_US', 'Template - delete form', '', ''), + (1081, 'en_US', 'Templates - JavaScript', '', ''), + (1082, 'en_US', 'Configuration - at the top', '', ''), + (1083, 'en_US', 'Configuration - at the top of the catalog area', '', ''), + (1084, 'en_US', 'Configuration - at the bottom of the catalog', '', ''), + (1085, 'en_US', 'Configuration - at the top of the shipping area', '', ''), + (1086, 'en_US', 'Configuration - at the bottom of the shipping area', '', ''), + (1087, 'en_US', 'Configuration - at the top of the system area', '', ''), + (1088, 'en_US', 'Configuration - at the bottom of the system area', '', ''), + (1089, 'en_US', 'Configuration - bottom', '', ''), + (1090, 'en_US', 'Configuration - JavaScript', '', ''), + (1091, 'en_US', 'Dashboard - at the top', '', ''), + (1092, 'en_US', 'Dashboard - middle', '', ''), + (1093, 'en_US', 'Dashboard - bottom', '', ''), + (1094, 'en_US', 'Orders - at the top', '', ''), + (1095, 'en_US', 'Orders - table header', '', ''), + (1096, 'en_US', 'Orders - table row', '', ''), + (1097, 'en_US', 'Orders - bottom', '', ''), + (1098, 'en_US', 'Orders - JavaScript', '', ''), + (1099, 'en_US', 'Delivery zone - at the top', '', ''), + (1100, 'en_US', 'Delivery zone - table header', '', ''), + (1101, 'en_US', 'Delivery zone - table row', '', ''), + (1102, 'en_US', 'Delivery zone - bottom', '', ''), + (1103, 'en_US', 'Delivery zone - JavaScript', '', ''), + (1104, 'en_US', 'Content - Edit JavaScript', '', ''), + (1105, 'en_US', 'Home - at the top', '', ''), + (1106, 'en_US', 'Home - bottom', '', ''), + (1107, 'en_US', 'Home - JavaScript', '', ''), + (1108, 'en_US', 'Modules - at the top', '', ''), + (1109, 'en_US', 'Modules - bottom', '', ''), + (1110, 'en_US', 'Modules - JavaScript', '', ''), + (1111, 'en_US', 'Languages - at the top', '', ''), + (1112, 'en_US', 'Languages - bottom', '', ''), + (1113, 'en_US', 'Language - create form', '', ''), + (1114, 'en_US', 'Languages - delete form', '', ''), + (1115, 'en_US', 'Languages - JavaScript', '', ''), + (1116, 'en_US', 'Zone - delete form', '', ''), + (1117, 'en_US', 'Delivery zone - Edit JavaScript', '', ''), + (1118, 'en_US', 'System - logs JavaScript', '', ''), + (1119, 'en_US', 'Search - at the top', '', ''), + (1120, 'en_US', 'Search - bottom', '', ''), + (1121, 'en_US', 'Search - JavaScript', '', ''), + (1122, 'en_US', 'Administrators - at the top', '', ''), + (1123, 'en_US', 'Administrators - bottom', '', ''), + (1124, 'en_US', 'Administrator - create form', '', ''), + (1125, 'en_US', 'Administrator - update form', '', ''), + (1126, 'en_US', 'Administrator - delete form', '', ''), + (1127, 'en_US', 'Administrators - JavaScript', '', ''), + (1128, 'en_US', 'Module hook - Edit JavaScript', '', ''), + (1129, 'en_US', 'Shipping configuration - at the top', '', ''), + (1130, 'en_US', 'Shipping configuration - table header', '', ''), + (1131, 'en_US', 'Shipping configuration - table row', '', ''), + (1132, 'en_US', 'Shipping configuration - bottom', '', ''), + (1133, 'en_US', 'Shipping configuration - create form', '', ''), + (1134, 'en_US', 'Shipping configuration - delete form', '', ''), + (1135, 'en_US', 'Shipping configuration - JavaScript', '', ''), + (1136, 'en_US', 'Features - at the top', '', ''), + (1137, 'en_US', 'Features - table header', '', ''), + (1138, 'en_US', 'Features - table row', '', ''), + (1139, 'en_US', 'Features - bottom', '', ''), + (1140, 'en_US', 'Feature - create form', '', ''), + (1141, 'en_US', 'Feature - delete form', '', ''), + (1142, 'en_US', 'Feature - add to all form', '', ''), + (1143, 'en_US', 'Feature - remove to all form', '', ''), + (1144, 'en_US', 'Features - JavaScript', '', ''), + (1145, 'en_US', 'Module - Edit JavaScript', '', ''), + (1146, 'en_US', 'Module hook - create form', '', ''), + (1147, 'en_US', 'Module hook - delete form', '', ''), + (1148, 'en_US', 'Module hook - JavaScript', '', ''), + (1149, 'en_US', 'Shipping configuration - Edit', '', ''), + (1150, 'en_US', 'Shipping configuration - country delete form', '', ''), + (1151, 'en_US', 'Shipping configuration - Edit JavaScript', '', ''), + (1152, 'en_US', 'Mailing system - at the top', '', ''), + (1153, 'en_US', 'Mailing system - bottom', '', ''), + (1154, 'en_US', 'Mailing system - JavaScript', '', ''), + (1155, 'en_US', 'Categories - at the top', '', ''), + (1156, 'en_US', 'Categories - caption', '', ''), + (1157, 'en_US', 'Categories - header', '', ''), + (1158, 'en_US', 'Categories - row', '', ''), + (1159, 'en_US', 'Products - caption', '', ''), + (1160, 'en_US', 'Products - header', '', ''), + (1161, 'en_US', 'Products - row', '', ''), + (1162, 'en_US', 'Categories - bottom', '', ''), + (1163, 'en_US', 'Categories - at the bottom of the catalog', '', ''), + (1164, 'en_US', 'Category - create form', '', ''), + (1165, 'en_US', 'Product - create form', '', ''), + (1166, 'en_US', 'Category - delete form', '', ''), + (1167, 'en_US', 'Product - delete form', '', ''), + (1168, 'en_US', 'Categories - JavaScript', '', ''), + (1169, 'en_US', 'Variables - at the top', '', ''), + (1170, 'en_US', 'Variables - table header', '', ''), + (1171, 'en_US', 'Variables - table row', '', ''), + (1172, 'en_US', 'Variables - bottom', '', ''), + (1173, 'en_US', 'Variable - create form', '', ''), + (1174, 'en_US', 'Variable - delete form', '', ''), + (1175, 'en_US', 'Variables - JavaScript', '', ''), + (1176, 'en_US', 'Order - product list', '', ''), + (1177, 'en_US', 'Order - Edit JavaScript', '', ''), + (1178, 'en_US', 'Store Information - JavaScript', '', ''), + (1179, 'en_US', 'Translations - JavaScript', '', ''), + (1180, 'en_US', 'Folder - at the top', '', ''), + (1181, 'en_US', 'Folder - caption', '', ''), + (1182, 'en_US', 'Folder - header', '', ''), + (1183, 'en_US', 'Folder - row', '', ''), + (1184, 'en_US', 'Contents - caption', '', ''), + (1185, 'en_US', 'Contents - header', '', ''), + (1186, 'en_US', 'Contents - row', '', ''), + (1187, 'en_US', 'Folder - bottom', '', ''), + (1188, 'en_US', 'Folder - create form', '', ''), + (1189, 'en_US', 'Content - create form', '', ''), + (1190, 'en_US', 'Folder - delete form', '', ''), + (1191, 'en_US', 'Content - delete form', '', ''), + (1192, 'en_US', 'Folder - JavaScript', '', ''), + (1193, 'en_US', 'Template - Edit JavaScript', '', ''), + (1194, 'en_US', 'Tax - Edit JavaScript', '', ''), + (1195, 'en_US', 'Hook - Edit JavaScript', '', ''), + (1196, 'en_US', 'Countries - at the top', '', ''), + (1197, 'en_US', 'Countries - table header', '', ''), + (1198, 'en_US', 'Countries - table row', '', ''), + (1199, 'en_US', 'Countries - bottom', '', ''), + (1200, 'en_US', 'Country - create form', '', ''), + (1201, 'en_US', 'Country - delete form', '', ''), + (1202, 'en_US', 'Countries - JavaScript', '', ''), + (1203, 'en_US', 'Currencies - at the top', '', ''), + (1204, 'en_US', 'Currencies - table header', '', ''), + (1205, 'en_US', 'Currencies - table row', '', ''), + (1206, 'en_US', 'Currencies - bottom', '', ''), + (1207, 'en_US', 'Currency - create form', '', ''), + (1208, 'en_US', 'Currency - delete form', '', ''), + (1209, 'en_US', 'Currencies - JavaScript', '', ''), + (1210, 'en_US', 'Customer - Edit', '', ''), + (1211, 'en_US', 'Customer - address create form', '', ''), + (1212, 'en_US', 'Customer - address update form', '', ''), + (1213, 'en_US', 'Customer - address delete form', '', ''), + (1214, 'en_US', 'Customer - Edit JavaScript', '', ''), + (1215, 'en_US', 'Attributes value - table header', '', ''), + (1216, 'en_US', 'Attributes value - table row', '', ''), + (1217, 'en_US', 'Attribute value - create form', '', ''), + (1218, 'en_US', 'Attribut - id delete form', '', ''), + (1219, 'en_US', 'Attribut - Edit JavaScript', '', ''), + (1220, 'en_US', 'Profiles - at the top', '', ''), + (1221, 'en_US', 'Profiles - bottom', '', ''), + (1222, 'en_US', 'Profile - create form', '', ''), + (1223, 'en_US', 'Profile - delete form', '', ''), + (1224, 'en_US', 'Profiles - JavaScript', '', ''), + (1225, 'en_US', 'Country - Edit JavaScript', '', ''), + (1226, 'en_US', 'Profile - Edit JavaScript', '', ''), + (1227, 'en_US', 'Variable - Edit JavaScript', '', ''), + (1228, 'en_US', 'Coupon - update JavaScript', '', ''), + (1229, 'en_US', 'Coupon - at the top', '', ''), + (1230, 'en_US', 'Coupon - list caption', '', ''), + (1231, 'en_US', 'Coupon - table header', '', ''), + (1232, 'en_US', 'Coupon - table row', '', ''), + (1233, 'en_US', 'Coupon - bottom', '', ''), + (1234, 'en_US', 'Coupon - list JavaScript', '', ''), + (1235, 'en_US', 'Module - configuration', '', ''), + (1236, 'en_US', 'Module - configuration JavaScript', '', ''), + (1237, 'en_US', 'Message - Edit JavaScript', '', ''), + (1238, 'en_US', 'Image - Edit JavaScript', '', ''), + (1239, 'en_US', 'Attributes - at the top', '', ''), + (1240, 'en_US', 'Attributes - table header', '', ''), + (1241, 'en_US', 'Attributes - table row', '', ''), + (1242, 'en_US', 'Attributes - bottom', '', ''), + (1243, 'en_US', 'Attribut - create form', '', ''), + (1244, 'en_US', 'Attribut - delete form', '', ''), + (1245, 'en_US', 'Attribut - add to all form', '', ''), + (1246, 'en_US', 'Attribut - remove to all form', '', ''), + (1247, 'en_US', 'Attributes - JavaScript', '', ''), + (1248, 'en_US', 'Logs - at the top', '', ''), + (1249, 'en_US', 'Logs - bottom', '', ''), + (1250, 'en_US', 'Logs - JavaScript', '', ''), + (1251, 'en_US', 'Folder - Edit JavaScript', '', ''), + (1252, 'en_US', 'Hooks - at the top', '', ''), + (1253, 'en_US', 'Hooks - table header', '', ''), + (1254, 'en_US', 'Hooks - table row', '', ''), + (1255, 'en_US', 'Hooks - bottom', '', ''), + (1256, 'en_US', 'Hook - create form', '', ''), + (1257, 'en_US', 'Hook - delete form', '', ''), + (1258, 'en_US', 'Hooks - JavaScript', '', ''), + (1259, 'en_US', 'Layout - CSS', '', ''), + (1260, 'en_US', 'Layout - before topbar', '', ''), + (1261, 'en_US', 'Layout - inside top bar', '', ''), + (1262, 'en_US', 'Layout - after top bar', '', ''), + (1263, 'en_US', 'Layout - before top menu', '', ''), + (1264, 'en_US', 'Layout - in top menu items', '', ''), + (1265, 'en_US', 'Layout - after top menu', '', ''), + (1266, 'en_US', 'Layout - before footer', '', ''), + (1267, 'en_US', 'Layout - in footer', '', ''), + (1268, 'en_US', 'Layout - after footer', '', ''), + (1269, 'en_US', 'Layout - JavaScript', '', ''), + (1270, 'en_US', 'Layout - at the top of the top bar', '', ''), + (1271, 'en_US', 'Layout - at the bottom of the top bar', '', ''), + (1272, 'en_US', 'Layout - in the menu customers', '', ''), + (1273, 'en_US', 'Layout - in the menu orders', '', ''), + (1274, 'en_US', 'Layout - in the menu catalog', '', ''), + (1275, 'en_US', 'Layout - in the menu folders', '', ''), + (1276, 'en_US', 'Layout - in the menu tools', '', ''), + (1277, 'en_US', 'Layout - in the menu modules', '', ''), + (1278, 'en_US', 'Layout - in the menu configuration', '', ''), + (1279, 'en_US', 'Brand - Edit JavaScript', '', ''), + (1280, 'en_US', 'Home - block', '', ''), + (1281, 'en_US', 'Brands - at the top', '', ''), + (1282, 'en_US', 'Brands - table header', '', ''), + (1283, 'en_US', 'Brands - table row', '', ''), + (1284, 'en_US', 'Brands - bottom', '', ''), + (1285, 'en_US', 'Brand - create form', '', ''), + (1286, 'en_US', 'Brand - delete form', '', ''), + (1287, 'en_US', 'Brand - JavaScript', '', ''), + (1288, 'en_US', 'Exports - at the top', '', ''), + (1289, 'en_US', 'Exports - at the bottom of a category', '', ''), + (1290, 'en_US', 'Exports - at the bottom of column 1', '', ''), + (1291, 'en_US', 'Exports - JavaScript', '', ''), + (1292, 'en_US', 'Export - JavaScript', '', ''), + (1293, 'en_US', 'Brand - content', '', ''), + (1294, 'en_US', 'Customer - order table header', '', ''), + (1295, 'en_US', 'Customer - order table row', '', ''), + + (2001, 'en_US', 'Invoice - CSS', '', ''), + (2002, 'en_US', 'Invoice - in the header', '', ''), + (2003, 'en_US', 'Invoice - at the top of the footer', '', ''), + (2004, 'en_US', 'Invoice - imprint', '', ''), + (2005, 'en_US', 'Invoice - at the bottom of the footer', '', ''), + (2006, 'en_US', 'Invoice - at the bottom of information area', '', ''), + (2007, 'en_US', 'Invoice - after the information area', '', ''), + (2008, 'en_US', 'Invoice - delivery address', '', ''), + (2009, 'en_US', 'Invoice - after addresse area', '', ''), + (2010, 'en_US', 'Invoice - after product listing', '', ''), + (2011, 'en_US', 'Invoice - after the order summary', '', ''), + (2012, 'en_US', 'Delivery - CSS', '', ''), + (2013, 'en_US', 'Delivery - in the header', '', ''), + (2014, 'en_US', 'Delivery - at the top of the footer', '', ''), + (2015, 'en_US', 'Delivery - imprint', '', ''), + (2016, 'en_US', 'Delivery - at the bottom of the footer', '', ''), + (2017, 'en_US', 'Delivery - at the bottom of information area', '', ''), + (2018, 'en_US', 'Delivery - after the information area', '', ''), + (2019, 'en_US', 'Delivery - delivery address', '', ''), + (2020, 'en_US', 'Delivery - after addresse area', '', ''), + (2021, 'en_US', 'Delivery - after the order summary', '', ''), + + (2022, 'en_US', 'Order confirmation - after the order summary', '', ''), + + (2023, 'en_US', 'Where the WYSIWYG editor is required', '', ''), + (1, 'es_ES', 'Opción de factura - en la parte superior', '', ''), + (2, 'es_ES', 'Opción de factura - dirección de envío', '', ''), + (3, 'es_ES', 'Opción de factura - zona de pago extra', '', ''), + (4, 'es_ES', 'Opción de factura - en la parte inferior de la factura', '', ''), + (5, 'es_ES', 'Opción de factura - después de la inicialización de javascript', '', ''), + (6, 'es_ES', 'Opción de factura - hoja de estilos CSS', '', ''), + (7, 'es_ES', 'Opción de factura - después de incluir javascript', '', ''), + (8, 'es_ES', 'Pasarela de pago - área principal', '', ''), + (9, 'es_ES', 'Pasarela de pago - JavaScript', '', ''), + (10, 'es_ES', 'Pasarela de pago - después de inicializar JavaScript', '', ''), + (11, 'es_ES', 'Pasarela de pago - Hoja de estilos CSS', '', ''), + (12, 'es_ES', 'Pasarela de pago - después de incluir JavaScript', '', ''), + (13, 'es_ES', 'Mapa de sitio - en la base', '', ''), + (14, 'es_ES', 'Página de selección de divisa - en la parte superior', '', ''), + (15, 'es_ES', 'Página de selección de divisa - en la parte inferior', '', ''), + (16, 'es_ES', 'Página de selección de divisa - hoja de estilos CSS', '', ''), + (17, 'es_ES', 'Página de selección de divisa - después de inclusión javascript', '', ''), + (18, 'es_ES', 'Página de selección de divisa - después de la inicialización de javascript', '', ''), + (19, 'es_ES', 'Página de inicio de sesión - en la parte superior', '', ''), + (20, 'es_ES', 'Página de inicio de sesión - en la parte superior del área principal', '', ''), + (21, 'es_ES', 'Página de inicio de sesión - en la parte superior del formulario', '', ''), + (22, 'es_ES', 'Página de inicio de sesión - en la parte inferior del formulario', '', ''), + (23, 'es_ES', 'Página de inicio de sesión - en la parte inferior del área principal', '', ''), + (24, 'es_ES', 'Página de inicio de sesión - en la parte inferior', '', ''), + (25, 'es_ES', 'Página de inicio de sesión - hoja de estilos CSS', '', ''), + (26, 'es_ES', 'Página de inicio de sesión - después de incluir JavaScript', '', ''), + (27, 'es_ES', 'Página de inicio de sesión - después de la inicialización de JavaScript', '', ''), + (28, 'es_ES', 'Actualización de cuenta de cliente - encabezado', '', ''), + (29, 'es_ES', 'Actualización de cuenta de cliente - encabezado del formulario', '', ''), + (30, 'es_ES', 'Actualización de cuenta de cliente - al pie del formulario', '', ''), + (31, 'es_ES', 'Actualización de cuenta de cliente - al pie', '', ''), + (32, 'es_ES', 'Actualización de cuenta del cliente - Hoja de estilos CSS', '', ''), + (33, 'es_ES', 'Actualización de cuenta del cliente - después de incluir JavaScript', '', ''), + (34, 'es_ES', 'Actualización de cuenta de cliente - después de inicializar JavaScript', '', ''), + (35, 'es_ES', 'Carrito - En la parte superior', '', ''), + (36, 'es_ES', 'Carrito - En la parte inferior', '', ''), + (37, 'es_ES', 'Carro - después de inclusión javascript', '', ''), + (38, 'es_ES', 'Carrito - hoja de estilos CSS', '', ''), + (39, 'es_ES', 'Carro - inicialización de javascript', '', ''), + (40, 'es_ES', 'Página de contacto - en la parte superior', '', ''), + (41, 'es_ES', 'Página de contacto - en la parte superior del formulario', '', ''), + (42, 'es_ES', 'Página de contacto - en la parte inferior del formulario', '', ''), + (43, 'es_ES', 'Página de contacto - en la parte inferior', '', ''), + (44, 'es_ES', 'Página de contacto - hoja de estilos CSS', '', ''), + (45, 'es_ES', 'Página de contacto - después del include de javascript', '', ''), + (46, 'es_ES', 'Página de contacto - después de la inicialización de javascript', '', ''), + (47, 'es_ES', 'Orden registrada - área principal', '', ''), + (48, 'es_ES', 'Orden registrada - Hoja de estilo CSS', '', ''), + (49, 'es_ES', 'Orden registrada - después del javascript include', '', ''), + (50, 'es_ES', 'Orden registrada - después de la inicialización de Javascript', '', ''), + (51, 'es_ES', 'Página de búsqueda - Hoja de Estilos en Cascada', '', ''), + (52, 'es_ES', 'Página de búsqueda - después de incluir JavaScript', '', ''), + (53, 'es_ES', 'Página de búsqueda - después de inicializar JavaScript', '', ''), + (54, 'es_ES', 'Registro - en la parte superior', '', ''), + (55, 'es_ES', 'Registro - en la parte superior del formulario', '', ''), + (56, 'es_ES', 'Registro - en la parte inferior del formulario', '', ''), + (57, 'es_ES', 'Registro - en la parte inferior', '', ''), + (58, 'es_ES', 'Registro - hoja de estilos CSS', '', ''), + (59, 'es_ES', 'Registro - después de incluir JavaScript', '', ''), + (60, 'es_ES', 'Registro - después de la inicialización de JavaScript', '', ''), + (61, 'es_ES', 'Contraseña perdida - en la parte superior', '', ''), + (62, 'es_ES', 'Contraseña perdida - en la parte superior del formulario', '', ''), + (63, 'es_ES', 'Contraseña perdida - en la parte inferior del formulario', '', ''), + (64, 'es_ES', 'Contraseña perdida - en la parte inferior', '', ''), + (65, 'es_ES', 'Contraseña perdida - hoja de estilos CSS', '', ''), + (66, 'es_ES', 'Contraseña perdida - después de incluir javascript', '', ''), + (67, 'es_ES', 'Contraseña perdida - inicialización de JavaScript', '', ''), + (68, 'es_ES', 'página de selección de idioma - en la parte superior', '', ''), + (69, 'es_ES', 'página de selección de idioma - en la parte inferior', '', ''), + (70, 'es_ES', 'página de selección de idioma - hoja de estilos CSS', '', ''), + (71, 'es_ES', 'página de selección de idioma - después de incluir JavaScript', '', ''), + (72, 'es_ES', 'página de selección de idioma - después de la inicialización de JavaScript', '', ''), + (73, 'es_ES', 'Página de contacto - si la respuesta es exitosa', '', ''), + (74, 'es_ES', 'Página del boletín de noticias - en la parte superior', '', ''), + (75, 'es_ES', 'Página del boletín de noticias - en la parte inferior', '', ''), + (76, 'es_ES', 'Página del boletín de noticias - hoja de estilos CSS', '', ''), + (77, 'es_ES', 'Página del boletín de noticias - después de incluir JavaScript', '', ''), + (78, 'es_ES', 'Página del boletín de noticias - después de la inicialización de JavaScript', '', ''), + (79, 'es_ES', 'Pago erróneo - Hoja de Estilos CSS', '', ''), + (80, 'es_ES', 'Pago erróneo - después de incluir JavaScript', '', ''), + (81, 'es_ES', 'Pago erróneo - inicialización de JavaScript', '', ''), + (82, 'es_ES', 'Página de contacto - en la parte superior', '', ''), + (83, 'es_ES', 'Página de contenido - en la parte superior de la zona principal', '', ''), + (84, 'es_ES', 'Página de contenido - en la parte inferior de la zona principal', '', ''), + (85, 'es_ES', 'Página de contacto - en la parte inferior', '', ''), + (86, 'es_ES', 'Página de contacto - hoja de estilos CSS', '', ''), + (87, 'es_ES', 'Página de contacto - después del include de javascript', '', ''), + (88, 'es_ES', 'Página de contacto - después de la inicialización de javascript', '', ''), + (89, 'es_ES', 'Diseño HTML - después de la etiqueta head de apertura', '', ''), + (90, 'es_ES', 'Diseño HTML - hojas de estilo CSS', '', ''), + (91, 'es_ES', 'Diseño HTML - antes de la etiqueta head de cierre', '', ''), + (92, 'es_ES', 'Diseño HTML - después de la etiqueta body de apertura', '', ''), + (93, 'es_ES', 'Diseño HTML - en la parte superior de la cabecera', '', ''), + (94, 'es_ES', 'Diseño HTML - navegación secundaria', '', ''), + (95, 'es_ES', 'Diseño HTML - navegación principal', '', ''), + (96, 'es_ES', 'Diseño HTML - en la parte inferior de la cabecera', '', ''), + (97, 'es_ES', 'Diseño HTML - antes el área de contenido principal', '', ''), + (98, 'es_ES', 'Diseño HTML - después del área de contenido principal', '', ''), + (99, 'es_ES', 'Diseño HTML - en la parte superior del pie de página', '', ''), + (100, 'es_ES', 'Diseño HTML - cuerpo del pie de página', '', ''), + (101, 'es_ES', 'Diseño HTML - parte inferior del pie de página', '', ''), + (102, 'es_ES', 'Diseño HTML - después de incluir javascript', '', ''), + (103, 'es_ES', 'Diseño HTML - inicialización de JavaScript', '', ''), + (104, 'es_ES', 'Diseño HTML - antes de la etiqueta body de cierre', '', ''), + (105, 'es_ES', 'Página 404 - área de contenido', '', ''), + (106, 'es_ES', 'Página 404 - CSS Hoja de estilos', '', ''), + (107, 'es_ES', 'Página 404 - después de incluir JavaScript', '', ''), + (108, 'es_ES', 'Página 404 - después de inicializar JavaScript', '', ''), + (109, 'es_ES', 'Opción de entrega - en la cabecera', '', ''), + (110, 'es_ES', 'Opción de entrega - en la cabecera del formulario', '', ''), + (111, 'es_ES', 'Opción de entrega - en el pie del formulario', '', ''), + (112, 'es_ES', 'Elección de entrega - en el pie', '', ''), + (113, 'es_ES', 'Opción de entrega - despues de inicializar el javascript', '', ''), + (114, 'es_ES', 'Opción de entrega - CSS', '', ''), + (115, 'es_ES', 'Opción de entrega - después de incluir el javascript', '', ''), + (116, 'es_ES', 'Creación de dirección - en la parte superior', '', ''), + (117, 'es_ES', 'Creación de dirección - en la parte superior del formulario', '', ''), + (118, 'es_ES', 'Creación de dirección - en la parte inferior del formulario', '', ''), + (119, 'es_ES', 'Creación de dirección - en la parte inferior', '', ''), + (120, 'es_ES', 'Creación de dirección - hoja de estilos CSS', '', ''), + (121, 'es_ES', 'Creación de dirección- después del include javascript', '', ''), + (122, 'es_ES', 'Creación de dirección - después de la inicialización de javascript', '', ''), + (123, 'es_ES', 'Carpeta de página - en la parte superior', '', ''), + (124, 'es_ES', 'Carpeta de página - en la parte superior del área principal', '', ''), + (125, 'es_ES', 'Carpeta de página - al final del área principal', '', ''), + (126, 'es_ES', 'Carpeta de página - al final', '', ''), + (127, 'es_ES', 'Página de la carpeta - hoja de estilos CSS', '', ''), + (128, 'es_ES', 'Carpeta de página - después de incluir JavaScript', '', ''), + (129, 'es_ES', 'Carpeta de página - después de inicialización de JavaScript', '', ''), + (130, 'es_ES', 'Pedido erróneo - al tope', '', ''), + (131, 'es_ES', 'Pedido erróneo - al pie', '', ''), + (132, 'es_ES', 'Pedido erróneo - Hoja de Estilos CSS', '', ''), + (133, 'es_ES', 'Pedido erróneo - después de incluir JavaScript', '', ''), + (134, 'es_ES', 'Pedido erróneo - después de la inicialización de JavaScript', '', ''), + (135, 'es_ES', 'Página de la categoría - en la parte superior', '', ''), + (136, 'es_ES', 'Página de categoría - en la parte superior de la zona principal', '', ''), + (137, 'es_ES', 'Página de la categoría - en la parte inferior de la zona principal', '', ''), + (138, 'es_ES', 'Página de la categoría - en la parte inferior', '', ''), + (139, 'es_ES', 'Página de la categoría - hoja de estilos CSS', '', ''), + (140, 'es_ES', 'Página de la categoría - después de inclusión javascript', '', ''), + (141, 'es_ES', 'Página de la categoría - después de la inicialización de javascript', '', ''), + (142, 'es_ES', 'Actualizar dirección - en la parte superior', '', ''), + (143, 'es_ES', 'Actualizar dirección - en la parte superior del formulario', '', ''), + (144, 'es_ES', 'Actualización de dirección - en la parte inferior del formulario', '', ''), + (145, 'es_ES', 'Actualización de dirección - en la parte inferior', '', ''), + (146, 'es_ES', 'Actualización de dirección - hoja de estilos CSS', '', ''), + (147, 'es_ES', 'Actualización de dirección - tras el include javascript', '', ''), + (148, 'es_ES', 'Actualización de dirección - después de la inicialización de javascript', '', ''), + (149, 'es_ES', 'Página de inicio - Área Principal', '', ''), + (150, 'es_ES', 'Página de inicio - hoja de estilos CSS', '', ''), + (151, 'es_ES', 'Página de inicio - después de incluir JavaScript', '', ''), + (152, 'es_ES', 'Página de inicio - después de la inicialización de JavaScript', '', ''), + (153, 'es_ES', 'Cambiar contraseña - en la parte superior', '', ''), + (154, 'es_ES', 'Cambiar contraseña - en la parte inferior', '', ''), + (155, 'es_ES', 'Cambiar contraseña - hoja de estilos CSS', '', ''), + (156, 'es_ES', 'Cambiar contraseña - después de inclusión javascript', '', ''), + (157, 'es_ES', 'Cambiar contraseña - después de la inicialización de javascript', '', ''), + (158, 'es_ES', 'Página de producto - en la parte superior', '', ''), + (159, 'es_ES', 'Página de producto - Galería de fotos', '', ''), + (160, 'es_ES', 'Página de producto - en la parte superior del detalle', '', ''), + (161, 'es_ES', 'Página de producto - en la parte inferior del área de detalle', '', ''), + (162, 'es_ES', 'Página de producto - información adicional', '', ''), + (163, 'es_ES', 'Página de producto - en la parte inferior', '', ''), + (164, 'es_ES', 'Página de producto - hoja de estilos CSS', '', ''), + (165, 'es_ES', 'Página de producto - después de incluir JavaScript', '', ''), + (166, 'es_ES', 'Página de producto - después de la inicialización de Javascript', '', ''), + (167, 'es_ES', 'cuenta de cliente - en la parte superior', '', ''), + (168, 'es_ES', 'cuenta de cliente - en la parte inferior', '', ''), + (169, 'es_ES', 'cuenta de cliente - hoja de estilos CSS', '', ''), + (170, 'es_ES', 'cuenta de cliente - después de incluir JavaScript', '', ''), + (171, 'es_ES', 'cuenta de cliente - después de la inicialización de JavaScript', '', ''), + (172, 'es_ES', 'Todos los productos - en la parte superior', '', ''), + (173, 'es_ES', 'Todos los productos - en la parte inferior', '', ''), + (174, 'es_ES', 'Todos los productos - hoja de estilos CSS', '', ''), + (175, 'es_ES', 'Todos los productos - después de include javascript', '', ''), + (176, 'es_ES', 'Todos los productos - después de la inicialización de javascript', '', ''), + (177, 'es_ES', 'Ciclo del producto - en la parte superior', '', ''), + (178, 'es_ES', 'Ciclo del producto - en la parte inferior', '', ''), + (179, 'es_ES', 'Página de categoría - en la parte inferior de la barra lateral', '', ''), + (180, 'es_ES', 'Página de categoría - el cuerpo de la barra lateral', '', ''), + (181, 'es_ES', 'Página de la categoría - en la parte inferior de la barra lateral', '', ''), + (182, 'es_ES', 'Página de contenido - en la parte superior de la barra lateral', '', ''), + (183, 'es_ES', 'Página de contenido - cuerpo de la barra lateral', '', ''), + (184, 'es_ES', 'Página de contenido - en la parte inferior de la barra lateral', '', ''), + (185, 'es_ES', 'Opción de entrega - área extra', '', ''), + (186, 'es_ES', 'Opción de entrega - javascript', '', ''), + (1000, 'es_ES', 'Categoría - contenido', '', ''), + (1001, 'es_ES', 'Contenido - contenido', '', ''), + (1002, 'es_ES', 'Carpeta - contenido', '', ''), + (1003, 'es_ES', 'Orden - contenido', '', ''), + (1004, 'es_ES', 'Producto - contenido', '', ''), + (1005, 'es_ES', 'Valor Característica - encabezado de tabla', '', ''), + (1006, 'es_ES', 'Valor Característica - fila de tabla', '', ''), + (1007, 'es_ES', 'Característica - Formulario para crear valor', '', ''), + (1008, 'es_ES', 'Característica - Editar JavaScript', '', ''), + (1009, 'es_ES', 'Producto - Editar JavaScript', '', ''), + (1010, 'es_ES', 'Cupón - crear JavaScript', '', ''), + (1011, 'es_ES', 'Impuestos - formulario de actualización', '', ''), + (1012, 'es_ES', 'regla de impuesto - Editar JavaScript', '', ''), + (1013, 'es_ES', 'Herramientas - en la parte superior', '', ''), + (1014, 'es_ES', 'Herramientas - en la parte superior de la columna', '', ''), + (1015, 'es_ES', 'Herramientas - en la parte inferior de la columna 1', '', ''), + (1016, 'es_ES', 'Herramientas - parte inferior', '', ''), + (1017, 'es_ES', 'Herramientas - JavaScript', '', ''), + (1018, 'es_ES', 'Mensajes - al tope', '', ''), + (1019, 'es_ES', 'Mensajes - encabezado de la tabla', '', ''), + (1020, 'es_ES', 'Mensajes - fila de la tabla', '', ''), + (1021, 'es_ES', 'Mensajes - base', '', ''), + (1022, 'es_ES', 'Mensaje - formulario de creación', '', ''), + (1023, 'es_ES', 'Mensaje - formulario de borrado', '', ''), + (1024, 'es_ES', 'Mensajes - JavaScript', '', ''), + (1025, 'es_ES', 'Reglas de impuestos - en la parte superior', '', ''), + (1026, 'es_ES', 'Reglas de impuestos - parte inferior', '', ''), + (1027, 'es_ES', 'Impuesto - formulario de creación', '', ''), + (1028, 'es_ES', 'Impuesto - formulario de borrado', '', ''), + (1029, 'es_ES', 'regla de impuesto - formulario de creación', '', ''), + (1030, 'es_ES', 'regla de impuesto - formulario de borrado', '', ''), + (1031, 'es_ES', 'Reglas de impuestos - JavaScript', '', ''), + (1032, 'es_ES', 'Exportar - en la parte superior', '', ''), + (1033, 'es_ES', 'Exportar - en la parte inferior de una categoría', '', ''), + (1034, 'es_ES', 'Exportar - en la parte inferior de la columna 1', '', ''), + (1035, 'es_ES', 'Exportar JavaScript', '', ''), + (1036, 'es_ES', 'Exportación - JavaScript', '', ''), + (1037, 'es_ES', 'Producto - encabezado de la tabla de carpetas', '', ''), + (1038, 'es_ES', 'Producto - fila de la tabla de carpetas', '', ''), + (1039, 'es_ES', 'Producto - formato de detalles del precio', '', ''), + (1040, 'es_ES', 'Producto - Editar formulario de stock', '', ''), + (1041, 'es_ES', 'Producto - formulario de detalles de la promoción', '', ''), + (1042, 'es_ES', 'Producto - después de las combinaciones', '', ''), + (1043, 'es_ES', 'Producto - título de la lista de combinaciones', '', ''), + (1044, 'es_ES', 'Producto - después de las combinaciones', '', ''), + (1045, 'es_ES', 'Producto - Formulario para borrar combinaciones', '', ''), + (1046, 'es_ES', 'Módulos - encabezado de la tabla', '', ''), + (1047, 'es_ES', 'Módulos - fila de la tabla', '', ''), + (1048, 'es_ES', 'Divisas - Editar javaScript', '', ''), + (1049, 'es_ES', 'Categoría - encabezado de tabla de contenido', '', ''), + (1050, 'es_ES', 'Categoría - fila de la tabla de contenido', '', ''), + (1051, 'es_ES', 'Categoría - edición JavaScript', '', ''), + (1052, 'es_ES', 'Documento - edición JavaScript', '', ''), + (1053, 'es_ES', 'Cliente - en la cabecera', '', ''), + (1054, 'es_ES', 'Clientes - texto', '', ''), + (1055, 'es_ES', 'Clientes - encabezado', '', ''), + (1056, 'es_ES', 'Clientes - fila', '', ''), + (1057, 'es_ES', 'Cliente - pie', '', ''), + (1058, 'es_ES', 'Cliente - formulario creación', '', ''), + (1059, 'es_ES', 'Cliente - formulario eliminación', '', ''), + (1060, 'es_ES', 'Clientes - JavaScript', '', ''), + (1061, 'es_ES', 'Producto - contenidos del encabezado de tabla', '', ''), + (1062, 'es_ES', 'Producto - contenidos de la fila de la tabla', '', ''), + (1063, 'es_ES', 'Producto - encabezado de la tabla accesoria', '', ''), + (1064, 'es_ES', 'Producto - fila de la tabla de accesorios', '', ''), + (1065, 'es_ES', 'Producto - encabezado de la tabla de categorías', '', ''), + (1066, 'es_ES', 'Producto - fila de la tabla de categorías', '', ''), + (1067, 'es_ES', 'Producto - encabezado de la tabla de atributos', '', ''), + (1068, 'es_ES', 'Producto - fila de la tabla de atributos', '', ''), + (1069, 'es_ES', 'Producto - encabezado de la tabla de características', '', ''), + (1070, 'es_ES', 'Producto - fila de la tabla de características', '', ''), + (1071, 'es_ES', 'Plantilla - cabecera de la tabla de atributos', '', ''), + (1072, 'es_ES', 'Plantilla - fila de la tabla de atributos', '', ''), + (1073, 'es_ES', 'Plantilla - encabezado de tabla de características', '', ''), + (1074, 'es_ES', 'Plantilla - fila de la tabla de características', '', ''), + (1075, 'es_ES', 'Plantillas - en la parte superior', '', ''), + (1076, 'es_ES', 'Plantillas - encabezado de tabla', '', ''), + (1077, 'es_ES', 'Plantillas - fila de la tabla', '', ''), + (1078, 'es_ES', 'Plantillas - parte inferior', '', ''), + (1079, 'es_ES', 'Plantilla - formulario de creación', '', ''), + (1080, 'es_ES', 'Plantilla - formulario de borrado', '', ''), + (1081, 'es_ES', 'Plantillas - JavaScript', '', ''), + (1082, 'es_ES', 'Configuración - en la parte superior', '', ''), + (1083, 'es_ES', 'Configuración - en la parte superior de la zona de catálogo', '', ''), + (1084, 'es_ES', 'Configuración - en la parte inferior del catálogo', '', ''), + (1085, 'es_ES', 'Configuración - en la parte superior del área de envío', '', ''), + (1086, 'es_ES', 'Configuración - en la parte inferior de la zona de envío', '', ''), + (1087, 'es_ES', 'Configuración - en la parte superior del área del sistema', '', ''), + (1088, 'es_ES', 'Configuración - en la parte inferior de la zona del sistema', '', ''), + (1089, 'es_ES', 'Configuración - parte inferior', '', ''), + (1090, 'es_ES', 'Configuración - JavaScript', '', ''), + (1091, 'es_ES', 'Dashboard - en la parte superior', '', ''), + (1092, 'es_ES', 'Dashboard - medio', '', ''), + (1093, 'es_ES', 'Dashboard - fondo', '', ''), + (1094, 'es_ES', 'Pedidos - encabezado', '', ''), + (1095, 'es_ES', 'Pedidos - encabezado de tabla', '', ''), + (1096, 'es_ES', 'Pedidos - fila de tabla', '', ''), + (1097, 'es_ES', 'Pedidos - pie de página', '', ''), + (1098, 'es_ES', 'Pedidos - JavaScript', '', ''), + (1099, 'es_ES', 'Zona de entrega - En la cabecera', '', ''), + (1100, 'es_ES', 'Zona de entrega - en el encabezado de tabla', '', ''), + (1101, 'es_ES', 'Zona de entrega - en la fila de la tabla', '', ''), + (1102, 'es_ES', 'Zona de entrega - en el pie', '', ''), + (1103, 'es_ES', 'Zona de entrega - JavaScript', '', ''), + (1104, 'es_ES', 'Contenido - Editar JavaScript', '', ''), + (1105, 'es_ES', 'Inicio - en la parte superior', '', ''), + (1106, 'es_ES', 'Inicio - fondo', '', ''), + (1107, 'es_ES', 'Inicio - JavaScript', '', ''), + (1108, 'es_ES', 'Módulos - al inicio', '', ''), + (1109, 'es_ES', 'Módulos - base', '', ''), + (1110, 'es_ES', 'Módulos - JavaScript', '', ''), + (1111, 'es_ES', 'Idiomas - en la parte superior', '', ''), + (1112, 'es_ES', 'Idiomas - parte inferior', '', ''), + (1113, 'es_ES', 'Idioma - formulario de creación', '', ''), + (1114, 'es_ES', 'Idiomas - Formulario de borrar', '', ''), + (1115, 'es_ES', 'Idiomas - JavaScript', '', ''), + (1116, 'es_ES', 'Zona - formulario de borrado', '', ''), + (1117, 'es_ES', 'Zona de entrega - Editar JavasCript', '', ''), + (1118, 'es_ES', 'Sistema - registros de JavaScript', '', ''), + (1119, 'es_ES', 'Búsqueda - al inicio', '', ''), + (1120, 'es_ES', 'Búsqueda - base', '', ''), + (1121, 'es_ES', 'Búsqueda - JavaScript', '', ''), + (1122, 'es_ES', 'Administradores - en la parte superior', '', ''), + (1123, 'es_ES', 'Administradores - inferior', '', ''), + (1124, 'es_ES', 'Administrador - formulario de creación', '', ''), + (1125, 'es_ES', 'Administrador - formulario de actualización', '', ''), + (1126, 'es_ES', 'Administrador - formulario de eliminación', '', ''), + (1127, 'es_ES', 'Administradores - JavaScript', '', ''), + (1128, 'es_ES', NULL, '', ''), + (1129, 'es_ES', 'Configuración de envío - al inicio', '', ''), + (1130, 'es_ES', 'Configuración de envío - encabezado de tabla', '', ''), + (1131, 'es_ES', 'Configuración de envío - fila de tabla', '', ''), + (1132, 'es_ES', 'Configuración de envío - base', '', ''), + (1133, 'es_ES', 'Configuración de envío - formulario de creación', '', ''), + (1134, 'es_ES', 'Configuración de envío - formulario de borrado', '', ''), + (1135, 'es_ES', 'Configuración de envío - JavaScript', '', ''), + (1136, 'es_ES', 'Característica - ir arriba', '', ''), + (1137, 'es_ES', 'Característica - Encabezado de tabla', '', ''), + (1138, 'es_ES', 'Característica - Fila de tabla', '', ''), + (1139, 'es_ES', 'Característica - inferior', '', ''), + (1140, 'es_ES', 'Característica - formulario crear', '', ''), + (1141, 'es_ES', 'Característica - formulario borrar', '', ''), + (1142, 'es_ES', 'Característica - Agregar a todos los formularios', '', ''), + (1143, 'es_ES', 'Característica - eliminar todos los formularios', '', ''), + (1144, 'es_ES', 'Característica - JavaScript', '', ''), + (1145, 'es_ES', 'Módulo - Editar JavaScript', '', ''), + (1146, 'es_ES', NULL, '', ''), + (1147, 'es_ES', NULL, '', ''), + (1148, 'es_ES', NULL, '', ''), + (1149, 'es_ES', 'Configuración de envío - Editar', '', ''), + (1150, 'es_ES', 'Configuración de envío - formulario de borrado de país', '', ''), + (1151, 'es_ES', 'Configuración de envío - Editar JavaScript', '', ''), + (1152, 'es_ES', 'Sistema de correo - en la parte superior', '', ''), + (1153, 'es_ES', 'Sistema de correo - fondo', '', ''), + (1154, 'es_ES', 'Sistema de correo - JavaScript', '', ''), + (1155, 'es_ES', 'Categorías - en la parte superior', '', ''), + (1156, 'es_ES', 'Categorías - título', '', ''), + (1157, 'es_ES', 'Categorías - header', '', ''), + (1158, 'es_ES', 'Categorías - fila', '', ''), + (1159, 'es_ES', 'Productos - leyenda', '', ''), + (1160, 'es_ES', 'Productos - encabezado', '', ''), + (1161, 'es_ES', 'Productos - fila', '', ''), + (1162, 'es_ES', 'Categorías - inferior', '', ''), + (1163, 'es_ES', 'Categorías - en la parte inferior del catálogo', '', ''), + (1164, 'es_ES', 'Formulario de creación de la categoría-', '', ''), + (1165, 'es_ES', 'Producto - formulario de creación', '', ''), + (1166, 'es_ES', 'Categoría - formulario de eliminación', '', ''), + (1167, 'es_ES', 'Producto - formulario de borrado', '', ''), + (1168, 'es_ES', 'Categorías - JavaScript', '', ''), + (1169, 'es_ES', 'Variables - en la parte superior', '', ''), + (1170, 'es_ES', 'Variables - encabezado de tabla', '', ''), + (1171, 'es_ES', 'Variables - fila de la tabla', '', ''), + (1172, 'es_ES', 'Variables - parte inferior', '', ''), + (1173, 'es_ES', 'Variable - formulario de creación', '', ''), + (1174, 'es_ES', 'Variable - formulario de borrado', '', ''), + (1175, 'es_ES', 'Variables - JavaScript', '', ''), + (1176, 'es_ES', 'Orden - lista de productos', '', ''), + (1177, 'es_ES', 'Orden - editar JavaScript', '', ''), + (1178, 'es_ES', 'Información de tienda - JavaScript', '', ''), + (1179, 'es_ES', 'Traducciones - JavaScript', '', ''), + (1180, 'es_ES', 'Carpeta - ir arriba', '', ''), + (1181, 'es_ES', 'Carpeta - título', '', ''), + (1182, 'es_ES', 'Carpeta - encabezado', '', ''), + (1183, 'es_ES', 'Carpeta - fila', '', ''), + (1184, 'es_ES', 'Contenido - leyenda', '', ''), + (1185, 'es_ES', 'Contenido - encabezado', '', ''), + (1186, 'es_ES', 'Contenido - fila', '', ''), + (1187, 'es_ES', 'Carpeta - abajo', '', ''), + (1188, 'es_ES', NULL, '', ''), + (1189, 'es_ES', 'Contenido - formulario de creación', '', ''), + (1190, 'es_ES', NULL, '', ''), + (1191, 'es_ES', 'Contenido - Formulario para eliminar', '', ''), + (1192, 'es_ES', 'Carpeta - JavaScript', '', ''), + (1193, 'es_ES', 'Plantilla - editar JavaScript', '', ''), + (1194, 'es_ES', 'Editar JavaScript', '', ''), + (1195, 'es_ES', 'Hook - editar JavaScript', '', ''), + (1196, 'es_ES', 'Países - en la parte superior', '', ''), + (1197, 'es_ES', 'Países - encabezado de la tabla', '', ''), + (1198, 'es_ES', 'Países - fila de la tabla', '', ''), + (1199, 'es_ES', 'Países - parte inferior', '', ''), + (1200, 'es_ES', 'País - formulario de creación', '', ''), + (1201, 'es_ES', 'País - formulario para eliminar', '', ''), + (1202, 'es_ES', 'Países - JavaScript', '', ''), + (1203, 'es_ES', 'Divisas - en la parte superior', '', ''), + (1204, 'es_ES', 'Divisas - encabezado de tabla', '', ''), + (1205, 'es_ES', 'Divisas - fila de tabla', '', ''), + (1206, 'es_ES', 'Divisas - inferior', '', ''), + (1207, 'es_ES', 'Divisas - formulario de creación', '', ''), + (1208, 'es_ES', 'Moneda - Formulario de eliminación', '', ''), + (1209, 'es_ES', 'Divisas - JavaScript', '', ''), + (1210, 'es_ES', 'Cliente - Editar', '', ''), + (1211, 'es_ES', 'Cliente - formulario crear dirección', '', ''), + (1212, 'es_ES', 'Cliente - formulario de actualización de dirección', '', ''), + (1213, 'es_ES', 'Cliente - Formulario borrar dirección', '', ''), + (1214, 'es_ES', 'Cliente - Editar JavaScript', '', ''), + (1215, 'es_ES', 'Valor de atributos - encabezado de tabla', '', ''), + (1216, 'es_ES', 'Valor de atributos - fila de la tabla', '', ''), + (1217, 'es_ES', 'Valor de atributo - formulario de creación', '', ''), + (1218, 'es_ES', 'Atributo - Formulario de eliminación de id', '', ''), + (1219, 'es_ES', 'Atributo - editar JavaScript', '', ''), + (1220, 'es_ES', 'Perfiles - en la parte superior', '', ''), + (1221, 'es_ES', 'Perfiles - parte inferior', '', ''), + (1222, 'es_ES', 'Perfil - formulario de alta', '', ''), + (1223, 'es_ES', 'Perfil - formulario de borrado', '', ''), + (1224, 'es_ES', 'Perfiles - JavaScript', '', ''), + (1225, 'es_ES', 'País - editar JavaScript', '', ''), + (1226, 'es_ES', 'Perfil - editar JavaScript', '', ''), + (1227, 'es_ES', 'Variable - Editar JavaScript', '', ''), + (1228, 'es_ES', 'Cupón - actualizar JavaScript', '', ''), + (1229, 'es_ES', 'Cupón - en la parte superior', '', ''), + (1230, 'es_ES', 'Cupón - titulo de la lista', '', ''), + (1231, 'es_ES', 'Cupón - encabezado de tabla', '', ''), + (1232, 'es_ES', 'Cupón - fila de la tabla', '', ''), + (1233, 'es_ES', 'Cupón - parte inferior', '', ''), + (1234, 'es_ES', 'Cupón - enlistar JavaScript', '', ''), + (1235, 'es_ES', 'Módulo - configuración', '', ''), + (1236, 'es_ES', 'Módulo - configuración de JavaScript', '', ''), + (1237, 'es_ES', 'Mensaje - Editar JavaScript', '', ''), + (1238, 'es_ES', 'Imagen - Editar JavaScript', '', ''), + (1239, 'es_ES', 'Atributos - en la parte superior', '', ''), + (1240, 'es_ES', 'Atributos - encabezado de tabla', '', ''), + (1241, 'es_ES', 'Atributos - fila de la tabla', '', ''), + (1242, 'es_ES', 'Atributos - inferior', '', ''), + (1243, 'es_ES', 'Atributo - formulario de creación', '', ''), + (1244, 'es_ES', 'Atributo - formulario de eliminación', '', ''), + (1245, 'es_ES', 'Atributo - agregar a todos los formularios', '', ''), + (1246, 'es_ES', 'Atributo - quitar a todos', '', ''), + (1247, 'es_ES', 'Atributos - JavaScript', '', ''), + (1248, 'es_ES', 'Registros - en la parte superior', '', ''), + (1249, 'es_ES', 'Registros - inferior', '', ''), + (1250, 'es_ES', 'Registros - JavaScript', '', ''), + (1251, 'es_ES', 'Carpeta - Editar JavaScript', '', ''), + (1252, 'es_ES', 'Hooks - en la parte superior', '', ''), + (1253, 'es_ES', 'Hooks - encabezado de tabla', '', ''), + (1254, 'es_ES', 'Hooks - fila de la tabla', '', ''), + (1255, 'es_ES', 'Hooks - inferior', '', ''), + (1256, 'es_ES', NULL, '', ''), + (1257, 'es_ES', NULL, '', ''), + (1258, 'es_ES', 'Hooks - JavaScript', '', ''), + (1259, 'es_ES', 'Diseño - CSS', '', ''), + (1260, 'es_ES', 'Diseño - antes de la barra superior', '', ''), + (1261, 'es_ES', 'Diseño - en la barra superior', '', ''), + (1262, 'es_ES', 'Diseño - después de la barra superior', '', ''), + (1263, 'es_ES', 'Diseño - antes del menú principal', '', ''), + (1264, 'es_ES', 'Diseño - en la parte superior del menú artículos', '', ''), + (1265, 'es_ES', 'Diseño - después del menú principal', '', ''), + (1266, 'es_ES', 'Diseño - antes del pie de página', '', ''), + (1267, 'es_ES', 'Diseño - en el pie de página', '', ''), + (1268, 'es_ES', 'Diseño - después de pie de página', '', ''), + (1269, 'es_ES', 'Diseño - JavaScript', '', ''), + (1270, 'es_ES', 'Diseño - en la parte superior de la barra superior', '', ''), + (1271, 'es_ES', 'Diseño - en la parte inferior de la barra superior', '', ''), + (1272, 'es_ES', 'Diseño - en el menú de cliente', '', ''), + (1273, 'es_ES', 'Diseño - en el menú de pedidos', '', ''), + (1274, 'es_ES', 'Diseño - en el menú de catálogo', '', ''), + (1275, 'es_ES', 'Diseño - en el menú de carpetas', '', ''), + (1276, 'es_ES', 'Diseño - en el menú de herramientas', '', ''), + (1277, 'es_ES', 'Diseño - en el menú de módulos', '', ''), + (1278, 'es_ES', 'Diseño - en el menú de configuración', '', ''), + (1279, 'es_ES', 'Marca - editar JavaScript', '', ''), + (1280, 'es_ES', 'Inicio - bloque', '', ''), + (1281, 'es_ES', 'Marcas - en parte superior', '', ''), + (1282, 'es_ES', 'Marcas - encabezado de tabla', '', ''), + (1283, 'es_ES', 'Marcas - file de la tabla', '', ''), + (1284, 'es_ES', 'Marcas - inferior', '', ''), + (1285, 'es_ES', 'Marca - formulario de creación', '', ''), + (1286, 'es_ES', 'Marca - formulario de eliminación', '', ''), + (1287, 'es_ES', 'Marca - JavaScript', '', ''), + (1288, 'es_ES', 'Exportar - en la parte superior', '', ''), + (1289, 'es_ES', 'Exportar - en la parte inferior de una categoría', '', ''), + (1290, 'es_ES', 'Exportar - en la parte inferior de la columna 1', '', ''), + (1291, 'es_ES', 'Exportar JavaScript', '', ''), + (1292, 'es_ES', 'Exportación - JavaScript', '', ''), + (1293, 'es_ES', 'Marca - contenido', '', ''), + (1294, 'es_ES', 'Cliente - cabecera tabla de pedidos', '', ''), + (1295, 'es_ES', 'Cliente - celda tabla pedidos', '', ''), + + (2001, 'es_ES', 'Factura - CSS', '', ''), + (2002, 'es_ES', 'Factura - en la cabecera', '', ''), + (2003, 'es_ES', 'Factura - en la parte superior del pie de página', '', ''), + (2004, 'es_ES', 'Factura - pie de imprenta', '', ''), + (2005, 'es_ES', 'Factura - en la parte inferior del pie de página', '', ''), + (2006, 'es_ES', 'Factura - en la parte inferior del área de la información', '', ''), + (2007, 'es_ES', 'Factura - después del área de información', '', ''), + (2008, 'es_ES', 'Factura - dirección de envío', '', ''), + (2009, 'es_ES', 'Factura - después del área de dirección', '', ''), + (2010, 'es_ES', 'Factura - después de listado de productos', '', ''), + (2011, 'es_ES', 'Factura - después del resumen de la orden', '', ''), + (2012, 'es_ES', 'Entrega - CSS', '', ''), + (2013, 'es_ES', 'Envío - en la cabecera', '', ''), + (2014, 'es_ES', 'Envío - en la parte superior del footer', '', ''), + (2015, 'es_ES', 'Envío - imprimir', '', ''), + (2016, 'es_ES', 'Envío - En el pie del footer', '', ''), + (2017, 'es_ES', 'Envío - en el pié del área de información', '', ''), + (2018, 'es_ES', 'Entrega - después del área de información', '', ''), + (2019, 'es_ES', 'Envío - dirección de entrega', '', ''), + (2020, 'es_ES', 'Entrega - tras el área de dirección', '', ''), + (2021, 'es_ES', 'Envío - después del resumen de pedido', '', ''), + + (2022, 'es_ES', 'Confirmación de la orden - después del Resumen de la orden', '', ''), + + (2023, 'es_ES', 'Donde se requiere el editor WYSIWYG', '', ''), + (1, 'fr_FR', 'Choix du mode de paiement - en haut', '', ''), + (2, 'fr_FR', 'Choix du mode de paiement - adresse de livraison', '', ''), + (3, 'fr_FR', 'Choix du mode de paiement - zone de paiement supplémentaire', '', ''), + (4, 'fr_FR', 'Choix du mode de paiement - en bas', '', ''), + (5, 'fr_FR', 'Choix du mode de paiement - après l\'initialisation du JavaScript', '', ''), + (6, 'fr_FR', 'Choix du mode de paiement - feuille de style CSS', '', ''), + (7, 'fr_FR', 'Choix du mode de paiement - après l\'inclusion du JavaScript', '', ''), + (8, 'fr_FR', 'Passerelle de paiement - zone principale', '', ''), + (9, 'fr_FR', 'Passerelle de paiement - javascript', '', ''), + (10, 'fr_FR', 'Passerelle de paiement - après l\'initialisation du JavaScript', '', ''), + (11, 'fr_FR', 'Passerelle de paiement - feuille de style CSS', '', ''), + (12, 'fr_FR', 'Passerelle de paiement - après l\'inclusion du JavaScript', '', ''), + (13, 'fr_FR', 'Sitemap - en bas', '', ''), + (14, 'fr_FR', 'Page du choix de la device - en haut', '', ''), + (15, 'fr_FR', 'Page du choix de la device - en bas', '', ''), + (16, 'fr_FR', 'Page du choix de la device - feuille de style CSS', '', ''), + (17, 'fr_FR', 'Page du choix de la device - après l\'inclusion du JavaScript', '', ''), + (18, 'fr_FR', 'Page du choix de la device - après l\'initialisation du JavaScript', '', ''), + (19, 'fr_FR', 'Page de connexion - en haut', '', ''), + (20, 'fr_FR', 'Page de connexion - en haut de la zone principal', '', ''), + (21, 'fr_FR', 'Page de connexion - en haut du formulaire', '', ''), + (22, 'fr_FR', 'Page de connexion - en bas du formulaire', '', ''), + (23, 'fr_FR', 'Page de connexion - en bas de la zone principal', '', ''), + (24, 'fr_FR', 'Page de connexion - en bas', '', ''), + (25, 'fr_FR', 'Page de connexion - feuille de style CSS', '', ''), + (26, 'fr_FR', 'Page de connexion - après l\'inclusion du JavaScript', '', ''), + (27, 'fr_FR', 'Page de connexion - après l\'initialisation du JavaScript', '', ''), + (28, 'fr_FR', 'Modification compte client - en haut', '', ''), + (29, 'fr_FR', 'Modification compte client - en haut du formulaire', '', ''), + (30, 'fr_FR', 'Modification compte client - en bas du formulaire', '', ''), + (31, 'fr_FR', 'Modification compte client - en bas', '', ''), + (32, 'fr_FR', 'Modification compte client - feuille de style CSS', '', ''), + (33, 'fr_FR', 'Modification compte client - après l\'inclusion du JavaScript', '', ''), + (34, 'fr_FR', 'Modification compte client - après l\'initialisation du JavaScript', '', ''), + (35, 'fr_FR', 'Panier - en haut', '', ''), + (36, 'fr_FR', 'Panier - en bas', '', ''), + (37, 'fr_FR', 'Panier - après l\'inclusion du JavaScript', '', ''), + (38, 'fr_FR', 'Panier - feuille de style CSS', '', ''), + (39, 'fr_FR', 'Panier - initialisation du JavaScript', '', ''), + (40, 'fr_FR', 'Page contact - en haut', '', ''), + (41, 'fr_FR', 'Page contact - en haut du formulaire', '', ''), + (42, 'fr_FR', 'Page contact - en bas du formulaire', '', ''), + (43, 'fr_FR', 'Page contact - en bas', '', ''), + (44, 'fr_FR', 'Page contact - feuille de style CSS', '', ''), + (45, 'fr_FR', 'Page contact - après l\'inclusion du JavaScript', '', ''), + (46, 'fr_FR', 'Page contact - après l\'initialisation du JavaScript', '', ''), + (47, 'fr_FR', 'Commande terminée - zone principale', '', ''), + (48, 'fr_FR', 'Commande terminée - feuille de style CSS', '', ''), + (49, 'fr_FR', 'Commande terminée - après l\'inclusion du JavaScript', '', ''), + (50, 'fr_FR', 'Commande terminée - après l\'initialisation du JavaScript', '', ''), + (51, 'fr_FR', 'Page de recherche - feuille de style CSS', '', ''), + (52, 'fr_FR', 'Page de recherche - après l\'inclusion du JavaScript', '', ''), + (53, 'fr_FR', 'Page de recherche - après l\'initialisation du JavaScript', '', ''), + (54, 'fr_FR', 'Création de compte - en haut', '', ''), + (55, 'fr_FR', 'Création de compte - en haut du formulaire', '', ''), + (56, 'fr_FR', 'Création de compte - en bas du formulaire', '', ''), + (57, 'fr_FR', 'Création de compte - en bas', '', ''), + (58, 'fr_FR', 'Création de compte - feuille de style CSS', '', ''), + (59, 'fr_FR', 'Création de compte - après l\'inclusion du JavaScript', '', ''), + (60, 'fr_FR', 'Création de compte - après l\'initialisation du JavaScript', '', ''), + (61, 'fr_FR', 'Mot de passe perdu - en haut', '', ''), + (62, 'fr_FR', 'Mot de passe perdu - en haut du formulaire', '', ''), + (63, 'fr_FR', 'Mot de passe perdu - en bas du formulaire', '', ''), + (64, 'fr_FR', 'Mot de passe perdu - en bas', '', ''), + (65, 'fr_FR', 'Mot de passe perdu - feuille de style CSS', '', ''), + (66, 'fr_FR', 'Mot de passe perdu - après l\'inclusion du JavaScript', '', ''), + (67, 'fr_FR', 'Mot de passe perdu - initialisation du JavaScript', '', ''), + (68, 'fr_FR', 'Page du choix du langage - en haut', '', ''), + (69, 'fr_FR', 'Page du choix du langage - en bas', '', ''), + (70, 'fr_FR', 'Page du choix du langage - feuille de style CSS', '', ''), + (71, 'fr_FR', 'Page du choix du langage - après l\'inclusion du JavaScript', '', ''), + (72, 'fr_FR', 'Page du choix du langage - après l\'initialisation du JavaScript', '', ''), + (73, 'fr_FR', 'Page contact - en cas de succès', '', ''), + (74, 'fr_FR', 'Page newsletter - en haut', '', ''), + (75, 'fr_FR', 'Page newsletter - en bas', '', ''), + (76, 'fr_FR', 'Page newsletter - feuille de style CSS', '', ''), + (77, 'fr_FR', 'Page newsletter - après l\'inclusion du JavaScript', '', ''), + (78, 'fr_FR', 'Page newsletter - après l\'initialisation du JavaScript', '', ''), + (79, 'fr_FR', 'Échec du paiement - feuille de style CSS', '', ''), + (80, 'fr_FR', 'Echec du paiement - après l\'inclusion du JavaScript', '', ''), + (81, 'fr_FR', 'Echec du paiement - initialisation du JavaScript', '', ''), + (82, 'fr_FR', 'Page de contenu - en haut', '', ''), + (83, 'fr_FR', 'Page de contenu - en haut de la zone principal', '', ''), + (84, 'fr_FR', 'Page de contenu - en bas de la zone principal', '', ''), + (85, 'fr_FR', 'Page de contenu - en bas', '', ''), + (86, 'fr_FR', 'Page de contenu - feuille de style CSS', '', ''), + (87, 'fr_FR', 'Page de contenu - après l\'inclusion du JavaScript', '', ''), + (88, 'fr_FR', 'Page de contenu - après l\'initialisation du JavaScript', '', ''), + (89, 'fr_FR', 'Structure HTML - après l\'ouverture de la balise head', '', ''), + (90, 'fr_FR', 'Structure HTML - feuille de style CSS', '', ''), + (91, 'fr_FR', 'Structure HTML - avant la fin de la balise head', '', ''), + (92, 'fr_FR', 'Structure HTML - après l\'ouverture de la balise body', '', ''), + (93, 'fr_FR', 'Structure HTML - en haut du header', '', ''), + (94, 'fr_FR', 'Structure HTML - navigation secondaire', '', ''), + (95, 'fr_FR', 'Structure HTML - navigation principale', '', ''), + (96, 'fr_FR', 'Structure HTML - en bas du header', '', ''), + (97, 'fr_FR', 'Structure HTML - au dessus de la zone de contenu principale', '', ''), + (98, 'fr_FR', 'Structure HTML - en dessous de la zone de contenu principale', '', ''), + (99, 'fr_FR', 'Structure HTML - en haut du pied de page', '', ''), + (100, 'fr_FR', 'Structure HTML - corps du pied de page', '', ''), + (101, 'fr_FR', 'Structure HTML - en bas du pied de page', '', ''), + (102, 'fr_FR', 'Structure HTML - après l\'inclusion du JavaScript', '', ''), + (103, 'fr_FR', 'Structure HTML - initialisation du JavaScript', '', ''), + (104, 'fr_FR', 'Structure HTML - avant la fin de la balise body', '', ''), + (105, 'fr_FR', 'Page introuvable - zone de contenu', '', ''), + (106, 'fr_FR', 'Page introuvable - feuille de style CSS', '', ''), + (107, 'fr_FR', 'Page introuvable - après l\'inclusion du JavaScript', '', ''), + (108, 'fr_FR', 'Page introuvable - après l\'initialisation du JavaScript', '', ''), + (109, 'fr_FR', 'Choix du transporteur - en haut', '', ''), + (110, 'fr_FR', 'Choix du transporteur - en haut du formulaire', '', ''), + (111, 'fr_FR', 'Choix du transporteur - en bas du formulaire', '', ''), + (112, 'fr_FR', 'Choix du transporteur - en bas', '', ''), + (113, 'fr_FR', 'Choix du transporteur - après l\'initialisation du JavaScript', '', ''), + (114, 'fr_FR', 'Choix du transporteur - feuille de style CSS', '', ''), + (115, 'fr_FR', 'Choix du transporteur - après l\'inclusion du JavaScript', '', ''), + (116, 'fr_FR', 'Création d\'adresse - en haut', '', ''), + (117, 'fr_FR', 'Création d\'adresse - en haut du formulaire', '', ''), + (118, 'fr_FR', 'Création d\'adresse - en bas du formulaire', '', ''), + (119, 'fr_FR', 'Création d\'adresse - en bas', '', ''), + (120, 'fr_FR', 'Création d\'adresse - feuille de style CSS', '', ''), + (121, 'fr_FR', 'Création d\'adresse - après l\'inclusion du JavaScript', '', ''), + (122, 'fr_FR', 'Création d\'adresse - après l\'initialisation du JavaScript', '', ''), + (123, 'fr_FR', 'Page dossier - en haut', '', ''), + (124, 'fr_FR', 'Page dossier - en haut de la zone principale', '', ''), + (125, 'fr_FR', 'Page dossier - en bas de la zone principale', '', ''), + (126, 'fr_FR', 'Page dossier - en bas', '', ''), + (127, 'fr_FR', 'Page dossier - feuille de style CSS', '', ''), + (128, 'fr_FR', 'Page dossier - après l\'inclusion du JavaScript', '', ''), + (129, 'fr_FR', 'Page dossier - après l\'initialisation du JavaScript', '', ''), + (130, 'fr_FR', 'Échec de la commande - en haut', '', ''), + (131, 'fr_FR', 'Échec de la commande - en bas', '', ''), + (132, 'fr_FR', 'Échec de la commande - feuille de style CSS', '', ''), + (133, 'fr_FR', 'Echec de la commande - après l\'inclusion du JavaScript', '', ''), + (134, 'fr_FR', 'Echec de la commande - après l\'initialisation du JavaScript', '', ''), + (135, 'fr_FR', 'Page catégorie - en haut', '', ''), + (136, 'fr_FR', 'Page catégorie - en haut de la zone principal', '', ''), + (137, 'fr_FR', 'Page catégorie - en bas de la zone principal', '', ''), + (138, 'fr_FR', 'Page catégorie - en bas', '', ''), + (139, 'fr_FR', 'Page catégorie - feuille de style CSS', '', ''), + (140, 'fr_FR', 'Page catégorie - après l\'inclusion du JavaScript', '', ''), + (141, 'fr_FR', 'Page catégorie - après l\'initialisation du JavaScript', '', ''), + (142, 'fr_FR', 'Modification d\'adresse - en haut', '', ''), + (143, 'fr_FR', 'Modification d\'adresse - en haut du formulaire', '', ''), + (144, 'fr_FR', 'Modification d\'adresse - en bas du formulaire', '', ''), + (145, 'fr_FR', 'Modification d\'adresse - en bas', '', ''), + (146, 'fr_FR', 'Modification d\'adresse - feuille de style CSS', '', ''), + (147, 'fr_FR', 'Modification d\'adresse - après l\'inclusion du JavaScript', '', ''), + (148, 'fr_FR', 'Modification d\'adresse - après l\'initialisation du JavaScript', '', ''), + (149, 'fr_FR', 'Page d\'accueil - zone principale', '', ''), + (150, 'fr_FR', 'Page d\'accueil - feuille de style CSS', '', ''), + (151, 'fr_FR', 'Page d\'accueil - après l\'inclusion du JavaScript', '', ''), + (152, 'fr_FR', 'Page d\'accueil - après l\'initialisation du JavaScript', '', ''), + (153, 'fr_FR', 'Changement de mot de passe - en haut', '', ''), + (154, 'fr_FR', 'Changement de mot de passe - en bas', '', ''), + (155, 'fr_FR', 'Changement de mot de passe - feuille de style CSS', '', ''), + (156, 'fr_FR', 'Changement de mot de passe - après l\'inclusion du JavaScript', '', ''), + (157, 'fr_FR', 'Changement de mot de passe - après l\'initialisation du JavaScript', '', ''), + (158, 'fr_FR', 'Page produit - en haut', '', ''), + (159, 'fr_FR', 'Page produit - galerie photos', '', ''), + (160, 'fr_FR', 'Page produit - en haut de la zone détail', '', ''), + (161, 'fr_FR', 'Page produit - en dessous de la zone de détail', '', ''), + (162, 'fr_FR', 'Page produit - informations additionnelles', '', ''), + (163, 'fr_FR', 'Page produit - en bas', '', ''), + (164, 'fr_FR', 'Page produit - feuille de style CSS', '', ''), + (165, 'fr_FR', 'Page produit - après l\'inclusion du JavaScript', '', ''), + (166, 'fr_FR', 'Page produit - après l\'initialisation du JavaScript', '', ''), + (167, 'fr_FR', 'Compte client - en haut', '', ''), + (168, 'fr_FR', 'Compte client - en bas', '', ''), + (169, 'fr_FR', 'Compte client - feuille de style CSS', '', ''), + (170, 'fr_FR', 'Compte client - après l\'inclusion du JavaScript', '', ''), + (171, 'fr_FR', 'Compte client - après l\'initialisation du JavaScript', '', ''), + (172, 'fr_FR', 'Tous les produits - en haut', '', ''), + (173, 'fr_FR', 'Tous les produits - en bas', '', ''), + (174, 'fr_FR', 'Tous les produits - feuille de style CSS', '', ''), + (175, 'fr_FR', 'Tous les produits - après l\'inclusion du JavaScript', '', ''), + (176, 'fr_FR', 'Tous les produits - après l\'initialisation du JavaScript', '', ''), + (177, 'fr_FR', 'Boucle produit - en haut', '', ''), + (178, 'fr_FR', 'Boucle produit - en bas', '', ''), + (179, 'fr_FR', 'Page catégorie - en haut de la sidebar', '', ''), + (180, 'fr_FR', 'Page catégorie - le corps de la sidebar', '', ''), + (181, 'fr_FR', 'Page catégorie - en bas de la sidebar', '', ''), + (182, 'fr_FR', 'Page de contenu - en haut de la sidebar', '', ''), + (183, 'fr_FR', 'Page de contenu - le corps de la sidebar', '', ''), + (184, 'fr_FR', 'Page de contenu - en bas de la sidebar', '', ''), + (185, 'fr_FR', 'Choix du transporteur - zone supplémentaire', '', ''), + (186, 'fr_FR', 'Choix du transporteur - javascript', '', ''), + (1000, 'fr_FR', 'Catégorie - contenu', '', ''), + (1001, 'fr_FR', 'Contenu - contenu', '', ''), + (1002, 'fr_FR', 'Dossier - contenu', '', ''), + (1003, 'fr_FR', 'Commande - contenu', '', ''), + (1004, 'fr_FR', 'Produit - contenu', '', ''), + (1005, 'fr_FR', 'Valeur de caractéristiques - colonne tableau', '', ''), + (1006, 'fr_FR', 'Valeur de caractéristiques - ligne tableau', '', ''), + (1007, 'fr_FR', 'Caractéristique - Formulaire de création de valeur', '', ''), + (1008, 'fr_FR', 'Caractéristique - JavaScript modification', '', ''), + (1009, 'fr_FR', 'Produit - Modification de JavaScript', '', ''), + (1010, 'fr_FR', 'Code promo - JavaScript création', '', ''), + (1011, 'fr_FR', 'Taxes - formulaire de modification', '', ''), + (1012, 'fr_FR', 'Règle de taxe - Modification de JavaScript', '', ''), + (1013, 'fr_FR', 'Outils - en haut', '', ''), + (1014, 'fr_FR', 'Outils - en haut de la colonne', '', ''), + (1015, 'fr_FR', 'Outils - en bas de la colonne 1', '', ''), + (1016, 'fr_FR', 'Outils - en bas', '', ''), + (1017, 'fr_FR', 'Outils - JavaScript', '', ''), + (1018, 'fr_FR', 'Messages - en haut', '', ''), + (1019, 'fr_FR', 'Messages - colonne tableau', '', ''), + (1020, 'fr_FR', 'Messages - ligne tableau', '', ''), + (1021, 'fr_FR', 'Messages - bas', '', ''), + (1022, 'fr_FR', 'Message - formulaire de création', '', ''), + (1023, 'fr_FR', 'Message - formulaire de suppression', '', ''), + (1024, 'fr_FR', 'Messages - JavaScript', '', ''), + (1025, 'fr_FR', 'Règles de taxes - en haut', '', ''), + (1026, 'fr_FR', 'Règles de taxes - en bas', '', ''), + (1027, 'fr_FR', 'Taxe - formulaire de création', '', ''), + (1028, 'fr_FR', 'Taxe - formulaire de suppression', '', ''), + (1029, 'fr_FR', 'Règle de taxe - formulaire de création', '', ''), + (1030, 'fr_FR', 'Règle de taxe - formulaire de suppression', '', ''), + (1031, 'fr_FR', 'Règles de taxes - JavaScript', '', ''), + (1032, 'fr_FR', 'Exports - en haut', '', ''), + (1033, 'fr_FR', 'Exports - en bas d\'une catégorie', '', ''), + (1034, 'fr_FR', 'Exports - en bas de la colonne 1', '', ''), + (1035, 'fr_FR', 'Exports - JavaScript', '', ''), + (1036, 'fr_FR', 'Export - JavaScript', '', ''), + (1037, 'fr_FR', 'Produit - colonne tableau dossiers', '', ''), + (1038, 'fr_FR', 'Produit - ligne tableau dossiers', '', ''), + (1039, 'fr_FR', 'Produit - Formulaire détail des prix', '', ''), + (1040, 'fr_FR', 'Produit - formulaire de modification du stock', '', ''), + (1041, 'fr_FR', 'Produit - Formulaire détail des promotions', '', ''), + (1042, 'fr_FR', 'Produit - avant les déclinaisons', '', ''), + (1043, 'fr_FR', 'Produit - légende liste des déclinaisons', '', ''), + (1044, 'fr_FR', 'Produit - après les déclinaisons', '', ''), + (1045, 'fr_FR', 'Produit - formulaire de suppression de combinaison', '', ''), + (1046, 'fr_FR', 'Modules - colonne tableau', '', ''), + (1047, 'fr_FR', 'Modules - ligne tableau', '', ''), + (1048, 'fr_FR', 'Devise - JavaScript modification', '', ''), + (1049, 'fr_FR', 'Catégorie - colonne tableau contenus', '', ''), + (1050, 'fr_FR', 'Catégorie - ligne tableau contenus', '', ''), + (1051, 'fr_FR', 'Catégorie - JavaScript modification', '', ''), + (1052, 'fr_FR', 'Document - JavaScript modification', '', ''), + (1053, 'fr_FR', 'Client - en haut', '', ''), + (1054, 'fr_FR', 'Clients - légende', '', ''), + (1055, 'fr_FR', 'Clients - en-tête', '', ''), + (1056, 'fr_FR', 'Clients - ligne', '', ''), + (1057, 'fr_FR', 'Client - bas', '', ''), + (1058, 'fr_FR', 'Client - formulaire de création', '', ''), + (1059, 'fr_FR', 'Client - formulaire de suppression', '', ''), + (1060, 'fr_FR', 'Clients - JavaScript', '', ''), + (1061, 'fr_FR', 'Produit - colonne tableau contenus', '', ''), + (1062, 'fr_FR', 'Produit - ligne tableau contenus', '', ''), + (1063, 'fr_FR', 'Produit - colonne tableau accessoires', '', ''), + (1064, 'fr_FR', 'Produit - ligne tableau accessoires', '', ''), + (1065, 'fr_FR', 'Produit - colonne tableau catégories', '', ''), + (1066, 'fr_FR', 'Produit - ligne tableau catégories', '', ''), + (1067, 'fr_FR', 'Produit - colonne tableau attributs', '', ''), + (1068, 'fr_FR', 'Produit - ligne tableau attributs', '', ''), + (1069, 'fr_FR', 'Produit - colonne tableau caractéristiques', '', ''), + (1070, 'fr_FR', 'Produit - ligne tableau caractéristiques', '', ''), + (1071, 'fr_FR', 'Gabarit - colonne tableau attributs', '', ''), + (1072, 'fr_FR', 'Gabarit - ligne tableau attributs', '', ''), + (1073, 'fr_FR', 'Gabarit - colonne tableau caractéristiques', '', ''), + (1074, 'fr_FR', 'Gabarit - ligne tableau caractéristiques', '', ''), + (1075, 'fr_FR', 'Gabarits - en haut', '', ''), + (1076, 'fr_FR', 'Gabarits - colonne tableau', '', ''), + (1077, 'fr_FR', 'Gabarits - ligne tableau', '', ''), + (1078, 'fr_FR', 'Gabarits - en bas', '', ''), + (1079, 'fr_FR', 'Gabarit - formulaire de création', '', ''), + (1080, 'fr_FR', 'Gabarit - formulaire de suppression', '', ''), + (1081, 'fr_FR', 'Gabarits - JavaScript', '', ''), + (1082, 'fr_FR', 'Configuration - en haut', '', ''), + (1083, 'fr_FR', 'Configuration - en haut de la zone catalogue', '', ''), + (1084, 'fr_FR', 'Configuration - en bas du catlogue', '', ''), + (1085, 'fr_FR', 'Configuration - en haut de la zone livraison', '', ''), + (1086, 'fr_FR', 'Configuration - en bas de la zone livraison', '', ''), + (1087, 'fr_FR', 'Configuration - en haut de la zone système', '', ''), + (1088, 'fr_FR', 'Configuration - en bas de la zone système', '', ''), + (1089, 'fr_FR', 'Configuration - bas', '', ''), + (1090, 'fr_FR', 'Configuration - JavaScript', '', ''), + (1091, 'fr_FR', 'Tableau de bord - en haut', '', ''), + (1092, 'fr_FR', 'Tableau de bord - au milieu', '', ''), + (1093, 'fr_FR', 'Tableau de bord - bas', '', ''), + (1094, 'fr_FR', 'Commandes - en haut', '', ''), + (1095, 'fr_FR', 'Commandes - colonne tableau', '', ''), + (1096, 'fr_FR', 'Commandes - ligne tableau', '', ''), + (1097, 'fr_FR', 'Commandes - en bas', '', ''), + (1098, 'fr_FR', 'Commandes - JavaScript', '', ''), + (1099, 'fr_FR', 'Zone de livraison - en haut', '', ''), + (1100, 'fr_FR', 'Zone de livraison - colonne tableau', '', ''), + (1101, 'fr_FR', 'Zone de livraison - ligne tableau', '', ''), + (1102, 'fr_FR', 'Zone de livraison - bas', '', ''), + (1103, 'fr_FR', 'Zone de livraison - JavaScript', '', ''), + (1104, 'fr_FR', 'Contenu - JavaScript modification', '', ''), + (1105, 'fr_FR', 'Accueil - en haut', '', ''), + (1106, 'fr_FR', 'Accueil - bas', '', ''), + (1107, 'fr_FR', 'Accueil - JavaScript', '', ''), + (1108, 'fr_FR', 'Modules - en haut', '', ''), + (1109, 'fr_FR', 'Modules - bas', '', ''), + (1110, 'fr_FR', 'Modules - JavaScript', '', ''), + (1111, 'fr_FR', 'Langages - en haut', '', ''), + (1112, 'fr_FR', 'Langages - bas', '', ''), + (1113, 'fr_FR', 'Langage - formulaire de création', '', ''), + (1114, 'fr_FR', 'Langages - formulaire de suppression', '', ''), + (1115, 'fr_FR', 'Langages - JavaScript', '', ''), + (1116, 'fr_FR', 'Zone - formulaire de suppression', '', ''), + (1117, 'fr_FR', 'Zone de livraison - JavaScript modification', '', ''), + (1118, 'fr_FR', 'Système - logs JavaScript', '', ''), + (1119, 'fr_FR', 'Recherche - en haut', '', ''), + (1120, 'fr_FR', 'Recherche - en bas', '', ''), + (1121, 'fr_FR', 'Recherche - JavaScript', '', ''), + (1122, 'fr_FR', 'Administateurs - en haut', '', ''), + (1123, 'fr_FR', 'Administateurs - bas', '', ''), + (1124, 'fr_FR', 'Administateur - formulaire de création', '', ''), + (1125, 'fr_FR', 'Administateur - formulaire de modification', '', ''), + (1126, 'fr_FR', 'Administateur - formulaire de suppression', '', ''), + (1127, 'fr_FR', 'Administateurs - JavaScript', '', ''), + (1128, 'fr_FR', 'Module hook - Modification de JavaScript', '', ''), + (1129, 'fr_FR', 'Configuration du transport - en haut', '', ''), + (1130, 'fr_FR', 'Configuration du transport - colonne tableau', '', ''), + (1131, 'fr_FR', 'Configuration du transport - ligne tableau', '', ''), + (1132, 'fr_FR', 'Configuration du transport - en bas', '', ''), + (1133, 'fr_FR', 'Configuration du transport - formulaire de création', '', ''), + (1134, 'fr_FR', 'Configuration du transport - formulaire de suppression', '', ''), + (1135, 'fr_FR', 'Configuration du transport - JavaScript', '', ''), + (1136, 'fr_FR', 'Caractéristiques - en haut', '', ''), + (1137, 'fr_FR', 'Caractéristiques - colonne tableau', '', ''), + (1138, 'fr_FR', 'Caractéristiques - ligne tableau', '', ''), + (1139, 'fr_FR', 'Caractéristiques - bas', '', ''), + (1140, 'fr_FR', 'Caractéristique - formulaire de création', '', ''), + (1141, 'fr_FR', 'Caractéristique - formulaire de suppression', '', ''), + (1142, 'fr_FR', 'Caractéristique - formulaire ajouter à tous', '', ''), + (1143, 'fr_FR', 'Caractéristique - formulaire de suppression multiple', '', ''), + (1144, 'fr_FR', 'Caractéristiques - JavaScript', '', ''), + (1145, 'fr_FR', 'Module - Modification de JavaScript', '', ''), + (1146, 'fr_FR', 'Module hook - formulaire de création', '', ''), + (1147, 'fr_FR', 'Module hook - formulaire de suppression', '', ''), + (1148, 'fr_FR', 'Point d\'accroche des modules - Javascript', '', ''), + (1149, 'fr_FR', 'Configuration du transport - Modification', '', ''), + (1150, 'fr_FR', 'Configuration du transport - formulaire de suppression de pays', '', ''), + (1151, 'fr_FR', 'Configuration du transport - Modification de JavaScript', '', ''), + (1152, 'fr_FR', 'Envoi des e-mails - en haut', '', ''), + (1153, 'fr_FR', 'Envoi des e-mails - en bas', '', ''), + (1154, 'fr_FR', 'Envoi des e-mails - JavaScript', '', ''), + (1155, 'fr_FR', 'Catégories - en haut', '', ''), + (1156, 'fr_FR', 'Catégories - légende', '', ''), + (1157, 'fr_FR', 'Catégories - en-tête', '', ''), + (1158, 'fr_FR', 'Catégories - ligne', '', ''), + (1159, 'fr_FR', 'Produits - légende', '', ''), + (1160, 'fr_FR', 'Produits - en-tête', '', ''), + (1161, 'fr_FR', 'Produits - ligne', '', ''), + (1162, 'fr_FR', 'Catégories - bas', '', ''), + (1163, 'fr_FR', 'Catégories - en bas du catalogue', '', ''), + (1164, 'fr_FR', 'Catégorie - formulaire de création', '', ''), + (1165, 'fr_FR', 'Produit - formulaire de création', '', ''), + (1166, 'fr_FR', 'Catégorie - formulaire de suppression', '', ''), + (1167, 'fr_FR', 'Produit - formulaire de suppression', '', ''), + (1168, 'fr_FR', 'Catégories - JavaScript', '', ''), + (1169, 'fr_FR', 'Variables - en haut', '', ''), + (1170, 'fr_FR', 'Variables - colonne tableau', '', ''), + (1171, 'fr_FR', 'Variables - ligne tableau', '', ''), + (1172, 'fr_FR', 'Variables - en bas', '', ''), + (1173, 'fr_FR', 'Variable - formulaire de création', '', ''), + (1174, 'fr_FR', 'Variable - formulaire de suppression', '', ''), + (1175, 'fr_FR', 'Variables - JavaScript', '', ''), + (1176, 'fr_FR', 'Commande - liste produit', '', ''), + (1177, 'fr_FR', 'Commande - Modification de JavaScript', '', ''), + (1178, 'fr_FR', 'Information boutique - JavaScript', '', ''), + (1179, 'fr_FR', 'Traductions - JavaScript', '', ''), + (1180, 'fr_FR', 'Dossiers - en haut', '', ''), + (1181, 'fr_FR', 'Dossiers - légende', '', ''), + (1182, 'fr_FR', 'Dossiers - en-tête', '', ''), + (1183, 'fr_FR', 'Dossiers - ligne', '', ''), + (1184, 'fr_FR', 'Contenus - légende', '', ''), + (1185, 'fr_FR', 'Contenus - en-tête', '', ''), + (1186, 'fr_FR', 'Contenus - ligne', '', ''), + (1187, 'fr_FR', 'Dossiers - bas', '', ''), + (1188, 'fr_FR', 'Dossier - formulaire de création', '', ''), + (1189, 'fr_FR', 'Contenu - formulaire de création', '', ''), + (1190, 'fr_FR', 'Dossier - formulaire de suppression', '', ''), + (1191, 'fr_FR', 'Contenu - formulaire de suppression', '', ''), + (1192, 'fr_FR', 'Dossiers - JavaScript', '', ''), + (1193, 'fr_FR', 'Gabarit - Modification de JavaScript', '', ''), + (1194, 'fr_FR', 'Taxe - Modification de JavaScript', '', ''), + (1195, 'fr_FR', 'Point d\'accroche - JavaScript modification', '', ''), + (1196, 'fr_FR', 'Pays - en haut', '', ''), + (1197, 'fr_FR', 'Pays - colonne tableau', '', ''), + (1198, 'fr_FR', 'Pays - ligne tableau', '', ''), + (1199, 'fr_FR', 'Pays - bas', '', ''), + (1200, 'fr_FR', 'Pays - formulaire de création', '', ''), + (1201, 'fr_FR', 'Pays - formulaire de suppression', '', ''), + (1202, 'fr_FR', 'Pays - JavaScript', '', ''), + (1203, 'fr_FR', 'Devises - en haut', '', ''), + (1204, 'fr_FR', 'Devises - colonne tableau', '', ''), + (1205, 'fr_FR', 'Devises - ligne tableau', '', ''), + (1206, 'fr_FR', 'Devises - bas', '', ''), + (1207, 'fr_FR', 'Devise - formulaire de création', '', ''), + (1208, 'fr_FR', 'Devise - formulaire de suppression', '', ''), + (1209, 'fr_FR', 'Devises - JavaScript', '', ''), + (1210, 'fr_FR', 'Client - Modification', '', ''), + (1211, 'fr_FR', 'Client - formulaire de création d\'adresse', '', ''), + (1212, 'fr_FR', 'Client - formulaire de Modification d\'adresse', '', ''), + (1213, 'fr_FR', 'Client - formulaire de suppression adresse', '', ''), + (1214, 'fr_FR', 'Client - JavaScript modification', '', ''), + (1215, 'fr_FR', 'Valeurs des attributs - colonne tableau', '', ''), + (1216, 'fr_FR', 'Valeurs des attributs - ligne tableau', '', ''), + (1217, 'fr_FR', 'Valeur d\'attribut - formulaire de création', '', ''), + (1218, 'fr_FR', 'Attribut - formulaire de suppression ID', '', ''), + (1219, 'fr_FR', 'Attribut - JavaScript modification', '', ''), + (1220, 'fr_FR', 'Profils - en haut', '', ''), + (1221, 'fr_FR', 'Profils - en bas', '', ''), + (1222, 'fr_FR', 'Profil - formulaire de création', '', ''), + (1223, 'fr_FR', 'Profil - formulaire de suppression', '', ''), + (1224, 'fr_FR', 'Profils - JavaScript', '', ''), + (1225, 'fr_FR', 'Pays - JavaScript modification', '', ''), + (1226, 'fr_FR', 'Profil - Modification de JavaScript', '', ''), + (1227, 'fr_FR', 'Variable - Modification de JavaScript', '', ''), + (1228, 'fr_FR', 'Code promo - JavaScript modification', '', ''), + (1229, 'fr_FR', 'Code promo - en haut', '', ''), + (1230, 'fr_FR', 'Code promo - légende liste', '', ''), + (1231, 'fr_FR', 'Code promo - colonne tableau', '', ''), + (1232, 'fr_FR', 'Code promo - ligne tableau', '', ''), + (1233, 'fr_FR', 'Code promo - bas', '', ''), + (1234, 'fr_FR', 'Code promo - JavaScript des listes', '', ''), + (1235, 'fr_FR', 'Module - configuration', '', ''), + (1236, 'fr_FR', 'Module - JavaScript configuration', '', ''), + (1237, 'fr_FR', 'Message - Modification de JavaScript', '', ''), + (1238, 'fr_FR', 'Image - Modification de JavaScript', '', ''), + (1239, 'fr_FR', 'Attributs - en haut', '', ''), + (1240, 'fr_FR', 'Attributs - colonne tableau', '', ''), + (1241, 'fr_FR', 'Attributs - ligne tableau', '', ''), + (1242, 'fr_FR', 'Attributs - bas', '', ''), + (1243, 'fr_FR', 'Attribut - formulaire de création', '', ''), + (1244, 'fr_FR', 'Attribut - formulaire de suppression', '', ''), + (1245, 'fr_FR', 'Attribut - formulaire ajouter à tous', '', ''), + (1246, 'fr_FR', 'Attribut - formulaire de suppression multiple', '', ''), + (1247, 'fr_FR', 'Attributs - JavaScript', '', ''), + (1248, 'fr_FR', 'Logs - en haut', '', ''), + (1249, 'fr_FR', 'Logs - bas', '', ''), + (1250, 'fr_FR', 'Journaux - JavaScript', '', ''), + (1251, 'fr_FR', 'Dossier - JavaScript modification', '', ''), + (1252, 'fr_FR', 'Point d\'accroches - en haut', '', ''), + (1253, 'fr_FR', 'Point d\'accroches - colonne tableau', '', ''), + (1254, 'fr_FR', 'Point d\'accroches - ligne tableau', '', ''), + (1255, 'fr_FR', 'Point d\'accroches - bas', '', ''), + (1256, 'fr_FR', 'Point d\'accroche - formulaire de création', '', ''), + (1257, 'fr_FR', 'Point d\'accroche - formulaire de suppression', '', ''), + (1258, 'fr_FR', 'Points d\'accroche - Javascript', '', ''), + (1259, 'fr_FR', 'Mise en page - CSS', '', ''), + (1260, 'fr_FR', 'Mise en page - avant la barre de titre', '', ''), + (1261, 'fr_FR', 'Mise en page - dans la barre de titre', '', ''), + (1262, 'fr_FR', 'Mise en page - après la barre de titre', '', ''), + (1263, 'fr_FR', 'Mise en page - avant le menu haut', '', ''), + (1264, 'fr_FR', 'Mise en page - éléments du menu haut', '', ''), + (1265, 'fr_FR', 'Mise en page - après le menu haut', '', ''), + (1266, 'fr_FR', 'Mise en page - avant le pied de page', '', ''), + (1267, 'fr_FR', 'Mise en page - dans le pied de page', '', ''), + (1268, 'fr_FR', 'Mise en page - après le pied de page', '', ''), + (1269, 'fr_FR', 'Mise en page - JavaScript', '', ''), + (1270, 'fr_FR', 'Mise en page - en haut de la barre supérieure', '', ''), + (1271, 'fr_FR', 'Mise en page - en bas de la barre supérieure', '', ''), + (1272, 'fr_FR', 'Mise en page - dans le menu clients', '', ''), + (1273, 'fr_FR', 'Mise en page - dans le menu commandes', '', ''), + (1274, 'fr_FR', 'Mise en page - dans le menu catalogue', '', ''), + (1275, 'fr_FR', 'Mise en page - dans le menu dossiers', '', ''), + (1276, 'fr_FR', 'Mise en page - dans le menu outils', '', ''), + (1277, 'fr_FR', 'Mise en page - dans le menu modules', '', ''), + (1278, 'fr_FR', 'Mise en page - dans le menu configuration', '', ''), + (1279, 'fr_FR', 'Marque - Modification du JavaScript', '', ''), + (1280, 'fr_FR', 'Accueil - bloc', '', ''), + (1281, 'fr_FR', 'Marques - en haut', '', ''), + (1282, 'fr_FR', 'Marques - colonne tableau', '', ''), + (1283, 'fr_FR', 'Marques - ligne tableau', '', ''), + (1284, 'fr_FR', 'Marques - bas', '', ''), + (1285, 'fr_FR', 'Marque - formulaire de création', '', ''), + (1286, 'fr_FR', 'Marque - formulaire de suppression', '', ''), + (1287, 'fr_FR', 'Marque - JavaScript', '', ''), + (1288, 'fr_FR', 'Exports - en haut', '', ''), + (1289, 'fr_FR', 'Exports - en bas d\'une catégorie', '', ''), + (1290, 'fr_FR', 'Exports - en bas de la colonne 1', '', ''), + (1291, 'fr_FR', 'Exports - JavaScript', '', ''), + (1292, 'fr_FR', 'Export - JavaScript', '', ''), + (1293, 'fr_FR', 'Marque - contenu', '', ''), + (1294, 'fr_FR', 'Client - colonne tableau commande', '', ''), + (1295, 'fr_FR', 'Client - ligne tableau commande', '', ''), + + (2001, 'fr_FR', 'Facture - CSS', '', ''), + (2002, 'fr_FR', 'Facture - dans l\'en-tête', '', ''), + (2003, 'fr_FR', 'Facture - en haut du pied de page', '', ''), + (2004, 'fr_FR', 'Facture - mentions légales', '', ''), + (2005, 'fr_FR', 'Facture - en bas du pied de page', '', ''), + (2006, 'fr_FR', 'Facture - en bas de la zone d\'informations', '', ''), + (2007, 'fr_FR', 'Facture - après la zone d\'informations', '', ''), + (2008, 'fr_FR', 'Facture - adresse de livraison', '', ''), + (2009, 'fr_FR', 'Facture - après la zone d\'adresses', '', ''), + (2010, 'fr_FR', 'Facture - après la liste des produits', '', ''), + (2011, 'fr_FR', 'Facture - après le résumé de la commande', '', ''), + (2012, 'fr_FR', 'Bon de livraison - CSS', '', ''), + (2013, 'fr_FR', 'Bon de livraison - dans l\'en-tête', '', ''), + (2014, 'fr_FR', 'Bon de livraison - en haut du pied de page', '', ''), + (2015, 'fr_FR', 'Bon de livraison - mentions légales', '', ''), + (2016, 'fr_FR', 'Bon de livraison - en bas du pied de page', '', ''), + (2017, 'fr_FR', 'Bon de livraison - en bas de la zone d\'informations', '', ''), + (2018, 'fr_FR', 'Bon de livraison - après la zone d\'informations', '', ''), + (2019, 'fr_FR', 'Bon de livraison - adresse de livraison', '', ''), + (2020, 'fr_FR', 'Bon de livraison - après la zone d\'adresses', '', ''), + (2021, 'fr_FR', 'Bon de livraison - après le résumé de la commande', '', ''), + + (2022, 'fr_FR', 'Confirmation de commande - après les récapitulatif de commande', '', ''), + + (2023, 'fr_FR', 'Partout ou l\'éditeur WYSIWYG est nécessaire', '', '') +; + +# ====================================================================================================================== +# Image / Document visible +# ====================================================================================================================== + +ALTER TABLE `product_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `product_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `category_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `category_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `content_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `content_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `folder_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `folder_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `module_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; +ALTER TABLE `brand_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `brand_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +-- Add version to customer +ALTER TABLE `customer` + ADD COLUMN `version` INTEGER DEFAULT 0 +; + +ALTER TABLE `customer` + ADD COLUMN `version_created_at` DATETIME +; + +ALTER TABLE `customer` + ADD COLUMN `version_created_by` VARCHAR(100) +; + +-- --------------------------------------------------------------------- +-- customer_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `customer_version`; + +CREATE TABLE `customer_version` +( + `id` INTEGER NOT NULL, + `ref` VARCHAR(50), + `title_id` INTEGER NOT NULL, + `firstname` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(255) NOT NULL, + `email` VARCHAR(255), + `password` VARCHAR(255), + `algo` VARCHAR(128), + `reseller` TINYINT, + `lang` VARCHAR(10), + `sponsor` VARCHAR(50), + `discount` FLOAT, + `remember_me_token` VARCHAR(255), + `remember_me_serial` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + `order_ids` TEXT, + `order_versions` TEXT, + PRIMARY KEY (`id`,`version`), + CONSTRAINT `customer_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `customer` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + + +# ====================================================================================================================== +# Order placed notification +# ====================================================================================================================== + +SELECT @store_email := `value` FROM `config` where name='store_email'; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('store_notification_emails', IFNULL(@store_email, ''), 1, 1, NOW(), NOW()); + +SELECT @max_id := MAX(`id`) FROM `message`; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'order_notification', NULL, NULL, 'order_notification.txt', NULL, 'order_notification.html', NOW(), NOW()), + (@max_id+2, 'customer_account_changed', 0, NULL, 'account_changed_by_admin.txt', NULL, 'account_changed_by_admin.html', NOW(), NOW()), + (@max_id+3, 'customer_account_created', 0, NULL, 'account_created_by_admin.txt', NULL, 'account_created_by_admin.html', NOW(), NOW()); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES + (@max_id+1, 'de_DE', 'Gesendete Nachricht wenn eine neue Bestellung erteilt wird.', 'Neue Bestellung {$order_ref} für {config key=\"store_name\"}', NULL, NULL), + (@max_id+2, 'de_DE', 'Mail an den Kunden geschickt, wenn sein Passwort oder E-Mail von einem Administrator im Back-Office geändert werden', 'Ihre Konto-Zugriff für {config key=\"store_name\"} wurde geändert', NULL, NULL), + (@max_id+3, 'de_DE', 'Mail an den Kunden geschickt, wenn sein Konto von einem Administrator im Back-Office erstellt wird', 'Ein Konto {config key=\"store_name\"} wurde für Sie erstellt.', NULL, NULL), + (@max_id+1, 'en_US', 'Message sent to the shop owner when a new order is placed', 'New order {$order_ref} placed on {config key=\"store_name\"}', NULL, NULL), + (@max_id+2, 'en_US', 'Mail sent to the customer when its password or email is changed in the back-office', 'Your account information on {config key=\"store_name\"} has been changed.', NULL, NULL), + (@max_id+3, 'en_US', 'Mail sent to the customer when its account is created by an administrator in the back-office', 'A {config key=\"store_name\"} account has been created for you', NULL, NULL), + (@max_id+1, 'es_ES', 'Mensaje enviado al propietario de la tienda cuando se envía una nueva orden', 'Nueva orden {$order_ref} ubicada en {tecla config = \"store_name\"}', NULL, NULL), + (@max_id+2, 'es_ES', 'Correo enviado al cliente cuando se cambia su contraseña o correo electrónico en el back-office', 'La información de su cuenta en {tecla config = \"store_name\"} ha sido cambiada.', NULL, NULL), + (@max_id+3, 'es_ES', 'Correo enviado al cliente cuando se crea su cuenta por un administrador en el back-office', 'Una {config key=\"store_name\"} cuenta ha sido creada para ti', NULL, NULL), + (@max_id+1, 'fr_FR', 'Message envoyé au gestionnaire de la boutique lors d\'une nouvelle commande.', 'Nouvelle commande {$order_ref} reçue sur {config key=\"store_name\"}', NULL, NULL), + (@max_id+2, 'fr_FR', 'Message envoyé au client lorsque son mot de passe ou son email est changé dans le back-office', 'L\'accès à votre compte {config key=\"store_name\"} a changé', NULL, NULL), + (@max_id+3, 'fr_FR', 'Mail envoyé au client lorsque son compte est créé depuis le back-office par un administrateur', 'Un compte {config key=\"store_name\"} vient d\'être créé pour vous.', NULL, NULL) +; + +# ====================================================================================================================== +# Add Virtual product +# ====================================================================================================================== + +ALTER TABLE `product` + ADD `virtual` TINYINT DEFAULT 0 NOT NULL + AFTER `ref`; + +ALTER TABLE `product_version` + ADD `virtual` TINYINT DEFAULT 0 NOT NULL + AFTER `ref`; + + +ALTER TABLE `order_product` + ADD `virtual` TINYINT DEFAULT 0 NOT NULL + AFTER `postscriptum`; + +ALTER TABLE `order_product` + ADD `virtual_document` VARCHAR(255) + AFTER `virtual`; + + +# ====================================================================================================================== +# Add Meta data +# ====================================================================================================================== + +DROP TABLE IF EXISTS `meta_data`; + +CREATE TABLE `meta_data` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `meta_key` VARCHAR(100) NOT NULL, + `element_key` VARCHAR(100) NOT NULL, + `element_id` INTEGER NOT NULL, + `is_serialized` TINYINT(1) NOT NULL, + `value` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `meta_data_key_element_idx` (`meta_key`, `element_key`, `element_id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +# ====================================================================================================================== +# Allow negative stock +# ====================================================================================================================== + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES + ('allow_negative_stock', '0', 0, 0, NOW(), NOW()); + +SELECT @max_id := MAX(`id`) FROM `config`; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max_id, 'de_DE', 'Negativen Lagerbestand erlauben (1) oder nicht (0)(Standartwert 0)', NULL, NULL, NULL), +(@max_id, 'en_US', 'Allow negative product stock (1) or not (0, default)', NULL, NULL, NULL), +(@max_id, 'es_ES', 'Permite valores negativos producto (1) o no (valor por defecto 0,)', NULL, NULL, NULL), +(@max_id, 'fr_FR', 'Autoriser le stock négatif (1) ou pas (0) (0 par défaut)', NULL, NULL, NULL) +; + +# ====================================================================================================================== +# Module configuration +# ====================================================================================================================== + +-- --------------------------------------------------------------------- +-- module_config +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_config`; + +CREATE TABLE `module_config` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `name` VARCHAR(255) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_module_id_name` (`module_id`, `name`), + CONSTRAINT `fk_module_config_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_config_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_config_i18n`; + +CREATE TABLE `module_config_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `value` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `module_config_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `module_config` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +# ====================================================================================================================== +# Update of short title Mister +# ====================================================================================================================== + +-- en_US +UPDATE `customer_title_i18n` + SET `short` = 'Mr.' + WHERE `customer_title_i18n`.`id` = 1 + AND `customer_title_i18n`.`locale` = 'en_US'; +-- fr_FR +UPDATE `customer_title_i18n` + SET `short` = 'M.' + WHERE `customer_title_i18n`.`id` = 1 + AND `customer_title_i18n`.`locale` = 'fr_FR'; + + +# ====================================================================================================================== +# Adding missing resources +# ====================================================================================================================== + +SELECT @max_id := MAX(`id`) FROM `resource`; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'admin.hook', NOW(), NOW()), +(@max_id+2, 'admin.module-hook', NOW(), NOW()), +(@max_id+3, 'admin.sales', NOW(), NOW()), +(@max_id+4, 'admin.administrator', NOW(), NOW()), +(@max_id+5, 'admin.configuration.category', NOW(), NOW()), +(@max_id+6, 'admin.configuration.shipping-configuration', NOW(), NOW()), +(@max_id+7, 'admin.configuration.tax-rule', NOW(), NOW()), +(@max_id+8, 'admin.hooks', NOW(), NOW()), +(@max_id+9, 'admin.import', NOW(), NOW()), +(@max_id+10, 'admin.modules', NOW(), NOW()), +(@max_id+11, 'admin.profile', NOW(), NOW()) +; + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES + (@max_id+1, 'de_DE', 'Andockpunkte'), + (@max_id+2, 'de_DE', 'Hook Positionen'), + (@max_id+3, 'de_DE', 'Sonderangebotsmanagement'), + (@max_id+4, 'de_DE', 'Administratorenliste'), + (@max_id+5, 'de_DE', 'Kategorie-Konfiguration'), + (@max_id+6, 'de_DE', 'Lieferungskonfiguration'), + (@max_id+7, 'de_DE', 'Taxeregelung-Konfiguration'), + (@max_id+8, 'de_DE', 'Hooks Verwendung'), + (@max_id+9, 'de_DE', 'Importation / Exportation von Daten'), + (@max_id+10, 'de_DE', 'Modul Verwendung'), + (@max_id+11, 'de_DE', 'Administration-Profilverwaltung'), + (@max_id+1, 'en_US', 'Hooks'), + (@max_id+2, 'en_US', 'Hook positions'), + (@max_id+3, 'en_US', 'Sales management'), + (@max_id+4, 'en_US', 'Administrator list'), + (@max_id+5, 'en_US', 'Category configuration'), + (@max_id+6, 'en_US', 'Shipping configuration'), + (@max_id+7, 'en_US', 'Tax rules configuration'), + (@max_id+8, 'en_US', 'Hooks management'), + (@max_id+9, 'en_US', 'Data import / export'), + (@max_id+10, 'en_US', 'Modules management'), + (@max_id+11, 'en_US', 'Administration profiles management'), + (@max_id+1, 'es_ES', 'Hooks'), + (@max_id+2, 'es_ES', 'Posiciones de hook'), + (@max_id+3, 'es_ES', 'Administración de ventas'), + (@max_id+4, 'es_ES', 'Lista de administrador'), + (@max_id+5, 'es_ES', 'Configuración de la categoría'), + (@max_id+6, 'es_ES', 'Configuración de envío'), + (@max_id+7, 'es_ES', 'Configuración de las reglas de impuestos'), + (@max_id+8, 'es_ES', 'Gestión de Hooks'), + (@max_id+9, 'es_ES', 'Importación/ exportación de datos'), + (@max_id+10, 'es_ES', 'Administración de módulos'), + (@max_id+11, 'es_ES', 'Gestión de perfiles de administración'), + (@max_id+1, 'fr_FR', 'Points d\'accroche'), + (@max_id+2, 'fr_FR', 'Positions des points d\'accroche'), + (@max_id+3, 'fr_FR', 'Gestion des promotions'), + (@max_id+4, 'fr_FR', 'Liste des administrateurs'), + (@max_id+5, 'fr_FR', 'Configuration d\'une catégorie'), + (@max_id+6, 'fr_FR', 'Configuration du transport'), + (@max_id+7, 'fr_FR', 'Configuration des règles de taxes'), + (@max_id+8, 'fr_FR', 'Gestion des hooks'), + (@max_id+9, 'fr_FR', 'Importation / exportation de données'), + (@max_id+10, 'fr_FR', 'Gestion des modules'), + (@max_id+11, 'fr_FR', 'Gestion des profils d\'administration') +; + +# ====================================================================================================================== +# Adding cart id in order table +# ====================================================================================================================== + +ALTER TABLE `order_version` + ADD `customer_id_version` INTEGER DEFAULT 0 + AFTER `version_created_by`; + + +# ====================================================================================================================== +# End of changes +# ====================================================================================================================== + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.1.0-alpha2.sql b/setup/update/sql/2.1.0-alpha2.sql new file mode 100644 index 00000000..42658471 --- /dev/null +++ b/setup/update/sql/2.1.0-alpha2.sql @@ -0,0 +1,181 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0-alpha2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha2' WHERE `name`='thelia_extra_version'; + +UPDATE `config` SET `name`='form_firewall_active' WHERE `name`='from_firewall_active'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'cart.use_persistent_cookie', '1', 0, 0, NOW(), NOW()), +(@max_id + 2, 'cart.cookie_name', 'thelia_cart', 0, 0, NOW(), NOW()), +(@max_id + 3, 'cart.cookie_lifetime', '31536060', 0, 0, NOW(), NOW()), +(@max_id + 4, 'allow_slash_ended_uri', 1, 0, 0, NOW(), NOW()) +; + + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max_id + 1, 'de_DE', 'Ein dauerhaftes Cookie verwenden, um den Kundes-Warenkorb zu merken', NULL, NULL, NULL), +(@max_id + 2, 'de_DE', 'Name der Warenkorb-Cookie', NULL, NULL, NULL), +(@max_id + 3, 'de_DE', 'Dauer der Warenkorb-Cookie in dem Kunden-Browser, in Sekunden', NULL, NULL, NULL), +(@max_id + 4, 'de_DE', 'URI mit Slash beendet erlauben', NULL, NULL, NULL), +(@max_id + 1, 'en_US', 'Use a persistent cookie to keep track of customer cart', NULL, NULL, NULL), +(@max_id + 2, 'en_US', 'Name the cart cookie', NULL, NULL, NULL), +(@max_id + 3, 'en_US', 'Life time of the cart cookie in the customer browser, in seconds', NULL, NULL, NULL), +(@max_id + 4, 'en_US', 'Allow slash ended uri', NULL, NULL, NULL), +(@max_id + 1, 'es_ES', 'Usa una \'cookie\' persistente para mantener el trayecto del carrito del cliente', NULL, NULL, NULL), +(@max_id + 2, 'es_ES', 'Nombre la cookie de carrito', NULL, NULL, NULL), +(@max_id + 3, 'es_ES', 'Tiempo de vida de la cookie del carro en el navegador del cliente, en segundos', NULL, NULL, NULL), +(@max_id + 4, 'es_ES', 'Permitir barra de fín de url', NULL, NULL, NULL), +(@max_id + 1, 'fr_FR', 'Utiliser un cookie persistant pour mémoriser le panier du client', NULL, NULL, NULL), +(@max_id + 2, 'fr_FR', 'Nom du cookie pour le panier', NULL, NULL, NULL), +(@max_id + 3, 'fr_FR', 'Durée de vie du cookie du panier dans le navigateur du client, en secondes', NULL, NULL, NULL), +(@max_id + 4, 'fr_FR', 'Autoriser les URI terminées par un slash', NULL, NULL, NULL) +; + +DELETE FROM `config` WHERE `name`='currency_rate_update_url'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'order-edit.cart-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'order-edit.cart-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+3, 'order-edit.bill-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+4, 'order-edit.bill-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+5, 'order-edit.before-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+6, 'order-edit.before-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+7, 'order-edit.after-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+8, 'order-edit.after-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+9, 'sales.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+10, 'sales.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+11, 'sales.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+12, 'sales.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+13, 'sale.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+14, 'sale.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+15, 'sales.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+16, 'product.combinations-row', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (@max_id+17, 'main.before-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+18, 'main.after-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES + (@max_id+1, 'de_DE', 'Bestellung - Warenkorb oben', '', ''), + (@max_id+2, 'de_DE', 'Bestellung - Warenkorb unten', '', ''), + (@max_id+3, 'de_DE', 'Bestellung - Rechnung oben', '', ''), + (@max_id+4, 'de_DE', 'Bestellung - Rechnung unten', '', ''), + (@max_id+5, 'de_DE', 'Bestellung - Vor der Produktliste', '', ''), + (@max_id+6, 'de_DE', 'Bestellung - Vor der Öffnung der Produktzeile', '', ''), + (@max_id+7, 'de_DE', 'Bestellung - Nach Sperrung der Produkt Zeile', '', ''), + (@max_id+8, 'de_DE', 'Bestellung - Nach der Produktliste', '', ''), + (@max_id+9, 'de_DE', 'Sonderangebote - oben', '', ''), + (@max_id+10, 'de_DE', 'Sonderangebote - Tabellenkopf', '', ''), + (@max_id+11, 'de_DE', 'Sonderangebote - Tabellenzeile', '', ''), + (@max_id+12, 'de_DE', 'Sonderangebote - unten', '', ''), + (@max_id+13, 'de_DE', 'Sonderangebot - Erstellungsformular', '', ''), + (@max_id+14, 'de_DE', 'Sonderangebot - Löschungsformular', '', ''), + (@max_id+15, 'de_DE', 'Sonderangebote - JavaScript', '', ''), + (@max_id+16, 'de_DE', 'Produkt - unten einer Produkt-Kombination', '', ''), + (@max_id+17, 'de_DE', 'Layout - vor dem Hauptinhaltsbereich', '', ''), + (@max_id+18, 'de_DE', 'Admin layout - Nach dem Hauptinhalt', '', ''), + (@max_id+1, 'en_US', 'Order - cart top', '', ''), + (@max_id+2, 'en_US', 'Order - cart bottom', '', ''), + (@max_id+3, 'en_US', 'Order - bill top', '', ''), + (@max_id+4, 'en_US', 'Order - bill bottom', '', ''), + (@max_id+5, 'en_US', 'Order - Before product list', '', ''), + (@max_id+6, 'en_US', 'Order - Before starting product row', '', ''), + (@max_id+7, 'en_US', 'Order - After closing product row', '', ''), + (@max_id+8, 'en_US', 'Order - After product list', '', ''), + (@max_id+9, 'en_US', 'Sales - at the top', '', ''), + (@max_id+10, 'en_US', 'Sales - table header', '', ''), + (@max_id+11, 'en_US', 'Sales - table row', '', ''), + (@max_id+12, 'en_US', 'Sales - at the bottom', '', ''), + (@max_id+13, 'en_US', 'Sale - create form', '', ''), + (@max_id+14, 'en_US', 'Sale - delete form', '', ''), + (@max_id+15, 'en_US', 'Sales - JavaScript', '', ''), + (@max_id+16, 'en_US', 'Product - at the bottom of a product combination', '', ''), + (@max_id+17, 'en_US', 'Layout - Before the main content', '', ''), + (@max_id+18, 'en_US', 'Admin layout - After the main content', '', ''), + (@max_id+1, 'es_ES', 'Orden - parte superior del carro', '', ''), + (@max_id+2, 'es_ES', 'Orden - parte inferior del carro', '', ''), + (@max_id+3, 'es_ES', 'Orden - parte superior de la cuenta', '', ''), + (@max_id+4, 'es_ES', 'Orden - parte inferior de la cuenta', '', ''), + (@max_id+5, 'es_ES', 'Orden - antes de la lista de productos', '', ''), + (@max_id+6, 'es_ES', 'Orden - antes de comenzar la fila de producto', '', ''), + (@max_id+7, 'es_ES', 'Orden - después de cerrar la fila de producto', '', ''), + (@max_id+8, 'es_ES', 'Orden - después de la lista de productos', '', ''), + (@max_id+9, 'es_ES', 'Ventas - en la parte superior', '', ''), + (@max_id+10, 'es_ES', 'Ventas - encabezado de tabla', '', ''), + (@max_id+11, 'es_ES', 'Ventas - fila de la tabla', '', ''), + (@max_id+12, 'es_ES', 'Ventas - en la parte inferior', '', ''), + (@max_id+13, 'es_ES', 'Venta - formulario de creación', '', ''), + (@max_id+14, 'es_ES', 'Venta - formulario de borrado', '', ''), + (@max_id+15, 'es_ES', 'Ventas - JavaScript', '', ''), + (@max_id+16, 'es_ES', 'Producto - al pie de la combinación de un producto', '', ''), + (@max_id+17, 'es_ES', 'Diseño - antes el contenido principal', '', ''), + (@max_id+18, 'es_ES', 'Diseño de administración - Después del contenido principal', '', ''), + (@max_id+1, 'fr_FR', 'Commande - panier haut', '', ''), + (@max_id+2, 'fr_FR', 'Commande - panier bas', '', ''), + (@max_id+3, 'fr_FR', 'Commande - facture haut', '', ''), + (@max_id+4, 'fr_FR', 'Commande - facture bas', '', ''), + (@max_id+5, 'fr_FR', 'Commande - Avant la liste des produits', '', ''), + (@max_id+6, 'fr_FR', 'Commande - Avant d\'ouvrir la ligne produit', '', ''), + (@max_id+7, 'fr_FR', 'Commande - Après avoir fermé la ligne produit', '', ''), + (@max_id+8, 'fr_FR', 'Commande - Après la liste des produits', '', ''), + (@max_id+9, 'fr_FR', 'Promotions - en haut', '', ''), + (@max_id+10, 'fr_FR', 'Promotions - colonne tableau', '', ''), + (@max_id+11, 'fr_FR', 'Promotions - ligne du tableau', '', ''), + (@max_id+12, 'fr_FR', 'Promotions - en bas', '', ''), + (@max_id+13, 'fr_FR', 'Promotion - formulaire de création', '', ''), + (@max_id+14, 'fr_FR', 'Promotion - formulaire de suppression', '', ''), + (@max_id+15, 'fr_FR', 'Promotions - JavaScript', '', ''), + (@max_id+16, 'fr_FR', 'Produit - en bas d\'une combinaison de déclinaisons', '', ''), + (@max_id+17, 'fr_FR', 'Layout - Avant le contenu principal', '', ''), + (@max_id+18, 'fr_FR', 'Admin layout - Après le contenu principal', '', '') +; + +# ====================================================================================================================== +# Module version, min & max Thelia version supported +# ====================================================================================================================== + +ALTER TABLE `module` + ADD COLUMN `category` VARCHAR(50) DEFAULT 'classic' NOT NULL + AFTER `type` +; + +UPDATE `module` SET `category` = 'classic' WHERE `type` = 1; +UPDATE `module` SET `category` = 'delivery' WHERE `type` = 2; +UPDATE `module` SET `category` = 'payment' WHERE `type` = 3; + +ALTER TABLE `module` + ADD COLUMN `version` VARCHAR(10) DEFAULT '' NOT NULL + AFTER `code` +; + +UPDATE `country` SET `isoalpha2` = 'BH' WHERE `isoalpha3` = 'BHR'; +UPDATE `country` SET `isoalpha2` = 'MG' WHERE `isoalpha3` = 'MDG'; + + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `module`; +SELECT @max_classic_position := IFNULL(MAX(`position`),0) FROM `module` WHERE `type`=1; + + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'TheliaSmarty', 1, 1, @max_classic_position+1, 'TheliaSmarty\\TheliaSmarty', NOW(), NOW()), +(@max_id+2, 'VirtualProductControl', 1, 1, @max_classic_position+2, 'VirtualProductControl\\VirtualProductControl', NOW(), NOW()) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max_id+1, 'de_DE', 'Smarty Template Engine Integration', NULL, NULL, NULL), +(@max_id+2, 'de_DE', 'Steuerung für virtuelle Produkte', 'Prüfen ob ein Liefermodul für virtuellen Produkte aktiviert ist, wenn es mindestens ein virtuelles Produkt gibt', NULL, NULL), +(@max_id+1, 'en_US', 'Smarty template engine integration', NULL, NULL, NULL), +(@max_id+2, 'en_US', 'Virtual Product Controller', 'Check if a virtual product delivery module is enabled if at least one product is virtual', NULL, NULL), +(@max_id+1, 'es_ES', 'Integración del motor de plantillas Smarty', NULL, NULL, NULL), +(@max_id+2, 'es_ES', 'Controlador de producto virtual', 'Compruebe si un módulo de entrega de producto virtual está habilitado si es virtual por lo menos un producto', NULL, NULL), +(@max_id+1, 'fr_FR', 'Intégration du moteur de template Smarty', NULL, NULL, NULL), +(@max_id+2, 'fr_FR', 'Contôle de produit virtuel', 'Vérifie qu\'un module de livraison pour produit virtuel soit activé si des produits virtuels existent', NULL, NULL) +; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.1.0-beta1.sql b/setup/update/sql/2.1.0-beta1.sql new file mode 100644 index 00000000..ab6efaa3 --- /dev/null +++ b/setup/update/sql/2.1.0-beta1.sql @@ -0,0 +1,280 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0-beta1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta1' WHERE `name`='thelia_extra_version'; + +DELETE FROM `config` WHERE `name`='session_config.handlers'; + +CREATE TABLE IF NOT EXISTS `api` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `label` VARCHAR(255), + `api_key` VARCHAR(100), + `profile_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_api_profile_id` (`profile_id`), + CONSTRAINT `fk_api_profile_id` + FOREIGN KEY (`profile_id`) + REFERENCES `profile` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +-- Add the session_config.lifetime configuration variable +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'session_config.lifetime', '0', 0, 0, NOW(), NOW()), +(@max_id + 2, 'error_message.show', '1', 0, 0, NOW(), NOW()), +(@max_id + 3, 'error_message.page_name', 'error.html', 0, 0, NOW(), NOW()) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max_id + 1, 'de_DE', 'Dauer der Session-Cookie in dem Kunden-Browser, in Sekunden', NULL, NULL, NULL), +(@max_id + 2, 'de_DE', 'Fehlermeldung zeigen anstatt einer weißen Seite im Falle eines eines Serverfehlers', NULL, NULL, NULL), +(@max_id + 3, 'de_DE', 'Dateiname der Fehlerseite', NULL, NULL, NULL), +(@max_id + 1, 'en_US', 'Life time of the session cookie in the customer browser, in seconds', NULL, NULL, NULL), +(@max_id + 2, 'en_US', 'Show error message instead of a white page on a server error', NULL, NULL, NULL), +(@max_id + 3, 'en_US', 'Filename of the error page', NULL, NULL, NULL), +(@max_id + 1, 'es_ES', 'Tiempo de vida de la cookie de la sesión en el navegador del cliente, en segundos', NULL, NULL, NULL), +(@max_id + 2, 'es_ES', 'Mostrar mensaje de error en lugar de una página en blanco cuando ocurre un error de servidor', NULL, NULL, NULL), +(@max_id + 3, 'es_ES', 'Nombre de archivo de la página de error', NULL, NULL, NULL), +(@max_id + 1, 'fr_FR', 'Durée de vie du cookie de la session dans le navigateur du client, en secondes', NULL, NULL, NULL), +(@max_id + 2, 'fr_FR', 'Afficher un message d\'erreur à la place d\'une page blanche lors d\'une erreur serveur', NULL, NULL, NULL), +(@max_id + 3, 'fr_FR', 'Nom du fichier de la page d\'erreur', NULL, NULL, NULL) +; + +-- Hide the session_config.handlers configuration variable +UPDATE `config` SET `secured`=1, `hidden`=1 where `name`='session_config.handlers'; + +-- Hooks + +-- front hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) + VALUES +(@max_id + 1, 'category.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'category.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'content.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'content.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'folder.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'folder.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'brand.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 8, 'brand.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 9, 'brand.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 10, 'brand.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 11, 'brand.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 12, 'brand.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 13, 'brand.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 14, 'brand.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 15, 'brand.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 16, 'brand.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 17, 'brand.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 18, 'brand.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 19, 'account-order.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 20, 'account-order.information', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 21, 'account-order.after-information', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 22, 'account-order.delivery-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 23, 'account-order.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 24, 'account-order.invoice-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 25, 'account-order.invoice-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 26, 'account-order.after-addresses', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 27, 'account-order.products-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 28, 'account-order.product-extra', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 29, 'account-order.products-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 30, 'account-order.after-products', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 31, 'account-order.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 32, 'account-order.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 33, 'account-order.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 34, 'account-order.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', 'Kategorieseite - vor dem Hauptinhaltsbereich', '', ''), +(@max_id + 2, 'de_DE', 'Kategorieseite - nach dem Hauptinhaltsbereich', '', ''), +(@max_id + 3, 'de_DE', 'Inhaltseite- vor dem Hauptinhaltsbereich', '', ''), +(@max_id + 4, 'de_DE', 'Inhaltseite - nach dem Hauptinhaltsbereich', '', ''), +(@max_id + 5, 'de_DE', 'Ordnerseite - vor dem Hauptinhaltsbereich', '', ''), +(@max_id + 6, 'de_DE', 'Ordnerseite - nach dem Hauptinhaltsbereich', '', ''), +(@max_id + 7, 'de_DE', 'Marken Seite - oben', '', ''), +(@max_id + 8, 'de_DE', 'Marken Seite - unten', '', ''), +(@max_id + 9, 'de_DE', 'Marken Seite - oben des Hauptbereichs', '', ''), +(@max_id + 10, 'de_DE', 'Marken Seite - unten des Hauptbereichs', '', ''), +(@max_id + 11, 'de_DE', 'Marken Seite - vor dem Hauptinhaltsbereich', '', ''), +(@max_id + 12, 'de_DE', 'Marken Seite - Nach dem Hauptinhalt Bereich', '', ''), +(@max_id + 13, 'de_DE', 'Marken Seite - CSS-Stylesheet', '', ''), +(@max_id + 14, 'de_DE', 'Marken Seite - Nach der Integration von Javascript', '', ''), +(@max_id + 15, 'de_DE', 'Marken Seite - Javascript Initialisation', '', ''), +(@max_id + 16, 'de_DE', 'Marken Seite - oben der Sidebar', '', ''), +(@max_id + 17, 'de_DE', 'Marken Seite - Sidebars Body', '', ''), +(@max_id + 18, 'de_DE', 'Marken Seite - unten der Sidebar', '', ''), +(@max_id + 19, 'de_DE', 'Bestellungsdetails - oben', '', ''), +(@max_id + 20, 'de_DE', 'Bestellungsdetails - weitere Informationen', '', ''), +(@max_id + 21, 'de_DE', 'Bestellungsdetails - nach den allgemeinen Informationen', '', ''), +(@max_id + 22, 'de_DE', 'Bestellungsdetails - weitere Informationen für den Versand', '', ''), +(@max_id + 23, 'de_DE', 'Bestellungsdetails - Lieferadresse', '', ''), +(@max_id + 24, 'de_DE', 'Bestellungsdetails - weitere Informationen für die Rechnung', '', ''), +(@max_id + 25, 'de_DE', 'Bestellungsdetails - Rechnungsadresse', '', ''), +(@max_id + 26, 'de_DE', 'Bestellungsdetails - Nach den Adressen', '', ''), +(@max_id + 27, 'de_DE', 'Bestellungsdetails - vor der Produktliste', '', ''), +(@max_id + 28, 'de_DE', 'Bestellungsdetails - weitere Informationen für ein Produkt', '', ''), +(@max_id + 29, 'de_DE', 'Bestellungsdetails - nach der Produktliste', '', ''), +(@max_id + 30, 'de_DE', 'Bestellungsdetails - nach den Produkten', '', ''), +(@max_id + 31, 'de_DE', 'Bestellungsdetails - unten', '', ''), +(@max_id + 32, 'de_DE', 'Bestellungsdetails - CSS-Stylesheet', '', ''), +(@max_id + 33, 'de_DE', 'Bestellungsdetails - nach Integration von JavaScript', '', ''), +(@max_id + 34, 'de_DE', 'Bestellungsdetails - Initialisierung von Javascript', '', ''), +(@max_id + 1, 'en_US', 'Category page - before the main content area', '', ''), +(@max_id + 2, 'en_US', 'Category page - after the main content area', '', ''), +(@max_id + 3, 'en_US', 'Content page - before the main content area', '', ''), +(@max_id + 4, 'en_US', 'Content page - after the main content area', '', ''), +(@max_id + 5, 'en_US', 'Folder page - before the main content area', '', ''), +(@max_id + 6, 'en_US', 'Folder page - after the main content area', '', ''), +(@max_id + 7, 'en_US', 'Brands page - at the top', '', ''), +(@max_id + 8, 'en_US', 'Brands page - at the bottom', '', ''), +(@max_id + 9, 'en_US', 'Brands page - at the top of the main area', '', ''), +(@max_id + 10, 'en_US', 'Brands page - at the bottom of the main area', '', ''), +(@max_id + 11, 'en_US', 'Brands page - before the main content area', '', ''), +(@max_id + 12, 'en_US', 'Brands page - after the main content area', '', ''), +(@max_id + 13, 'en_US', 'Brands page - CSS stylesheet', '', ''), +(@max_id + 14, 'en_US', 'Brands page - after javascript include', '', ''), +(@max_id + 15, 'en_US', 'Brands page - javascript initialization', '', ''), +(@max_id + 16, 'en_US', 'Brands page - at the top of the sidebar', '', ''), +(@max_id + 17, 'en_US', 'Brands page - the body of the sidebar', '', ''), +(@max_id + 18, 'en_US', 'Brands page - at the bottom of the sidebar', '', ''), +(@max_id + 19, 'en_US', 'Order details - at the top', '', ''), +(@max_id + 20, 'en_US', 'Order details - additional information', '', ''), +(@max_id + 21, 'en_US', 'Order details - after global information', '', ''), +(@max_id + 22, 'en_US', 'Order details - additional delivery information', '', ''), +(@max_id + 23, 'en_US', 'Order details - delivery address', '', ''), +(@max_id + 24, 'en_US', 'Order details - additional invoice information', '', ''), +(@max_id + 25, 'en_US', 'Order details - invoice address', '', ''), +(@max_id + 26, 'en_US', 'Order details - after addresses', '', ''), +(@max_id + 27, 'en_US', 'Order details - before products list', '', ''), +(@max_id + 28, 'en_US', 'Order details - additional product information', '', ''), +(@max_id + 29, 'en_US', 'Order details - after products list', '', ''), +(@max_id + 30, 'en_US', 'Order details - after products', '', ''), +(@max_id + 31, 'en_US', 'Order details - at the bottom', '', ''), +(@max_id + 32, 'en_US', 'Order details - CSS stylesheet', '', ''), +(@max_id + 33, 'en_US', 'Order details - after javascript include', '', ''), +(@max_id + 34, 'en_US', 'Order details - javascript initialization', '', ''), +(@max_id + 1, 'es_ES', 'Página de categoría - antes el área de contenido principal', '', ''), +(@max_id + 2, 'es_ES', 'Página de la categoría - después el área de contenido principal', '', ''), +(@max_id + 3, 'es_ES', 'Página de contenido - antes del área de contenido principal', '', ''), +(@max_id + 4, 'es_ES', 'Página de contenido - después del área de contenido principal', '', ''), +(@max_id + 5, 'es_ES', 'Carpeta de página - antes del área de contenido principal', '', ''), +(@max_id + 6, 'es_ES', 'Carpeta de página - después del área de contenido principal', '', ''), +(@max_id + 7, 'es_ES', 'Página de las marcas - en la parte superior', '', ''), +(@max_id + 8, 'es_ES', 'Página de las marcas - en la parte inferior', '', ''), +(@max_id + 9, 'es_ES', 'Página de las marcas - en la parte inferior del área principal', '', ''), +(@max_id + 10, 'es_ES', 'Página de las marcas - en la parte inferior del área principal', '', ''), +(@max_id + 11, 'es_ES', 'Página de marcas - antes del área de contenido principal', '', ''), +(@max_id + 12, 'es_ES', 'Página de marcas - después el área de contenido principal', '', ''), +(@max_id + 13, 'es_ES', 'Página de marcas - hoja de estilos CSS', '', ''), +(@max_id + 14, 'es_ES', 'Página de marcas - después de inclusión de javascript', '', ''), +(@max_id + 15, 'es_ES', 'Página de marcas - inicialización de javascript', '', ''), +(@max_id + 16, 'es_ES', 'Página de las marcas - en la parte inferior de la barra lateral', '', ''), +(@max_id + 17, 'es_ES', 'Página de marcas - el cuerpo de la barra lateral', '', ''), +(@max_id + 18, 'es_ES', 'Página de las marcas - en la parte inferior de la barra lateral', '', ''), +(@max_id + 19, 'es_ES', 'Detalles de la orden - en la parte superior', '', ''), +(@max_id + 20, 'es_ES', 'Detalles de la Orden - información adicional', '', ''), +(@max_id + 21, 'es_ES', 'Detalles de la orden - después de la información global', '', ''), +(@max_id + 22, 'es_ES', 'Detalles de la Orden - información adicional del envío', '', ''), +(@max_id + 23, 'es_ES', 'Pedir detalles - dirección de envío', '', ''), +(@max_id + 24, 'es_ES', 'Detalles de la Orden - información adicional de la factura', '', ''), +(@max_id + 25, 'es_ES', 'Detalles de la orden - dirección de factura', '', ''), +(@max_id + 26, 'es_ES', 'Detalles de la Orden - después de direcciones', '', ''), +(@max_id + 27, 'es_ES', 'Detalles de la orden - antes de lista de productos', '', ''), +(@max_id + 28, 'es_ES', 'Detalles de la Orden - información adicional del producto', '', ''), +(@max_id + 29, 'es_ES', 'Detalles de la orden - después de la lista de productos', '', ''), +(@max_id + 30, 'es_ES', 'Detalles de la orden - después de los productos', '', ''), +(@max_id + 31, 'es_ES', 'Detalles de la orden - en la parte inferior', '', ''), +(@max_id + 32, 'es_ES', 'Detalles de la Orden - hoja de estilos CSS', '', ''), +(@max_id + 33, 'es_ES', 'Detalles de la orden - después de incluir JavaScript', '', ''), +(@max_id + 34, 'es_ES', 'Detalles de la Orden - inicialización de JavaScript', '', ''), +(@max_id + 1, 'fr_FR', 'Page catégorie - au dessus de la zone de contenu principale', '', ''), +(@max_id + 2, 'fr_FR', 'Page catégorie - en dessous de la zone de contenu principale', '', ''), +(@max_id + 3, 'fr_FR', 'Page de contenu - au dessus de la zone de contenu principale', '', ''), +(@max_id + 4, 'fr_FR', 'Page de contenu - en dessous de la zone de contenu principale', '', ''), +(@max_id + 5, 'fr_FR', 'Page dossier - au dessus de la zone de contenu principale', '', ''), +(@max_id + 6, 'fr_FR', 'Page dossier - en dessous de la zone de contenu principale', '', ''), +(@max_id + 7, 'fr_FR', 'Page des marques - en haut', '', ''), +(@max_id + 8, 'fr_FR', 'Page des marques - en bas', '', ''), +(@max_id + 9, 'fr_FR', 'Page des marques - en haut de la zone principal', '', ''), +(@max_id + 10, 'fr_FR', 'Page des marques - en bas de la zone principal', '', ''), +(@max_id + 11, 'fr_FR', 'Page des marques - au dessus de la zone de contenu principale', '', ''), +(@max_id + 12, 'fr_FR', 'Page des marques - en dessous de la zone de contenu principale', '', ''), +(@max_id + 13, 'fr_FR', 'Page des marques - feuille de style CSS', '', ''), +(@max_id + 14, 'fr_FR', 'Page des marques - après l\'inclusion du JavaScript', '', ''), +(@max_id + 15, 'fr_FR', 'Page des marques - initialisation du JavaScript', '', ''), +(@max_id + 16, 'fr_FR', 'Page des marques - en haut de la sidebar', '', ''), +(@max_id + 17, 'fr_FR', 'Page des marques - le corps de la sidebar', '', ''), +(@max_id + 18, 'fr_FR', 'Page des marques - en bas de la sidebar', '', ''), +(@max_id + 19, 'fr_FR', 'Détail d\'une commande - en haut', '', ''), +(@max_id + 20, 'fr_FR', 'Détail d\'une commande - informations additionnelles', '', ''), +(@max_id + 21, 'fr_FR', 'Détail d\'une commande - après les informations générales', '', ''), +(@max_id + 22, 'fr_FR', 'Détail d\'une commande - informations additionnelles pour l\'expédition', '', ''), +(@max_id + 23, 'fr_FR', 'Détail d\'une commande - adresse de livraison', '', ''), +(@max_id + 24, 'fr_FR', 'Détail d\'une commande - informations additionnelles pour la facturation', '', ''), +(@max_id + 25, 'fr_FR', 'Détail d\'une commande - adresse de facturation', '', ''), +(@max_id + 26, 'fr_FR', 'Détail d\'une commande - Après les adresses', '', ''), +(@max_id + 27, 'fr_FR', 'Détail d\'une commande - avant la liste des produits', '', ''), +(@max_id + 28, 'fr_FR', 'Détail d\'une commande - informations additionnelles pour un produit', '', ''), +(@max_id + 29, 'fr_FR', 'Détail d\'une commande - après la liste des produits', '', ''), +(@max_id + 30, 'fr_FR', 'Détail d\'une commande - Après les produits', '', ''), +(@max_id + 31, 'fr_FR', 'Détail d\'une commande - en bas', '', ''), +(@max_id + 32, 'fr_FR', 'Détail d\'une commande - feuille de style CSS', '', ''), +(@max_id + 33, 'fr_FR', 'Détail d\'une commande - après l\'inclusion du JavaScript', '', ''), +(@max_id + 34, 'fr_FR', 'Détail d\'une commande - initialisation du JavaScript', '', '') +; + + +-- admin hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'category.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'product.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'folder.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'content.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'brand.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'order-edit.bill-delivery-address', 2, 1, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', 'Kategorie - Tab', '', ''), +(@max_id + 2, 'de_DE', 'Produkt - Tab', '', ''), +(@max_id + 3, 'de_DE', 'Ordner - Tab', '', ''), +(@max_id + 4, 'de_DE', 'Inhalt - Tab', '', ''), +(@max_id + 5, 'de_DE', 'Marke - Tab', '', ''), +(@max_id + 6, 'de_DE', 'Bestellungs-Änderung - Lieferadresse', '', ''), +(@max_id + 1, 'en_US', 'Category - Tab', '', ''), +(@max_id + 2, 'en_US', 'Product - Tab', '', ''), +(@max_id + 3, 'en_US', 'Folder - Tab', '', ''), +(@max_id + 4, 'en_US', 'Content - Tab', '', ''), +(@max_id + 5, 'en_US', 'Brand - Tab', '', ''), +(@max_id + 6, 'en_US', 'Order edit - delivery address', '', ''), +(@max_id + 1, 'es_ES', 'Categoría - Tab', '', ''), +(@max_id + 2, 'es_ES', 'Producto - Pestaña', '', ''), +(@max_id + 3, 'es_ES', 'Carpeta - Pestaña', '', ''), +(@max_id + 4, 'es_ES', 'Contenido - Pestaña', '', ''), +(@max_id + 5, 'es_ES', 'Marca - Tab', '', ''), +(@max_id + 6, 'es_ES', 'Editar Orden - dirección de envío', '', ''), +(@max_id + 1, 'fr_FR', 'Catégorie - Onglet', '', ''), +(@max_id + 2, 'fr_FR', 'Produit - Onglet', '', ''), +(@max_id + 3, 'fr_FR', 'Dossier - Onglet', '', ''), +(@max_id + 4, 'fr_FR', 'Contenu - Onglet', '', ''), +(@max_id + 5, 'fr_FR', 'Marque - Onglet', '', ''), +(@max_id + 6, 'fr_FR', 'Modification commande - adresse de livraison', '', '') +; + + +SET FOREIGN_KEY_CHECKS = 1; + diff --git a/setup/update/sql/2.1.0-beta2.sql b/setup/update/sql/2.1.0-beta2.sql new file mode 100644 index 00000000..6d6d7cb8 --- /dev/null +++ b/setup/update/sql/2.1.0-beta2.sql @@ -0,0 +1,31 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- Hooks + +-- front hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'account.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), + +(@max_id + 2, 'product.modification.form_top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'product.modification.form_bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', 'Kundenkonto - Erweitere Informationen', '', ''), +(@max_id + 2, 'de_DE', 'Produktseite - oben im Formular', '', ''), +(@max_id + 3, 'de_DE', 'Produktseite - unten an dem Formular', '', ''), +(@max_id + 1, 'en_US', 'Customer account - additional information', '', ''), +(@max_id + 2, 'en_US', 'Product page - On the top of the form', '', ''), +(@max_id + 3, 'en_US', 'Product page - On the bottom of the form', '', ''), +(@max_id + 1, 'es_ES', 'Cuenta de cliente - información adicional', '', ''), +(@max_id + 2, 'es_ES', 'Página de producto - en la parte superior del formulario', '', ''), +(@max_id + 3, 'es_ES', 'Página del producto - en la parte inferior del formulario', '', ''), +(@max_id + 1, 'fr_FR', 'Compte client - informations additionnelles', '', ''), +(@max_id + 2, 'fr_FR', 'Page produit - En haut du formulaire', '', ''), +(@max_id + 3, 'fr_FR', 'Page produit - En bas du formulaire', '', '') +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.0.sql b/setup/update/sql/2.1.0.sql new file mode 100644 index 00000000..ae258455 --- /dev/null +++ b/setup/update/sql/2.1.0.sql @@ -0,0 +1,54 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + + +UPDATE `config` SET `value`='1' WHERE `name`='cart.use_persistent_cookie'; + +-- Order + +ALTER TABLE `order` ADD `postage_tax` FLOAT DEFAULT 0 NOT NULL AFTER `postage` ; +ALTER TABLE `order` ADD `postage_tax_rule_title` VARCHAR(255) AFTER `postage_tax` ; + +ALTER TABLE `order_version` ADD `postage_tax` FLOAT DEFAULT 0 NOT NULL AFTER `postage` ; +ALTER TABLE `order_version` ADD `postage_tax_rule_title` VARCHAR(255) AFTER `postage_tax` ; + +-- Hooks +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'brand.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'sale.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'api.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'api.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'api.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', 'Brand edit Seite - im Formular', '', ''), +(@max_id + 2, 'de_DE', 'Sonderangebot Änderungsseite - javascript last call block', '', ''), +(@max_id + 3, 'de_DE', 'API Seite - oben', '', ''), +(@max_id + 4, 'de_DE', 'API Seite - unten', '', ''), +(@max_id + 5, 'de_DE', 'API Seite - Löschungsformular', '', ''), +(@max_id + 1, 'en_US', 'Brand edit page - in the form', '', ''), +(@max_id + 2, 'en_US', 'Sale edit page - javascript last call block', '', ''), +(@max_id + 3, 'en_US', 'Api page - at top', '', ''), +(@max_id + 4, 'en_US', 'Api page - at bottom', '', ''), +(@max_id + 5, 'en_US', 'Api page - in deletion form', '', ''), +(@max_id + 1, 'es_ES', 'Página de edición de marca - en formulario', '', ''), +(@max_id + 2, 'es_ES', 'Página de edición de Venta - última bloque de llamada JavaScript', '', ''), +(@max_id + 3, 'es_ES', 'Página de la API - en la parte superior', '', ''), +(@max_id + 4, 'es_ES', 'Página de la API - en la parte inferior', '', ''), +(@max_id + 5, 'es_ES', 'Página de Api - en formulario de eliminación', '', ''), +(@max_id + 1, 'fr_FR', 'Page brand edit - dans formulaire', '', ''), +(@max_id + 2, 'fr_FR', 'Page sale edit - appel javascript', '', ''), +(@max_id + 3, 'fr_FR', 'Page api - en haut', '', ''), +(@max_id + 4, 'fr_FR', 'Page api - en bas', '', ''), +(@max_id + 5, 'fr_FR', 'Page api - formulaire de suppression', '', '') +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.1.sql b/setup/update/sql/2.1.1.sql new file mode 100644 index 00000000..78876dec --- /dev/null +++ b/setup/update/sql/2.1.1.sql @@ -0,0 +1,10 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.2.sql b/setup/update/sql/2.1.2.sql new file mode 100644 index 00000000..e505ad2b --- /dev/null +++ b/setup/update/sql/2.1.2.sql @@ -0,0 +1,46 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SELECT @maxHookId := MAX(`id`) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@maxHookId + 1, 'coupon.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@maxHookId + 1, 'de_DE', 'Gutschein-Seite - Löschungsformular', '', ''), +(@maxHookId + 1, 'en_US', 'Coupon page - in deletion form', '', ''), +(@maxHookId + 1, 'es_ES', 'Página de cupón - en formulario de eliminación', '', ''), +(@maxHookId + 1, 'fr_FR', 'Page coupon - formulaire de suppression', '', '') +; + +UPDATE `config_i18n` SET `title`='Utiliser un cookie persistant pour memoriser le panier du client' WHERE `locale`='fr_FR' AND `id`=(SELECT`id` FROM `config` WHERE `name`='cart.use_persistent_cookie'); + +-- New ignored_module_hook table + +CREATE TABLE IF NOT EXISTS `ignored_module_hook` +( + `module_id` INTEGER NOT NULL, + `hook_id` INTEGER NOT NULL, + `method` VARCHAR(255), + `classname` VARCHAR(255), + INDEX `fk_deleted_module_hook_module_id_idx` (`module_id`), + INDEX `fk_deleted_module_hook_hook_id_idx` (`hook_id`), + CONSTRAINT `fk_deleted_module_hook_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_deleted_module_hook_hook_id` + FOREIGN KEY (`hook_id`) + REFERENCES `hook` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.1.3.sql b/setup/update/sql/2.1.3.sql new file mode 100644 index 00000000..72a6cdf4 --- /dev/null +++ b/setup/update/sql/2.1.3.sql @@ -0,0 +1,16 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +-- Add the session_config.lifetime configuration variable +INSERT IGNORE INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'form.secret', 'ThisIsNotASecret', 0, 0, NOW(), NOW()); + + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.4.sql b/setup/update/sql/2.1.4.sql new file mode 100644 index 00000000..53fd798c --- /dev/null +++ b/setup/update/sql/2.1.4.sql @@ -0,0 +1,27 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.4' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='4' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SELECT @max_id := MAX(`id`) FROM hook; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'export.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'export.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES + (@max_id+1, 'de_DE', 'Export modal or page - oben', '', ''), + (@max_id+2, 'de_DE', 'Export modal or page - unten', '', ''), + (@max_id+1, 'en_US', 'Export modal or page - top', '', ''), + (@max_id+2, 'en_US', 'Export modal or page - bottom', '', ''), + (@max_id+1, 'es_ES', 'Modal o página de exportación - superior', '', ''), + (@max_id+2, 'es_ES', 'Modal o página de exportación - inferior', '', ''), + (@max_id+1, 'fr_FR', 'Modal ou page d\'export - en haut', '', ''), + (@max_id+2, 'fr_FR', 'Modal ou page d\'export - en bas', '', '') +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.5.sql b/setup/update/sql/2.1.5.sql new file mode 100644 index 00000000..0739ebd8 --- /dev/null +++ b/setup/update/sql/2.1.5.sql @@ -0,0 +1,32 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.5' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='5' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `category` CHANGE `parent` `parent` INT( 11 ) NULL DEFAULT '0'; +ALTER TABLE `category_version` CHANGE `parent` `parent` INT( 11 ) NULL DEFAULT '0'; + +SELECT @max_id := MAX(`id`) FROM hook; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'invoice.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'delivery.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES + (@max_id+1, 'de_DE', 'Rechnung - Weitere Produktinformationen', '', ''), + (@max_id+2, 'de_DE', 'Lieferung - Weitere Produktinformationen', '', ''), + (@max_id+1, 'en_US', 'Invoice - additional product information', '', ''), + (@max_id+2, 'en_US', 'Delivery - additional product information', '', ''), + (@max_id+1, 'es_ES', 'Factura - información adicional del producto', '', ''), + (@max_id+2, 'es_ES', 'Entrega - información adicional del producto', '', ''), + (@max_id+1, 'fr_FR', 'Facture - informations additionnelles pour un produit', '', ''), + (@max_id+2, 'fr_FR', 'Bon de livraison - informations additionnelles pour un produit', '', '') +; + +UPDATE `hook` SET `by_module` = 1 WHERE `code` = 'module.config-js'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.6.sql b/setup/update/sql/2.1.6.sql new file mode 100644 index 00000000..21713348 --- /dev/null +++ b/setup/update/sql/2.1.6.sql @@ -0,0 +1,11 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.6' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='6' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +UPDATE hook SET by_module = '1' WHERE hook.code = 'module.configuration'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.7.sql b/setup/update/sql/2.1.7.sql new file mode 100644 index 00000000..f5b7a5af --- /dev/null +++ b/setup/update/sql/2.1.7.sql @@ -0,0 +1,45 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.7' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='7' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_image_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_image_id` +FOREIGN KEY (`product_image_id`) +REFERENCES `product_image` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_document_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_document_id` +FOREIGN KEY (`product_document_id`) +REFERENCES `product_document` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.1.8.sql b/setup/update/sql/2.1.8.sql new file mode 100644 index 00000000..db58e354 --- /dev/null +++ b/setup/update/sql/2.1.8.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.8' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='8' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.1.9.sql b/setup/update/sql/2.1.9.sql new file mode 100644 index 00000000..4591df91 --- /dev/null +++ b/setup/update/sql/2.1.9.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.9' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='9' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.2.0-alpha1.sql b/setup/update/sql/2.2.0-alpha1.sql new file mode 100644 index 00000000..48beea9e --- /dev/null +++ b/setup/update/sql/2.2.0-alpha1.sql @@ -0,0 +1,417 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-alpha1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha1' WHERE `name`='thelia_extra_version'; + +-- order status + +SELECT @max_id := MAX(`id`) FROM `order_status`; + +INSERT INTO `order_status` VALUES + (@max_id + 1, "refunded", NOW(), NOW()) +; + +INSERT INTO `order_status_i18n` VALUES +(@max_id + 1, "de_DE", 'Zrückerstattet', "", "", ""), +(@max_id + 1, "en_US", 'Refunded', "", "", ""), +(@max_id + 1, "es_ES", 'Reembolsado', "", "", ""), +(@max_id + 1, "fr_FR", 'Remboursé', "", "", "") +; + +-- new column in admin_log + +ALTER TABLE `admin_log` ADD `resource_id` INTEGER AFTER `resource` ; + +-- new config + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'customer_change_email', '0', 0, 0, NOW(), NOW()), +(@max_id + 2, 'customer_confirm_email', '0', 0, 0, NOW(), NOW()) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max_id + 1, 'de_DE', 'Den Kunden erlauben ihre E-Mail-Adresse zu ändern. 1 für Ja, 0 für Nein', NULL, NULL, NULL), +(@max_id + 2, 'de_DE', 'Den Kunden fragen, ihre E-Mail-Adresse zu bestätigen. 1 für Jan, 0 für Nein', NULL, NULL, NULL), +(@max_id + 1, 'en_US', 'Allow customers to change their email. 1 for yes, 0 for no', NULL, NULL, NULL), +(@max_id + 2, 'en_US', 'Ask the customers to confirm their email, 1 for yes, 0 for no', NULL, NULL, NULL), +(@max_id + 1, 'es_ES', 'Permitir a los clientes cambiar su correo electrónico. 1 para sí, 0 para no', NULL, NULL, NULL), +(@max_id + 2, 'es_ES', 'Preguntar al cliente para confirmar su correo electrónico, 1 para sí, 0 no', NULL, NULL, NULL), +(@max_id + 1, 'fr_FR', 'Permettre aux utilisateurs de changer leur email. 1 pour oui, 0 pour non', NULL, NULL, NULL), +(@max_id + 2, 'fr_FR', 'Demander aux clients de confirmer leur email. 1 pour oui, 0 pour non', NULL, NULL, NULL) +; + +-- country area table + +create table IF NOT EXISTS `country_area` +( + `country_id` INTEGER NOT NULL, + `area_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + INDEX `country_area_area_id_idx` (`area_id`), + INDEX `fk_country_area_country_id_idx` (`country_id`), + CONSTRAINT `fk_country_area_area_id` + FOREIGN KEY (`area_id`) + REFERENCES `area` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_country_area_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- Initialize the table with existing data +INSERT INTO `country_area` (`country_id`, `area_id`, `created_at`, `updated_at`) select `id`, `area_id`, NOW(), NOW() FROM `country` WHERE `area_id` IS NOT NULL; + +-- Remove area_id column from country table +ALTER TABLE `country` DROP FOREIGN KEY `fk_country_area_id`; +ALTER TABLE `country` DROP KEY `idx_country_area_id`; +ALTER TABLE `country` DROP COLUMN `area_id`; +ALTER TABLE `category` ADD COLUMN `default_template_id` INTEGER AFTER `position`; + +-- new hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'profile.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'profile.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'import.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'import.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'export.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'export.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'category-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 8, 'category-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 9, 'brand-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 10, 'brand-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 11, 'attribute-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 12, 'attribute-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 13, 'currency-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 14, 'currency-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 15, 'country-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 16, 'country-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 17, 'content-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 18, 'content-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 19, 'feature-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 20, 'feature-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 21, 'document-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 22, 'document-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 23, 'customer-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 24, 'customer-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 25, 'image-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 26, 'image-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 27, 'hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 28, 'hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 29, 'folder-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 30, 'folder-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 31, 'module-hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 32, 'module-hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 33, 'module-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 34, 'module-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 35, 'message-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 36, 'message-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 37, 'profile-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 38, 'profile-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 39, 'product-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 40, 'product-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 41, 'order-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 42, 'order-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 43, 'shipping-zones-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 44, 'shipping-zones-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 45, 'shipping-configuration-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 46, 'shipping-configuration-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 47, 'sale-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 48, 'sale-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 49, 'variables-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 50, 'variables-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 51, 'template-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 52, 'template-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 53, 'tax-rule-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 54, 'tax-rule-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 55, 'tax-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 56, 'tax-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 57, 'order-edit.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 58, 'order.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 59, 'account-order.product', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 60, 'tab-seo.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 61, 'tab-seo.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 62, 'tab-image.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 63, 'tab-image.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 64, 'tab-document.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 65, 'tab-document.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', 'Profil - Tabellenkopf', '', ''), +(@max_id + 2, 'de_DE', 'Profil - Tabellenzeile', '', ''), +(@max_id + 3, 'de_DE', 'Import - Tabellenkopf', '', ''), +(@max_id + 4, 'de_DE', 'Import - Tabellenzeile', '', ''), +(@max_id + 5, 'de_DE', 'Export - Tabellenkopf', '', ''), +(@max_id + 6, 'de_DE', 'Export - Tabellenzeile', '', ''), +(@max_id + 7, 'de_DE', 'Kategorie Bearbeitung - oben', '', ''), +(@max_id + 8, 'de_DE', 'Kategorie Bearbeitung - unten', '', ''), +(@max_id + 9, 'de_DE', 'Marke Bearbeitung - oben', '', ''), +(@max_id + 10, 'de_DE', 'Marke Bearbeitung - unten', '', ''), +(@max_id + 11, 'de_DE', 'Deklination Bearbeitung - oben', '', ''), +(@max_id + 12, 'de_DE', 'Deklination Bearbeitung - unten', '', ''), +(@max_id + 13, 'de_DE', 'Währung Bearbeitung - oben', '', ''), +(@max_id + 14, 'de_DE', 'Währung Bearbeitung - unten', '', ''), +(@max_id + 15, 'de_DE', 'Währung Bearbeitung - oben', '', ''), +(@max_id + 16, 'de_DE', 'Währung Bearbeitung - unten', '', ''), +(@max_id + 17, 'de_DE', 'Inhalt Bearbeitung - oben', '', ''), +(@max_id + 18, 'de_DE', 'Inhalt Bearbeitung - unten', '', ''), +(@max_id + 19, 'de_DE', 'Charakteristik Bearbeitung - oben', '', ''), +(@max_id + 20, 'de_DE', 'Charakteristik Bearbeitung - unten', '', ''), +(@max_id + 21, 'de_DE', 'Dokument Bearbeitung - oben', '', ''), +(@max_id + 22, 'de_DE', 'Dokument Bearbeitung - unten', '', ''), +(@max_id + 23, 'de_DE', 'Kunde Bearbeitung - oben', '', ''), +(@max_id + 24, 'de_DE', 'Kunde Bearbeitung - unten', '', ''), +(@max_id + 25, 'de_DE', 'Bild Bearbeitung - oben', '', ''), +(@max_id + 26, 'de_DE', 'Bild Bearbeitung - unten', '', ''), +(@max_id + 27, 'de_DE', 'Hook Bearbeitung - oben', '', ''), +(@max_id + 28, 'de_DE', 'Hook Bearbeitung - unten', '', ''), +(@max_id + 29, 'de_DE', 'Ordner Bearbeitung - oben', '', ''), +(@max_id + 30, 'de_DE', 'Ordner Bearbeitung - unten', '', ''), +(@max_id + 31, 'de_DE', 'Modul-Hook Bearbeitung - oben', '', ''), +(@max_id + 32, 'de_DE', 'Modul-Hook Bearbeitung - unten', '', ''), +(@max_id + 33, 'de_DE', 'Modul Bearbeitung - oben', '', ''), +(@max_id + 34, 'de_DE', 'Modul Bearbeitung - unten', '', ''), +(@max_id + 35, 'de_DE', 'Nachricht Bearbeitung - oben', '', ''), +(@max_id + 36, 'de_DE', 'Nachricht Bearbeitung - unten', '', ''), +(@max_id + 37, 'de_DE', 'Profil Bearbeitung - oben', '', ''), +(@max_id + 38, 'de_DE', 'Profil Bearbeitung - unten', '', ''), +(@max_id + 39, 'de_DE', 'Produkt Bearbeitung - oben', '', ''), +(@max_id + 40, 'de_DE', 'Produkt Bearbeitung - unten', '', ''), +(@max_id + 41, 'de_DE', 'Bestellung Bearbeitung - oben', '', ''), +(@max_id + 42, 'de_DE', 'Bestellung Bearbeitung - unten', '', ''), +(@max_id + 43, 'de_DE', 'Transporteur Lieferzonen Bearbeitung - oben', '', ''), +(@max_id + 44, 'de_DE', 'Transporteur Lieferzonen Bearbeitung - unten', '', ''), +(@max_id + 45, 'de_DE', 'Lieferzone Bearbeitung - oben', '', ''), +(@max_id + 46, 'de_DE', 'Lieferzone Bearbeitung - unten', '', ''), +(@max_id + 47, 'de_DE', 'Sonderangebot Bearbeitung - oben', '', ''), +(@max_id + 48, 'de_DE', 'Sonderangebot Bearbeitung - unten', '', ''), +(@max_id + 49, 'de_DE', 'Variable Bearbeitung - oben', '', ''), +(@max_id + 50, 'de_DE', 'Variable Bearbeitung - unten', '', ''), +(@max_id + 51, 'de_DE', 'Template Bearbeitung - oben', '', ''), +(@max_id + 52, 'de_DE', 'Template Bearbeitung - unten', '', ''), +(@max_id + 53, 'de_DE', 'Taxregel Bearbeitung - oben', '', ''), +(@max_id + 54, 'de_DE', 'Taxregel Bearbeitung - unten', '', ''), +(@max_id + 55, 'de_DE', 'Taxe Bearbeitung - oben', '', ''), +(@max_id + 56, 'de_DE', 'Taxe Bearbeitung - unten', '', ''), +(@max_id + 57, 'de_DE', 'Bestellungs Bearbeitung - unter die Produktdaten', '', ''), +(@max_id + 58, 'de_DE', 'Bestellung - Tab', '', ''), +(@max_id + 59, 'de_DE', 'Bestelldaten - nach einem Produkt', '', ''), +(@max_id + 60, 'de_DE', 'SEO Tab - oben', '', ''), +(@max_id + 61, 'de_DE', 'SEO Tab - unten', '', ''), +(@max_id + 62, 'de_DE', 'Bild Tab - oben', '', ''), +(@max_id + 63, 'de_DE', 'Bild Tab - unten', '', ''), +(@max_id + 64, 'de_DE', 'Dokument Tab - oben', '', ''), +(@max_id + 65, 'de_DE', 'Dokument Tab - unten', '', ''), +(@max_id + 1, 'en_US', 'Profile - table header', '', ''), +(@max_id + 2, 'en_US', 'Profile - table row', '', ''), +(@max_id + 3, 'en_US', 'Import - table header', '', ''), +(@max_id + 4, 'en_US', 'Import - table row', '', ''), +(@max_id + 5, 'en_US', 'Export - table header', '', ''), +(@max_id + 6, 'en_US', 'Export - table row', '', ''), +(@max_id + 7, 'en_US', 'Category edit - top', '', ''), +(@max_id + 8, 'en_US', 'Category edit - bottom', '', ''), +(@max_id + 9, 'en_US', 'Brand edit - top', '', ''), +(@max_id + 10, 'en_US', 'Brand edit - bottom', '', ''), +(@max_id + 11, 'en_US', 'Attribute edit - top', '', ''), +(@max_id + 12, 'en_US', 'Attribute edit - bottom', '', ''), +(@max_id + 13, 'en_US', 'Currency edit - top', '', ''), +(@max_id + 14, 'en_US', 'Currency edit - bottom', '', ''), +(@max_id + 15, 'en_US', 'Country edit - top', '', ''), +(@max_id + 16, 'en_US', 'Country edit - bottom', '', ''), +(@max_id + 17, 'en_US', 'Content edit - top', '', ''), +(@max_id + 18, 'en_US', 'Content edit - bottom', '', ''), +(@max_id + 19, 'en_US', 'Feature edit - top', '', ''), +(@max_id + 20, 'en_US', 'Feature edit - bottom', '', ''), +(@max_id + 21, 'en_US', 'Document edit - top', '', ''), +(@max_id + 22, 'en_US', 'Document edit - bottom', '', ''), +(@max_id + 23, 'en_US', 'Client edit - top', '', ''), +(@max_id + 24, 'en_US', 'Client edit - bottom', '', ''), +(@max_id + 25, 'en_US', 'Image edit - top', '', ''), +(@max_id + 26, 'en_US', 'Image edit - bottom', '', ''), +(@max_id + 27, 'en_US', 'Hook edit - top', '', ''), +(@max_id + 28, 'en_US', 'Hook edit - bottom', '', ''), +(@max_id + 29, 'en_US', 'Folder edit - top', '', ''), +(@max_id + 30, 'en_US', 'Folder edit - bottom', '', ''), +(@max_id + 31, 'en_US', 'Module hook edit - top', '', ''), +(@max_id + 32, 'en_US', 'Module hook edit - bottom', '', ''), +(@max_id + 33, 'en_US', 'Module edit - top', '', ''), +(@max_id + 34, 'en_US', 'Module edit - bottom', '', ''), +(@max_id + 35, 'en_US', 'Message edit - top', '', ''), +(@max_id + 36, 'en_US', 'Message edit - bottom', '', ''), +(@max_id + 37, 'en_US', 'Profile edit - top', '', ''), +(@max_id + 38, 'en_US', 'Profile edit - bottom', '', ''), +(@max_id + 39, 'en_US', 'Product edit - top', '', ''), +(@max_id + 40, 'en_US', 'Product edit - bottom', '', ''), +(@max_id + 41, 'en_US', 'Order edit - top', '', ''), +(@max_id + 42, 'en_US', 'Order edit - bottom', '', ''), +(@max_id + 43, 'en_US', 'Shipping zones edit - top', '', ''), +(@max_id + 44, 'en_US', 'Shipping zones edit - bottom', '', ''), +(@max_id + 45, 'en_US', 'Shipping configuration edit - top', '', ''), +(@max_id + 46, 'en_US', 'Shipping configuration edit - bottom', '', ''), +(@max_id + 47, 'en_US', 'Sale edit - top', '', ''), +(@max_id + 48, 'en_US', 'Sale edit - bottom', '', ''), +(@max_id + 49, 'en_US', 'Variable edit - top', '', ''), +(@max_id + 50, 'en_US', 'Variable edit - bottom', '', ''), +(@max_id + 51, 'en_US', 'Template edit - top', '', ''), +(@max_id + 52, 'en_US', 'Template edit - bottom', '', ''), +(@max_id + 53, 'en_US', 'Tax rule edit - top', '', ''), +(@max_id + 54, 'en_US', 'Tax rule edit - bottom', '', ''), +(@max_id + 55, 'en_US', 'Tax edit - top', '', ''), +(@max_id + 56, 'en_US', 'Tax edit - bottom', '', ''), +(@max_id + 57, 'en_US', 'Order edit - displayed after product information', '', ''), +(@max_id + 58, 'en_US', 'Order - Tab', '', ''), +(@max_id + 59, 'en_US', 'Order details - after product', '', ''), +(@max_id + 60, 'en_US', 'Tab SEO - top', '', ''), +(@max_id + 61, 'en_US', 'Tab SEO - bottom', '', ''), +(@max_id + 62, 'en_US', 'Tab image - top', '', ''), +(@max_id + 63, 'en_US', 'Tab image - bottom', '', ''), +(@max_id + 64, 'en_US', 'Tab document - top', '', ''), +(@max_id + 65, 'en_US', 'Tab document - bottom', '', ''), +(@max_id + 1, 'es_ES', 'Perfil - encabezado de tabla', '', ''), +(@max_id + 2, 'es_ES', 'Perfil - fila de la tabla', '', ''), +(@max_id + 3, 'es_ES', 'Importar - encabezado de tabla', '', ''), +(@max_id + 4, 'es_ES', 'Importar - fila de la tabla', '', ''), +(@max_id + 5, 'es_ES', 'Exportación - encabezado de tabla', '', ''), +(@max_id + 6, 'es_ES', 'Exportación - fila de la tabla', '', ''), +(@max_id + 7, 'es_ES', 'Categoría edición - superior', '', ''), +(@max_id + 8, 'es_ES', 'Editar categoría - inferior', '', ''), +(@max_id + 9, 'es_ES', 'Editar marca - superior', '', ''), +(@max_id + 10, 'es_ES', 'Editar marca - inferior', '', ''), +(@max_id + 11, 'es_ES', 'Editar atributo - superior', '', ''), +(@max_id + 12, 'es_ES', 'Edición de atributos - inferior', '', ''), +(@max_id + 13, 'es_ES', 'Editar Monedas - Cabecera', '', ''), +(@max_id + 14, 'es_ES', 'Editar Monedas - Pie', '', ''), +(@max_id + 15, 'es_ES', 'Edición de país - parte superior', '', ''), +(@max_id + 16, 'es_ES', 'Edición de pais - parte inferior', '', ''), +(@max_id + 17, 'es_ES', 'Editar contenido - superior', '', ''), +(@max_id + 18, 'es_ES', 'Editar Contenido - inferior', '', ''), +(@max_id + 19, 'es_ES', 'Editar Característica - superior', '', ''), +(@max_id + 20, 'es_ES', 'Editar Característica - inferior', '', ''), +(@max_id + 21, 'es_ES', 'Edición de documentos - cabecera', '', ''), +(@max_id + 22, 'es_ES', 'Edición de documentos - pie', '', ''), +(@max_id + 23, 'es_ES', 'Editar cliente - superior', '', ''), +(@max_id + 24, 'es_ES', 'Editar cliente - parte inferior', '', ''), +(@max_id + 25, 'es_ES', 'Edición de imagen - parte superior', '', ''), +(@max_id + 26, 'es_ES', 'Edición de imagen - parte inferior', '', ''), +(@max_id + 27, 'es_ES', 'Edición de Hook - superior', '', ''), +(@max_id + 28, 'es_ES', 'Edición de Hook - inferior', '', ''), +(@max_id + 29, 'es_ES', 'Edición de carpeta - superior', '', ''), +(@max_id + 30, 'es_ES', 'Editar carpeta - parte inferior', '', ''), +(@max_id + 31, 'es_ES', NULL, '', ''), +(@max_id + 32, 'es_ES', NULL, '', ''), +(@max_id + 33, 'es_ES', 'Edición de módulo - tope', '', ''), +(@max_id + 34, 'es_ES', 'Edición de módulo - base', '', ''), +(@max_id + 35, 'es_ES', 'Editar mensaje - tope', '', ''), +(@max_id + 36, 'es_ES', 'Editar mensaje - base', '', ''), +(@max_id + 37, 'es_ES', 'Editar Perfil - parte superior', '', ''), +(@max_id + 38, 'es_ES', 'Editar Perfil - parte inferior', '', ''), +(@max_id + 39, 'es_ES', 'Editar producto - parte superior', '', ''), +(@max_id + 40, 'es_ES', 'Editar producto - parte inferior', '', ''), +(@max_id + 41, 'es_ES', 'Edición de Pedido - al tope', '', ''), +(@max_id + 42, 'es_ES', 'Editar Orden - parte inferior', '', ''), +(@max_id + 43, 'es_ES', 'Edición zonas de envío - inicio', '', ''), +(@max_id + 44, 'es_ES', 'Edición zonas de envío - base', '', ''), +(@max_id + 45, 'es_ES', 'Configuración de envío - inicio', '', ''), +(@max_id + 46, 'es_ES', 'Configuración de envío - base', '', ''), +(@max_id + 47, 'es_ES', 'Editar Venta - parte superior', '', ''), +(@max_id + 48, 'es_ES', 'Editar Venta - parte inferior', '', ''), +(@max_id + 49, 'es_ES', 'Editar variable - parte superior', '', ''), +(@max_id + 50, 'es_ES', 'Editar variable - parte inferior', '', ''), +(@max_id + 51, 'es_ES', 'Editar plantilla - parte superior', '', ''), +(@max_id + 52, 'es_ES', 'Editar plantilla - parte inferior', '', ''), +(@max_id + 53, 'es_ES', 'Edición de regla de impuesto - parte superior', '', ''), +(@max_id + 54, 'es_ES', 'Editar regla de Impuesto - base', '', ''), +(@max_id + 55, 'es_ES', 'Editar Impuesto - parte superior', '', ''), +(@max_id + 56, 'es_ES', 'Editar Impuesto - base', '', ''), +(@max_id + 57, 'es_ES', 'Edición de Pedido - se muestra después de la información de producto', '', ''), +(@max_id + 58, 'es_ES', 'Orden - Pestaña', '', ''), +(@max_id + 59, 'es_ES', 'Detalles de la orden - después del producto', '', ''), +(@max_id + 60, 'es_ES', 'Ficha SEO - arriba', '', ''), +(@max_id + 61, 'es_ES', 'Ficha SEO - abajo', '', ''), +(@max_id + 62, 'es_ES', 'Pestaña de imagen - arriba', '', ''), +(@max_id + 63, 'es_ES', 'Pestaña de imagen - abajo', '', ''), +(@max_id + 64, 'es_ES', 'Ficha de documento - arriba', '', ''), +(@max_id + 65, 'es_ES', 'Ficha de documento - abajo', '', ''), +(@max_id + 1, 'fr_FR', 'Profil - colonne tableau', '', ''), +(@max_id + 2, 'fr_FR', 'Profil - ligne du tableau', '', ''), +(@max_id + 3, 'fr_FR', 'Import - colonne tableau', '', ''), +(@max_id + 4, 'fr_FR', 'Import - ligne du tableau', '', ''), +(@max_id + 5, 'fr_FR', 'Export - colonne tableau', '', ''), +(@max_id + 6, 'fr_FR', 'Export - ligne du tableau', '', ''), +(@max_id + 7, 'fr_FR', 'Édition d\'une categorie - en haut', '', ''), +(@max_id + 8, 'fr_FR', 'Édition d\'une categorie - en bas', '', ''), +(@max_id + 9, 'fr_FR', 'Édition d\'une marque - en haut', '', ''), +(@max_id + 10, 'fr_FR', 'Édition d\'une marque - en bas', '', ''), +(@max_id + 11, 'fr_FR', 'Édition d\'une déclinaison - en haut', '', ''), +(@max_id + 12, 'fr_FR', 'Édition d\'une déclinaison - en bas', '', ''), +(@max_id + 13, 'fr_FR', 'Édition d\'une devise - en haut', '', ''), +(@max_id + 14, 'fr_FR', 'Édition d\'une devise - en bas', '', ''), +(@max_id + 15, 'fr_FR', 'Édition d\'un pays - en haut', '', ''), +(@max_id + 16, 'fr_FR', 'Édition d\'un pays - en bas', '', ''), +(@max_id + 17, 'fr_FR', 'Édition d\'un contenu - en haut', '', ''), +(@max_id + 18, 'fr_FR', 'Édition d\'un contenu - en bas', '', ''), +(@max_id + 19, 'fr_FR', 'Édition d\'une caractéristique - en haut', '', ''), +(@max_id + 20, 'fr_FR', 'Édition d\'une caractéristique - en bas', '', ''), +(@max_id + 21, 'fr_FR', 'Édition d\'un document - en haut', '', ''), +(@max_id + 22, 'fr_FR', 'Édition d\'un document - en bas', '', ''), +(@max_id + 23, 'fr_FR', 'Édition d\'un client - en haut', '', ''), +(@max_id + 24, 'fr_FR', 'Édition d\'un client - en bas', '', ''), +(@max_id + 25, 'fr_FR', 'Édition d\'image - en haut', '', ''), +(@max_id + 26, 'fr_FR', 'Édition d\'image - en bas', '', ''), +(@max_id + 27, 'fr_FR', 'Édition d\'hook - en haut', '', ''), +(@max_id + 28, 'fr_FR', 'Édition d\'hook - en bas', '', ''), +(@max_id + 29, 'fr_FR', 'Édition d\'un dossier - en haut', '', ''), +(@max_id + 30, 'fr_FR', 'Édition d\'un dossier - en bas', '', ''), +(@max_id + 31, 'fr_FR', 'Édition d\'un hook de module - en haut', '', ''), +(@max_id + 32, 'fr_FR', 'Édition d\'un hook de module - en bas', '', ''), +(@max_id + 33, 'fr_FR', 'Édition d\'un module - en haut', '', ''), +(@max_id + 34, 'fr_FR', 'Édition d\'un module - en bas', '', ''), +(@max_id + 35, 'fr_FR', 'Édition d\'un message - en haut', '', ''), +(@max_id + 36, 'fr_FR', 'Édition d\'un message - en bas', '', ''), +(@max_id + 37, 'fr_FR', 'Édition d\'un profil - en haut', '', ''), +(@max_id + 38, 'fr_FR', 'Édition d\'un profil - en bas', '', ''), +(@max_id + 39, 'fr_FR', 'Édition d\'un produit - en haut', '', ''), +(@max_id + 40, 'fr_FR', 'Édition d\'un produit - en bas', '', ''), +(@max_id + 41, 'fr_FR', 'Édition d\'une commande - en haut', '', ''), +(@max_id + 42, 'fr_FR', 'Édition d\'une commande - en bas', '', ''), +(@max_id + 43, 'fr_FR', 'Édition des zones de livraison d\'un transporteur - en haut', '', ''), +(@max_id + 44, 'fr_FR', 'Édition des zones de livraison d\'un transporteur - en bas', '', ''), +(@max_id + 45, 'fr_FR', 'Édition d\'une zone de livraison - en haut', '', ''), +(@max_id + 46, 'fr_FR', 'Édition d\'une zone de livraiso - en bas', '', ''), +(@max_id + 47, 'fr_FR', 'Édition d\'une promotion - en haut', '', ''), +(@max_id + 48, 'fr_FR', 'Édition d\'une promotion - en bas', '', ''), +(@max_id + 49, 'fr_FR', 'Édition d\'une variable - en haut', '', ''), +(@max_id + 50, 'fr_FR', 'Édition d\'une variable - en bas', '', ''), +(@max_id + 51, 'fr_FR', 'Édition d\'un gabarit - en haut', '', ''), +(@max_id + 52, 'fr_FR', 'Édition d\'un gabarit - en bas', '', ''), +(@max_id + 53, 'fr_FR', 'Édition d\'une règle de taxe - en haut', '', ''), +(@max_id + 54, 'fr_FR', 'Édition d\'une règle de taxe - en bas', '', ''), +(@max_id + 55, 'fr_FR', 'Édition d\'une taxe - en haut', '', ''), +(@max_id + 56, 'fr_FR', 'Édition d\'une taxe - en bas', '', ''), +(@max_id + 57, 'fr_FR', 'Édition d\'une commande - sous les informations du produit', '', ''), +(@max_id + 58, 'fr_FR', 'Commande- Onglet', '', ''), +(@max_id + 59, 'fr_FR', 'Détail d\'une commande - Après un produit', '', ''), +(@max_id + 60, 'fr_FR', 'Onglet SEO - en haut', '', ''), +(@max_id + 61, 'fr_FR', 'Onglet SEO - en bas', '', ''), +(@max_id + 62, 'fr_FR', 'Onglet image - en haut', '', ''), +(@max_id + 63, 'fr_FR', 'Onglet image - en bas', '', ''), +(@max_id + 64, 'fr_FR', 'Onglet document - en haut', '', ''), +(@max_id + 65, 'fr_FR', 'Onglet document - en bas', '', '') +; + +-- Fix attribute_template and feature_template relations +ALTER TABLE `attribute_template` DROP FOREIGN KEY `fk_attribute_template`; ALTER TABLE `attribute_template` ADD CONSTRAINT `fk_attribute_template` FOREIGN KEY (`template_id`) REFERENCES `template`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT; +ALTER TABLE `feature_template` DROP FOREIGN KEY `fk_feature_template`; ALTER TABLE `feature_template` ADD CONSTRAINT `fk_feature_template` FOREIGN KEY (`template_id`) REFERENCES `template`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.2.0-alpha2.sql b/setup/update/sql/2.2.0-alpha2.sql new file mode 100644 index 00000000..1a9d1caf --- /dev/null +++ b/setup/update/sql/2.2.0-alpha2.sql @@ -0,0 +1,51 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-alpha2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha2' WHERE `name`='thelia_extra_version'; + +-- Add cellphone column in order_address table +ALTER TABLE `order_address` ADD COLUMN `cellphone` VARCHAR (20) AFTER `phone`; + +-- new hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'order-edit.customer-information-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'order-edit.payment-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'order-edit.delivery-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'invoice.after-payment-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'invoice.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'delivery.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', 'Bestellung - Kunde Informationen unten', '', ''), +(@max_id + 2, 'de_DE', 'Bestellung - Zahlungsmodul unten', '', ''), +(@max_id + 3, 'de_DE', 'Bestellung - Liefermodul unten', '', ''), +(@max_id + 4, 'de_DE', 'Rechnung - Nach dem Zahlungsmodul', NULL, NULL), +(@max_id + 5, 'de_DE', 'Rechnung - Nach dem Liefermodul', NULL, NULL), +(@max_id + 6, 'de_DE', 'Lieferung - Nach dem Liefermodul', NULL, NULL), +(@max_id + 1, 'en_US', 'Order - customer information bottom', '', ''), +(@max_id + 2, 'en_US', 'Order - payment module bottom', '', ''), +(@max_id + 3, 'en_US', 'Order - delivery module bottom', '', ''), +(@max_id + 4, 'en_US', 'Invoice - After payment module', NULL, NULL), +(@max_id + 5, 'en_US', 'Invoice - After delivery module', NULL, NULL), +(@max_id + 6, 'en_US', 'Delivery - After delivery module', NULL, NULL), +(@max_id + 1, 'es_ES', 'Orden - parte inferior de información del cliente', '', ''), +(@max_id + 2, 'es_ES', 'Orden - parte inferior del módulo de pago', '', ''), +(@max_id + 3, 'es_ES', 'Orden - parte inferior del módulo de entrega', '', ''), +(@max_id + 4, 'es_ES', 'Factura - Después de módulo de pago de factura', NULL, NULL), +(@max_id + 5, 'es_ES', 'Factura - Después de módulo de entrega de factura', NULL, NULL), +(@max_id + 6, 'es_ES', 'Entrega - después del módulo de entrega', NULL, NULL), +(@max_id + 1, 'fr_FR', 'Commande - en bas des informations client', '', ''), +(@max_id + 2, 'fr_FR', 'Commande - en bas du module de paiement', '', ''), +(@max_id + 3, 'fr_FR', 'Commande - en bas du module de livraison', '', ''), +(@max_id + 4, 'fr_FR', 'Commande - après le module de paiement', NULL, NULL), +(@max_id + 5, 'fr_FR', 'Commande - après le module de livraison', NULL, NULL), +(@max_id + 6, 'fr_FR', 'Commande - après le module de livraison', NULL, NULL) +; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.2.0-beta1.sql b/setup/update/sql/2.2.0-beta1.sql new file mode 100644 index 00000000..fa695bde --- /dev/null +++ b/setup/update/sql/2.2.0-beta1.sql @@ -0,0 +1,40 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-beta1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta1' WHERE `name`='thelia_extra_version'; + +-- fix currency already created +update currency set by_default = 0 where by_default is NULL; + +ALTER TABLE `category_version` ADD COLUMN `default_template_id` INTEGER AFTER `position`; + +-- new hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id + 1, 'order-edit.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id + 2, 'order-edit.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id + 3, 'mini-cart', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES + (@max_id + 1, 'de_DE', 'Bestellung - Tabellenkopf', '', ''), + (@max_id + 2, 'de_DE', 'Bestellung - Tabellenzeile', '', ''), + (@max_id + 3, 'de_DE', 'Mini-Warenkorb', '', ''), + (@max_id + 1, 'en_US', 'Order - table header', '', ''), + (@max_id + 2, 'en_US', 'Order - table row', '', ''), + (@max_id + 3, 'en_US', 'Mini cart', '', ''), + (@max_id + 1, 'es_ES', 'Orden - encabezado de tabla', '', ''), + (@max_id + 2, 'es_ES', 'Orden - fila de la tabla', '', ''), + (@max_id + 3, 'es_ES', 'Mini tarjeta', '', ''), + (@max_id + 1, 'fr_FR', 'Commande - colonne tableau', '', ''), + (@max_id + 2, 'fr_FR', 'Commande - ligne tableau', '', ''), + (@max_id + 3, 'fr_FR', 'Mini panier', '', '') +; + +ALTER TABLE `rewriting_url` CHANGE `url` `url` VARBINARY( 255 ) NOT NULL; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.2.0-beta2.sql b/setup/update/sql/2.2.0-beta2.sql new file mode 100644 index 00000000..bc5a4e85 --- /dev/null +++ b/setup/update/sql/2.2.0-beta2.sql @@ -0,0 +1,5 @@ +UPDATE `config` SET `value`='2.2.0-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; diff --git a/setup/update/sql/2.2.0-beta3.sql b/setup/update/sql/2.2.0-beta3.sql new file mode 100644 index 00000000..d571581f --- /dev/null +++ b/setup/update/sql/2.2.0-beta3.sql @@ -0,0 +1,69 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-beta3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta3' WHERE `name`='thelia_extra_version'; + +-- fix hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'tab-seo.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'order-edit.order-product-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'order-edit.order-product-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'administrators.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'administrators.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'advanced-configuration', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'advanced-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES + (@max_id + 1, 'de_DE', 'Registerkarte SEO - Update-Formular', '', ''), + (@max_id + 2, 'de_DE', 'Bestellung bearbeiten - Produkttabelle Header', '', ''), + (@max_id + 3, 'de_DE', 'Bestellung bearbeiten - Produkttabelle Zeile', '', ''), + (@max_id + 4, 'de_DE', 'Administratoren - Header', '', ''), + (@max_id + 5, 'de_DE', 'Administratoren - Zeile', '', ''), + (@max_id + 6, 'de_DE', 'Erweiterte Konfiguration', '', ''), + (@max_id + 7, 'de_DE', 'Erweiterte Konfiguration - JavaScript', '', ''), + (@max_id + 1, 'en_US', 'Tab SEO - update form', '', ''), + (@max_id + 2, 'en_US', 'Order edit - order product table header', '', ''), + (@max_id + 3, 'en_US', 'Order edit - order product table row', '', ''), + (@max_id + 4, 'en_US', 'Administrators - header', '', ''), + (@max_id + 5, 'en_US', 'Administrators - row', '', ''), + (@max_id + 6, 'en_US', 'Advanced Configuration', '', ''), + (@max_id + 7, 'en_US', 'Advanced Configuration - Javascript', '', ''), + (@max_id + 1, 'es_ES', 'Ficha SEO - formato de actualización', '', ''), + (@max_id + 2, 'es_ES', 'Edición de Pedido - encabezado de la tabla de pedido de producto', '', ''), + (@max_id + 3, 'es_ES', 'Edición de Pedido - fila de la tabla del pedido de producto', '', ''), + (@max_id + 4, 'es_ES', 'Administradores - cabecera', '', ''), + (@max_id + 5, 'es_ES', 'Administradores - fila', '', ''), + (@max_id + 6, 'es_ES', 'Configuración avanzada', '', ''), + (@max_id + 7, 'es_ES', 'Configuración avanzada - JavaScript', '', ''), + (@max_id + 1, 'fr_FR', 'Onglet SEO - formulaire de mise à jour', '', ''), + (@max_id + 2, 'fr_FR', 'Modification commande - en-tête des produits', '', ''), + (@max_id + 3, 'fr_FR', 'Modification commande - ligne du tableau des produits', '', ''), + (@max_id + 4, 'fr_FR', 'Administrateurs - en-tête', '', ''), + (@max_id + 5, 'fr_FR', 'Administrateurs - ligne', '', ''), + (@max_id + 6, 'fr_FR', 'Configuration avancée', '', ''), + (@max_id + 7, 'fr_FR', 'Configuration avancée - JavaScript', '', '') +; + +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'main.topbar-top' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'main.topbar-bottom' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'product.combinations-row' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.top' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.table-header' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.table-row' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.bottom' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.create-form' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.delete-form' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.js' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.tab-content' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.edit-js' AND `type` = 2; + +-- add index -- +ALTER TABLE `rewriting_url` ADD INDEX `idx_rewriting_url` (`view_locale`, `view`, `view_id`, `redirected`); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.2.0.sql b/setup/update/sql/2.2.0.sql new file mode 100644 index 00000000..741a9784 --- /dev/null +++ b/setup/update/sql/2.2.0.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.2.1.sql b/setup/update/sql/2.2.1.sql new file mode 100644 index 00000000..55e7c684 --- /dev/null +++ b/setup/update/sql/2.2.1.sql @@ -0,0 +1,45 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_image_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_image_id` +FOREIGN KEY (`product_image_id`) +REFERENCES `product_image` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_document_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_document_id` +FOREIGN KEY (`product_document_id`) +REFERENCES `product_document` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.2.2.sql b/setup/update/sql/2.2.2.sql new file mode 100644 index 00000000..2c7f8a74 --- /dev/null +++ b/setup/update/sql/2.2.2.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.2.3.sql b/setup/update/sql/2.2.3.sql new file mode 100644 index 00000000..b66c3fb1 --- /dev/null +++ b/setup/update/sql/2.2.3.sql @@ -0,0 +1,11 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `module` MODIFY `version` varchar(25) NOT NULL DEFAULT ''; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/sql/2.3.0-alpha1.sql b/setup/update/sql/2.3.0-alpha1.sql new file mode 100644 index 00000000..925935c5 --- /dev/null +++ b/setup/update/sql/2.3.0-alpha1.sql @@ -0,0 +1,2010 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-alpha1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha1' WHERE `name`='thelia_extra_version'; + +-- Add new column in module_hook table +ALTER TABLE `module_hook` ADD `templates` TEXT AFTER`position`; + +-- Add new columns in currency table +ALTER TABLE `currency` ADD `format` CHAR( 10 ) NOT NULL AFTER `symbol`; +ALTER TABLE `currency` ADD `visible` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `rate`; + +-- Update currencies +UPDATE `currency` SET `visible` = 1 WHERE 1; +UPDATE `currency` SET `format` = '%n %s' WHERE `code` NOT IN ('USD', 'GBP'); +UPDATE `currency` SET `format` = '%s%n' WHERE `code` IN ('USD', 'GBP'); + +-- Additional hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'brand.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+2, 'brand.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+3, 'category.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+4, 'category.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+5, 'content.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+6, 'content.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+7, 'folder.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+8, 'folder.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+9, 'product.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+10, 'product.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id+1, 'de_DE', 'Marke bearbeiten - Rechte Spalte oben', NULL, NULL), +(@max_id+2, 'de_DE', 'Marke bearbeiten - Rechte Spalte unten', NULL, NULL), +(@max_id+3, 'de_DE', NULL, NULL, NULL), +(@max_id+4, 'de_DE', NULL, NULL, NULL), +(@max_id+5, 'de_DE', 'Inhalt bearbeiten - Rechte Spalte oben', NULL, NULL), +(@max_id+6, 'de_DE', 'Inhalt bearbeiten - Rechte Spalte unten', NULL, NULL), +(@max_id+7, 'de_DE', 'Ordner bearbeiten - Rechte Spalte oben', NULL, NULL), +(@max_id+8, 'de_DE', 'Ordner bearbeiten - Rechte Spalte unten', NULL, NULL), +(@max_id+9, 'de_DE', NULL, NULL, NULL), +(@max_id+10, 'de_DE', NULL, NULL, NULL), +(@max_id+1, 'en_US', 'Brand edit - right column top', NULL, NULL), +(@max_id+2, 'en_US', 'Brand edit - right column bottom', NULL, NULL), +(@max_id+3, 'en_US', 'Category edit - right column top', NULL, NULL), +(@max_id+4, 'en_US', 'Category edit - right column bottom', NULL, NULL), +(@max_id+5, 'en_US', 'Content edit - right column top', NULL, NULL), +(@max_id+6, 'en_US', 'Content edit - right column bottom', NULL, NULL), +(@max_id+7, 'en_US', 'Folder edit - right column top', NULL, NULL), +(@max_id+8, 'en_US', 'Folder edit - right column bottom', NULL, NULL), +(@max_id+9, 'en_US', 'Product edit - right column top', NULL, NULL), +(@max_id+10, 'en_US', 'Product edit - right column bottom', NULL, NULL), +(@max_id+1, 'es_ES', 'Edición de marca - encabezado de la columna derecha', NULL, NULL), +(@max_id+2, 'es_ES', 'Edición de marca - al pie de la columna derecha', NULL, NULL), +(@max_id+3, 'es_ES', 'Edición de categoría - al tope de la columna derecha', NULL, NULL), +(@max_id+4, 'es_ES', 'Edición de categoría - al pie de la columna derecha', NULL, NULL), +(@max_id+5, 'es_ES', 'Edición de Contenido - al tope de la columna derecha', NULL, NULL), +(@max_id+6, 'es_ES', 'Edición de Contenido - al pie de la columna derecha', NULL, NULL), +(@max_id+7, 'es_ES', 'Edición de carpeta - al tope de la columna derecha', NULL, NULL), +(@max_id+8, 'es_ES', 'Edición de carpeta - al pie de la columna derecha', NULL, NULL), +(@max_id+9, 'es_ES', 'Edición de producto - encabezado de la columna derecha', NULL, NULL), +(@max_id+10, 'es_ES', 'Edición de producto - al pie de la columna derecha', NULL, NULL), +(@max_id+1, 'fr_FR', 'Édition d\'une marque - en haut de la colonne de droite', NULL, NULL), +(@max_id+2, 'fr_FR', 'Édition d\'une marque - en bas de la colonne de droite', NULL, NULL), +(@max_id+3, 'fr_FR', 'Édition d\'une catégorie - en haut de la colonne de droite', NULL, NULL), +(@max_id+4, 'fr_FR', 'Édition d\'une catégorie - en bas de la colonne de droite', NULL, NULL), +(@max_id+5, 'fr_FR', 'Édition d\'un contenu - en haut de la colonne de droite', NULL, NULL), +(@max_id+6, 'fr_FR', 'Édition d\'un contenu - en bas de la colonne de droite', NULL, NULL), +(@max_id+7, 'fr_FR', 'Édition d\'un dossier - en haut de la colonne de droite', NULL, NULL), +(@max_id+8, 'fr_FR', 'Édition d\'un dossier - en bas de la colonne de droite', NULL, NULL), +(@max_id+9, 'fr_FR', 'Édition d\'un produit - en haut de la colonne de droite', NULL, NULL), +(@max_id+10, 'fr_FR', 'Édition d\'un produit - en bas de la colonne de droite', NULL, NULL) +; + +/* States */ +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'state-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'state-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'state.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'states.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'states.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'states.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'states.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 8, 'state.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 9, 'state.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 10, 'states.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +(@max_id + 1, 'de_DE', NULL, '', ''), +(@max_id + 2, 'de_DE', NULL, '', ''), +(@max_id + 3, 'de_DE', NULL, '', ''), +(@max_id + 4, 'de_DE', NULL, '', ''), +(@max_id + 5, 'de_DE', NULL, '', ''), +(@max_id + 6, 'de_DE', NULL, '', ''), +(@max_id + 7, 'de_DE', NULL, '', ''), +(@max_id + 8, 'de_DE', NULL, '', ''), +(@max_id + 9, 'de_DE', NULL, '', ''), +(@max_id + 10, 'de_DE', NULL, '', ''), +(@max_id + 1, 'en_US', 'state-edit - at the top', '', ''), +(@max_id + 2, 'en_US', 'state-edit - bottom', '', ''), +(@max_id + 3, 'en_US', 'state - Edit JavaScript', '', ''), +(@max_id + 4, 'en_US', 'states - at the top', '', ''), +(@max_id + 5, 'en_US', 'states - table header', '', ''), +(@max_id + 6, 'en_US', 'states - table row', '', ''), +(@max_id + 7, 'en_US', 'states - bottom', '', ''), +(@max_id + 8, 'en_US', 'state - creation form', '', ''), +(@max_id + 9, 'en_US', 'state - delete form', '', ''), +(@max_id + 10, 'en_US', 'states - JavaScript', '', ''), +(@max_id + 1, 'es_ES', 'estado - editar - encabezado', '', ''), +(@max_id + 2, 'es_ES', 'estado - al pie', '', ''), +(@max_id + 3, 'es_ES', 'estado - Editar JavaScript', '', ''), +(@max_id + 4, 'es_ES', 'estados - encabezado', '', ''), +(@max_id + 5, 'es_ES', 'estados - encabezado de tabla', '', ''), +(@max_id + 6, 'es_ES', 'estados - fila de tabla', '', ''), +(@max_id + 7, 'es_ES', 'estados - al pie', '', ''), +(@max_id + 8, 'es_ES', 'estado - formulario de creación', '', ''), +(@max_id + 9, 'es_ES', 'estado - formulario de borrado', '', ''), +(@max_id + 10, 'es_ES', 'estados - JavaScript', '', ''), +(@max_id + 1, 'fr_FR', 'édition d\'un état - en haut', '', ''), +(@max_id + 2, 'fr_FR', 'édition d\'un état - en bas', '', ''), +(@max_id + 3, 'fr_FR', 'Etat - JavaScript modification', '', ''), +(@max_id + 4, 'fr_FR', 'états - en haut', '', ''), +(@max_id + 5, 'fr_FR', 'états - colonne tableau', '', ''), +(@max_id + 6, 'fr_FR', 'états - ligne du tableau', '', ''), +(@max_id + 7, 'fr_FR', 'états - bas', '', ''), +(@max_id + 8, 'fr_FR', 'état - formulaire de création', '', ''), +(@max_id + 9, 'fr_FR', 'état - formulaire de suppression', '', ''), +(@max_id + 10, 'fr_FR', 'états - JavaScript', '', '') +; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'email-html.template.css', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+2, 'email-html.layout.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+3, 'email-html.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+4, 'email-html.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+5, 'email-html.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+6, 'email-html.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+7, 'email-html.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+8, 'email-html.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+9, 'email-html.order-confirmation.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+10, 'email-html.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+11, 'email-html.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+12, 'email-html.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+13, 'email-html.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+14, 'email-html.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+15, 'email-html.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+16, 'email-txt.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+17, 'email-txt.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+18, 'email-txt.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+19, 'email-txt.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+20, 'email-txt.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+21, 'email-txt.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+22, 'email-txt.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+23, 'email-txt.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+24, 'email-txt.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+25, 'email-txt.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+26, 'email-txt.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+27, 'email-txt.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES + (@max_id+1, 'de_DE', 'E-Mail html - Layout - CSS', NULL, NULL), + (@max_id+2, 'de_DE', 'E-Mail html - Layout - Fußzeile', NULL, NULL), + (@max_id+3, 'de_DE', 'E-Mail html - Bestellbestätigung - vor Adresse', NULL, NULL), + (@max_id+4, 'de_DE', NULL, NULL, NULL), + (@max_id+5, 'de_DE', 'E-Mail html - Bestellbestätigung - nach Adresse', NULL, NULL), + (@max_id+6, 'de_DE', NULL, NULL, NULL), + (@max_id+7, 'de_DE', 'E-Mail html - Bestellbestätigung - vor Produkten', NULL, NULL), + (@max_id+8, 'de_DE', 'E-Mail html - Bestellbestätigung - nach Produkten', NULL, NULL), + (@max_id+9, 'de_DE', NULL, NULL, NULL), + (@max_id+10, 'de_DE', NULL, NULL, NULL), + (@max_id+11, 'de_DE', NULL, NULL, NULL), + (@max_id+12, 'de_DE', NULL, NULL, NULL), + (@max_id+13, 'de_DE', NULL, NULL, NULL), + (@max_id+14, 'de_DE', NULL, NULL, NULL), + (@max_id+15, 'de_DE', NULL, NULL, NULL), + (@max_id+16, 'de_DE', NULL, NULL, NULL), + (@max_id+17, 'de_DE', NULL, NULL, NULL), + (@max_id+18, 'de_DE', NULL, NULL, NULL), + (@max_id+19, 'de_DE', NULL, NULL, NULL), + (@max_id+20, 'de_DE', NULL, NULL, NULL), + (@max_id+21, 'de_DE', NULL, NULL, NULL), + (@max_id+22, 'de_DE', NULL, NULL, NULL), + (@max_id+23, 'de_DE', NULL, NULL, NULL), + (@max_id+24, 'de_DE', NULL, NULL, NULL), + (@max_id+25, 'de_DE', NULL, NULL, NULL), + (@max_id+26, 'de_DE', NULL, NULL, NULL), + (@max_id+27, 'de_DE', NULL, NULL, NULL), + (@max_id+1, 'en_US', 'Email html - layout - CSS', NULL, NULL), + (@max_id+2, 'en_US', 'Email html - layout - footer', NULL, NULL), + (@max_id+3, 'en_US', 'Email html - order confirmation - before address', NULL, NULL), + (@max_id+4, 'en_US', 'Email html - order confirmation - delivery address', NULL, NULL), + (@max_id+5, 'en_US', 'Email html - order confirmation - after address', NULL, NULL), + (@max_id+6, 'en_US', 'Email html - order confirmation - order product', NULL, NULL), + (@max_id+7, 'en_US', 'Email html - order confirmation - before products', NULL, NULL), + (@max_id+8, 'en_US', 'Email html - order confirmation - after products', NULL, NULL), + (@max_id+9, 'en_US', 'Email html - order confirmation - footer', NULL, NULL), + (@max_id+10, 'en_US', 'Email html - order notification - before address', NULL, NULL), + (@max_id+11, 'en_US', 'Email html - order notification - delivery address', NULL, NULL), + (@max_id+12, 'en_US', 'Email html - order notification - after address', NULL, NULL), + (@max_id+13, 'en_US', 'Email html - order notification - order product', NULL, NULL), + (@max_id+14, 'en_US', 'Email html - order notification - before products', NULL, NULL), + (@max_id+15, 'en_US', 'Email html - order notification - after products', NULL, NULL), + (@max_id+16, 'en_US', 'Email txt - order confirmation - before address', NULL, NULL), + (@max_id+17, 'en_US', 'Email txt - order confirmation - delivery address', NULL, NULL), + (@max_id+18, 'en_US', 'Email txt - order confirmation - after address', NULL, NULL), + (@max_id+19, 'en_US', 'Email txt - order confirmation - order product', NULL, NULL), + (@max_id+20, 'en_US', 'Email txt - order confirmation - before products', NULL, NULL), + (@max_id+21, 'en_US', 'Email txt - order confirmation - after products', NULL, NULL), + (@max_id+22, 'en_US', 'Email txt - order notification - before address', NULL, NULL), + (@max_id+23, 'en_US', 'Email txt - order notification - delivery address', NULL, NULL), + (@max_id+24, 'en_US', 'Email txt - order notification - after address', NULL, NULL), + (@max_id+25, 'en_US', 'Email txt - order notification - order product', NULL, NULL), + (@max_id+26, 'en_US', 'Email txt - order notification - before products', NULL, NULL), + (@max_id+27, 'en_US', 'Email txt - order notification - after products', NULL, NULL), + (@max_id+1, 'es_ES', 'Email HTML - Interfaz - CSS', NULL, NULL), + (@max_id+2, 'es_ES', 'Email HTML - Interfaz - pie', NULL, NULL), + (@max_id+3, 'es_ES', NULL, NULL, NULL), + (@max_id+4, 'es_ES', NULL, NULL, NULL), + (@max_id+5, 'es_ES', 'Email HTML - confirmación de orden - después de la dirección', NULL, NULL), + (@max_id+6, 'es_ES', NULL, NULL, NULL), + (@max_id+7, 'es_ES', NULL, NULL, NULL), + (@max_id+8, 'es_ES', NULL, NULL, NULL), + (@max_id+9, 'es_ES', NULL, NULL, NULL), + (@max_id+10, 'es_ES', NULL, NULL, NULL), + (@max_id+11, 'es_ES', NULL, NULL, NULL), + (@max_id+12, 'es_ES', NULL, NULL, NULL), + (@max_id+13, 'es_ES', 'Email HTML - notificación de orden - pedir producto', NULL, NULL), + (@max_id+14, 'es_ES', NULL, NULL, NULL), + (@max_id+15, 'es_ES', NULL, NULL, NULL), + (@max_id+16, 'es_ES', 'Email texto - confirmación de pedido - antes de la dirección', NULL, NULL), + (@max_id+17, 'es_ES', 'Email texto - confirmación de pedido - dirección de entrega', NULL, NULL), + (@max_id+18, 'es_ES', 'Email texto - confirmación de pedido - después de la dirección', NULL, NULL), + (@max_id+19, 'es_ES', 'Email texto - confirmación de pedido - pedido de producto', NULL, NULL), + (@max_id+20, 'es_ES', 'Email texto - confirmación de pedido - antes de los productos', NULL, NULL), + (@max_id+21, 'es_ES', 'Email texto - confirmación de pedido - después de los productos', NULL, NULL), + (@max_id+22, 'es_ES', NULL, NULL, NULL), + (@max_id+23, 'es_ES', NULL, NULL, NULL), + (@max_id+24, 'es_ES', 'Email texto - notificación de pedido - después de la dirección', NULL, NULL), + (@max_id+25, 'es_ES', NULL, NULL, NULL), + (@max_id+26, 'es_ES', NULL, NULL, NULL), + (@max_id+27, 'es_ES', NULL, NULL, NULL), + (@max_id+1, 'fr_FR', 'Email html - layout - CSS', NULL, NULL), + (@max_id+2, 'fr_FR', 'Email html - layout - pied de page', NULL, NULL), + (@max_id+3, 'fr_FR', 'Email html - confirmation commande - avant adresses', NULL, NULL), + (@max_id+4, 'fr_FR', 'Email html - confirmation commande - adresse de livraison', NULL, NULL), + (@max_id+5, 'fr_FR', 'Email html - confirmation commande - après adresses', NULL, NULL), + (@max_id+6, 'fr_FR', 'Email html - confirmation commande - produit de la commande', NULL, NULL), + (@max_id+7, 'fr_FR', 'Email html - confirmation commande - avant produits', NULL, NULL), + (@max_id+8, 'fr_FR', 'Email html - confirmation commande - après produits', NULL, NULL), + (@max_id+9, 'fr_FR', 'Email html - confirmation commande - pied de page', NULL, NULL), + (@max_id+10, 'fr_FR', 'Email html - notification commande - avant adresses', NULL, NULL), + (@max_id+11, 'fr_FR', 'Email html - notification commande - adresse de livraison', NULL, NULL), + (@max_id+12, 'fr_FR', 'Email html - notification commande - après adresses', NULL, NULL), + (@max_id+13, 'fr_FR', 'Email html - notification commande - produit de la commande', NULL, NULL), + (@max_id+14, 'fr_FR', 'Email html - notification commande - avant produits', NULL, NULL), + (@max_id+15, 'fr_FR', 'Email html - notification commande - après produits', NULL, NULL), + (@max_id+16, 'fr_FR', 'Email txt - confirmation commande - avant adresses', NULL, NULL), + (@max_id+17, 'fr_FR', 'Email txt - confirmation commande - adresse de livraison', NULL, NULL), + (@max_id+18, 'fr_FR', 'Email txt - confirmation commande - après adresses', NULL, NULL), + (@max_id+19, 'fr_FR', 'Email txt - confirmation commande - produit de la commande', NULL, NULL), + (@max_id+20, 'fr_FR', 'Email txt - confirmation commande - avant produits', NULL, NULL), + (@max_id+21, 'fr_FR', 'Email txt - confirmation commande - après produits', NULL, NULL), + (@max_id+22, 'fr_FR', 'Email txt - notification commande - avant adresses', NULL, NULL), + (@max_id+23, 'fr_FR', 'Email txt - notification commande - adresse de livraison', NULL, NULL), + (@max_id+24, 'fr_FR', 'Email txt - notification commande - après adresses', NULL, NULL), + (@max_id+25, 'fr_FR', 'Email txt - notification commande - produit de la commande', NULL, NULL), + (@max_id+26, 'fr_FR', 'Email txt - notification commande - avant produits', NULL, NULL), + (@max_id+27, 'fr_FR', 'Email txt - notification commande - après produits', NULL, NULL) +; + +/* countries and states */ + +ALTER TABLE `country` + ADD COLUMN `visible` TINYINT DEFAULT 0 NOT NULL AFTER `id`, + ADD COLUMN `has_states` TINYINT DEFAULT 0 AFTER `isoalpha3`, + ADD COLUMN `need_zip_code` TINYINT DEFAULT 0 AFTER `has_states`, + ADD COLUMN `zip_code_format` VARCHAR(20) AFTER `need_zip_code`; + +CREATE TABLE `state` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT DEFAULT 0 NOT NULL, + `isocode` VARCHAR(4) NOT NULL, + `country_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `FI_state_country_id` (`country_id`), + CONSTRAINT `fk_state_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +CREATE TABLE `state_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `state_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `state` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +ALTER TABLE `address` + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD CONSTRAINT `fk_address_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + ADD INDEX `FI_address_state_id` (`state_id`); + +ALTER TABLE `order_address` + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD CONSTRAINT `fk_order_address_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + ADD INDEX `FI_order_address_state_id` (`state_id`); + +ALTER TABLE `tax_rule_country` + DROP PRIMARY KEY, + ADD COLUMN `id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD CONSTRAINT `fk_tax_rule_country_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + ADD INDEX `idx_tax_rule_country_state_id` (`state_id`); + +ALTER TABLE `country_area` + ADD COLUMN `id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD INDEX `fk_country_area_state_id_idx` (`state_id`); + +/* +we create new countries (not visible) and link them to states +the migration will be done with the module migrateCountryState +*/ + +UPDATE `country` SET `visible` = 1 WHERE 1; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `country`; + +INSERT INTO `country` (`visible`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `has_states`, `need_zip_code`, `zip_code_format`, `created_at`, `updated_at`) VALUES +(0, '840', 'US', 'USA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(0, '124', 'CA', 'CAN', 0, 0, '1', '1', 'LNL NLN', NOW(), NOW()), +(0, '32', 'AR', 'ARG', 0, 0, '1', '1', 'LNNNN', NOW(), NOW()), +(0, '360', 'ID', 'IDN', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(0, '380', 'IT', 'ITA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(0, '392', 'JP', 'JPN', 0, 0, '1', '1', 'NNN-NNNN', NOW(), NOW()), +(0, '484', 'MX', 'MEX', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()) +; + +INSERT INTO `country_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES + (@max_id + 1, 'de_DE', NULL, NULL, NULL, NULL), + (@max_id + 2, 'de_DE', NULL, NULL, NULL, NULL), + (@max_id + 3, 'de_DE', 'Argentinien', NULL, NULL, NULL), + (@max_id + 4, 'de_DE', 'Indonesien', NULL, NULL, NULL), + (@max_id + 5, 'de_DE', 'Italien', NULL, NULL, NULL), + (@max_id + 6, 'de_DE', 'Japan', NULL, NULL, NULL), + (@max_id + 7, 'de_DE', 'Mexiko', NULL, NULL, NULL), + (@max_id + 1, 'en_US', 'USA', NULL, NULL, NULL), + (@max_id + 2, 'en_US', 'Canada', NULL, NULL, NULL), + (@max_id + 3, 'en_US', 'Argentina', NULL, NULL, NULL), + (@max_id + 4, 'en_US', 'Indonesia', NULL, NULL, NULL), + (@max_id + 5, 'en_US', 'Italy', NULL, NULL, NULL), + (@max_id + 6, 'en_US', 'Japan', NULL, NULL, NULL), + (@max_id + 7, 'en_US', 'Mexico', NULL, NULL, NULL), + (@max_id + 1, 'es_ES', NULL, NULL, NULL, NULL), + (@max_id + 2, 'es_ES', NULL, NULL, NULL, NULL), + (@max_id + 3, 'es_ES', 'Argentina', NULL, NULL, NULL), + (@max_id + 4, 'es_ES', 'Indonesia', NULL, NULL, NULL), + (@max_id + 5, 'es_ES', 'Italia', NULL, NULL, NULL), + (@max_id + 6, 'es_ES', 'Japón', NULL, NULL, NULL), + (@max_id + 7, 'es_ES', 'Méjico', NULL, NULL, NULL), + (@max_id + 1, 'fr_FR', 'États-Unis', NULL, NULL, NULL), + (@max_id + 2, 'fr_FR', 'Canada', NULL, NULL, NULL), + (@max_id + 3, 'fr_FR', 'Argentine', NULL, NULL, NULL), + (@max_id + 4, 'fr_FR', 'Indonésie', NULL, NULL, NULL), + (@max_id + 5, 'fr_FR', 'Italie', NULL, NULL, NULL), + (@max_id + 6, 'fr_FR', 'Japon', NULL, NULL, NULL), + (@max_id + 7, 'fr_FR', 'Mexique', NULL, NULL, NULL) +; + +INSERT INTO `state` (`id`, `visible`, `isocode`, `country_id`, `created_at`, `updated_at`) VALUES +(1, 1, 'AL', @max_id + 1, NOW(), NOW()), +(2, 1, 'AK', @max_id + 1, NOW(), NOW()), +(3, 1, 'AZ', @max_id + 1, NOW(), NOW()), +(4, 1, 'AR', @max_id + 1, NOW(), NOW()), +(5, 1, 'CA', @max_id + 1, NOW(), NOW()), +(6, 1, 'CO', @max_id + 1, NOW(), NOW()), +(7, 1, 'CT', @max_id + 1, NOW(), NOW()), +(8, 1, 'DE', @max_id + 1, NOW(), NOW()), +(9, 1, 'FL', @max_id + 1, NOW(), NOW()), +(10, 1, 'GA', @max_id + 1, NOW(), NOW()), +(11, 1, 'HI', @max_id + 1, NOW(), NOW()), +(12, 1, 'ID', @max_id + 1, NOW(), NOW()), +(13, 1, 'IL', @max_id + 1, NOW(), NOW()), +(14, 1, 'IN', @max_id + 1, NOW(), NOW()), +(15, 1, 'IA', @max_id + 1, NOW(), NOW()), +(16, 1, 'KS', @max_id + 1, NOW(), NOW()), +(17, 1, 'KY', @max_id + 1, NOW(), NOW()), +(18, 1, 'LA', @max_id + 1, NOW(), NOW()), +(19, 1, 'ME', @max_id + 1, NOW(), NOW()), +(20, 1, 'MD', @max_id + 1, NOW(), NOW()), +(21, 1, 'MA', @max_id + 1, NOW(), NOW()), +(22, 1, 'MI', @max_id + 1, NOW(), NOW()), +(23, 1, 'MN', @max_id + 1, NOW(), NOW()), +(24, 1, 'MS', @max_id + 1, NOW(), NOW()), +(25, 1, 'MO', @max_id + 1, NOW(), NOW()), +(26, 1, 'MT', @max_id + 1, NOW(), NOW()), +(27, 1, 'NE', @max_id + 1, NOW(), NOW()), +(28, 1, 'NV', @max_id + 1, NOW(), NOW()), +(29, 1, 'NH', @max_id + 1, NOW(), NOW()), +(30, 1, 'NJ', @max_id + 1, NOW(), NOW()), +(31, 1, 'NM', @max_id + 1, NOW(), NOW()), +(32, 1, 'NY', @max_id + 1, NOW(), NOW()), +(33, 1, 'NC', @max_id + 1, NOW(), NOW()), +(34, 1, 'ND', @max_id + 1, NOW(), NOW()), +(35, 1, 'OH', @max_id + 1, NOW(), NOW()), +(36, 1, 'OK', @max_id + 1, NOW(), NOW()), +(37, 1, 'OR', @max_id + 1, NOW(), NOW()), +(38, 1, 'PA', @max_id + 1, NOW(), NOW()), +(39, 1, 'RI', @max_id + 1, NOW(), NOW()), +(40, 1, 'SC', @max_id + 1, NOW(), NOW()), +(41, 1, 'SD', @max_id + 1, NOW(), NOW()), +(42, 1, 'TN', @max_id + 1, NOW(), NOW()), +(43, 1, 'TX', @max_id + 1, NOW(), NOW()), +(44, 1, 'UT', @max_id + 1, NOW(), NOW()), +(45, 1, 'VT', @max_id + 1, NOW(), NOW()), +(46, 1, 'VA', @max_id + 1, NOW(), NOW()), +(47, 1, 'WA', @max_id + 1, NOW(), NOW()), +(48, 1, 'WV', @max_id + 1, NOW(), NOW()), +(49, 1, 'WI', @max_id + 1, NOW(), NOW()), +(50, 1, 'WY', @max_id + 1, NOW(), NOW()), +(51, 1, 'PR', @max_id + 1, NOW(), NOW()), +(52, 1, 'VI', @max_id + 1, NOW(), NOW()), +(53, 1, 'DC', @max_id + 1, NOW(), NOW()), +(54, 1, 'AGS', @max_id + 7, NOW(), NOW()), +(55, 1, 'BCN', @max_id + 7, NOW(), NOW()), +(56, 1, 'BCS', @max_id + 7, NOW(), NOW()), +(57, 1, 'CAM', @max_id + 7, NOW(), NOW()), +(58, 1, 'CHP', @max_id + 7, NOW(), NOW()), +(59, 1, 'CHH', @max_id + 7, NOW(), NOW()), +(60, 1, 'COA', @max_id + 7, NOW(), NOW()), +(61, 1, 'COL', @max_id + 7, NOW(), NOW()), +(62, 1, 'DIF', @max_id + 7, NOW(), NOW()), +(63, 1, 'DUR', @max_id + 7, NOW(), NOW()), +(64, 1, 'GUA', @max_id + 7, NOW(), NOW()), +(65, 1, 'GRO', @max_id + 7, NOW(), NOW()), +(66, 1, 'HID', @max_id + 7, NOW(), NOW()), +(67, 1, 'JAL', @max_id + 7, NOW(), NOW()), +(68, 1, 'MEX', @max_id + 7, NOW(), NOW()), +(69, 1, 'MIC', @max_id + 7, NOW(), NOW()), +(70, 1, 'MOR', @max_id + 7, NOW(), NOW()), +(71, 1, 'NAY', @max_id + 7, NOW(), NOW()), +(72, 1, 'NLE', @max_id + 7, NOW(), NOW()), +(73, 1, 'OAX', @max_id + 7, NOW(), NOW()), +(74, 1, 'PUE', @max_id + 7, NOW(), NOW()), +(75, 1, 'QUE', @max_id + 7, NOW(), NOW()), +(76, 1, 'ROO', @max_id + 7, NOW(), NOW()), +(77, 1, 'SLP', @max_id + 7, NOW(), NOW()), +(78, 1, 'SIN', @max_id + 7, NOW(), NOW()), +(79, 1, 'SON', @max_id + 7, NOW(), NOW()), +(80, 1, 'TAB', @max_id + 7, NOW(), NOW()), +(81, 1, 'TAM', @max_id + 7, NOW(), NOW()), +(82, 1, 'TLA', @max_id + 7, NOW(), NOW()), +(83, 1, 'VER', @max_id + 7, NOW(), NOW()), +(84, 1, 'YUC', @max_id + 7, NOW(), NOW()), +(85, 1, 'ZAC', @max_id + 7, NOW(), NOW()), +(86, 1, 'ON', @max_id + 2, NOW(), NOW()), +(87, 1, 'QC', @max_id + 2, NOW(), NOW()), +(88, 1, 'BC', @max_id + 2, NOW(), NOW()), +(89, 1, 'AB', @max_id + 2, NOW(), NOW()), +(90, 1, 'MB', @max_id + 2, NOW(), NOW()), +(91, 1, 'SK', @max_id + 2, NOW(), NOW()), +(92, 1, 'NS', @max_id + 2, NOW(), NOW()), +(93, 1, 'NB', @max_id + 2, NOW(), NOW()), +(94, 1, 'NL', @max_id + 2, NOW(), NOW()), +(95, 1, 'PE', @max_id + 2, NOW(), NOW()), +(96, 1, 'NT', @max_id + 2, NOW(), NOW()), +(97, 1, 'YT', @max_id + 2, NOW(), NOW()), +(98, 1, 'NU', @max_id + 2, NOW(), NOW()), +(99, 1, 'B', @max_id + 3, NOW(), NOW()), +(100, 1, 'K', @max_id + 3, NOW(), NOW()), +(101, 1, 'H', @max_id + 3, NOW(), NOW()), +(102, 1, 'U', @max_id + 3, NOW(), NOW()), +(103, 1, 'C', @max_id + 3, NOW(), NOW()), +(104, 1, 'X', @max_id + 3, NOW(), NOW()), +(105, 1, 'W', @max_id + 3, NOW(), NOW()), +(106, 1, 'E', @max_id + 3, NOW(), NOW()), +(107, 1, 'P', @max_id + 3, NOW(), NOW()), +(108, 1, 'Y', @max_id + 3, NOW(), NOW()), +(109, 1, 'L', @max_id + 3, NOW(), NOW()), +(110, 1, 'F', @max_id + 3, NOW(), NOW()), +(111, 1, 'M', @max_id + 3, NOW(), NOW()), +(112, 1, 'N', @max_id + 3, NOW(), NOW()), +(113, 1, 'Q', @max_id + 3, NOW(), NOW()), +(114, 1, 'R', @max_id + 3, NOW(), NOW()), +(115, 1, 'A', @max_id + 3, NOW(), NOW()), +(116, 1, 'J', @max_id + 3, NOW(), NOW()), +(117, 1, 'D', @max_id + 3, NOW(), NOW()), +(118, 1, 'Z', @max_id + 3, NOW(), NOW()), +(119, 1, 'S', @max_id + 3, NOW(), NOW()), +(120, 1, 'G', @max_id + 3, NOW(), NOW()), +(121, 1, 'V', @max_id + 3, NOW(), NOW()), +(122, 1, 'T', @max_id + 3, NOW(), NOW()), +(123, 1, 'AG', @max_id + 5, NOW(), NOW()), +(124, 1, 'AL', @max_id + 5, NOW(), NOW()), +(125, 1, 'AN', @max_id + 5, NOW(), NOW()), +(126, 1, 'AO', @max_id + 5, NOW(), NOW()), +(127, 1, 'AR', @max_id + 5, NOW(), NOW()), +(128, 1, 'AP', @max_id + 5, NOW(), NOW()), +(129, 1, 'AT', @max_id + 5, NOW(), NOW()), +(130, 1, 'AV', @max_id + 5, NOW(), NOW()), +(131, 1, 'BA', @max_id + 5, NOW(), NOW()), +(132, 1, 'BT', @max_id + 5, NOW(), NOW()), +(133, 1, 'BL', @max_id + 5, NOW(), NOW()), +(134, 1, 'BN', @max_id + 5, NOW(), NOW()), +(135, 1, 'BG', @max_id + 5, NOW(), NOW()), +(136, 1, 'BI', @max_id + 5, NOW(), NOW()), +(137, 1, 'BO', @max_id + 5, NOW(), NOW()), +(138, 1, 'BZ', @max_id + 5, NOW(), NOW()), +(139, 1, 'BS', @max_id + 5, NOW(), NOW()), +(140, 1, 'BR', @max_id + 5, NOW(), NOW()), +(141, 1, 'CA', @max_id + 5, NOW(), NOW()), +(142, 1, 'CL', @max_id + 5, NOW(), NOW()), +(143, 1, 'CB', @max_id + 5, NOW(), NOW()), +(144, 1, 'CI', @max_id + 5, NOW(), NOW()), +(145, 1, 'CE', @max_id + 5, NOW(), NOW()), +(146, 1, 'CT', @max_id + 5, NOW(), NOW()), +(147, 1, 'CZ', @max_id + 5, NOW(), NOW()), +(148, 1, 'CH', @max_id + 5, NOW(), NOW()), +(149, 1, 'CO', @max_id + 5, NOW(), NOW()), +(150, 1, 'CS', @max_id + 5, NOW(), NOW()), +(151, 1, 'CR', @max_id + 5, NOW(), NOW()), +(152, 1, 'KR', @max_id + 5, NOW(), NOW()), +(153, 1, 'CN', @max_id + 5, NOW(), NOW()), +(154, 1, 'EN', @max_id + 5, NOW(), NOW()), +(155, 1, 'FM', @max_id + 5, NOW(), NOW()), +(156, 1, 'FE', @max_id + 5, NOW(), NOW()), +(157, 1, 'FI', @max_id + 5, NOW(), NOW()), +(158, 1, 'FG', @max_id + 5, NOW(), NOW()), +(159, 1, 'FC', @max_id + 5, NOW(), NOW()), +(160, 1, 'FR', @max_id + 5, NOW(), NOW()), +(161, 1, 'GE', @max_id + 5, NOW(), NOW()), +(162, 1, 'GO', @max_id + 5, NOW(), NOW()), +(163, 1, 'GR', @max_id + 5, NOW(), NOW()), +(164, 1, 'IM', @max_id + 5, NOW(), NOW()), +(165, 1, 'IS', @max_id + 5, NOW(), NOW()), +(166, 1, 'AQ', @max_id + 5, NOW(), NOW()), +(167, 1, 'SP', @max_id + 5, NOW(), NOW()), +(168, 1, 'LT', @max_id + 5, NOW(), NOW()), +(169, 1, 'LE', @max_id + 5, NOW(), NOW()), +(170, 1, 'LC', @max_id + 5, NOW(), NOW()), +(171, 1, 'LI', @max_id + 5, NOW(), NOW()), +(172, 1, 'LO', @max_id + 5, NOW(), NOW()), +(173, 1, 'LU', @max_id + 5, NOW(), NOW()), +(174, 1, 'MC', @max_id + 5, NOW(), NOW()), +(175, 1, 'MN', @max_id + 5, NOW(), NOW()), +(176, 1, 'MS', @max_id + 5, NOW(), NOW()), +(177, 1, 'MT', @max_id + 5, NOW(), NOW()), +(178, 1, 'VS', @max_id + 5, NOW(), NOW()), +(179, 1, 'ME', @max_id + 5, NOW(), NOW()), +(180, 1, 'MI', @max_id + 5, NOW(), NOW()), +(181, 1, 'MO', @max_id + 5, NOW(), NOW()), +(182, 1, 'MB', @max_id + 5, NOW(), NOW()), +(183, 1, 'NA', @max_id + 5, NOW(), NOW()), +(184, 1, 'NO', @max_id + 5, NOW(), NOW()), +(185, 1, 'NU', @max_id + 5, NOW(), NOW()), +(186, 1, 'OG', @max_id + 5, NOW(), NOW()), +(187, 1, 'OT', @max_id + 5, NOW(), NOW()), +(188, 1, 'OR', @max_id + 5, NOW(), NOW()), +(189, 1, 'PD', @max_id + 5, NOW(), NOW()), +(190, 1, 'PA', @max_id + 5, NOW(), NOW()), +(191, 1, 'PR', @max_id + 5, NOW(), NOW()), +(192, 1, 'PV', @max_id + 5, NOW(), NOW()), +(193, 1, 'PG', @max_id + 5, NOW(), NOW()), +(194, 1, 'PU', @max_id + 5, NOW(), NOW()), +(195, 1, 'PE', @max_id + 5, NOW(), NOW()), +(196, 1, 'PC', @max_id + 5, NOW(), NOW()), +(197, 1, 'PI', @max_id + 5, NOW(), NOW()), +(198, 1, 'PT', @max_id + 5, NOW(), NOW()), +(199, 1, 'PN', @max_id + 5, NOW(), NOW()), +(200, 1, 'PZ', @max_id + 5, NOW(), NOW()), +(201, 1, 'PO', @max_id + 5, NOW(), NOW()), +(202, 1, 'RG', @max_id + 5, NOW(), NOW()), +(203, 1, 'RA', @max_id + 5, NOW(), NOW()), +(204, 1, 'RC', @max_id + 5, NOW(), NOW()), +(205, 1, 'RE', @max_id + 5, NOW(), NOW()), +(206, 1, 'RI', @max_id + 5, NOW(), NOW()), +(207, 1, 'RN', @max_id + 5, NOW(), NOW()), +(208, 1, 'RM', @max_id + 5, NOW(), NOW()), +(209, 1, 'RO', @max_id + 5, NOW(), NOW()), +(210, 1, 'SA', @max_id + 5, NOW(), NOW()), +(211, 1, 'SS', @max_id + 5, NOW(), NOW()), +(212, 1, 'SV', @max_id + 5, NOW(), NOW()), +(213, 1, 'SI', @max_id + 5, NOW(), NOW()), +(214, 1, 'SR', @max_id + 5, NOW(), NOW()), +(215, 1, 'SO', @max_id + 5, NOW(), NOW()), +(216, 1, 'TA', @max_id + 5, NOW(), NOW()), +(217, 1, 'TE', @max_id + 5, NOW(), NOW()), +(218, 1, 'TR', @max_id + 5, NOW(), NOW()), +(219, 1, 'TO', @max_id + 5, NOW(), NOW()), +(220, 1, 'TP', @max_id + 5, NOW(), NOW()), +(221, 1, 'TN', @max_id + 5, NOW(), NOW()), +(222, 1, 'TV', @max_id + 5, NOW(), NOW()), +(223, 1, 'TS', @max_id + 5, NOW(), NOW()), +(224, 1, 'UD', @max_id + 5, NOW(), NOW()), +(225, 1, 'VA', @max_id + 5, NOW(), NOW()), +(226, 1, 'VE', @max_id + 5, NOW(), NOW()), +(227, 1, 'VB', @max_id + 5, NOW(), NOW()), +(228, 1, 'VC', @max_id + 5, NOW(), NOW()), +(229, 1, 'VR', @max_id + 5, NOW(), NOW()), +(230, 1, 'VV', @max_id + 5, NOW(), NOW()), +(231, 1, 'VI', @max_id + 5, NOW(), NOW()), +(232, 1, 'VT', @max_id + 5, NOW(), NOW()), +(233, 1, 'AC', @max_id + 4, NOW(), NOW()), +(234, 1, 'BA', @max_id + 4, NOW(), NOW()), +(235, 1, 'BB', @max_id + 4, NOW(), NOW()), +(236, 1, 'BT', @max_id + 4, NOW(), NOW()), +(237, 1, 'BE', @max_id + 4, NOW(), NOW()), +(238, 1, 'JT', @max_id + 4, NOW(), NOW()), +(239, 1, 'KT', @max_id + 4, NOW(), NOW()), +(240, 1, 'ST', @max_id + 4, NOW(), NOW()), +(241, 1, 'JI', @max_id + 4, NOW(), NOW()), +(242, 1, 'KI', @max_id + 4, NOW(), NOW()), +(243, 1, 'NT', @max_id + 4, NOW(), NOW()), +(244, 1, 'GO', @max_id + 4, NOW(), NOW()), +(245, 1, 'JK', @max_id + 4, NOW(), NOW()), +(246, 1, 'JA', @max_id + 4, NOW(), NOW()), +(247, 1, 'LA', @max_id + 4, NOW(), NOW()), +(248, 1, 'MA', @max_id + 4, NOW(), NOW()), +(249, 1, 'MU', @max_id + 4, NOW(), NOW()), +(250, 1, 'SA', @max_id + 4, NOW(), NOW()), +(251, 1, 'SU', @max_id + 4, NOW(), NOW()), +(252, 1, 'PA', @max_id + 4, NOW(), NOW()), +(253, 1, 'RI', @max_id + 4, NOW(), NOW()), +(254, 1, 'KR', @max_id + 4, NOW(), NOW()), +(255, 1, 'SG', @max_id + 4, NOW(), NOW()), +(256, 1, 'KS', @max_id + 4, NOW(), NOW()), +(257, 1, 'SN', @max_id + 4, NOW(), NOW()), +(258, 1, 'SS', @max_id + 4, NOW(), NOW()), +(259, 1, 'JB', @max_id + 4, NOW(), NOW()), +(260, 1, 'KB', @max_id + 4, NOW(), NOW()), +(261, 1, 'NB', @max_id + 4, NOW(), NOW()), +(262, 1, 'PB', @max_id + 4, NOW(), NOW()), +(263, 1, 'SR', @max_id + 4, NOW(), NOW()), +(264, 1, 'SB', @max_id + 4, NOW(), NOW()), +(265, 1, 'YO', @max_id + 4, NOW(), NOW()), +(266, 1, '23', @max_id + 6, NOW(), NOW()), +(267, 1, '05', @max_id + 6, NOW(), NOW()), +(268, 1, '02', @max_id + 6, NOW(), NOW()), +(269, 1, '12', @max_id + 6, NOW(), NOW()), +(270, 1, '38', @max_id + 6, NOW(), NOW()), +(271, 1, '18', @max_id + 6, NOW(), NOW()), +(272, 1, '40', @max_id + 6, NOW(), NOW()), +(273, 1, '07', @max_id + 6, NOW(), NOW()), +(274, 1, '21', @max_id + 6, NOW(), NOW()), +(275, 1, '10', @max_id + 6, NOW(), NOW()), +(276, 1, '34', @max_id + 6, NOW(), NOW()), +(277, 1, '01', @max_id + 6, NOW(), NOW()), +(278, 1, '28', @max_id + 6, NOW(), NOW()), +(279, 1, '08', @max_id + 6, NOW(), NOW()), +(280, 1, '17', @max_id + 6, NOW(), NOW()), +(281, 1, '03', @max_id + 6, NOW(), NOW()), +(282, 1, '37', @max_id + 6, NOW(), NOW()), +(283, 1, '46', @max_id + 6, NOW(), NOW()), +(284, 1, '14', @max_id + 6, NOW(), NOW()), +(285, 1, '39', @max_id + 6, NOW(), NOW()), +(286, 1, '43', @max_id + 6, NOW(), NOW()), +(287, 1, '26', @max_id + 6, NOW(), NOW()), +(288, 1, '24', @max_id + 6, NOW(), NOW()), +(289, 1, '04', @max_id + 6, NOW(), NOW()), +(290, 1, '45', @max_id + 6, NOW(), NOW()), +(291, 1, '20', @max_id + 6, NOW(), NOW()), +(292, 1, '42', @max_id + 6, NOW(), NOW()), +(293, 1, '29', @max_id + 6, NOW(), NOW()), +(294, 1, '15', @max_id + 6, NOW(), NOW()), +(295, 1, '44', @max_id + 6, NOW(), NOW()), +(296, 1, '33', @max_id + 6, NOW(), NOW()), +(297, 1, '47', @max_id + 6, NOW(), NOW()), +(298, 1, '27', @max_id + 6, NOW(), NOW()), +(299, 1, '41', @max_id + 6, NOW(), NOW()), +(300, 1, '11', @max_id + 6, NOW(), NOW()), +(301, 1, '25', @max_id + 6, NOW(), NOW()), +(302, 1, '32', @max_id + 6, NOW(), NOW()), +(303, 1, '22', @max_id + 6, NOW(), NOW()), +(304, 1, '09', @max_id + 6, NOW(), NOW()), +(305, 1, '36', @max_id + 6, NOW(), NOW()), +(306, 1, '13', @max_id + 6, NOW(), NOW()), +(307, 1, '31', @max_id + 6, NOW(), NOW()), +(308, 1, '16', @max_id + 6, NOW(), NOW()), +(309, 1, '30', @max_id + 6, NOW(), NOW()), +(310, 1, '06', @max_id + 6, NOW(), NOW()), +(311, 1, '35', @max_id + 6, NOW(), NOW()), +(312, 1, '19', @max_id + 6, NOW(), NOW()), +(313, 1, '', @max_id + 3, NOW(), NOW()), +(314, 1, '', @max_id + 4, NOW(), NOW()), +(315, 1, '', @max_id + 5, NOW(), NOW()), +(316, 1, '', @max_id + 6, NOW(), NOW()), +(317, 1, '', @max_id + 7, NOW(), NOW()); + + +INSERT INTO `state_i18n` (`id`, `locale`, `title`) VALUES + + (1, 'de_DE', NULL), + (2, 'de_DE', NULL), + (3, 'de_DE', NULL), + (4, 'de_DE', NULL), + (5, 'de_DE', NULL), + (6, 'de_DE', NULL), + (7, 'de_DE', NULL), + (8, 'de_DE', NULL), + (9, 'de_DE', NULL), + (10, 'de_DE', 'Georgien'), + (11, 'de_DE', NULL), + (12, 'de_DE', NULL), + (13, 'de_DE', NULL), + (14, 'de_DE', NULL), + (15, 'de_DE', NULL), + (16, 'de_DE', NULL), + (17, 'de_DE', NULL), + (18, 'de_DE', NULL), + (19, 'de_DE', NULL), + (20, 'de_DE', NULL), + (21, 'de_DE', NULL), + (22, 'de_DE', NULL), + (23, 'de_DE', NULL), + (24, 'de_DE', NULL), + (25, 'de_DE', NULL), + (26, 'de_DE', NULL), + (27, 'de_DE', NULL), + (28, 'de_DE', NULL), + (29, 'de_DE', NULL), + (30, 'de_DE', NULL), + (31, 'de_DE', NULL), + (32, 'de_DE', 'New York'), + (33, 'de_DE', NULL), + (34, 'de_DE', NULL), + (35, 'de_DE', NULL), + (36, 'de_DE', NULL), + (37, 'de_DE', NULL), + (38, 'de_DE', NULL), + (39, 'de_DE', NULL), + (40, 'de_DE', NULL), + (41, 'de_DE', NULL), + (42, 'de_DE', NULL), + (43, 'de_DE', NULL), + (44, 'de_DE', NULL), + (45, 'de_DE', NULL), + (46, 'de_DE', NULL), + (47, 'de_DE', NULL), + (48, 'de_DE', NULL), + (49, 'de_DE', NULL), + (50, 'de_DE', NULL), + (51, 'de_DE', NULL), + (52, 'de_DE', NULL), + (53, 'de_DE', NULL), + (54, 'de_DE', NULL), + (55, 'de_DE', NULL), + (56, 'de_DE', NULL), + (57, 'de_DE', NULL), + (58, 'de_DE', NULL), + (59, 'de_DE', NULL), + (60, 'de_DE', NULL), + (61, 'de_DE', NULL), + (62, 'de_DE', NULL), + (63, 'de_DE', NULL), + (64, 'de_DE', NULL), + (65, 'de_DE', NULL), + (66, 'de_DE', NULL), + (67, 'de_DE', NULL), + (68, 'de_DE', NULL), + (69, 'de_DE', NULL), + (70, 'de_DE', NULL), + (71, 'de_DE', NULL), + (72, 'de_DE', NULL), + (73, 'de_DE', NULL), + (74, 'de_DE', NULL), + (75, 'de_DE', NULL), + (76, 'de_DE', NULL), + (77, 'de_DE', NULL), + (78, 'de_DE', NULL), + (79, 'de_DE', NULL), + (80, 'de_DE', NULL), + (81, 'de_DE', NULL), + (82, 'de_DE', NULL), + (83, 'de_DE', NULL), + (84, 'de_DE', NULL), + (85, 'de_DE', NULL), + (86, 'de_DE', NULL), + (87, 'de_DE', NULL), + (88, 'de_DE', NULL), + (89, 'de_DE', NULL), + (90, 'de_DE', NULL), + (91, 'de_DE', NULL), + (92, 'de_DE', NULL), + (93, 'de_DE', NULL), + (94, 'de_DE', NULL), + (95, 'de_DE', NULL), + (96, 'de_DE', NULL), + (97, 'de_DE', NULL), + (98, 'de_DE', NULL), + (99, 'de_DE', NULL), + (100, 'de_DE', NULL), + (101, 'de_DE', NULL), + (102, 'de_DE', NULL), + (103, 'de_DE', NULL), + (104, 'de_DE', NULL), + (105, 'de_DE', NULL), + (106, 'de_DE', NULL), + (107, 'de_DE', NULL), + (108, 'de_DE', NULL), + (109, 'de_DE', NULL), + (110, 'de_DE', NULL), + (111, 'de_DE', NULL), + (112, 'de_DE', NULL), + (113, 'de_DE', NULL), + (114, 'de_DE', NULL), + (115, 'de_DE', NULL), + (116, 'de_DE', NULL), + (117, 'de_DE', NULL), + (118, 'de_DE', NULL), + (119, 'de_DE', NULL), + (120, 'de_DE', NULL), + (121, 'de_DE', NULL), + (122, 'de_DE', NULL), + (123, 'de_DE', NULL), + (124, 'de_DE', NULL), + (125, 'de_DE', NULL), + (126, 'de_DE', NULL), + (127, 'de_DE', NULL), + (128, 'de_DE', NULL), + (129, 'de_DE', NULL), + (130, 'de_DE', NULL), + (131, 'de_DE', NULL), + (132, 'de_DE', NULL), + (133, 'de_DE', NULL), + (134, 'de_DE', NULL), + (135, 'de_DE', NULL), + (136, 'de_DE', NULL), + (137, 'de_DE', NULL), + (138, 'de_DE', NULL), + (139, 'de_DE', NULL), + (140, 'de_DE', NULL), + (141, 'de_DE', NULL), + (142, 'de_DE', NULL), + (143, 'de_DE', NULL), + (144, 'de_DE', NULL), + (145, 'de_DE', NULL), + (146, 'de_DE', NULL), + (147, 'de_DE', NULL), + (148, 'de_DE', NULL), + (149, 'de_DE', NULL), + (150, 'de_DE', NULL), + (151, 'de_DE', NULL), + (152, 'de_DE', NULL), + (153, 'de_DE', NULL), + (154, 'de_DE', NULL), + (155, 'de_DE', NULL), + (156, 'de_DE', NULL), + (157, 'de_DE', NULL), + (158, 'de_DE', NULL), + (159, 'de_DE', NULL), + (160, 'de_DE', NULL), + (161, 'de_DE', NULL), + (162, 'de_DE', NULL), + (163, 'de_DE', NULL), + (164, 'de_DE', NULL), + (165, 'de_DE', NULL), + (166, 'de_DE', NULL), + (167, 'de_DE', NULL), + (168, 'de_DE', NULL), + (169, 'de_DE', NULL), + (170, 'de_DE', NULL), + (171, 'de_DE', NULL), + (172, 'de_DE', NULL), + (173, 'de_DE', NULL), + (174, 'de_DE', NULL), + (175, 'de_DE', NULL), + (176, 'de_DE', NULL), + (177, 'de_DE', NULL), + (178, 'de_DE', NULL), + (179, 'de_DE', NULL), + (180, 'de_DE', NULL), + (181, 'de_DE', NULL), + (182, 'de_DE', NULL), + (183, 'de_DE', NULL), + (184, 'de_DE', NULL), + (185, 'de_DE', NULL), + (186, 'de_DE', NULL), + (187, 'de_DE', NULL), + (188, 'de_DE', NULL), + (189, 'de_DE', NULL), + (190, 'de_DE', NULL), + (191, 'de_DE', NULL), + (192, 'de_DE', NULL), + (193, 'de_DE', NULL), + (194, 'de_DE', NULL), + (195, 'de_DE', NULL), + (196, 'de_DE', NULL), + (197, 'de_DE', NULL), + (198, 'de_DE', NULL), + (199, 'de_DE', NULL), + (200, 'de_DE', NULL), + (201, 'de_DE', NULL), + (202, 'de_DE', NULL), + (203, 'de_DE', NULL), + (204, 'de_DE', NULL), + (205, 'de_DE', NULL), + (206, 'de_DE', NULL), + (207, 'de_DE', NULL), + (208, 'de_DE', NULL), + (209, 'de_DE', NULL), + (210, 'de_DE', NULL), + (211, 'de_DE', NULL), + (212, 'de_DE', NULL), + (213, 'de_DE', NULL), + (214, 'de_DE', NULL), + (215, 'de_DE', NULL), + (216, 'de_DE', NULL), + (217, 'de_DE', NULL), + (218, 'de_DE', NULL), + (219, 'de_DE', NULL), + (220, 'de_DE', NULL), + (221, 'de_DE', NULL), + (222, 'de_DE', NULL), + (223, 'de_DE', NULL), + (224, 'de_DE', NULL), + (225, 'de_DE', NULL), + (226, 'de_DE', NULL), + (227, 'de_DE', NULL), + (228, 'de_DE', NULL), + (229, 'de_DE', NULL), + (230, 'de_DE', NULL), + (231, 'de_DE', NULL), + (232, 'de_DE', NULL), + (233, 'de_DE', NULL), + (234, 'de_DE', NULL), + (235, 'de_DE', NULL), + (236, 'de_DE', NULL), + (237, 'de_DE', NULL), + (238, 'de_DE', NULL), + (239, 'de_DE', NULL), + (240, 'de_DE', NULL), + (241, 'de_DE', NULL), + (242, 'de_DE', NULL), + (243, 'de_DE', NULL), + (244, 'de_DE', NULL), + (245, 'de_DE', NULL), + (246, 'de_DE', NULL), + (247, 'de_DE', NULL), + (248, 'de_DE', NULL), + (249, 'de_DE', NULL), + (250, 'de_DE', NULL), + (251, 'de_DE', NULL), + (252, 'de_DE', NULL), + (253, 'de_DE', NULL), + (254, 'de_DE', NULL), + (255, 'de_DE', NULL), + (256, 'de_DE', NULL), + (257, 'de_DE', NULL), + (258, 'de_DE', NULL), + (259, 'de_DE', NULL), + (260, 'de_DE', NULL), + (261, 'de_DE', NULL), + (262, 'de_DE', NULL), + (263, 'de_DE', NULL), + (264, 'de_DE', NULL), + (265, 'de_DE', NULL), + (266, 'de_DE', NULL), + (267, 'de_DE', NULL), + (268, 'de_DE', NULL), + (269, 'de_DE', NULL), + (270, 'de_DE', NULL), + (271, 'de_DE', NULL), + (272, 'de_DE', NULL), + (273, 'de_DE', NULL), + (274, 'de_DE', NULL), + (275, 'de_DE', NULL), + (276, 'de_DE', NULL), + (277, 'de_DE', NULL), + (278, 'de_DE', NULL), + (279, 'de_DE', NULL), + (280, 'de_DE', NULL), + (281, 'de_DE', NULL), + (282, 'de_DE', NULL), + (283, 'de_DE', NULL), + (284, 'de_DE', NULL), + (285, 'de_DE', NULL), + (286, 'de_DE', NULL), + (287, 'de_DE', NULL), + (288, 'de_DE', NULL), + (289, 'de_DE', NULL), + (290, 'de_DE', NULL), + (291, 'de_DE', NULL), + (292, 'de_DE', NULL), + (293, 'de_DE', NULL), + (294, 'de_DE', NULL), + (295, 'de_DE', NULL), + (296, 'de_DE', NULL), + (297, 'de_DE', NULL), + (298, 'de_DE', NULL), + (299, 'de_DE', NULL), + (300, 'de_DE', NULL), + (301, 'de_DE', NULL), + (302, 'de_DE', NULL), + (303, 'de_DE', NULL), + (304, 'de_DE', NULL), + (305, 'de_DE', NULL), + (306, 'de_DE', NULL), + (307, 'de_DE', NULL), + (308, 'de_DE', NULL), + (309, 'de_DE', NULL), + (310, 'de_DE', NULL), + (311, 'de_DE', NULL), + (312, 'de_DE', NULL), + (313, 'de_DE', ''), + (314, 'de_DE', ''), + (315, 'de_DE', ''), + (316, 'de_DE', ''), + (317, 'de_DE', ''), + + (1, 'en_US', 'Alabama'), + (2, 'en_US', 'Alaska'), + (3, 'en_US', 'Arizona'), + (4, 'en_US', 'Arkansas'), + (5, 'en_US', 'California'), + (6, 'en_US', 'Colorado'), + (7, 'en_US', 'Connecticut'), + (8, 'en_US', 'Delaware'), + (9, 'en_US', 'Florida'), + (10, 'en_US', 'Georgia'), + (11, 'en_US', 'Hawaii'), + (12, 'en_US', 'Idaho'), + (13, 'en_US', 'Illinois'), + (14, 'en_US', 'Indiana'), + (15, 'en_US', 'Iowa'), + (16, 'en_US', 'Kansas'), + (17, 'en_US', 'Kentucky'), + (18, 'en_US', 'Louisiana'), + (19, 'en_US', 'Maine'), + (20, 'en_US', 'Maryland'), + (21, 'en_US', 'Massachusetts'), + (22, 'en_US', 'Michigan'), + (23, 'en_US', 'Minnesota'), + (24, 'en_US', 'Mississippi'), + (25, 'en_US', 'Missouri'), + (26, 'en_US', 'Montana'), + (27, 'en_US', 'Nebraska'), + (28, 'en_US', 'Nevada'), + (29, 'en_US', 'New Hampshire'), + (30, 'en_US', 'New Jersey'), + (31, 'en_US', 'New Mexico'), + (32, 'en_US', 'New York'), + (33, 'en_US', 'North Carolina'), + (34, 'en_US', 'North Dakota'), + (35, 'en_US', 'Ohio'), + (36, 'en_US', 'Oklahoma'), + (37, 'en_US', 'Oregon'), + (38, 'en_US', 'Pennsylvania'), + (39, 'en_US', 'Rhode Island'), + (40, 'en_US', 'South Carolina'), + (41, 'en_US', 'South Dakota'), + (42, 'en_US', 'Tennessee'), + (43, 'en_US', 'Texas'), + (44, 'en_US', 'Utah'), + (45, 'en_US', 'Vermont'), + (46, 'en_US', 'Virginia'), + (47, 'en_US', 'Washington'), + (48, 'en_US', 'West Virginia'), + (49, 'en_US', 'Wisconsin'), + (50, 'en_US', 'Wyoming'), + (51, 'en_US', 'Puerto Rico'), + (52, 'en_US', 'US Virgin Islands'), + (53, 'en_US', 'District of Columbia'), + (54, 'en_US', 'Aguascalientes'), + (55, 'en_US', 'Baja California'), + (56, 'en_US', 'Baja California Sur'), + (57, 'en_US', 'Campeche'), + (58, 'en_US', 'Chiapas'), + (59, 'en_US', 'Chihuahua'), + (60, 'en_US', 'Coahuila'), + (61, 'en_US', 'Colima'), + (62, 'en_US', 'Distrito Federal'), + (63, 'en_US', 'Durango'), + (64, 'en_US', 'Guanajuato'), + (65, 'en_US', 'Guerrero'), + (66, 'en_US', 'Hidalgo'), + (67, 'en_US', 'Jalisco'), + (68, 'en_US', 'Estado de México'), + (69, 'en_US', 'Michoacán'), + (70, 'en_US', 'Morelos'), + (71, 'en_US', 'Nayarit'), + (72, 'en_US', 'Nuevo León'), + (73, 'en_US', 'Oaxaca'), + (74, 'en_US', 'Puebla'), + (75, 'en_US', 'Querétaro'), + (76, 'en_US', 'Quintana Roo'), + (77, 'en_US', 'San Luis Potosí'), + (78, 'en_US', 'Sinaloa'), + (79, 'en_US', 'Sonora'), + (80, 'en_US', 'Tabasco'), + (81, 'en_US', 'Tamaulipas'), + (82, 'en_US', 'Tlaxcala'), + (83, 'en_US', 'Veracruz'), + (84, 'en_US', 'Yucatán'), + (85, 'en_US', 'Zacatecas'), + (86, 'en_US', 'Ontario'), + (87, 'en_US', 'Quebec'), + (88, 'en_US', 'British Columbia'), + (89, 'en_US', 'Alberta'), + (90, 'en_US', 'Manitoba'), + (91, 'en_US', 'Saskatchewan'), + (92, 'en_US', 'Nova Scotia'), + (93, 'en_US', 'New Brunswick'), + (94, 'en_US', 'Newfoundland and Labrador'), + (95, 'en_US', 'Prince Edward Island'), + (96, 'en_US', 'Northwest Territories'), + (97, 'en_US', 'Yukon'), + (98, 'en_US', 'Nunavut'), + (99, 'en_US', 'Buenos Aires'), + (100, 'en_US', 'Catamarca'), + (101, 'en_US', 'Chaco'), + (102, 'en_US', 'Chubut'), + (103, 'en_US', 'Ciudad de Buenos Aires'), + (104, 'en_US', 'Córdoba'), + (105, 'en_US', 'Corrientes'), + (106, 'en_US', 'Entre Ríos'), + (107, 'en_US', 'Formosa'), + (108, 'en_US', 'Jujuy'), + (109, 'en_US', 'La Pampa'), + (110, 'en_US', 'La Rioja'), + (111, 'en_US', 'Mendoza'), + (112, 'en_US', 'Misiones'), + (113, 'en_US', 'Neuquén'), + (114, 'en_US', 'Río Negro'), + (115, 'en_US', 'Salta'), + (116, 'en_US', 'San Juan'), + (117, 'en_US', 'San Luis'), + (118, 'en_US', 'Santa Cruz'), + (119, 'en_US', 'Santa Fe'), + (120, 'en_US', 'Santiago del Estero'), + (121, 'en_US', 'Tierra del Fuego'), + (122, 'en_US', 'Tucumán'), + (123, 'en_US', 'Agrigento'), + (124, 'en_US', 'Alessandria'), + (125, 'en_US', 'Ancona'), + (126, 'en_US', 'Aosta'), + (127, 'en_US', 'Arezzo'), + (128, 'en_US', 'Ascoli Piceno'), + (129, 'en_US', 'Asti'), + (130, 'en_US', 'Avellino'), + (131, 'en_US', 'Bari'), + (132, 'en_US', 'Barletta-Andria-Trani'), + (133, 'en_US', 'Belluno'), + (134, 'en_US', 'Benevento'), + (135, 'en_US', 'Bergamo'), + (136, 'en_US', 'Biella'), + (137, 'en_US', 'Bologna'), + (138, 'en_US', 'Bolzano'), + (139, 'en_US', 'Brescia'), + (140, 'en_US', 'Brindisi'), + (141, 'en_US', 'Cagliari'), + (142, 'en_US', 'Caltanissetta'), + (143, 'en_US', 'Campobasso'), + (144, 'en_US', 'Carbonia-Iglesias'), + (145, 'en_US', 'Caserta'), + (146, 'en_US', 'Catania'), + (147, 'en_US', 'Catanzaro'), + (148, 'en_US', 'Chieti'), + (149, 'en_US', 'Como'), + (150, 'en_US', 'Cosenza'), + (151, 'en_US', 'Cremona'), + (152, 'en_US', 'Crotone'), + (153, 'en_US', 'Cuneo'), + (154, 'en_US', 'Enna'), + (155, 'en_US', 'Fermo'), + (156, 'en_US', 'Ferrara'), + (157, 'en_US', 'Firenze'), + (158, 'en_US', 'Foggia'), + (159, 'en_US', 'Forlì-Cesena'), + (160, 'en_US', 'Frosinone'), + (161, 'en_US', 'Genova'), + (162, 'en_US', 'Gorizia'), + (163, 'en_US', 'Grosseto'), + (164, 'en_US', 'Imperia'), + (165, 'en_US', 'Isernia'), + (166, 'en_US', 'L\'Aquila'), + (167, 'en_US', 'La Spezia'), + (168, 'en_US', 'Latina'), + (169, 'en_US', 'Lecce'), + (170, 'en_US', 'Lecco'), + (171, 'en_US', 'Livorno'), + (172, 'en_US', 'Lodi'), + (173, 'en_US', 'Lucca'), + (174, 'en_US', 'Macerata'), + (175, 'en_US', 'Mantova'), + (176, 'en_US', 'Massa'), + (177, 'en_US', 'Matera'), + (178, 'en_US', 'Medio Campidano'), + (179, 'en_US', 'Messina'), + (180, 'en_US', 'Milano'), + (181, 'en_US', 'Modena'), + (182, 'en_US', 'Monza e della Brianza'), + (183, 'en_US', 'Napoli'), + (184, 'en_US', 'Novara'), + (185, 'en_US', 'Nuoro'), + (186, 'en_US', 'Ogliastra'), + (187, 'en_US', 'Olbia-Tempio'), + (188, 'en_US', 'Oristano'), + (189, 'en_US', 'Padova'), + (190, 'en_US', 'Palermo'), + (191, 'en_US', 'Parma'), + (192, 'en_US', 'Pavia'), + (193, 'en_US', 'Perugia'), + (194, 'en_US', 'Pesaro-Urbino'), + (195, 'en_US', 'Pescara'), + (196, 'en_US', 'Piacenza'), + (197, 'en_US', 'Pisa'), + (198, 'en_US', 'Pistoia'), + (199, 'en_US', 'Pordenone'), + (200, 'en_US', 'Potenza'), + (201, 'en_US', 'Prato'), + (202, 'en_US', 'Ragusa'), + (203, 'en_US', 'Ravenna'), + (204, 'en_US', 'Reggio Calabria'), + (205, 'en_US', 'Reggio Emilia'), + (206, 'en_US', 'Rieti'), + (207, 'en_US', 'Rimini'), + (208, 'en_US', 'Roma'), + (209, 'en_US', 'Rovigo'), + (210, 'en_US', 'Salerno'), + (211, 'en_US', 'Sassari'), + (212, 'en_US', 'Savona'), + (213, 'en_US', 'Siena'), + (214, 'en_US', 'Siracusa'), + (215, 'en_US', 'Sondrio'), + (216, 'en_US', 'Taranto'), + (217, 'en_US', 'Teramo'), + (218, 'en_US', 'Terni'), + (219, 'en_US', 'Torino'), + (220, 'en_US', 'Trapani'), + (221, 'en_US', 'Trento'), + (222, 'en_US', 'Treviso'), + (223, 'en_US', 'Trieste'), + (224, 'en_US', 'Udine'), + (225, 'en_US', 'Varese'), + (226, 'en_US', 'Venezia'), + (227, 'en_US', 'Verbano-Cusio-Ossola'), + (228, 'en_US', 'Vercelli'), + (229, 'en_US', 'Verona'), + (230, 'en_US', 'Vibo Valentia'), + (231, 'en_US', 'Vicenza'), + (232, 'en_US', 'Viterbo'), + (233, 'en_US', 'Aceh'), + (234, 'en_US', 'Bali'), + (235, 'en_US', 'Bangka'), + (236, 'en_US', 'Banten'), + (237, 'en_US', 'Bengkulu'), + (238, 'en_US', 'Central Java'), + (239, 'en_US', 'Central Kalimantan'), + (240, 'en_US', 'Central Sulawesi'), + (241, 'en_US', 'Coat of arms of East Java'), + (242, 'en_US', 'East kalimantan'), + (243, 'en_US', 'East Nusa Tenggara'), + (244, 'en_US', 'Lambang propinsi'), + (245, 'en_US', 'Jakarta'), + (246, 'en_US', 'Jambi'), + (247, 'en_US', 'Lampung'), + (248, 'en_US', 'Maluku'), + (249, 'en_US', 'North Maluku'), + (250, 'en_US', 'North Sulawesi'), + (251, 'en_US', 'North Sumatra'), + (252, 'en_US', 'Papua'), + (253, 'en_US', 'Riau'), + (254, 'en_US', 'Lambang Riau'), + (255, 'en_US', 'Southeast Sulawesi'), + (256, 'en_US', 'South Kalimantan'), + (257, 'en_US', 'South Sulawesi'), + (258, 'en_US', 'South Sumatra'), + (259, 'en_US', 'West Java'), + (260, 'en_US', 'West Kalimantan'), + (261, 'en_US', 'West Nusa Tenggara'), + (262, 'en_US', 'Lambang Provinsi Papua Barat'), + (263, 'en_US', 'West Sulawesi'), + (264, 'en_US', 'West Sumatra'), + (265, 'en_US', 'Yogyakarta'), + (266, 'en_US', 'Aichi'), + (267, 'en_US', 'Akita'), + (268, 'en_US', 'Aomori'), + (269, 'en_US', 'Chiba'), + (270, 'en_US', 'Ehime'), + (271, 'en_US', 'Fukui'), + (272, 'en_US', 'Fukuoka'), + (273, 'en_US', 'Fukushima'), + (274, 'en_US', 'Gifu'), + (275, 'en_US', 'Gunma'), + (276, 'en_US', 'Hiroshima'), + (277, 'en_US', 'Hokkaido'), + (278, 'en_US', 'Hyogo'), + (279, 'en_US', 'Ibaraki'), + (280, 'en_US', 'Ishikawa'), + (281, 'en_US', 'Iwate'), + (282, 'en_US', 'Kagawa'), + (283, 'en_US', 'Kagoshima'), + (284, 'en_US', 'Kanagawa'), + (285, 'en_US', 'Kochi'), + (286, 'en_US', 'Kumamoto'), + (287, 'en_US', 'Kyoto'), + (288, 'en_US', 'Mie'), + (289, 'en_US', 'Miyagi'), + (290, 'en_US', 'Miyazaki'), + (291, 'en_US', 'Nagano'), + (292, 'en_US', 'Nagasaki'), + (293, 'en_US', 'Nara'), + (294, 'en_US', 'Niigata'), + (295, 'en_US', 'Oita'), + (296, 'en_US', 'Okayama'), + (297, 'en_US', 'Okinawa'), + (298, 'en_US', 'Osaka'), + (299, 'en_US', 'Saga'), + (300, 'en_US', 'Saitama'), + (301, 'en_US', 'Shiga'), + (302, 'en_US', 'Shimane'), + (303, 'en_US', 'Shizuoka'), + (304, 'en_US', 'Tochigi'), + (305, 'en_US', 'Tokushima'), + (306, 'en_US', 'Tokyo'), + (307, 'en_US', 'Tottori'), + (308, 'en_US', 'Toyama'), + (309, 'en_US', 'Wakayama'), + (310, 'en_US', 'Yamagata'), + (311, 'en_US', 'Yamaguchi'), + (312, 'en_US', 'Yamanashi'), + (313, 'en_US', ''), + (314, 'en_US', ''), + (315, 'en_US', ''), + (316, 'en_US', ''), + (317, 'en_US', ''), + + (1, 'es_ES', NULL), + (2, 'es_ES', NULL), + (3, 'es_ES', NULL), + (4, 'es_ES', NULL), + (5, 'es_ES', NULL), + (6, 'es_ES', NULL), + (7, 'es_ES', NULL), + (8, 'es_ES', NULL), + (9, 'es_ES', NULL), + (10, 'es_ES', 'Georgia'), + (11, 'es_ES', NULL), + (12, 'es_ES', NULL), + (13, 'es_ES', NULL), + (14, 'es_ES', NULL), + (15, 'es_ES', NULL), + (16, 'es_ES', NULL), + (17, 'es_ES', NULL), + (18, 'es_ES', NULL), + (19, 'es_ES', NULL), + (20, 'es_ES', NULL), + (21, 'es_ES', NULL), + (22, 'es_ES', NULL), + (23, 'es_ES', NULL), + (24, 'es_ES', NULL), + (25, 'es_ES', NULL), + (26, 'es_ES', NULL), + (27, 'es_ES', NULL), + (28, 'es_ES', NULL), + (29, 'es_ES', NULL), + (30, 'es_ES', NULL), + (31, 'es_ES', NULL), + (32, 'es_ES', 'Nueva York'), + (33, 'es_ES', NULL), + (34, 'es_ES', NULL), + (35, 'es_ES', NULL), + (36, 'es_ES', NULL), + (37, 'es_ES', NULL), + (38, 'es_ES', NULL), + (39, 'es_ES', NULL), + (40, 'es_ES', NULL), + (41, 'es_ES', NULL), + (42, 'es_ES', NULL), + (43, 'es_ES', NULL), + (44, 'es_ES', NULL), + (45, 'es_ES', NULL), + (46, 'es_ES', NULL), + (47, 'es_ES', NULL), + (48, 'es_ES', NULL), + (49, 'es_ES', NULL), + (50, 'es_ES', NULL), + (51, 'es_ES', NULL), + (52, 'es_ES', NULL), + (53, 'es_ES', NULL), + (54, 'es_ES', NULL), + (55, 'es_ES', NULL), + (56, 'es_ES', NULL), + (57, 'es_ES', NULL), + (58, 'es_ES', NULL), + (59, 'es_ES', NULL), + (60, 'es_ES', NULL), + (61, 'es_ES', NULL), + (62, 'es_ES', 'Ciudad de México'), + (63, 'es_ES', NULL), + (64, 'es_ES', NULL), + (65, 'es_ES', NULL), + (66, 'es_ES', NULL), + (67, 'es_ES', NULL), + (68, 'es_ES', NULL), + (69, 'es_ES', NULL), + (70, 'es_ES', NULL), + (71, 'es_ES', NULL), + (72, 'es_ES', NULL), + (73, 'es_ES', NULL), + (74, 'es_ES', NULL), + (75, 'es_ES', NULL), + (76, 'es_ES', NULL), + (77, 'es_ES', NULL), + (78, 'es_ES', NULL), + (79, 'es_ES', NULL), + (80, 'es_ES', NULL), + (81, 'es_ES', NULL), + (82, 'es_ES', NULL), + (83, 'es_ES', NULL), + (84, 'es_ES', NULL), + (85, 'es_ES', NULL), + (86, 'es_ES', NULL), + (87, 'es_ES', NULL), + (88, 'es_ES', NULL), + (89, 'es_ES', NULL), + (90, 'es_ES', NULL), + (91, 'es_ES', NULL), + (92, 'es_ES', NULL), + (93, 'es_ES', NULL), + (94, 'es_ES', NULL), + (95, 'es_ES', NULL), + (96, 'es_ES', NULL), + (97, 'es_ES', NULL), + (98, 'es_ES', NULL), + (99, 'es_ES', NULL), + (100, 'es_ES', NULL), + (101, 'es_ES', NULL), + (102, 'es_ES', NULL), + (103, 'es_ES', NULL), + (104, 'es_ES', NULL), + (105, 'es_ES', NULL), + (106, 'es_ES', NULL), + (107, 'es_ES', NULL), + (108, 'es_ES', NULL), + (109, 'es_ES', NULL), + (110, 'es_ES', NULL), + (111, 'es_ES', NULL), + (112, 'es_ES', NULL), + (113, 'es_ES', NULL), + (114, 'es_ES', NULL), + (115, 'es_ES', NULL), + (116, 'es_ES', NULL), + (117, 'es_ES', NULL), + (118, 'es_ES', NULL), + (119, 'es_ES', NULL), + (120, 'es_ES', NULL), + (121, 'es_ES', NULL), + (122, 'es_ES', NULL), + (123, 'es_ES', NULL), + (124, 'es_ES', NULL), + (125, 'es_ES', NULL), + (126, 'es_ES', NULL), + (127, 'es_ES', NULL), + (128, 'es_ES', NULL), + (129, 'es_ES', NULL), + (130, 'es_ES', NULL), + (131, 'es_ES', NULL), + (132, 'es_ES', NULL), + (133, 'es_ES', NULL), + (134, 'es_ES', NULL), + (135, 'es_ES', NULL), + (136, 'es_ES', NULL), + (137, 'es_ES', NULL), + (138, 'es_ES', NULL), + (139, 'es_ES', NULL), + (140, 'es_ES', NULL), + (141, 'es_ES', NULL), + (142, 'es_ES', NULL), + (143, 'es_ES', NULL), + (144, 'es_ES', NULL), + (145, 'es_ES', NULL), + (146, 'es_ES', NULL), + (147, 'es_ES', NULL), + (148, 'es_ES', NULL), + (149, 'es_ES', NULL), + (150, 'es_ES', NULL), + (151, 'es_ES', NULL), + (152, 'es_ES', NULL), + (153, 'es_ES', NULL), + (154, 'es_ES', NULL), + (155, 'es_ES', NULL), + (156, 'es_ES', NULL), + (157, 'es_ES', NULL), + (158, 'es_ES', NULL), + (159, 'es_ES', NULL), + (160, 'es_ES', NULL), + (161, 'es_ES', NULL), + (162, 'es_ES', NULL), + (163, 'es_ES', NULL), + (164, 'es_ES', NULL), + (165, 'es_ES', NULL), + (166, 'es_ES', NULL), + (167, 'es_ES', NULL), + (168, 'es_ES', NULL), + (169, 'es_ES', NULL), + (170, 'es_ES', NULL), + (171, 'es_ES', NULL), + (172, 'es_ES', NULL), + (173, 'es_ES', NULL), + (174, 'es_ES', NULL), + (175, 'es_ES', NULL), + (176, 'es_ES', NULL), + (177, 'es_ES', NULL), + (178, 'es_ES', NULL), + (179, 'es_ES', NULL), + (180, 'es_ES', NULL), + (181, 'es_ES', NULL), + (182, 'es_ES', NULL), + (183, 'es_ES', NULL), + (184, 'es_ES', NULL), + (185, 'es_ES', NULL), + (186, 'es_ES', NULL), + (187, 'es_ES', NULL), + (188, 'es_ES', NULL), + (189, 'es_ES', NULL), + (190, 'es_ES', NULL), + (191, 'es_ES', NULL), + (192, 'es_ES', NULL), + (193, 'es_ES', NULL), + (194, 'es_ES', NULL), + (195, 'es_ES', NULL), + (196, 'es_ES', NULL), + (197, 'es_ES', NULL), + (198, 'es_ES', NULL), + (199, 'es_ES', NULL), + (200, 'es_ES', NULL), + (201, 'es_ES', NULL), + (202, 'es_ES', NULL), + (203, 'es_ES', NULL), + (204, 'es_ES', NULL), + (205, 'es_ES', NULL), + (206, 'es_ES', NULL), + (207, 'es_ES', NULL), + (208, 'es_ES', NULL), + (209, 'es_ES', NULL), + (210, 'es_ES', NULL), + (211, 'es_ES', NULL), + (212, 'es_ES', NULL), + (213, 'es_ES', NULL), + (214, 'es_ES', NULL), + (215, 'es_ES', NULL), + (216, 'es_ES', NULL), + (217, 'es_ES', NULL), + (218, 'es_ES', NULL), + (219, 'es_ES', NULL), + (220, 'es_ES', NULL), + (221, 'es_ES', NULL), + (222, 'es_ES', NULL), + (223, 'es_ES', NULL), + (224, 'es_ES', NULL), + (225, 'es_ES', NULL), + (226, 'es_ES', NULL), + (227, 'es_ES', NULL), + (228, 'es_ES', NULL), + (229, 'es_ES', NULL), + (230, 'es_ES', NULL), + (231, 'es_ES', NULL), + (232, 'es_ES', NULL), + (233, 'es_ES', NULL), + (234, 'es_ES', NULL), + (235, 'es_ES', NULL), + (236, 'es_ES', NULL), + (237, 'es_ES', NULL), + (238, 'es_ES', NULL), + (239, 'es_ES', NULL), + (240, 'es_ES', NULL), + (241, 'es_ES', NULL), + (242, 'es_ES', NULL), + (243, 'es_ES', NULL), + (244, 'es_ES', NULL), + (245, 'es_ES', NULL), + (246, 'es_ES', NULL), + (247, 'es_ES', NULL), + (248, 'es_ES', NULL), + (249, 'es_ES', NULL), + (250, 'es_ES', NULL), + (251, 'es_ES', NULL), + (252, 'es_ES', NULL), + (253, 'es_ES', NULL), + (254, 'es_ES', NULL), + (255, 'es_ES', NULL), + (256, 'es_ES', NULL), + (257, 'es_ES', NULL), + (258, 'es_ES', NULL), + (259, 'es_ES', NULL), + (260, 'es_ES', NULL), + (261, 'es_ES', NULL), + (262, 'es_ES', NULL), + (263, 'es_ES', NULL), + (264, 'es_ES', NULL), + (265, 'es_ES', NULL), + (266, 'es_ES', NULL), + (267, 'es_ES', NULL), + (268, 'es_ES', NULL), + (269, 'es_ES', NULL), + (270, 'es_ES', NULL), + (271, 'es_ES', NULL), + (272, 'es_ES', NULL), + (273, 'es_ES', NULL), + (274, 'es_ES', NULL), + (275, 'es_ES', NULL), + (276, 'es_ES', NULL), + (277, 'es_ES', NULL), + (278, 'es_ES', NULL), + (279, 'es_ES', NULL), + (280, 'es_ES', NULL), + (281, 'es_ES', NULL), + (282, 'es_ES', NULL), + (283, 'es_ES', NULL), + (284, 'es_ES', NULL), + (285, 'es_ES', NULL), + (286, 'es_ES', NULL), + (287, 'es_ES', NULL), + (288, 'es_ES', NULL), + (289, 'es_ES', NULL), + (290, 'es_ES', NULL), + (291, 'es_ES', NULL), + (292, 'es_ES', NULL), + (293, 'es_ES', NULL), + (294, 'es_ES', NULL), + (295, 'es_ES', NULL), + (296, 'es_ES', NULL), + (297, 'es_ES', NULL), + (298, 'es_ES', NULL), + (299, 'es_ES', NULL), + (300, 'es_ES', NULL), + (301, 'es_ES', NULL), + (302, 'es_ES', NULL), + (303, 'es_ES', NULL), + (304, 'es_ES', NULL), + (305, 'es_ES', NULL), + (306, 'es_ES', NULL), + (307, 'es_ES', NULL), + (308, 'es_ES', NULL), + (309, 'es_ES', NULL), + (310, 'es_ES', NULL), + (311, 'es_ES', NULL), + (312, 'es_ES', NULL), + (313, 'es_ES', ''), + (314, 'es_ES', ''), + (315, 'es_ES', ''), + (316, 'es_ES', ''), + (317, 'es_ES', ''), + + (1, 'fr_FR', 'Alabama'), + (2, 'fr_FR', 'Alaska'), + (3, 'fr_FR', 'Arizona'), + (4, 'fr_FR', 'Arkansas'), + (5, 'fr_FR', 'Californie'), + (6, 'fr_FR', 'Colorado'), + (7, 'fr_FR', 'Connecticut'), + (8, 'fr_FR', 'Delaware'), + (9, 'fr_FR', 'Floride'), + (10, 'fr_FR', 'Géorgie'), + (11, 'fr_FR', 'Hawaii'), + (12, 'fr_FR', 'Idaho'), + (13, 'fr_FR', 'Illinois'), + (14, 'fr_FR', 'Indiana'), + (15, 'fr_FR', 'Iowa'), + (16, 'fr_FR', 'Kansas'), + (17, 'fr_FR', 'Kentucky'), + (18, 'fr_FR', 'Louisiane'), + (19, 'fr_FR', 'Maine'), + (20, 'fr_FR', 'Maryland'), + (21, 'fr_FR', 'Massachusetts'), + (22, 'fr_FR', 'Michigan'), + (23, 'fr_FR', 'Minnesota'), + (24, 'fr_FR', 'Mississippi'), + (25, 'fr_FR', 'Missouri'), + (26, 'fr_FR', 'Montana'), + (27, 'fr_FR', 'Nebraska'), + (28, 'fr_FR', 'Nevada'), + (29, 'fr_FR', 'New Hampshire'), + (30, 'fr_FR', 'New Jersey'), + (31, 'fr_FR', 'Nouveau-Mexique'), + (32, 'fr_FR', 'New York'), + (33, 'fr_FR', 'Caroline du Nord'), + (34, 'fr_FR', 'Dakota du Nord'), + (35, 'fr_FR', 'Ohio'), + (36, 'fr_FR', 'Oklahoma'), + (37, 'fr_FR', 'Oregon'), + (38, 'fr_FR', 'Pennsylvanie'), + (39, 'fr_FR', 'Rhode Island'), + (40, 'fr_FR', 'Caroline du Sud'), + (41, 'fr_FR', 'Dakota du Sud'), + (42, 'fr_FR', 'Tennessee'), + (43, 'fr_FR', 'Texas'), + (44, 'fr_FR', 'Utah'), + (45, 'fr_FR', 'Vermont'), + (46, 'fr_FR', 'Virginie'), + (47, 'fr_FR', 'Washington'), + (48, 'fr_FR', 'Virginie-occidentale'), + (49, 'fr_FR', 'Wisconsin'), + (50, 'fr_FR', 'Wyoming'), + (51, 'fr_FR', 'Porto Rico'), + (52, 'fr_FR', 'Îles Vierges américaines'), + (53, 'fr_FR', 'District de Columbia'), + (54, 'fr_FR', 'Aguascalientes'), + (55, 'fr_FR', 'Baja California'), + (56, 'fr_FR', 'Baja California Sur'), + (57, 'fr_FR', 'Campeche'), + (58, 'fr_FR', 'Chiapas'), + (59, 'fr_FR', 'Chihuahua'), + (60, 'fr_FR', 'Coahuila'), + (61, 'fr_FR', 'Colima'), + (62, 'fr_FR', 'Distrito Federal'), + (63, 'fr_FR', 'Durango'), + (64, 'fr_FR', 'Guanajuato'), + (65, 'fr_FR', 'Guerrero'), + (66, 'fr_FR', 'Hidalgo'), + (67, 'fr_FR', 'Jalisco'), + (68, 'fr_FR', 'Estado de México'), + (69, 'fr_FR', 'Michoacán'), + (70, 'fr_FR', 'Morelos'), + (71, 'fr_FR', 'Nayarit'), + (72, 'fr_FR', 'Nuevo León'), + (73, 'fr_FR', 'Oaxaca'), + (74, 'fr_FR', 'Puebla'), + (75, 'fr_FR', 'Querétaro'), + (76, 'fr_FR', 'Quintana Roo'), + (77, 'fr_FR', 'San Luis Potosí'), + (78, 'fr_FR', 'Sinaloa'), + (79, 'fr_FR', 'Sonora'), + (80, 'fr_FR', 'Tabasco'), + (81, 'fr_FR', 'Tamaulipas'), + (82, 'fr_FR', 'Tlaxcala'), + (83, 'fr_FR', 'Veracruz'), + (84, 'fr_FR', 'Yucatán'), + (85, 'fr_FR', 'Zacatecas'), + (86, 'fr_FR', 'Ontario'), + (87, 'fr_FR', 'Québec'), + (88, 'fr_FR', 'Colombie-Britannique'), + (89, 'fr_FR', 'Alberta'), + (90, 'fr_FR', 'Manitoba'), + (91, 'fr_FR', 'Saskatchewan'), + (92, 'fr_FR', 'Nouvelle-Écosse'), + (93, 'fr_FR', 'Nouveau-Brunswick'), + (94, 'fr_FR', 'Terre Neuve et Labrador'), + (95, 'fr_FR', 'Île-du-Prince-Édouard'), + (96, 'fr_FR', 'Territoires du Nord-Ouest'), + (97, 'fr_FR', 'Yukon'), + (98, 'fr_FR', 'Nunavut'), + (99, 'fr_FR', 'Buenos Aires'), + (100, 'fr_FR', 'Catamarca'), + (101, 'fr_FR', 'Chaco'), + (102, 'fr_FR', 'Chubut'), + (103, 'fr_FR', 'Ciudad de Buenos Aires'), + (104, 'fr_FR', 'Cordoba'), + (105, 'fr_FR', 'Corrientes'), + (106, 'fr_FR', 'Entre Ríos'), + (107, 'fr_FR', 'Formosa'), + (108, 'fr_FR', 'Jujuy'), + (109, 'fr_FR', 'La Pampa'), + (110, 'fr_FR', 'La Rioja'), + (111, 'fr_FR', 'Mendoza'), + (112, 'fr_FR', 'Misiones'), + (113, 'fr_FR', 'Neuquén'), + (114, 'fr_FR', 'Rio Negro'), + (115, 'fr_FR', 'Salta'), + (116, 'fr_FR', 'San Juan'), + (117, 'fr_FR', 'San Luis'), + (118, 'fr_FR', 'Santa Cruz'), + (119, 'fr_FR', 'Santa Fe'), + (120, 'fr_FR', 'Santiago del Estero'), + (121, 'fr_FR', 'Tierra del Fuego'), + (122, 'fr_FR', 'Tucuman'), + (123, 'fr_FR', 'Agrigento'), + (124, 'fr_FR', 'Alessandria'), + (125, 'fr_FR', 'Ancona'), + (126, 'fr_FR', 'Aosta'), + (127, 'fr_FR', 'Arezzo'), + (128, 'fr_FR', 'Ascoli Piceno'), + (129, 'fr_FR', 'Asti'), + (130, 'fr_FR', 'Avellino'), + (131, 'fr_FR', 'Bari'), + (132, 'fr_FR', 'Barletta-Andria-Trani'), + (133, 'fr_FR', 'Belluno'), + (134, 'fr_FR', 'Benevento'), + (135, 'fr_FR', 'Bergamo'), + (136, 'fr_FR', 'Biella'), + (137, 'fr_FR', 'Bologne'), + (138, 'fr_FR', 'Bolzano'), + (139, 'fr_FR', 'Brescia'), + (140, 'fr_FR', 'Brindisi'), + (141, 'fr_FR', 'Cagliari'), + (142, 'fr_FR', 'Caltanissetta'), + (143, 'fr_FR', 'Campobasso'), + (144, 'fr_FR', 'Carbonia-Iglesias'), + (145, 'fr_FR', 'Caserta'), + (146, 'fr_FR', 'Catane'), + (147, 'fr_FR', 'Catanzaro'), + (148, 'fr_FR', 'Chieti'), + (149, 'fr_FR', 'Como'), + (150, 'fr_FR', 'Cosenza'), + (151, 'fr_FR', 'Cremona'), + (152, 'fr_FR', 'Crotone'), + (153, 'fr_FR', 'Cuneo'), + (154, 'fr_FR', 'Enna'), + (155, 'fr_FR', 'Fermo'), + (156, 'fr_FR', 'Ferrara'), + (157, 'fr_FR', 'Firenze'), + (158, 'fr_FR', 'Foggia'), + (159, 'fr_FR', 'Forlì-Cesena'), + (160, 'fr_FR', 'Frosinone'), + (161, 'fr_FR', 'Genova'), + (162, 'fr_FR', 'Gorizia'), + (163, 'fr_FR', 'Grosseto'), + (164, 'fr_FR', 'Imperia'), + (165, 'fr_FR', 'Isernia'), + (166, 'fr_FR', 'L\'Aquila'), + (167, 'fr_FR', 'La Spezia'), + (168, 'fr_FR', 'Latina'), + (169, 'fr_FR', 'Lecce'), + (170, 'fr_FR', 'Lecco'), + (171, 'fr_FR', 'Livourne'), + (172, 'fr_FR', 'Lodi'), + (173, 'fr_FR', 'Lucca'), + (174, 'fr_FR', 'Macerata'), + (175, 'fr_FR', 'Mantova'), + (176, 'fr_FR', 'Massa'), + (177, 'fr_FR', 'Matera'), + (178, 'fr_FR', 'Medio Campidano'), + (179, 'fr_FR', 'Messina'), + (180, 'fr_FR', 'Milano'), + (181, 'fr_FR', 'Modena'), + (182, 'fr_FR', 'Monza e della Brianza'), + (183, 'fr_FR', 'Napoli'), + (184, 'fr_FR', 'Novara'), + (185, 'fr_FR', 'Nuoro'), + (186, 'fr_FR', 'Ogliastra'), + (187, 'fr_FR', 'Olbia-Tempio'), + (188, 'fr_FR', 'Oristano'), + (189, 'fr_FR', 'Padova'), + (190, 'fr_FR', 'Palerme'), + (191, 'fr_FR', 'Parma'), + (192, 'fr_FR', 'Pavie'), + (193, 'fr_FR', 'Pérouse'), + (194, 'fr_FR', 'Pesaro-Urbino'), + (195, 'fr_FR', 'Pescara'), + (196, 'fr_FR', 'Piacenza'), + (197, 'fr_FR', 'Pise'), + (198, 'fr_FR', 'Pistoia'), + (199, 'fr_FR', 'Pordenone'), + (200, 'fr_FR', 'Potenza'), + (201, 'fr_FR', 'Prato'), + (202, 'fr_FR', 'Ragusa'), + (203, 'fr_FR', 'Ravenne'), + (204, 'fr_FR', 'Reggio de Calabre'), + (205, 'fr_FR', 'Reggio d\'Émilie'), + (206, 'fr_FR', 'Rieti'), + (207, 'fr_FR', 'Rimini'), + (208, 'fr_FR', 'Rome'), + (209, 'fr_FR', 'Rovigo'), + (210, 'fr_FR', 'Salerno'), + (211, 'fr_FR', 'Sassari'), + (212, 'fr_FR', 'Savona'), + (213, 'fr_FR', 'Siena'), + (214, 'fr_FR', 'Siracusa'), + (215, 'fr_FR', 'Sondrio'), + (216, 'fr_FR', 'Taranto'), + (217, 'fr_FR', 'Teramo'), + (218, 'fr_FR', 'Terni'), + (219, 'fr_FR', 'Torino'), + (220, 'fr_FR', 'Trapani'), + (221, 'fr_FR', 'Trento'), + (222, 'fr_FR', 'Treviso'), + (223, 'fr_FR', 'Trieste'), + (224, 'fr_FR', 'Udine'), + (225, 'fr_FR', 'Varese'), + (226, 'fr_FR', 'Venezia'), + (227, 'fr_FR', 'Verbano-Cusio-Ossola'), + (228, 'fr_FR', 'Vercelli'), + (229, 'fr_FR', 'Vérone'), + (230, 'fr_FR', 'Vibo Valentia'), + (231, 'fr_FR', 'Vicenza'), + (232, 'fr_FR', 'Viterbo'), + (233, 'fr_FR', 'Aceh'), + (234, 'fr_FR', 'Bali'), + (235, 'fr_FR', 'Bangka'), + (236, 'fr_FR', 'Banten'), + (237, 'fr_FR', 'Bengkulu'), + (238, 'fr_FR', 'Central Java'), + (239, 'fr_FR', 'Kalimantan occidental'), + (240, 'fr_FR', 'Sulawesi central'), + (241, 'fr_FR', 'Coat of arms of East Java'), + (242, 'fr_FR', 'Kalimantan oriental'), + (243, 'fr_FR', 'Nusa Tenggara oriental'), + (244, 'fr_FR', 'Lambang propinsi'), + (245, 'fr_FR', 'Jakarta'), + (246, 'fr_FR', 'Jambi'), + (247, 'fr_FR', 'Lampung'), + (248, 'fr_FR', 'Maluku'), + (249, 'fr_FR', 'Maluku du Nord'), + (250, 'fr_FR', 'Sulawesi du Nord'), + (251, 'fr_FR', 'Sumatra-Nord'), + (252, 'fr_FR', 'Papouasie'), + (253, 'fr_FR', 'Riau'), + (254, 'fr_FR', 'Lambang Riau'), + (255, 'fr_FR', 'Sulawesi du sud-est'), + (256, 'fr_FR', 'Kalimantan du Sud'), + (257, 'fr_FR', 'Sulawesi du Sud'), + (258, 'fr_FR', 'Sumatra du Sud'), + (259, 'fr_FR', 'Java-Ouest'), + (260, 'fr_FR', 'Kalimantan occidental'), + (261, 'fr_FR', 'Nusa Tenggara occidental'), + (262, 'fr_FR', 'Lambang Provinsi Papua Barat'), + (263, 'fr_FR', 'Sulawesi occidental'), + (264, 'fr_FR', 'Sumatra occidental'), + (265, 'fr_FR', 'Yogyakarta'), + (266, 'fr_FR', 'Aichi'), + (267, 'fr_FR', 'Akita'), + (268, 'fr_FR', 'Aomori'), + (269, 'fr_FR', 'Chiba'), + (270, 'fr_FR', 'Ehime'), + (271, 'fr_FR', 'Fukui'), + (272, 'fr_FR', 'Fukuoka'), + (273, 'fr_FR', 'Fukushima'), + (274, 'fr_FR', 'Gifu'), + (275, 'fr_FR', 'Gunma'), + (276, 'fr_FR', 'Hiroshima'), + (277, 'fr_FR', 'Hokkaido'), + (278, 'fr_FR', 'Hyogo'), + (279, 'fr_FR', 'Ibaraki'), + (280, 'fr_FR', 'Ishikawa'), + (281, 'fr_FR', 'Iwate'), + (282, 'fr_FR', 'Kagawa'), + (283, 'fr_FR', 'Kagoshima'), + (284, 'fr_FR', 'Kanagawa'), + (285, 'fr_FR', 'Kochi'), + (286, 'fr_FR', 'Kumamoto'), + (287, 'fr_FR', 'Kyoto'), + (288, 'fr_FR', 'Mie'), + (289, 'fr_FR', 'Miyagi'), + (290, 'fr_FR', 'Miyazaki'), + (291, 'fr_FR', 'Nagano'), + (292, 'fr_FR', 'Nagasaki'), + (293, 'fr_FR', 'Nara'), + (294, 'fr_FR', 'Niigata'), + (295, 'fr_FR', 'Oita'), + (296, 'fr_FR', 'Okayama'), + (297, 'fr_FR', 'Okinawa'), + (298, 'fr_FR', 'Osaka'), + (299, 'fr_FR', 'Saga'), + (300, 'fr_FR', 'Saitama'), + (301, 'fr_FR', 'Shiga'), + (302, 'fr_FR', 'Shimane'), + (303, 'fr_FR', 'Shizuoka'), + (304, 'fr_FR', 'Tochigi'), + (305, 'fr_FR', 'Tokushima'), + (306, 'fr_FR', 'Tokyo'), + (307, 'fr_FR', 'Tottori'), + (308, 'fr_FR', 'Toyama'), + (309, 'fr_FR', 'Wakayama'), + (310, 'fr_FR', 'Yamagata'), + (311, 'fr_FR', 'Yamaguchi'), + (312, 'fr_FR', 'Yamanashi'), + (313, 'fr_FR', ''), + (314, 'fr_FR', ''), + (315, 'fr_FR', ''), + (316, 'fr_FR', ''), + (317, 'fr_FR', '') +; + +-- Add new column in lang table +ALTER TABLE `lang` ADD `active` BOOLEAN NOT NULL DEFAULT FALSE AFTER `decimals` ; +ALTER TABLE `lang` ADD `visible` TINYINT NOT NULL DEFAULT '0' AFTER `active` ; + +-- Update lang +UPDATE `lang` SET `active` = '1', `visible` = '1' WHERE 1; + +-- add missing primary key +ALTER TABLE `coupon_customer_count` ADD PRIMARY KEY(`coupon_id`, `customer_id`); +ALTER TABLE `ignored_module_hook` ADD PRIMARY KEY(`module_id`, `hook_id`); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.3.0-alpha2.sql b/setup/update/sql/2.3.0-alpha2.sql new file mode 100644 index 00000000..abda8802 --- /dev/null +++ b/setup/update/sql/2.3.0-alpha2.sql @@ -0,0 +1,239 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-alpha2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha2' WHERE `name`='thelia_extra_version'; + +-- Add column unsubscribed in newsletter table +ALTER TABLE `newsletter` ADD `unsubscribed` TINYINT(1) NOT NULL DEFAULT '0' AFTER `locale`; + +-- add admin email +ALTER TABLE `admin` ADD `email` VARCHAR(255) NOT NULL AFTER `remember_me_serial` ; +ALTER TABLE `admin` ADD `password_renew_token` VARCHAR(255) NOT NULL AFTER `email` ; + +-- add admin password renew message + +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES +(@max, 'new_admin_password', NULL, NULL, 'admin_password.txt', NULL, 'admin_password.html', NOW(), NOW()); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES + (@max, 'de_DE', NULL, NULL, NULL, NULL), + (@max, 'en_US', 'Mail sent to an administrator who requested a new password', NULL, NULL, NULL), + (@max, 'es_ES', 'Correo enviado a un administrador que ha solicitado una nueva contraseña', NULL, NULL, NULL), + (@max, 'fr_FR', 'Courrier envoyé à un administrateur qui a demandé un nouveau mot de passe', NULL, NULL, NULL) +; + +-- Insert a fake email address for administrators, to trigger the admin update dialog +-- at next admin login. + +UPDATE `admin` set email = CONCAT('CHANGE_ME_', ID); + +ALTER TABLE `admin` ADD UNIQUE `email_UNIQUE` (`email`); + +-- additional config variables + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'minimum_admin_password_length', '4', 0, 0, NOW(), NOW()), +(@max_id + 2, 'enable_lost_admin_password_recovery', '1', 0, 0, NOW(), NOW()), +(@max_id + 3, 'notify_newsletter_subscription', '1', 0, 0, NOW(), NOW()) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@max_id + 1, 'de_DE', NULL, NULL, NULL, NULL), + (@max_id + 2, 'de_DE', NULL, NULL, NULL, NULL), + (@max_id + 3, 'de_DE', NULL, NULL, NULL, NULL), + (@max_id + 1, 'en_US', 'The minimum length required for an administrator password', NULL, NULL, NULL), + (@max_id + 2, 'en_US', 'Allow an administrator to recreate a lost password (1 = yes, 0 = no)', NULL, NULL, NULL), + (@max_id + 3, 'en_US', 'Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)', NULL, NULL, NULL), + (@max_id + 1, 'es_ES', 'La longitud mínima de la contraseña de administrador', NULL, NULL, NULL), + (@max_id + 2, 'es_ES', 'Permite a un administrador recrear una contraseña perdida (1 = sí, 0 = no)', NULL, NULL, NULL), + (@max_id + 3, 'es_ES', 'Enviar un correo de confirmación a los suscriptores del boletín (1 = sí, 0 = no)', NULL, NULL, NULL), + (@max_id + 1, 'fr_FR', 'La longueur minimale requise pour un mot de passe administrateur', NULL, NULL, NULL), + (@max_id + 2, 'fr_FR', 'Permettre à un administrateur de recréer un mot de passe perdu (1 = Oui, 0 = non)', NULL, NULL, NULL), + (@max_id + 3, 'fr_FR', 'Envoyer un email de confirmation aux abonnés de la newsletter (1 = Oui, 0 = non)', NULL, NULL, NULL) +; + +-- Additional hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'sale.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'sale.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+3, 'sale.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+4, 'sale.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+5, 'sale.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+6, 'sale.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+7, 'sale.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+8, 'sale.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+9, 'sale.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+10, 'account-order.invoice-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+11, 'account-order.delivery-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+12, 'newsletter-unsubscribe.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+13, 'newsletter-unsubscribe.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+14, 'newsletter-unsubscribe.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+15, 'newsletter-unsubscribe.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+16, 'newsletter-unsubscribe.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES + (@max_id+1, 'de_DE', NULL, NULL, NULL), + (@max_id+2, 'de_DE', NULL, NULL, NULL), + (@max_id+3, 'de_DE', NULL, NULL, NULL), + (@max_id+4, 'de_DE', NULL, NULL, NULL), + (@max_id+5, 'de_DE', NULL, NULL, NULL), + (@max_id+6, 'de_DE', NULL, NULL, NULL), + (@max_id+7, 'de_DE', NULL, NULL, NULL), + (@max_id+8, 'de_DE', NULL, NULL, NULL), + (@max_id+9, 'de_DE', NULL, NULL, NULL), + (@max_id+10, 'de_DE', NULL, NULL, NULL), + (@max_id+11, 'de_DE', NULL, NULL, NULL), + (@max_id+12, 'de_DE', NULL, NULL, NULL), + (@max_id+13, 'de_DE', NULL, NULL, NULL), + (@max_id+14, 'de_DE', NULL, NULL, NULL), + (@max_id+15, 'de_DE', NULL, NULL, NULL), + (@max_id+16, 'de_DE', NULL, NULL, NULL), + (@max_id+1, 'en_US', 'Sale - at the top', NULL, NULL), + (@max_id+2, 'en_US', 'Sale - at the bottom', NULL, NULL), + (@max_id+3, 'en_US', 'Sale - at the top of the main area', NULL, NULL), + (@max_id+4, 'en_US', 'Sale - at the bottom of the main area', NULL, NULL), + (@max_id+5, 'en_US', 'Sale - before the main content area', NULL, NULL), + (@max_id+6, 'en_US', 'Sale - after the main content area', NULL, NULL), + (@max_id+7, 'en_US', 'Sale - CSS stylesheet', NULL, NULL), + (@max_id+8, 'en_US', 'Sale - after javascript include', NULL, NULL), + (@max_id+9, 'en_US', 'Sale - javascript initialization', NULL, NULL), + (@max_id+10, 'en_US', 'Order details - after invoice address', NULL, NULL), + (@max_id+11, 'en_US', 'Order details - after delivery address', NULL, NULL), + (@max_id+12, 'en_US', 'Newsletter unsubscribe page - at the top', NULL, NULL), + (@max_id+13, 'en_US', 'Newsletter unsubscribe page - at the bottom', NULL, NULL), + (@max_id+14, 'en_US', 'Newsletter unsubscribe page - CSS stylesheet', NULL, NULL), + (@max_id+15, 'en_US', 'Newsletter unsubscribe page - after javascript include', NULL, NULL), + (@max_id+16, 'en_US', 'Newsletter unsubscribe page - after javascript initialisation', NULL, NULL), + (@max_id+1, 'es_ES', 'Venta - encabezado', NULL, NULL), + (@max_id+2, 'es_ES', 'Venta - al pie', NULL, NULL), + (@max_id+3, 'es_ES', 'Venta - encabezado del área principal', NULL, NULL), + (@max_id+4, 'es_ES', 'Venta - al pie del área principal', NULL, NULL), + (@max_id+5, 'es_ES', 'Venta - antes del área de contenido principal', NULL, NULL), + (@max_id+6, 'es_ES', 'Venta - después del área de contenido principal', NULL, NULL), + (@max_id+7, 'es_ES', 'Venta - Hoja de estilos CSS', NULL, NULL), + (@max_id+8, 'es_ES', 'Venta - después de incluir JavaScript', NULL, NULL), + (@max_id+9, 'es_ES', 'Venta - inicialización de JavaScript', NULL, NULL), + (@max_id+10, 'es_ES', 'Detalles de pedido - después de la dirección de facturación', NULL, NULL), + (@max_id+11, 'es_ES', 'Detalles de pedido - después de la dirección de entrega', NULL, NULL), + (@max_id+12, 'es_ES', 'Página de baja del boletín - en la parte superior', NULL, NULL), + (@max_id+13, 'es_ES', 'Página de baja del boletín - al pie', NULL, NULL), + (@max_id+14, 'es_ES', 'Página de baja del boletín - Hoja de estilos CSS', NULL, NULL), + (@max_id+15, 'es_ES', 'Página de baja del boletín - después de incluir JavaScript', NULL, NULL), + (@max_id+16, 'es_ES', 'Página de baja del boletín - después de la inicialización de JavaScript', NULL, NULL), + (@max_id+1, 'fr_FR', 'Promotion - en haut', NULL, NULL), + (@max_id+2, 'fr_FR', 'Promotion - en bas', NULL, NULL), + (@max_id+3, 'fr_FR', 'Promotion - en haut de la zone principal', NULL, NULL), + (@max_id+4, 'fr_FR', 'Promotion - en bas de la zone principal', NULL, NULL), + (@max_id+5, 'fr_FR', 'Promotion - au dessous de la zone de contenu principale', NULL, NULL), + (@max_id+6, 'fr_FR', 'Promotion - en dessous de la zone de contenu principale', NULL, NULL), + (@max_id+7, 'fr_FR', 'Promotion - feuille de style CSS', NULL, NULL), + (@max_id+8, 'fr_FR', 'Promotion - après l\'inclusion du JavaScript', NULL, NULL), + (@max_id+9, 'fr_FR', 'Promotion - initialisation du JavaScript', NULL, NULL), + (@max_id+10, 'fr_FR', 'Détail d\'une commande - après l\'adresse de facturation', NULL, NULL), + (@max_id+11, 'fr_FR', 'Détails d\'une commande - après l\'adresse de livraison', NULL, NULL), + (@max_id+12, 'fr_FR', 'Désabonnement newsletter - en haut', NULL, NULL), + (@max_id+13, 'fr_FR', 'Désabonnement newsletter - en bas', NULL, NULL), + (@max_id+14, 'fr_FR', 'Désabonnement newsletter - feuille de style CSS', NULL, NULL), + (@max_id+15, 'fr_FR', 'Désabonnement newsletter - après l\'inclusion du JavaScript', NULL, NULL), + (@max_id+16, 'fr_FR', 'Désabonnement newsletter - après l\'initialisation du JavaScript', NULL, NULL) +; + +-- Update module version column +ALTER TABLE `module` MODIFY `version` varchar(25) NOT NULL DEFAULT ''; + +-- Add new column in coupon table +ALTER TABLE `coupon` ADD `start_date` DATETIME AFTER`is_enabled`; +ALTER TABLE `coupon` ADD INDEX `idx_start_date` (`start_date`); + +-- Add new column in coupon version table +ALTER TABLE `coupon_version` ADD `start_date` DATETIME AFTER`is_enabled`; + +-- Add new column in order coupon table +ALTER TABLE `order_coupon` ADD `start_date` DATETIME AFTER`description`; + +-- Add new column in attribute combination table +ALTER TABLE `attribute_combination` ADD `position` INT NULL AFTER `product_sale_elements_id`; + +-- Add newsletter subscription confirmation message + +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES +(@max, 'newsletter_subscription_confirmation', NULL, NULL, 'newsletter_subscription_confirmation.txt', NULL, 'newsletter_subscription_confirmation.html', NOW(), NOW()); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES + (@max, 'de_DE', NULL, NULL, NULL, NULL), + (@max, 'en_US', 'Mail sent after a subscription to newsletter', 'Your subscription to %store newsletter', NULL, NULL), + (@max, 'es_ES', 'Correo enviado después de la suscripción al boletín de noticias', 'Tu suscripción al boletín de %store', NULL, NULL), + (@max, 'fr_FR', 'Email envoyé après l\'inscription à la newsletter', 'Vous avez souscrit à la newsletter du site %store', NULL, NULL) +; + +-- add new config variables number_default_results_per_page +SELECT @max := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES (@max+1, 'number_default_results_per_page.product_list', '20', '0', '0', NOW(), NOW()); +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES (@max+2, 'number_default_results_per_page.order_list', '20', '0', '0', NOW(), NOW()); +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES (@max+3, 'number_default_results_per_page.customer_list', '20', '0', '0', NOW(), NOW()); + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES + (@max+1, 'de_DE', NULL, NUll, NULL, NULL), + (@max+2, 'de_DE', NULL, NUll, NULL, NULL), + (@max+3, 'de_DE', NULL, NUll, NULL, NULL), + (@max+1, 'en_US', 'Number by default of results per page for product list', NUll, NULL, NULL), + (@max+2, 'en_US', 'Number by default of results per page for order list', NUll, NULL, NULL), + (@max+3, 'en_US', 'Number by default of results per page for customer list', NUll, NULL, NULL), + (@max+1, 'es_ES', 'Número predeterminado de resultados por página para la lista de productos', NUll, NULL, NULL), + (@max+2, 'es_ES', 'Número predeterminado de resultados por página para la lista de pedidos', NUll, NULL, NULL), + (@max+3, 'es_ES', 'Número predeterminado de resultados por página para la lista de clientes', NUll, NULL, NULL), + (@max+1, 'fr_FR', 'Nombre par défaut de résultats par page pour la liste des produits', NUll, NULL, NULL), + (@max+2, 'fr_FR', 'Nombre par défaut de résultats par page pour la liste des commandes', NUll, NULL, NULL), + (@max+3, 'fr_FR', 'Nombre par défaut de résultats par page pour la liste des clients', NUll, NULL, NULL) +; + +-- Add module HookAdminHome +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `module`; +SELECT @max_classic_position := IFNULL(MAX(`position`),0) FROM `module` WHERE `type`=1; + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'HookAdminHome', 1, 1, @max_classic_position+1, 'HookAdminHome\\HookAdminHome', NOW(), NOW()) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(@max_id+1, 'de_DE', NULL, NULL, NULL, NULL), +(@max_id+1, 'en_US', 'Displays the default blocks on the homepage of the administration', NULL, NULL, NULL), +(@max_id+1, 'es_ES', NULL, NULL, NULL, NULL), +(@max_id+1, 'fr_FR', 'Affiche les blocs par défaut sur la page d\'accueil de l\'administration', NULL, NULL, NULL) +; + +-- Update customer lang FK +ALTER TABLE `customer` CHANGE `lang` `lang_id` INT(11) NULL DEFAULT NULL; +ALTER TABLE `customer` ADD INDEX `idx_email` (`email`); +ALTER TABLE `customer` ADD INDEX `idx_customer_lang_id` (`lang_id`); +ALTER TABLE `customer` ADD CONSTRAINT `fk_customer_lang_id` FOREIGN KEY (`lang_id`) REFERENCES `lang` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +OPTIMIZE TABLE `customer`; + + +-- Update customer version +ALTER TABLE `customer_version` CHANGE `lang` `lang_id` INT(11) NULL DEFAULT NULL; + + +-- Update newletter index +ALTER TABLE `newsletter` ADD INDEX `idx_unsubscribed` (`unsubscribed`); + +OPTIMIZE TABLE `newsletter`; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.3.0-beta1.sql b/setup/update/sql/2.3.0-beta1.sql new file mode 100644 index 00000000..b694fc63 --- /dev/null +++ b/setup/update/sql/2.3.0-beta1.sql @@ -0,0 +1,18 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-beta1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta1' WHERE `name`='thelia_extra_version'; + +-- Add column position in the product_category and content_folder table +ALTER TABLE `product_category` ADD `position` INT(11) NOT NULL AFTER `default_category`; +ALTER TABLE `content_folder` ADD `position` INT(11) NOT NULL AFTER `default_folder`; + +UPDATE `product_category` INNER JOIN `product` ON `product_category`.`product_id`=`product`.`id` SET `product_category`.`position`=`product`.`position`; + +ALTER TABLE `product` CHANGE `position` `position` INT(11) COMMENT 'This column is deprecated since 2.3, and will be removed in 2.5'; +ALTER TABLE `content` CHANGE `position` `position` INT(11) COMMENT 'This column is deprecated since 2.3, and will be removed in 2.5'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.3.0-beta2.sql b/setup/update/sql/2.3.0-beta2.sql new file mode 100644 index 00000000..3322e6c6 --- /dev/null +++ b/setup/update/sql/2.3.0-beta2.sql @@ -0,0 +1,12 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; + +-- Fix content folder position +UPDATE `content_folder` INNER JOIN `content` ON `content_folder`.`content_id`=`content`.`id` SET `content_folder`.`position`=`content`.`position`; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.3.0.sql b/setup/update/sql/2.3.0.sql new file mode 100644 index 00000000..57f9ef0c --- /dev/null +++ b/setup/update/sql/2.3.0.sql @@ -0,0 +1,12 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +-- Fix lang date/time format for fr_FR +UPDATE `lang` SET datetime_format = 'd/m/Y H:i:s' WHERE locale = 'fr_FR' and datetime_format = 'd/m/y H:i:s'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/sql/2.3.1.sql b/setup/update/sql/2.3.1.sql new file mode 100644 index 00000000..eeb3bef8 --- /dev/null +++ b/setup/update/sql/2.3.1.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.0.0-RC1.sql.tpl b/setup/update/tpl/2.0.0-RC1.sql.tpl new file mode 100644 index 00000000..7930e427 --- /dev/null +++ b/setup/update/tpl/2.0.0-RC1.sql.tpl @@ -0,0 +1,24 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +ALTER TABLE `product` CHANGE `position` `position` INT( 11 ) NOT NULL DEFAULT '0'; +ALTER TABLE `product_version` CHANGE `position` `position` INT( 11 ) NOT NULL DEFAULT '0'; + +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +INSERT INTO `message` (`id`, `name`, `secured`, `created_at`, `updated_at`, `version`, `version_created_at`, `version_created_by`) VALUES +(@max, 'lost_password', NULL, NOW(), NOW(), 2, NOW(), NULL); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +{foreach $locales as $locale} +(@max, '{$locale}', {intl l='Your new password' locale=$locale}, {intl l='Your new password' locale=$locale}, {intl l='Your new passord is : {$password}' locale=$locale}, '\r\n\r\n\r\n\r\n{intl l='changing password email for' in_string=1 use_default=1 locale=$locale} {ldelim}config key="urlsite"{rdelim} \r\n{ldelim}literal{rdelim}{literal}\r\n\r\n{/literal}{ldelim}/literal{rdelim}\r\n\r\n\r\n
    \r\n
    \r\n

    {ldelim}config key="store_name"{rdelim}

    \r\n

    {intl l='changing password email for' in_string=1 use_default=1 locale=$locale}

    \r\n
    {intl l='You have lost your password
    \r\nYour new password is' in_string=1 use_default=1 locale=$locale} {ldelim}$password{rdelim}.
    \r\n
    \r\n
    \r\n

    {intl l='You can now login at' in_string=1 use_default=1 locale=$locale} {ldelim}config key="urlsite"{rdelim}.
    {intl l='You have lost your password
    \r\nPlease, change this password after your first connection' in_string=1 use_default=1 locale=$locale}

    \r\n\r\n'){if ! $locale@last},{/if} + +{/foreach} +; + +UPDATE `config` SET `value`='2.0.0-RC1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='RC1' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.0-beta2.sql.tpl b/setup/update/tpl/2.0.0-beta2.sql.tpl new file mode 100644 index 00000000..a34ee4c2 --- /dev/null +++ b/setup/update/tpl/2.0.0-beta2.sql.tpl @@ -0,0 +1,362 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +# config table +ALTER TABLE `config` CHANGE `value` `value` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; + +# admin table +ALTER TABLE `admin` ADD UNIQUE index `login_UNIQUE`(`login`); + +# message table +ALTER TABLE `message` ADD `text_layout_file_name` VARCHAR( 255 ) AFTER `secured` ; +ALTER TABLE `message` ADD `text_template_file_name` VARCHAR( 255 ) AFTER `text_layout_file_name` ; +ALTER TABLE `message` ADD `html_layout_file_name` VARCHAR( 255 ) AFTER `text_template_file_name` ; +ALTER TABLE `message` ADD `html_template_file_name` VARCHAR( 255 ) AFTER `html_layout_file_name` ; + +# message_version table +ALTER TABLE `message_version` ADD `text_layout_file_name` VARCHAR( 255 ) AFTER `secured` ; +ALTER TABLE `message_version` ADD `text_template_file_name` VARCHAR( 255 ) AFTER `text_layout_file_name` ; +ALTER TABLE `message_version` ADD `html_layout_file_name` VARCHAR( 255 ) AFTER `text_template_file_name` ; +ALTER TABLE `message_version` ADD `html_template_file_name` VARCHAR( 255 ) AFTER `html_layout_file_name` ; + +# admin_log table +ALTER TABLE `admin_log` ADD `resource` VARCHAR( 255 ) AFTER `admin_lastname` ; +ALTER TABLE `admin_log` ADD `message` TEXT AFTER `action` ; +ALTER TABLE `admin_log` CHANGE `request` `request` LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci ; + +# category_i18n table +ALTER TABLE `category_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `category_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `category_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + +# product_i18n table +ALTER TABLE `product_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `product_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `product_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + +# folder_i18n table +ALTER TABLE `folder_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `folder_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `folder_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + +# content_i18n table +ALTER TABLE `content_i18n` ADD `meta_title` VARCHAR( 255 ) AFTER `postscriptum` ; +ALTER TABLE `content_i18n` ADD `meta_description` TEXT AFTER `meta_title` ; +ALTER TABLE `content_i18n` ADD `meta_keywords` TEXT AFTER `meta_description` ; + + +# config content + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('active-admin-template', 'default', 0, 0, NOW(), NOW()), +('active-pdf-template', 'default', 0, 0, NOW(), NOW()), +('active-mail-template', 'default', 0, 0, NOW(), NOW()), +('pdf_invoice_file', 'invoice', 0, 0, NOW(), NOW()), +('pdf_delivery_file', 'delivery', 0, 0, NOW(), NOW()) +; + +UPDATE `config` SET `name`='active-front-template' WHERE `name`='active-template'; +UPDATE `config` SET `name`='obsolete_rewriten_url_view', `value`='obsolete-rewritten-url' WHERE `name`='passed_url_view'; +UPDATE `config` SET `name`='store_name' WHERE `name`='company_name'; +UPDATE `config` SET `name`='store_email' WHERE `name`='company_email'; +UPDATE `config` SET `value`='2.0.0-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; + +INSERT INTO `module` (`code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +('Front', 1, 1, 2, 'Front\\Front', NOW(), NOW()); + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(LAST_INSERT_ID(), 'en_US', 'Front office integration', NULL, NULL, NULL), +(LAST_INSERT_ID(), 'fr_FR', 'Module Front office', NULL, NULL, NULL); + +TRUNCATE TABLE `area`; + +INSERT INTO `area` (`id`, `name`, `postage`, `created_at`, `updated_at`) VALUES +(1, 'France', NULL, NOW(), NOW()), +(2, 'A Zone', NULL, NOW(), NOW()), +(3, 'B Zone', NULL, NOW(), NOW()), +(4, 'C Zone', NULL, NOW(), NOW()), +(5, 'D Zone', NULL, NOW(), NOW()), +(6, 'France OM1', NULL, NOW(), NOW()), +(7, 'France OM2', NULL, NOW(), NOW()); + +TRUNCATE TABLE `area_delivery_module`; + +INSERT INTO `area_delivery_module` (`id`, `area_id`, `delivery_module_id`, `created_at`, `updated_at`) VALUES +(1, 1, 2, NOW(), NOW()), +(2, 2, 2, NOW(), NOW()), +(3, 3, 2, NOW(), NOW()), +(4, 4, 2, NOW(), NOW()), +(5, 5, 2, NOW(), NOW()), +(6, 6, 2, NOW(), NOW()); + +TRUNCATE TABLE `country`; + +INSERT INTO `country` (`id`, `area_id`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `created_at`, `updated_at`) VALUES +(1, 5, '4', 'AF', 'AFG', 0, 0, NOW(), NOW()), +(2, 4, '710', 'ZA', 'ZAF', 0, 0, NOW(), NOW()), +(3, 3, '8', 'AL', 'ALB', 0, 0, NOW(), NOW()), +(4, 3, '12', 'DZ', 'DZA', 0, 0, NOW(), NOW()), +(5, 2, '276', 'DE', 'DEU', 0, 0, NOW(), NOW()), +(6, 1, '20', 'AD', 'AND', 0, 0, NOW(), NOW()), +(7, 4, '24', 'AO', 'AGO', 0, 0, NOW(), NOW()), +(8, 5, '28', 'AG', 'ATG', 0, 0, NOW(), NOW()), +(9, 4, '682', 'SA', 'SAU', 0, 0, NOW(), NOW()), +(10, 5, '32', 'AR', 'ARG', 0, 0, NOW(), NOW()), +(11, 3, '51', 'AM', 'ARM', 0, 0, NOW(), NOW()), +(12, 5, '36', 'AU', 'AUS', 0, 0, NOW(), NOW()), +(13, 2, '40', 'AT', 'AUT', 0, 0, NOW(), NOW()), +(14, 3, '31', 'AZ', 'AZE', 0, 0, NOW(), NOW()), +(15, 5, '44', 'BS', 'BHS', 0, 0, NOW(), NOW()), +(16, 4, '48', 'BR', 'BHR', 0, 0, NOW(), NOW()), +(17, 5, '50', 'BD', 'BGD', 0, 0, NOW(), NOW()), +(18, 5, '52', 'BB', 'BRB', 0, 0, NOW(), NOW()), +(19, 3, '585', 'PW', 'PLW', 0, 0, NOW(), NOW()), +(20, 5, '56', 'BE', 'BEL', 0, 0, NOW(), NOW()), +(21, 5, '84', 'BL', 'BLZ', 0, 0, NOW(), NOW()), +(22, 4, '204', 'BJ', 'BEN', 0, 0, NOW(), NOW()), +(23, NULL, '64', 'BT', 'BTN', 0, 0, NOW(), NOW()), +(24, 3, '112', 'BY', 'BLR', 0, 0, NOW(), NOW()), +(25, 5, '104', 'MM', 'MMR', 0, 0, NOW(), NOW()), +(26, 5, '68', 'BO', 'BOL', 0, 0, NOW(), NOW()), +(27, 3, '70', 'BA', 'BIH', 0, 0, NOW(), NOW()), +(28, 4, '72', 'BW', 'BWA', 0, 0, NOW(), NOW()), +(29, 5, '76', 'BR', 'BRA', 0, 0, NOW(), NOW()), +(30, 5, '96', 'BN', 'BRN', 0, 0, NOW(), NOW()), +(31, 3, '100', 'BG', 'BGR', 0, 0, NOW(), NOW()), +(32, 5, '854', 'BF', 'BFA', 0, 0, NOW(), NOW()), +(33, 4, '108', 'BI', 'BDI', 0, 0, NOW(), NOW()), +(34, 5, '116', 'KH', 'KHM', 0, 0, NOW(), NOW()), +(35, 4, '120', 'CM', 'CMR', 0, 0, NOW(), NOW()), +(37, 4, '132', 'CV', 'CPV', 0, 0, NOW(), NOW()), +(38, 5, '152', 'CL', 'CHL', 0, 0, NOW(), NOW()), +(39, 5, '156', 'CN', 'CHN', 0, 0, NOW(), NOW()), +(40, 2, '196', 'CY', 'CYP', 0, 0, NOW(), NOW()), +(41, 5, '170', 'CO', 'COL', 0, 0, NOW(), NOW()), +(42, 4, '174', 'KM', 'COM', 0, 0, NOW(), NOW()), +(43, 4, '178', 'CG', 'COG', 0, 0, NOW(), NOW()), +(44, 5, '184', 'CK', 'COK', 0, 0, NOW(), NOW()), +(45, 5, '408', 'KP', 'PRK', 0, 0, NOW(), NOW()), +(46, 5, '410', 'KR', 'KOR', 0, 0, NOW(), NOW()), +(47, 5, '188', 'CR', 'CRI', 0, 0, NOW(), NOW()), +(48, 4, '384', 'CI', 'CIV', 0, 0, NOW(), NOW()), +(49, 2, '191', 'HR', 'HRV', 0, 0, NOW(), NOW()), +(50, 5, '192', 'CU', 'CUB', 0, 0, NOW(), NOW()), +(51, 2, '208', 'DK', 'DNK', 0, 0, NOW(), NOW()), +(52, 5, '262', 'DJ', 'DJI', 0, 0, NOW(), NOW()), +(53, 5, '212', 'DM', 'DMA', 0, 0, NOW(), NOW()), +(54, 4, '818', 'EG', 'EGY', 0, 0, NOW(), NOW()), +(55, 4, '784', 'AE', 'ARE', 0, 0, NOW(), NOW()), +(56, 5, '218', 'EC', 'ECU', 0, 0, NOW(), NOW()), +(57, 4, '232', 'ER', 'ERI', 0, 0, NOW(), NOW()), +(58, 2, '724', 'ES', 'ESP', 0, 0, NOW(), NOW()), +(59, 2, '233', 'EE', 'EST', 0, 0, NOW(), NOW()), +(61, 4, '231', 'ET', 'ETH', 0, 0, NOW(), NOW()), +(62, 5, '242', 'FJ', 'FJI', 0, 0, NOW(), NOW()), +(63, 2, '246', 'FI', 'FIN', 0, 0, NOW(), NOW()), +(64, 1, '250', 'FR', 'FRA', 1, 1, NOW(), NOW()), +(65, 4, '266', 'GA', 'GAB', 0, 0, NOW(), NOW()), +(66, 4, '270', 'GM', 'GMB', 0, 0, NOW(), NOW()), +(67, 3, '268', 'GE', 'GEO', 0, 0, NOW(), NOW()), +(68, 4, '288', 'GH', 'GHA', 0, 0, NOW(), NOW()), +(69, 2, '300', 'GR', 'GRC', 0, 0, NOW(), NOW()), +(70, 5, '308', 'GD', 'GRD', 0, 0, NOW(), NOW()), +(71, 5, '320', 'GT', 'GTM', 0, 0, NOW(), NOW()), +(72, 4, '324', 'GN', 'GIN', 0, 0, NOW(), NOW()), +(73, 4, '624', 'GW', 'GNB', 0, 0, NOW(), NOW()), +(74, 4, '226', 'GQ', 'GNQ', 0, 0, NOW(), NOW()), +(75, 5, '328', 'GY', 'GUY', 0, 0, NOW(), NOW()), +(76, 5, '332', 'HT', 'HTI', 0, 0, NOW(), NOW()), +(77, 5, '340', 'HN', 'HND', 0, 0, NOW(), NOW()), +(78, 2, '348', 'HU', 'HUN', 0, 0, NOW(), NOW()), +(79, 5, '356', 'IN', 'IND', 0, 0, NOW(), NOW()), +(80, 5, '360', 'ID', 'IDN', 0, 0, NOW(), NOW()), +(81, 4, '364', 'IR', 'IRN', 0, 0, NOW(), NOW()), +(82, 4, '368', 'IQ', 'IRQ', 0, 0, NOW(), NOW()), +(83, 2, '372', 'IE', 'IRL', 0, 0, NOW(), NOW()), +(84, 3, '352', 'IS', 'ISL', 0, 0, NOW(), NOW()), +(85, 4, '376', 'IL', 'ISR', 0, 0, NOW(), NOW()), +(86, 2, '380', 'IT', 'ITA', 0, 0, NOW(), NOW()), +(87, 5, '388', 'JM', 'JAM', 0, 0, NOW(), NOW()), +(88, 5, '392', 'JP', 'JPN', 0, 0, NOW(), NOW()), +(89, 4, '400', 'JO', 'JOR', 0, 0, NOW(), NOW()), +(90, 5, '398', 'KZ', 'KAZ', 0, 0, NOW(), NOW()), +(91, 4, '404', 'KE', 'KEN', 0, 0, NOW(), NOW()), +(92, 5, '417', 'KG', 'KGZ', 0, 0, NOW(), NOW()), +(93, 5, '296', 'KI', 'KIR', 0, 0, NOW(), NOW()), +(94, 4, '414', 'KW', 'KWT', 0, 0, NOW(), NOW()), +(95, 5, '418', 'LA', 'LAO', 0, 0, NOW(), NOW()), +(96, 4, '426', 'LS', 'LSO', 0, 0, NOW(), NOW()), +(97, 2, '428', 'LV', 'LVA', 0, 0, NOW(), NOW()), +(98, 4, '422', 'LB', 'LBN', 0, 0, NOW(), NOW()), +(99, 4, '430', 'LR', 'LBR', 0, 0, NOW(), NOW()), +(100, 4, '343', 'LY', 'LBY', 0, 0, NOW(), NOW()), +(101, 2, '438', 'LI', 'LIE', 0, 0, NOW(), NOW()), +(102, 2, '440', 'LT', 'LTU', 0, 0, NOW(), NOW()), +(103, 2, '442', 'LU', 'LUX', 0, 0, NOW(), NOW()), +(104, 3, '807', 'MK', 'MKD', 0, 0, NOW(), NOW()), +(105, 4, '450', 'MD', 'MDG', 0, 0, NOW(), NOW()), +(106, 5, '458', 'MY', 'MYS', 0, 0, NOW(), NOW()), +(107, 4, '454', 'MW', 'MWI', 0, 0, NOW(), NOW()), +(108, 5, '462', 'MV', 'MDV', 0, 0, NOW(), NOW()), +(109, 4, '466', 'ML', 'MLI', 0, 0, NOW(), NOW()), +(110, 2, '470', 'MT', 'MLT', 0, 0, NOW(), NOW()), +(111, 3, '504', 'MA', 'MAR', 0, 0, NOW(), NOW()), +(112, 5, '584', 'MH', 'MHL', 0, 0, NOW(), NOW()), +(113, 4, '480', 'MU', 'MUS', 0, 0, NOW(), NOW()), +(114, 4, '478', 'MR', 'MRT', 0, 0, NOW(), NOW()), +(115, 5, '484', 'MX', 'MEX', 0, 0, NOW(), NOW()), +(116, NULL, '583', 'FM', 'FSM', 0, 0, NOW(), NOW()), +(117, 3, '498', 'MD', 'MDA', 0, 0, NOW(), NOW()), +(118, 1, '492', 'MC', 'MCO', 0, 0, NOW(), NOW()), +(119, 5, '496', 'MN', 'MNG', 0, 0, NOW(), NOW()), +(120, 4, '508', 'MZ', 'MOZ', 0, 0, NOW(), NOW()), +(121, 4, '516', 'NA', 'NAM', 0, 0, NOW(), NOW()), +(122, 5, '520', 'NR', 'NRU', 0, 0, NOW(), NOW()), +(123, 5, '524', 'NP', 'NPL', 0, 0, NOW(), NOW()), +(124, 5, '558', 'NI', 'NIC', 0, 0, NOW(), NOW()), +(125, 4, '562', 'NE', 'NER', 0, 0, NOW(), NOW()), +(126, 4, '566', 'NG', 'NGA', 0, 0, NOW(), NOW()), +(127, NULL, '570', 'NU', 'NIU', 0, 0, NOW(), NOW()), +(128, 3, '578', 'NO', 'NOR', 0, 0, NOW(), NOW()), +(129, 5, '554', 'NZ', 'NZL', 0, 0, NOW(), NOW()), +(130, 4, '512', 'OM', 'OMN', 0, 0, NOW(), NOW()), +(131, 4, '800', 'UG', 'UGA', 0, 0, NOW(), NOW()), +(132, 5, '860', 'UZ', 'UZB', 0, 0, NOW(), NOW()), +(133, 5, '586', 'PK', 'PAK', 0, 0, NOW(), NOW()), +(134, 5, '591', 'PA', 'PAN', 0, 0, NOW(), NOW()), +(135, 5, '598', 'PG', 'PNG', 0, 0, NOW(), NOW()), +(136, 5, '600', 'PY', 'PRY', 0, 0, NOW(), NOW()), +(137, 2, '528', 'NL', 'NLD', 0, 0, NOW(), NOW()), +(138, 5, '604', 'PE', 'PER', 0, 0, NOW(), NOW()), +(139, 5, '608', 'PH', 'PHL', 0, 0, NOW(), NOW()), +(140, 2, '616', 'PL', 'POL', 0, 0, NOW(), NOW()), +(141, 2, '620', 'PT', 'PRT', 0, 0, NOW(), NOW()), +(142, 4, '634', 'QA', 'QAT', 0, 0, NOW(), NOW()), +(143, 4, '140', 'CF', 'CAF', 0, 0, NOW(), NOW()), +(144, 5, '214', 'DO', 'DOM', 0, 0, NOW(), NOW()), +(145, 2, '203', 'CZ', 'CZE', 0, 0, NOW(), NOW()), +(146, 2, '642', 'RO', 'ROU', 0, 0, NOW(), NOW()), +(147, 2, '826', 'GB', 'GBR', 0, 0, NOW(), NOW()), +(148, 3, '643', 'RU', 'RUS', 0, 0, NOW(), NOW()), +(149, 4, '646', 'RW', 'RWA', 0, 0, NOW(), NOW()), +(150, 5, '659', 'KN', 'KNA', 0, 0, NOW(), NOW()), +(151, 5, '662', 'LC', 'LCA', 0, 0, NOW(), NOW()), +(152, 2, '674', 'SM', 'SMR', 0, 0, NOW(), NOW()), +(153, 5, '670', 'VC', 'VCT', 0, 0, NOW(), NOW()), +(154, 5, '90', 'SB', 'SLB', 0, 0, NOW(), NOW()), +(155, NULL, '222', 'SV', 'SLV', 0, 0, NOW(), NOW()), +(156, 5, '882', 'WS', 'WSM', 0, 0, NOW(), NOW()), +(157, 4, '678', 'ST', 'STP', 0, 0, NOW(), NOW()), +(158, 4, '686', 'SN', 'SEN', 0, 0, NOW(), NOW()), +(159, 4, '690', 'SC', 'SYC', 0, 0, NOW(), NOW()), +(160, 4, '694', 'SL', 'SLE', 0, 0, NOW(), NOW()), +(161, 5, '702', 'SG', 'SGP', 0, 0, NOW(), NOW()), +(162, 2, '703', 'SK', 'SVK', 0, 0, NOW(), NOW()), +(163, 2, '705', 'SI', 'SVN', 0, 0, NOW(), NOW()), +(164, 4, '706', 'SO', 'SOM', 0, 0, NOW(), NOW()), +(165, 4, '729', 'SD', 'SDN', 0, 0, NOW(), NOW()), +(166, 5, '144', 'LK', 'LKA', 0, 0, NOW(), NOW()), +(167, 2, '752', 'SE', 'SWE', 0, 0, NOW(), NOW()), +(168, 2, '756', 'CH', 'CHE', 0, 0, NOW(), NOW()), +(169, 5, '740', 'SR', 'SUR', 0, 0, NOW(), NOW()), +(170, 4, '748', 'SZ', 'SWZ', 0, 0, NOW(), NOW()), +(171, 4, '760', 'SY', 'SYR', 0, 0, NOW(), NOW()), +(172, 5, '762', 'TJ', 'TJK', 0, 0, NOW(), NOW()), +(173, 5, '834', 'TZ', 'TZA', 0, 0, NOW(), NOW()), +(174, 4, '148', 'TD', 'TCD', 0, 0, NOW(), NOW()), +(175, 5, '764', 'TH', 'THA', 0, 0, NOW(), NOW()), +(176, 4, '768', 'TG', 'TGO', 0, 0, NOW(), NOW()), +(177, 5, '776', 'TO', 'TON', 0, 0, NOW(), NOW()), +(178, 5, '780', 'TT', 'TTO', 0, 0, NOW(), NOW()), +(179, 3, '788', 'TN', 'TUN', 0, 0, NOW(), NOW()), +(180, 5, '795', 'TM', 'TKM', 0, 0, NOW(), NOW()), +(181, 3, '792', 'TR', 'TUR', 0, 0, NOW(), NOW()), +(182, 5, '798', 'TV', 'TUV', 0, 0, NOW(), NOW()), +(183, 2, '804', 'UA', 'UKR', 0, 0, NOW(), NOW()), +(184, 5, '858', 'UY', 'URY', 0, 0, NOW(), NOW()), +(185, 2, '336', 'VA', 'VAT', 0, 0, NOW(), NOW()), +(186, 5, '548', 'VU', 'VUT', 0, 0, NOW(), NOW()), +(187, 5, '862', 'VE', 'VEN', 0, 0, NOW(), NOW()), +(188, 5, '704', 'VN', 'VNM', 0, 0, NOW(), NOW()), +(189, 4, '887', 'YE', 'YEM', 0, 0, NOW(), NOW()), +(191, 4, '180', 'CD', 'COD', 0, 0, NOW(), NOW()), +(192, 4, '894', 'ZM', 'ZMB', 0, 0, NOW(), NOW()), +(193, 4, '716', 'ZW', 'ZWE', 0, 0, NOW(), NOW()), +(196, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(197, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(198, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(199, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(200, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(201, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(202, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(203, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(204, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(205, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(206, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(207, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(208, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(209, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(210, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(211, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(212, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(213, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(214, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(215, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(216, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(217, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(218, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(219, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(220, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(221, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(222, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(223, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(224, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(225, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(226, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(227, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(228, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(229, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(230, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(231, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(232, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(233, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(234, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(235, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(236, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(237, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(238, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(239, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(240, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(241, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(242, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(243, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(244, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(245, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()), +(246, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(247, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(248, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(249, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(250, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(251, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(252, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(253, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(254, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(255, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(256, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(257, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(258, 4, '124', 'CA', 'CAN', 0, 0, NOW(), NOW()), +(259, 6, '312', 'GP', 'GLP', 0, 0, NOW(), NOW()), +(260, 6, '254', 'GF', 'GUF', 0, 0, NOW(), NOW()), +(261, 6, '474', 'MQ', 'MTQ', 0, 0, NOW(), NOW()), +(262, 6, '175', 'YT', 'MYT', 0, 0, NOW(), NOW()), +(263, 6, '638', 'RE', 'REU', 0, 0, NOW(), NOW()), +(264, 6, '666', 'PM', 'SPM', 0, 0, NOW(), NOW()), +(265, 7, '540', 'NC', 'NCL', 0, 0, NOW(), NOW()), +(266, 7, '258', 'PF', 'PYF', 0, 0, NOW(), NOW()), +(267, 7, '876', 'WF', 'WLF', 0, 0, NOW(), NOW()), +(268, 4, '840', 'US', 'USA', 0, 0, NOW(), NOW()); + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.0.0-beta3.sql.tpl b/setup/update/tpl/2.0.0-beta3.sql.tpl new file mode 100644 index 00000000..c829165f --- /dev/null +++ b/setup/update/tpl/2.0.0-beta3.sql.tpl @@ -0,0 +1,53 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +# order table +ALTER TABLE `order` ADD `discount` FLOAT AFTER `invoice_ref` ; + +# coupon table +ALTER TABLE `coupon` DROP INDEX `idx_amount`; +ALTER TABLE `coupon` DROP `amount`; +ALTER TABLE `coupon` ADD `serialized_effects` TEXT AFTER `type` ; + +ALTER TABLE `coupon_version` DROP `amount`; +ALTER TABLE `coupon_version` ADD `serialized_effects` TEXT AFTER `type` ; + +DROP TABLE IF EXISTS `coupon_order`; + +# cart_item table +ALTER TABLE `cart_item` DROP `discount`; + +DROP TABLE IF EXISTS `order_coupon`; + +CREATE TABLE `order_coupon` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_id` INTEGER NOT NULL, + `code` VARCHAR(45) NOT NULL, + `type` VARCHAR(255) NOT NULL, + `amount` FLOAT NOT NULL, + `title` VARCHAR(255) NOT NULL, + `short_description` TEXT NOT NULL, + `description` LONGTEXT NOT NULL, + `expiration_date` DATETIME NOT NULL, + `is_cumulative` TINYINT(1) NOT NULL, + `is_removing_postage` TINYINT(1) NOT NULL, + `is_available_on_special_offers` TINYINT(1) NOT NULL, + `serialized_conditions` TEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_order_coupon_order_id` (`order_id`), + CONSTRAINT `fk_order_coupon_order_id` + FOREIGN KEY (`order_id`) + REFERENCES `order` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +UPDATE `config` SET `value`='2.0.0-beta3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta3' WHERE `name`='thelia_extra_version'; + +# This restores the fkey checks, after having unset them earlier +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.0.0-beta4.sql.tpl b/setup/update/tpl/2.0.0-beta4.sql.tpl new file mode 100644 index 00000000..662f344b --- /dev/null +++ b/setup/update/tpl/2.0.0-beta4.sql.tpl @@ -0,0 +1,26 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +INSERT INTO `module` (`code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +( 'Tinymce', 1, 0, 1, 'Tinymce\\Tinymce', NOW(), NOW()); + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(LAST_INSERT_ID(), '{$locale}', {intl l='tinymce wysiwyg editor' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +UPDATE `config` SET `value`='2.0.0-beta4' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta4' WHERE `name`='thelia_extra_version'; + +-- Preferred locale for admin users +ALTER TABLE `admin` ADD `locale` VARCHAR(45) NOT NULL AFTER `password`; +UPDATE `admin` SET `locale`='en_US'; + +-- Unknown flag image path +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('unknown-flag-path','assets/img/flags/unknown.png', 1, 1, NOW(), NOW()); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.0.sql.tpl b/setup/update/tpl/2.0.0.sql.tpl new file mode 100644 index 00000000..f325a743 --- /dev/null +++ b/setup/update/tpl/2.0.0.sql.tpl @@ -0,0 +1,60 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `country` ADD INDEX `idx_country_by_default` (`by_default`); +ALTER TABLE `currency` ADD INDEX `idx_currency_by_default` (`by_default`); +ALTER TABLE `lang` ADD INDEX `idx_lang_by_default` (`by_default`); + +ALTER TABLE `tax_rule_country` ADD INDEX `idx_tax_rule_country_tax_rule_id_country_id_position` (`tax_rule_id`, `country_id`, `position`); + +ALTER TABLE `product_sale_elements` ADD INDEX `idx_product_elements_product_id_promo_is_default` (`product_id`, `promo`, `is_default`); + +ALTER TABLE `product_image` ADD INDEX `idx_product_image_product_id_position` (`product_id`, `position`); +ALTER TABLE `category_image` ADD INDEX `idx_category_image_category_id_position` (`category_id`, `position`); +ALTER TABLE `content_image` ADD INDEX `idx_content_image_content_id_position` (`content_id`, `position`); +ALTER TABLE `folder_image` ADD INDEX `idx_folder_image_folder_id_position` (`folder_id`, `position`); +ALTER TABLE `module_image` ADD INDEX `idx_module_image_module_id_position` (`module_id`, `position`); + +ALTER TABLE `rewriting_url` ADD INDEX `idx_rewriting_url_view_updated_at` (`view`, `updated_at`); +ALTER TABLE `rewriting_url` ADD INDEX `idx_rewriting_url_view_id_view_view_locale_updated_at` (`view_id`, `view`, `view_locale`, `updated_at`); +ALTER TABLE `rewriting_url` DROP INDEX `idx_view_id`; + +ALTER TABLE `feature_product` ADD INDEX `idx_feature_product_product_id_feature_id_position` (`product_id`, `feature_id`, `position`); +ALTER TABLE `feature_template` ADD INDEX `idx_feature_template_template_id_position` (`template_id`, `position`); + +ALTER TABLE `currency` ADD INDEX `idx_currency_code` (`code`); + +ALTER TABLE `customer` CHANGE `ref` `ref` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ; + +ALTER TABLE `order` CHANGE `ref` `ref` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ; + +SELECT @max := MAX(`id`) FROM `resource`; +SET @max := @max+1; + +INSERT INTO `resource` (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max, 'admin.cache', NOW(), NOW()); + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} +(@max, '{$locale}', {intl l='Configuration / Cache' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +SET @max := @max+1; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max, 'admin.home', NOW(), NOW()); + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} +(@max, '{$locale}', {intl l='Back-office home page' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.1.sql.tpl b/setup/update/tpl/2.0.1.sql.tpl new file mode 100644 index 00000000..8a51ada6 --- /dev/null +++ b/setup/update/tpl/2.0.1.sql.tpl @@ -0,0 +1,62 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('front_cart_country_cookie_name','fcccn', 1, 1, NOW(), NOW()); +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('front_cart_country_cookie_expires','2592000', 1, 1, NOW(), NOW()); +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('sitemap_ttl','7200', 1, 1, NOW(), NOW()); +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('feed_ttl','7200', 1, 1, NOW(), NOW()); + +ALTER TABLE `module` ADD INDEX `idx_module_activate` (`activate`); + +SELECT @max := MAX(`id`) FROM `resource`; +SET @max := @max+1; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max, 'admin.configuration.store', NOW(), NOW()), +(@max+1, 'admin.configuration.variable', NOW(), NOW()), +(@max+2, 'admin.configuration.admin-logs', NOW(), NOW()), +(@max+3, 'admin.configuration.system-logs', NOW(), NOW()), +(@max+4, 'admin.configuration.advanced', NOW(), NOW()), +(@max+5, 'admin.configuration.translations', NOW(), NOW()), +(@max+6, 'admin.tools', NOW(), NOW()), +(@max+7, 'admin.export', NOW(), NOW()), +(@max+8, 'admin.export.customer.newsletter', NOW(), NOW()) +; + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} +(@max, '{$locale}', {intl l='Store information configuration' locale=$locale}), +(@max+1, '{$locale}', {intl l='Configuration variables' locale=$locale}), +(@max+2, '{$locale}', {intl l='View administration logs' locale=$locale}), +(@max+3, '{$locale}', {intl l='Logging system configuration' locale=$locale}), +(@max+4, '{$locale}', {intl l='Advanced configuration' locale=$locale}), +(@max+5, '{$locale}', {intl l='Translations' locale=$locale}), +(@max+6, '{$locale}', {intl l='Tools panel' locale=$locale}), +(@max+7, '{$locale}', {intl l='Back-office export management' locale=$locale}), +(@max+8, '{$locale}', {intl l='export of newsletter subscribers' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +SELECT @max := MAX(`id`) FROM `lang`; +SET @max := @max+1; + +INSERT INTO `lang`(`id`,`title`,`code`,`locale`,`url`,`date_format`,`time_format`,`datetime_format`,`decimal_separator`,`thousands_separator`,`decimals`,`by_default`,`created_at`,`updated_at`)VALUES +(@max, 'Russian', 'ru', 'ru_RU', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', 0, NOW(), NOW()); + +SET @max := @max+1; + +INSERT INTO `lang`(`id`,`title`,`code`,`locale`,`url`,`date_format`,`time_format`,`datetime_format`,`decimal_separator`,`thousands_separator`,`decimals`,`by_default`,`created_at`,`updated_at`)VALUES +(@max, 'Czech', 'cs', 'cs_CZ', '', 'j.n.Y', 'H:i:s', 'j.n.Y H:i:s', ',', ' ', '2', 0, NOW(), NOW()); + + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.0.10.sql.tpl b/setup/update/tpl/2.0.10.sql.tpl new file mode 100644 index 00000000..5c8987e6 --- /dev/null +++ b/setup/update/tpl/2.0.10.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.10' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='10' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.11.sql.tpl b/setup/update/tpl/2.0.11.sql.tpl new file mode 100644 index 00000000..53280953 --- /dev/null +++ b/setup/update/tpl/2.0.11.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.11' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='11' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.12.sql.tpl b/setup/update/tpl/2.0.12.sql.tpl new file mode 100644 index 00000000..9eca9da2 --- /dev/null +++ b/setup/update/tpl/2.0.12.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.12' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='12' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.2.sql.tpl b/setup/update/tpl/2.0.2.sql.tpl new file mode 100644 index 00000000..e5616d8f --- /dev/null +++ b/setup/update/tpl/2.0.2.sql.tpl @@ -0,0 +1,129 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +# Remove useless rewriting_url indexes +ALTER TABLE `rewriting_url` DROP INDEX `idx_rewriting_url_view_updated_at`; +ALTER TABLE `rewriting_url` DROP INDEX `idx_rewriting_url_view_id_view_view_locale_updated_at`; + +# Add coupon country/modules crossref tables +# ------------------------------------------ + +DROP TABLE IF EXISTS `coupon_country`; + +CREATE TABLE `coupon_country` +( + `coupon_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`country_id`), + INDEX `fk_country_id_idx` (`country_id`), + CONSTRAINT `fk_coupon_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_country_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +DROP TABLE IF EXISTS `coupon_module`; + +CREATE TABLE `coupon_module` +( + `coupon_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`module_id`), + INDEX `fk_module_id_idx` (`module_id`), + CONSTRAINT `fk_coupon_module_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_module_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +DROP TABLE IF EXISTS `order_coupon_country`; + +CREATE TABLE `order_coupon_country` +( + `coupon_id` INTEGER NOT NULL, + `country_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`country_id`), + INDEX `fk_country_id_idx` (`country_id`), + CONSTRAINT `fk_order_coupon_country_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_order_coupon_country_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `order_coupon` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +DROP TABLE IF EXISTS `order_coupon_module`; + +CREATE TABLE `order_coupon_module` +( + `coupon_id` INTEGER NOT NULL, + `module_id` INTEGER NOT NULL, + PRIMARY KEY (`coupon_id`,`module_id`), + INDEX `fk_module_id_idx` (`module_id`), + CONSTRAINT `fk_coupon_module_coupon_id0` + FOREIGN KEY (`coupon_id`) + REFERENCES `order_coupon` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_module_module_id0` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +# Per customer usage count +# ------------------------ + +# Add new column to coupon tables (coupon, order_coupon, coupon_version) + +ALTER TABLE `coupon` ADD `per_customer_usage_count` BOOLEAN NOT NULL DEFAULT FALSE AFTER `serialized_conditions`; +ALTER TABLE `order_coupon` ADD `per_customer_usage_count` BOOLEAN NOT NULL DEFAULT FALSE AFTER `serialized_conditions`; +ALTER TABLE `coupon_version` ADD `per_customer_usage_count` BOOLEAN NOT NULL DEFAULT FALSE AFTER `serialized_conditions`; + +DROP TABLE IF EXISTS `coupon_customer_count`; + +CREATE TABLE `coupon_customer_count` +( + `coupon_id` INTEGER NOT NULL, + `customer_id` INTEGER NOT NULL, + `count` INTEGER DEFAULT 0 NOT NULL, + INDEX `fk_coupon_customer_customer_id_idx` (`customer_id`), + INDEX `fk_coupon_customer_coupon_id_idx` (`coupon_id`), + CONSTRAINT `fk_coupon_customer_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_coupon_customer_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +SELECT @max := MAX(`id`) FROM `country`; +SET @max := @max+1; + +INSERT INTO `country` (`id`, `area_id`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `created_at`, `updated_at`) VALUES +(@max, 5, '344', 'HK', 'HKG', 0, 0, NOW(), NOW()); + +INSERT INTO `country_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max, '{$locale}', {intl l='Hong Kong' locale=$locale}, '', '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.0.3-beta.sql.tpl b/setup/update/tpl/2.0.3-beta.sql.tpl new file mode 100644 index 00000000..1ee223b6 --- /dev/null +++ b/setup/update/tpl/2.0.3-beta.sql.tpl @@ -0,0 +1,590 @@ +# This is a fix for InnoDB in MySQL >= 4.1.x +# It "suspends judgement" for fkey relationships until are tables are set. +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.3-beta' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta' WHERE `name`='thelia_extra_version'; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('store_description', '', 0, 0, NOW(), NOW()); + +# default available stock + +SELECT @max := MAX(`id`) FROM `config`; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('default_available_stock', '100', 0, 0, NOW(), NOW()), +('information_folder_id', '', 0, 0, NOW(), NOW()), +('terms_conditions_content_id', '', 0, 0, NOW(), NOW()); + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max + 1, '{$locale}', {intl l='Default available stock when check-available-stock is set to 0.' locale=$locale}, NULL, NULL, NULL), +(@max + 2, '{$locale}', {intl l='The ID of the folder containing your information pages : terms, imprint, ...' locale=$locale}, NULL, NULL, NULL), +(@max + 3, '{$locale}', {intl l='The ID of the \'Terms & Conditions\' content.' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +# Add new column to order (version, version_created_at, version_created_by) + +ALTER TABLE `order` ADD `version` INT DEFAULT 0 AFTER `updated_at`; +ALTER TABLE `order` ADD `version_created_at` DATE AFTER `version`; +ALTER TABLE `order` ADD `version_created_by` VARCHAR(100) AFTER `version_created_at`; + +ALTER TABLE `order_address` + ADD CONSTRAINT `fk_order_address_customer_title_id` + FOREIGN KEY (`customer_title_id`) + REFERENCES `customer_title` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +; +ALTER TABLE `order_address` + ADD CONSTRAINT `fk_order_address_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +; + +DROP TABLE IF EXISTS `order_version`; + +CREATE TABLE `order_version` +( + `id` INTEGER NOT NULL, + `ref` VARCHAR(45), + `customer_id` INTEGER NOT NULL, + `invoice_order_address_id` INTEGER NOT NULL, + `delivery_order_address_id` INTEGER NOT NULL, + `invoice_date` DATE, + `currency_id` INTEGER NOT NULL, + `currency_rate` FLOAT NOT NULL, + `transaction_ref` VARCHAR(100) COMMENT 'transaction reference - usually use to identify a transaction with banking modules', + `delivery_ref` VARCHAR(100) COMMENT 'delivery reference - usually use to identify a delivery progress on a distant delivery tracker website', + `invoice_ref` VARCHAR(100) COMMENT 'the invoice reference', + `discount` FLOAT, + `postage` FLOAT NOT NULL, + `payment_module_id` INTEGER NOT NULL, + `delivery_module_id` INTEGER NOT NULL, + `status_id` INTEGER NOT NULL, + `lang_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + PRIMARY KEY (`id`,`version`), + CONSTRAINT `order_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `order` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; +UPDATE `order` SET + `version` = 1, + `version_created_at` = NOW(), + `version_created_by` = 'Thelia' +WHERE `version` = 0; + +INSERT INTO `order_version`( + `id`, + `ref`, + `customer_id`, + `invoice_order_address_id`, + `delivery_order_address_id`, + `invoice_date`, + `currency_id`, + `currency_rate`, + `transaction_ref`, + `delivery_ref`, + `invoice_ref`, + `discount`, + `postage`, + `payment_module_id`, + `delivery_module_id`, + `status_id`, + `lang_id`, + `created_at`, + `updated_at`, + `version`, + `version_created_at`, + `version_created_by`) + SELECT + `id`, + `ref`, + `customer_id`, + `invoice_order_address_id`, + `delivery_order_address_id`, + `invoice_date`, + `currency_id`, + `currency_rate`, + `transaction_ref`, + `delivery_ref`, + `invoice_ref`, + `discount`, + `postage`, + `payment_module_id`, + `delivery_module_id`, + `status_id`, + `lang_id`, + `created_at`, + `updated_at`, + `version`, + `version_created_at`, + `version_created_by` + FROM `order`; + + +# Add missing columns to coupon (version_created_at, version_created_by) +ALTER TABLE `coupon` ADD `version_created_at` DATE AFTER `version`; +ALTER TABLE `coupon` ADD `version_created_by` VARCHAR(100) AFTER `version_created_at`; + +ALTER TABLE `coupon_version` ADD `version_created_at` DATE AFTER `version`; +ALTER TABLE `coupon_version` ADD `version_created_by` VARCHAR(100) AFTER `version_created_at`; + +# Add coupon_customer_count table +# ------------------------------- + +ALTER TABLE `coupon_customer_count` + DROP FOREIGN KEY `fk_coupon_customer_customer_id`; + +ALTER TABLE `coupon_customer_count` + DROP FOREIGN KEY `fk_coupon_customer_coupon_id`; + +ALTER TABLE `coupon_customer_count` + ADD CONSTRAINT `fk_coupon_customer_customer_id` + FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE; + +ALTER TABLE `coupon_customer_count` + ADD CONSTRAINT `fk_coupon_customer_coupon_id` + FOREIGN KEY (`coupon_id`) + REFERENCES `coupon` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE; + +# --------------------------------------------------------------------- +# Add Brand tables and related resources +# --------------------------------------------------------------------- + +# Add the "brand" resource +INSERT INTO resource (`code`, `created_at`, `updated_at`) VALUES ('admin.brand', NOW(), NOW()); + +-- --------------------------------------------------------------------- +-- brand +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand`; + +CREATE TABLE `brand` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT, + `position` INTEGER, + `logo_image_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `fk_brand_brand_image_idx` (`logo_image_id`), + CONSTRAINT `fk_logo_image_id_brand_image` + FOREIGN KEY (`logo_image_id`) + REFERENCES `brand_image` (`id`) + ON UPDATE RESTRICT + ON DELETE SET NULL +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_document`; + +CREATE TABLE `brand_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `brand_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_brand_document_brand_id` (`brand_id`), + CONSTRAINT `fk_brand_document_brand_id` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_image`; + +CREATE TABLE `brand_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `brand_id` INTEGER NOT NULL, + `file` VARCHAR(255) NOT NULL, + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_brand_image_brand_id` (`brand_id`), + CONSTRAINT `fk_brand_image_brand_id` + FOREIGN KEY (`brand_id`) + REFERENCES `brand` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_i18n`; + +CREATE TABLE `brand_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_document_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_document_i18n`; + +CREATE TABLE `brand_document_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_document_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand_document` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- brand_image_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `brand_image_i18n`; + +CREATE TABLE `brand_image_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `brand_image_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `brand_image` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------- +-- Add brand field to product table, and related constraint. +-- --------------------------------------------------------- + +ALTER TABLE `product` ADD `brand_id` INTEGER AFTER `template_id`; +ALTER TABLE `product` ADD CONSTRAINT `fk_product_brand` FOREIGN KEY (`brand_id`) REFERENCES `brand` (`id`) ON DELETE SET NULL; + +ALTER TABLE `product_version` ADD `brand_id` INTEGER AFTER `template_id`; +ALTER TABLE `product_version` ADD CONSTRAINT `fk_product_version_brand` FOREIGN KEY (`brand_id`) REFERENCES `brand` (`id`) ON DELETE SET NULL; + + +# Add html_output_trim_level config variable +# ------------------------------------------ + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES + ('html_output_trim_level','1', 0, 0, NOW(), NOW()); + +SELECT @max := MAX(`id`) FROM `config`; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@max, 'en_US', 'Whitespace trim level of the generated HTML code (0 = none, 1 = medium, 2 = maximum)', NULL, NULL, NULL); + +-- --------------------------------------------------------------------- +-- form_firewall +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `form_firewall`; + +CREATE TABLE `form_firewall` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `form_name` VARCHAR(255) NOT NULL, + `ip_address` VARCHAR(15) NOT NULL, + `attempts` TINYINT DEFAULT 1, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_form_firewall_form_name` (`form_name`), + INDEX `idx_form_firewall_ip_address` (`ip_address`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- import_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_category`; + +CREATE TABLE `import_category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export_category +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_category`; + +CREATE TABLE `export_category` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `position` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`) +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- import +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import`; + +CREATE TABLE `import` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `import_category_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `handle_class` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_import_import_category_id` (`import_category_id`), + CONSTRAINT `fk_import_import_category_id` + FOREIGN KEY (`import_category_id`) + REFERENCES `import_category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export`; + +CREATE TABLE `export` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `ref` VARCHAR(255) NOT NULL, + `export_category_id` INTEGER NOT NULL, + `position` INTEGER NOT NULL, + `handle_class` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `ref_UNIQUE` (`ref`), + INDEX `idx_export_export_category_id` (`export_category_id`), + CONSTRAINT `fk_export_export_category_id` + FOREIGN KEY (`export_category_id`) + REFERENCES `export_category` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB; + + + +-- --------------------------------------------------------------------- +-- import_category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_category_i18n`; + +CREATE TABLE `import_category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `import_category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `import_category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export_category_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_category_i18n`; + +CREATE TABLE `export_category_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `export_category_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `export_category` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- import_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `import_i18n`; + +CREATE TABLE `import_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `import_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `import` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + +-- --------------------------------------------------------------------- +-- export_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `export_i18n`; + +CREATE TABLE `export_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255) NOT NULL, + `description` LONGTEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `export_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `export` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB; + + + +INSERT INTO `config`(`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('form_firewall_bruteforce_time_to_wait', '10', 0, 0, NOW(), NOW()), +('form_firewall_time_to_wait', '60', 0, 0, NOW(), NOW()), +('form_firewall_bruteforce_attempts', '10', 0, 0, NOW(), NOW()), +('form_firewall_attempts', '6', 0, 0, NOW(), NOW()), +('form_firewall_active', '1', 0, 0, NOW(), NOW()) +; + +SELECT @bf_time := `id` FROM `config` WHERE `name` = 'form_firewall_bruteforce_time_to_wait'; +SELECT @time := `id` FROM `config` WHERE `name` = 'form_firewall_time_to_wait'; +SELECT @bf_attempts := `id` FROM `config` WHERE `name` = 'form_firewall_bruteforce_attempts'; +SELECT @attempts := `id` FROM `config` WHERE `name` = 'form_firewall_attempts'; +SELECT @active := `id` FROM `config` WHERE `name` = 'form_firewall_active'; + + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@time, 'en_US', '[Firewall] Time to wait between X attempts', NULL, NULL, NULL), + (@time, 'fr_FR', '[Pare-feu] Temps à attendre entre X essais', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@bf_time, 'en_US', '[Firewall/Bruteforce] Time to wait between X attempts', NULL, NULL, NULL), + (@bf_time, 'fr_FR', '[Pare-feu/Bruteforce] Temps à attendre entre X essais', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@attempts, 'en_US', '[Firewall] Number of allowed attemps', NULL, NULL, NULL), + (@attempts, 'fr_FR', '[Pare-feu] Nombre de tentatives autorisées', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@bf_attempts, 'en_US', '[Firewall/Bruteforce] Number of allowed attemps', NULL, NULL, NULL), + (@bf_attempts, 'fr_FR', '[Pare-feu/Bruteforce] Nombre de tentatives autorisées', NULL, NULL, NULL) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES + (@active, 'en_US', '[Firewall] Activate the firewall', NULL, NULL, NULL), + (@active, 'fr_FR', '[Pare-feu] Activer le pare-feu', NULL, NULL, NULL) +; + + +-- --------------------------------------------------------------------- +-- missing config_i18n translation for standards variables. +-- --------------------------------------------------------------------- +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +(1, 'fr_FR', 'Nom de la classe du gestionnaire de session', NULL, NULL, NULL), +(2, 'fr_FR', 'Vérifier la présence de produits en stock (1) ou l''ignorer (0) lors de l''affichage et la modification des quantités commandées', NULL, NULL, NULL), +(3, 'fr_FR', 'Nom du modèle de front-office actif', NULL, NULL, NULL), +(4, 'fr_FR', 'Nom du modèle de back-office actif', NULL, NULL, NULL), +(5, 'fr_FR', 'Nom du modèle PDF actif', NULL, NULL, NULL), +(6, 'fr_FR', 'Nom du modèle d''e-mail actif', NULL, NULL, NULL), +(7, 'fr_FR', 'Activer (1) ou désactiver (0) la réécriture d''URL', NULL, NULL, NULL), +(8, 'fr_FR', 'Nom du pilote graphique utilisé par la bibliothèque Imagine (voir https://imagine.readthedocs.org)', NULL, NULL, NULL), +(9, 'fr_FR', 'La qualité par défaut (en %) dans les images générées', NULL, NULL, NULL), +(10, 'fr_FR', 'Comment les images originales (pleine résolution) sont-elles fournises dans l''espace web (lien symbolique ou copie)', NULL, NULL, NULL), +(11, 'fr_FR', 'Comment les documents sont-ils fournis dans l''espace web (lien symbolique ou copie)', NULL, NULL, NULL), +(12, 'fr_FR', 'Chemin vers le répertoire où les images sont stockées', NULL, NULL, NULL), +(13, 'fr_FR', 'Chemin vers le répertoire où sont stockés les documents', NULL, NULL, NULL), +(14, 'fr_FR', 'Chemin vers le répertoire de cache d''image dans l''espace web', NULL, NULL, NULL), +(15, 'fr_FR', 'Chemin d''accès au répertoire de cache de document dans l''espace web', NULL, NULL, NULL), +(16, 'fr_FR', 'L''URL pour mettre à jour les taux de change', NULL, NULL, NULL), +(17, 'fr_FR', 'Nom de la page 404 (introuvable) dans le modèle actuel (avec l''extension, par exemple, 404.html)', NULL, NULL, NULL), +(18, 'fr_FR', 'Nom de la page du modèle retournée lorsqu''une URL obsolète (ou inactive) est invoquée', NULL, NULL, NULL), +(19, 'fr_FR', 'Affiche et traite les prix avec(0) ou sans (1) les taxes', NULL, NULL, NULL), +(20, 'fr_FR', 'Compiler les resources du modèle actif à chaque changement (1 = oui, 2 = non)', NULL, NULL, NULL), +(21, 'fr_FR', 'Nom du cookie "Remember me" pour les utilisateurs d''administration', NULL, NULL, NULL), +(22, 'fr_FR', 'Délai d''expiration du cookie "Remember me", en secondes, pour les utilisateurs d''administration', NULL, NULL, NULL), +(23, 'fr_FR', 'Nom du cookie "Remember me" pour les clients', NULL, NULL, NULL), +(24, 'fr_FR', 'Délai d''expiration du cookie "Remember me", en secondes, pour les clients', NULL, NULL, NULL), +(25, 'fr_FR', 'URL de base pour la boutique (par exemple http://www.yourshopdomain.com)', NULL, NULL, NULL), +(26, 'fr_FR', 'Nom de la vue de la facture dans le modèle PDF en cours (sans extension)', NULL, NULL, NULL), +(27, 'fr_FR', 'Nom de la vue de la livraison dans le modèle PDF en cours (sans extension)', NULL, NULL, NULL), +(28, 'fr_FR', 'Le chemin (par rapport au modèle de back-office par défaut) vers l''image utilisée lorsque aucune image de drapeau ne peut être trouvée pour un pays', NULL, NULL, NULL), +(29, 'fr_FR', 'Niveau de découpe des espaces dans le code HTML généré (0 = aucun, 1 = moyen, 2 = maximum)', NULL, NULL, NULL); + +# Done ! +# ------ +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.3-beta2.sql.tpl b/setup/update/tpl/2.0.3-beta2.sql.tpl new file mode 100644 index 00000000..7075cca6 --- /dev/null +++ b/setup/update/tpl/2.0.3-beta2.sql.tpl @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.3-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `export` ADD INDEX `fk_export_1_idx` (`export_category_id`); +ALTER TABLE `import` ADD INDEX `fk_import_1_idx` (`import_category_id`); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.3.sql.tpl b/setup/update/tpl/2.0.3.sql.tpl new file mode 100644 index 00000000..1a472692 --- /dev/null +++ b/setup/update/tpl/2.0.3.sql.tpl @@ -0,0 +1,6 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.4.sql.tpl b/setup/update/tpl/2.0.4.sql.tpl new file mode 100644 index 00000000..6750510e --- /dev/null +++ b/setup/update/tpl/2.0.4.sql.tpl @@ -0,0 +1,42 @@ +SET FOREIGN_KEY_CHECKS = 0; + +# ====================================================================================================================== +# Add relation between order and cart +# ====================================================================================================================== +ALTER TABLE `order` + ADD COLUMN `cart_id` INTEGER NOT NULL + AFTER `lang_id` +; + +ALTER TABLE `order_version` + ADD COLUMN `cart_id` INTEGER NOT NULL + AFTER `lang_id` +; + +ALTER TABLE `order` + ADD CONSTRAINT `fk_order_cart_id` + FOREIGN KEY (`cart_id`) REFERENCES `cart`(`id`) +; + +ALTER TABLE `order` + ADD INDEX idx_order_cart_fk + (`cart_id`) +; + +# ====================================================================================================================== +# Add product_sale_elements_id IN order_product +# ====================================================================================================================== + +ALTER TABLE `order_product` + ADD `product_sale_elements_id` INT NOT NULL + AFTER `product_sale_elements_ref`; + +UPDATE `config` SET `value`='2.0.4' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='4' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +# ====================================================================================================================== +# End of changes +# ====================================================================================================================== + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.0.5.sql.tpl b/setup/update/tpl/2.0.5.sql.tpl new file mode 100644 index 00000000..e141d71a --- /dev/null +++ b/setup/update/tpl/2.0.5.sql.tpl @@ -0,0 +1,24 @@ +SET FOREIGN_KEY_CHECKS = 0; + +ALTER TABLE `order` DROP FOREIGN KEY `fk_order_cart_id`; + +UPDATE `config` SET `value`='2.0.5' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='5' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +UPDATE `config` SET `name`='form_firewall_active' WHERE `name`='from_firewall_active'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `resource`; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'admin.search', NOW(), NOW()); + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Search' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.6.sql.tpl b/setup/update/tpl/2.0.6.sql.tpl new file mode 100644 index 00000000..9d3fd810 --- /dev/null +++ b/setup/update/tpl/2.0.6.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.6' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='6' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.7.sql.tpl b/setup/update/tpl/2.0.7.sql.tpl new file mode 100644 index 00000000..0183cd7b --- /dev/null +++ b/setup/update/tpl/2.0.7.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.7' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='7' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.8.sql.tpl b/setup/update/tpl/2.0.8.sql.tpl new file mode 100644 index 00000000..da7594b2 --- /dev/null +++ b/setup/update/tpl/2.0.8.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.8' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='8' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.0.9.sql.tpl b/setup/update/tpl/2.0.9.sql.tpl new file mode 100644 index 00000000..6e91adf2 --- /dev/null +++ b/setup/update/tpl/2.0.9.sql.tpl @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.0.9' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='9' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.0-alpha1.sql.tpl b/setup/update/tpl/2.1.0-alpha1.sql.tpl new file mode 100644 index 00000000..6782ec49 --- /dev/null +++ b/setup/update/tpl/2.1.0-alpha1.sql.tpl @@ -0,0 +1,1616 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0-alpha1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha1' WHERE `name`='thelia_extra_version'; + + +# ====================================================================================================================== +# Add sale related tables +# ====================================================================================================================== + +-- --------------------------------------------------------------------- +-- sale +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale`; + +CREATE TABLE `sale` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `active` TINYINT(1) DEFAULT 0 NOT NULL, + `display_initial_price` TINYINT(1) DEFAULT 1 NOT NULL, + `start_date` DATETIME, + `end_date` DATETIME, + `price_offset_type` TINYINT, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_sales_active_start_end_date` (`active`, `start_date`, `end_date`), + INDEX `idx_sales_active` (`active`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_i18n`; + +CREATE TABLE `sale_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + `postscriptum` TEXT, + `sale_label` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `sale_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `sale` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_offset_currency +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_offset_currency`; + +CREATE TABLE `sale_offset_currency` +( + `sale_id` INTEGER NOT NULL, + `currency_id` INTEGER NOT NULL, + `price_offset_value` FLOAT DEFAULT 0, + PRIMARY KEY (`sale_id`,`currency_id`), + INDEX `fk_sale_offset_currency_currency1_idx` (`currency_id`), + CONSTRAINT `fk_sale_offset_currency_sales_id` + FOREIGN KEY (`sale_id`) + REFERENCES `sale` (`id`) + ON DELETE CASCADE, + CONSTRAINT `fk_sale_offset_currency_currency_id` + FOREIGN KEY (`currency_id`) + REFERENCES `currency` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- sale_product +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `sale_product`; + +CREATE TABLE `sale_product` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `sale_id` INTEGER NOT NULL, + `product_id` INTEGER NOT NULL, + `attribute_av_id` INTEGER, + PRIMARY KEY (`id`), + INDEX `fk_sale_product_product_idx` (`product_id`), + INDEX `fk_sale_product_attribute_av_idx` (`attribute_av_id`), + INDEX `idx_sale_product_sales_id_product_id` (`sale_id`, `product_id`), + CONSTRAINT `fk_sale_product_sales_id` + FOREIGN KEY (`sale_id`) + REFERENCES `sale` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_sale_product_product_id` + FOREIGN KEY (`product_id`) + REFERENCES `product` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_sale_product_attribute_av_id` + FOREIGN KEY (`attribute_av_id`) + REFERENCES `attribute_av` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +# ====================================================================================================================== +# Product sale elements images and documents +# ====================================================================================================================== + +-- --------------------------------------------------------------------- +-- product_sale_elements_product_image +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements_product_image`; + +CREATE TABLE `product_sale_elements_product_image` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_sale_elements_id` INTEGER NOT NULL, + `product_image_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_pse_product_image_product_image_id_idx` (`product_image_id`), + INDEX `fk_pse_product_image_product_sale_element_idx` (`product_sale_elements_id`), + CONSTRAINT `fk_pse_product_image_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`), + CONSTRAINT `fk_pse_product_image_product_image_id` + FOREIGN KEY (`product_image_id`) + REFERENCES `product_image` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- product_sale_elements_product_document +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `product_sale_elements_product_document`; + +CREATE TABLE `product_sale_elements_product_document` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `product_sale_elements_id` INTEGER NOT NULL, + `product_document_id` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_pse_product_document_product_document__idx` (`product_document_id`), + INDEX `fk_pse_product_document_product_sale_elem_idx` (`product_sale_elements_id`), + CONSTRAINT `fk_pse_product_document_product_sale_elements_id` + FOREIGN KEY (`product_sale_elements_id`) + REFERENCES `product_sale_elements` (`id`), + CONSTRAINT `fk_pse_product_document_product_document_id` + FOREIGN KEY (`product_document_id`) + REFERENCES `product_document` (`id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +# ====================================================================================================================== +# Hooks +# ====================================================================================================================== + +SELECT @max_pos := IFNULL(MAX(`position`),0) FROM `module`; +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `module`; + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'HookNavigation', 1, 1, @max_pos+1, 'HookNavigation\\HookNavigation', NOW(), NOW()), + (@max_id+2, 'HookCurrency', 1, 1, @max_pos+2, 'HookCurrency\\HookCurrency', NOW(), NOW()), + (@max_id+3, 'HookLang', 1, 1, @max_pos+3, 'HookLang\\HookLang', NOW(), NOW()), + (@max_id+4, 'HookSearch', 1, 1, @max_pos+4, 'HookSearch\\HookSearch', NOW(), NOW()), + (@max_id+5, 'HookCustomer', 1, 1, @max_pos+5, 'HookCustomer\\HookCustomer', NOW(), NOW()), + (@max_id+6, 'HookCart', 1, 1, @max_pos+6, 'HookCart\\HookCart', NOW(), NOW()), + (@max_id+7, 'HookAnalytics', 1, 1, @max_pos+7, 'HookAnalytics\\HookAnalytics', NOW(), NOW()), + (@max_id+8, 'HookContact', 1, 1, @max_pos+8, 'HookContact\\HookContact', NOW(), NOW()), + (@max_id+9, 'HookLinks', 1, 1, @max_pos+9, 'HookLinks\\HookLinks', NOW(), NOW()), + (@max_id+10, 'HookNewsletter', 1, 1, @max_pos+10, 'HookNewsletter\\HookNewsletter', NOW(), NOW()), + (@max_id+11, 'HookSocial', 1, 1, @max_pos+11, 'HookSocial\\HookSocial', NOW(), NOW()), + (@max_id+12, 'HookProductsNew', 1, 1, @max_pos+12, 'HookProductsNew\\HookProductsNew', NOW(), NOW()), + (@max_id+13, 'HookProductsOffer', 1, 1, @max_pos+13, 'HookProductsOffer\\HookProductsOffer', NOW(), NOW()) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Navigation block' locale=$locale}, NULL, NULL, NULL), + (@max_id+2, '{$locale}', {intl l='Currency block' locale=$locale}, NULL, NULL, NULL), + (@max_id+3, '{$locale}', {intl l='Languages block' locale=$locale}, NULL, NULL, NULL), + (@max_id+4, '{$locale}', {intl l='Search block' locale=$locale}, NULL, NULL, NULL), + (@max_id+5, '{$locale}', {intl l='Customer account block' locale=$locale}, NULL, NULL, NULL), + (@max_id+6, '{$locale}', {intl l='Cart block' locale=$locale}, NULL, NULL, NULL), + (@max_id+7, '{$locale}', {intl l='Google Analytics block' locale=$locale}, NULL, NULL, NULL), + (@max_id+8, '{$locale}', {intl l='Contact block' locale=$locale}, NULL, NULL, NULL), + (@max_id+9, '{$locale}', {intl l='Links block' locale=$locale}, NULL, NULL, NULL), + (@max_id+10, '{$locale}', {intl l='Newsletter block' locale=$locale}, NULL, NULL, NULL), + (@max_id+11, '{$locale}', {intl l='Social Networks block' locale=$locale}, NULL, NULL, NULL), + (@max_id+12, '{$locale}', {intl l='New Products block' locale=$locale}, NULL, NULL, NULL), + (@max_id+13, '{$locale}', {intl l='Products offer block' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + + + +-- --------------------------------------------------------------------- +-- hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `hook`; + +CREATE TABLE `hook` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL, + `type` TINYINT, + `by_module` TINYINT(1), + `native` TINYINT(1), + `activate` TINYINT(1), + `block` TINYINT(1), + `position` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + UNIQUE INDEX `code_UNIQUE` (`code`, `type`), + INDEX `idx_module_activate` (`activate`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_hook +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_hook`; + +CREATE TABLE `module_hook` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `hook_id` INTEGER NOT NULL, + `classname` VARCHAR(255), + `method` VARCHAR(255), + `active` TINYINT(1) NOT NULL, + `hook_active` TINYINT(1) NOT NULL, + `module_active` TINYINT(1) NOT NULL, + `position` INTEGER NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_module_hook_active` (`active`), + INDEX `fk_module_hook_module_id_idx` (`module_id`), + INDEX `fk_module_hook_hook_id_idx` (`hook_id`), + CONSTRAINT `fk_module_hook_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_module_hook_hook_id` + FOREIGN KEY (`hook_id`) + REFERENCES `hook` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +-- --------------------------------------------------------------------- +-- hook_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `hook_i18n`; + +CREATE TABLE `hook_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + `description` LONGTEXT, + `chapo` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `hook_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `hook` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (1, 'order-invoice.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (2, 'order-invoice.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (3, 'order-invoice.payment-extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (4, 'order-invoice.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (5, 'order-invoice.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (6, 'order-invoice.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (7, 'order-invoice.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (8, 'order-payment-gateway.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (9, 'order-payment-gateway.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (10, 'order-payment-gateway.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (11, 'order-payment-gateway.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (12, 'order-payment-gateway.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (13, 'sitemap.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (14, 'currency.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (15, 'currency.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (16, 'currency.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (17, 'currency.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (18, 'currency.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (19, 'login.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (20, 'login.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (21, 'login.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (22, 'login.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (23, 'login.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (24, 'login.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (25, 'login.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (26, 'login.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (27, 'login.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (28, 'account-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (29, 'account-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (30, 'account-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (31, 'account-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (32, 'account-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (33, 'account-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (34, 'account-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (35, 'cart.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (36, 'cart.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (37, 'cart.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (38, 'cart.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (39, 'cart.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (40, 'contact.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (41, 'contact.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (42, 'contact.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (43, 'contact.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (44, 'contact.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (45, 'contact.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (46, 'contact.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (47, 'order-placed.body', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (48, 'order-placed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (49, 'order-placed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (50, 'order-placed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (51, 'search.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (52, 'search.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (53, 'search.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (54, 'register.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (55, 'register.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (56, 'register.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (57, 'register.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (58, 'register.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (59, 'register.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (60, 'register.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (61, 'password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (62, 'password.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (63, 'password.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (64, 'password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (65, 'password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (66, 'password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (67, 'password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (68, 'language.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (69, 'language.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (70, 'language.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (71, 'language.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (72, 'language.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (73, 'contact.success', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (74, 'newsletter.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (75, 'newsletter.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (76, 'newsletter.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (77, 'newsletter.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (78, 'newsletter.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (79, 'badresponseorder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (80, 'badresponseorder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (81, 'badresponseorder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (82, 'content.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (83, 'content.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (84, 'content.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (85, 'content.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (86, 'content.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (87, 'content.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (88, 'content.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (89, 'main.head-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (90, 'main.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (91, 'main.head-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (92, 'main.body-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (93, 'main.header-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (94, 'main.navbar-secondary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (95, 'main.navbar-primary', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (96, 'main.header-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (97, 'main.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (98, 'main.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (99, 'main.footer-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (100, 'main.footer-body', 1, 0, 1, 1, 1, 1, NOW(), NOW()), + (101, 'main.footer-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (102, 'main.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (103, 'main.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (104, 'main.body-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (105, '404.content', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (106, '404.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (107, '404.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (108, '404.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (109, 'order-delivery.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (110, 'order-delivery.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (111, 'order-delivery.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (112, 'order-delivery.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (113, 'order-delivery.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (114, 'order-delivery.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (115, 'order-delivery.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (116, 'address-create.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (117, 'address-create.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (118, 'address-create.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (119, 'address-create.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (120, 'address-create.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (121, 'address-create.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (122, 'address-create.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (123, 'folder.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (124, 'folder.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (125, 'folder.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (126, 'folder.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (127, 'folder.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (128, 'folder.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (129, 'folder.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (130, 'order-failed.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (131, 'order-failed.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (132, 'order-failed.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (133, 'order-failed.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (134, 'order-failed.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (135, 'category.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (136, 'category.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (137, 'category.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (138, 'category.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (139, 'category.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (140, 'category.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (141, 'category.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (142, 'address-update.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (143, 'address-update.form-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (144, 'address-update.form-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (145, 'address-update.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (146, 'address-update.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (147, 'address-update.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (148, 'address-update.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (149, 'home.body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (150, 'home.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (151, 'home.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (152, 'home.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (153, 'account-password.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (154, 'account-password.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (155, 'account-password.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (156, 'account-password.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (157, 'account-password.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (158, 'product.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (159, 'product.gallery', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (160, 'product.details-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (161, 'product.details-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (162, 'product.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), + (163, 'product.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (164, 'product.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (165, 'product.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (166, 'product.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (167, 'account.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (168, 'account.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (169, 'account.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (170, 'account.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (171, 'account.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (172, 'viewall.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (173, 'viewall.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (174, 'viewall.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (175, 'viewall.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (176, 'viewall.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (177, 'singleproduct.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (178, 'singleproduct.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (179, 'category.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (180, 'category.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (181, 'category.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (182, 'content.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (183, 'content.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (184, 'content.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (185, 'order-delivery.extra', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (186, 'order-delivery.javascript', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + + (1000, 'category.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1001, 'content.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1002, 'folder.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1003, 'order.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1004, 'product.tab-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1005, 'features-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1006, 'features-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1007, 'feature.value-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1008, 'feature.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1009, 'product.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1010, 'coupon.create-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1011, 'taxes.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1012, 'tax-rule.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1013, 'tools.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1014, 'tools.col1-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1015, 'tools.col1-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1016, 'tools.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1017, 'tools.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1018, 'messages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1019, 'messages.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1020, 'messages.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1021, 'messages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1022, 'message.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1023, 'message.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1024, 'messages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1025, 'taxes-rules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1026, 'taxes-rules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1027, 'tax.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1028, 'tax.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1029, 'tax-rule.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1030, 'tax-rule.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1031, 'taxes-rules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1032, 'exports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1033, 'exports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1034, 'exports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1035, 'exports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1036, 'export.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1037, 'product.folders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1038, 'product.folders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1039, 'product.details-pricing-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1040, 'product.details-details-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1041, 'product.details-promotion-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1042, 'product.before-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1043, 'product.combinations-list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1044, 'product.after-combinations', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1045, 'product.combination-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1046, 'modules.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1047, 'modules.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1048, 'currency.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1049, 'category.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1050, 'category.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1051, 'category.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1052, 'document.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1053, 'customer.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1054, 'customers.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1055, 'customers.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1056, 'customers.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1057, 'customer.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1058, 'customer.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1059, 'customer.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1060, 'customers.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1061, 'product.contents-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1062, 'product.contents-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1063, 'product.accessories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1064, 'product.accessories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1065, 'product.categories-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1066, 'product.categories-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1067, 'product.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1068, 'product.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1069, 'product.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1070, 'product.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1071, 'template.attributes-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1072, 'template.attributes-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1073, 'template.features-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1074, 'template.features-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1075, 'templates.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1076, 'templates.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1077, 'templates.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1078, 'templates.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1079, 'template.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1080, 'template.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1081, 'templates.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1082, 'configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1083, 'configuration.catalog-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1084, 'configuration.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1085, 'configuration.shipping-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1086, 'configuration.shipping-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1087, 'configuration.system-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1088, 'configuration.system-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1089, 'configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1090, 'configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1091, 'index.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1092, 'index.middle', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1093, 'index.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1094, 'orders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1095, 'orders.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1096, 'orders.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1097, 'orders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1098, 'orders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1099, 'shipping-zones.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1100, 'shipping-zones.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1101, 'shipping-zones.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1102, 'shipping-zones.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1103, 'shipping-zones.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1104, 'content.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1105, 'home.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1106, 'home.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1107, 'home.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1108, 'modules.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1109, 'modules.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1110, 'modules.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1111, 'languages.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1112, 'languages.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1113, 'language.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1114, 'languages.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1115, 'languages.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1116, 'zone.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1117, 'shipping-zones.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1118, 'system.logs-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1119, 'search.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1120, 'search.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1121, 'search.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1122, 'administrators.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1123, 'administrators.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1124, 'administrator.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1125, 'administrator.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1126, 'administrator.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1127, 'administrators.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1128, 'module-hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1129, 'shipping-configuration.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1130, 'shipping-configuration.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1131, 'shipping-configuration.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1132, 'shipping-configuration.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1133, 'shipping-configuration.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1134, 'shipping-configuration.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1135, 'shipping-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1136, 'features.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1137, 'features.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1138, 'features.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1139, 'features.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1140, 'feature.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1141, 'feature.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1142, 'feature.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1143, 'feature.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1144, 'features.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1145, 'module.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1146, 'module-hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1147, 'module-hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1148, 'module-hook.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1149, 'shipping-configuration.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1150, 'shipping-configuration.country-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1151, 'shipping-configuration.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1152, 'mailing-system.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1153, 'mailing-system.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1154, 'mailing-system.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1155, 'categories.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1156, 'categories.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1157, 'categories.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1158, 'categories.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1159, 'products.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1160, 'products.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1161, 'products.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1162, 'categories.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1163, 'categories.catalog-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1164, 'category.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1165, 'product.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1166, 'category.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1167, 'product.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1168, 'categories.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1169, 'variables.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1170, 'variables.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1171, 'variables.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1172, 'variables.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1173, 'variable.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1174, 'variable.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1175, 'variables.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1176, 'order.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1177, 'order.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1178, 'config-store.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1179, 'translations.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1180, 'folders.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1181, 'folders.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1182, 'folders.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1183, 'folders.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1184, 'contents.caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1185, 'contents.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1186, 'contents.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1187, 'folders.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1188, 'folder.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1189, 'content.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1190, 'folder.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1191, 'content.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1192, 'folders.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1193, 'template.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1194, 'tax.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1195, 'hook.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1196, 'countries.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1197, 'countries.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1198, 'countries.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1199, 'countries.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1200, 'country.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1201, 'country.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1202, 'countries.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1203, 'currencies.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1204, 'currencies.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1205, 'currencies.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1206, 'currencies.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1207, 'currency.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1208, 'currency.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1209, 'currencies.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1210, 'customer.edit', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1211, 'customer.address-create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1212, 'customer.address-update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1213, 'customer.address-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1214, 'customer.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1215, 'attributes-value.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1216, 'attributes-value.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1217, 'attribute-value.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1218, 'attribute.id-delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1219, 'attribute.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1220, 'profiles.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1221, 'profiles.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1222, 'profile.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1223, 'profile.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1224, 'profiles.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1225, 'country.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1226, 'profile.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1227, 'variable.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1228, 'coupon.update-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1229, 'coupon.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1230, 'coupon.list-caption', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1231, 'coupon.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1232, 'coupon.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1233, 'coupon.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1234, 'coupon.list-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1235, 'module.configuration', 2, 1, 0, 1, 1, 1, NOW(), NOW()), + (1236, 'module.config-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1237, 'message.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1238, 'image.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1239, 'attributes.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1240, 'attributes.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1241, 'attributes.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1242, 'attributes.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1243, 'attribute.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1244, 'attribute.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1245, 'attribute.add-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1246, 'attribute.remove-to-all-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1247, 'attributes.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1248, 'admin-logs.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1249, 'admin-logs.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1250, 'admin-logs.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1251, 'folder.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1252, 'hooks.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1253, 'hooks.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1254, 'hooks.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1255, 'hooks.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1256, 'hook.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1257, 'hook.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1258, 'hooks.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1259, 'main.head-css', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1260, 'main.before-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1261, 'main.inside-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1262, 'main.after-topbar', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1263, 'main.before-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1264, 'main.in-top-menu-items', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1265, 'main.after-top-menu', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1266, 'main.before-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1267, 'main.in-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1268, 'main.after-footer', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1269, 'main.footer-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1270, 'main.topbar-top', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1271, 'main.topbar-bottom', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1272, 'main.top-menu-customer', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1273, 'main.top-menu-order', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1274, 'main.top-menu-catalog', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1275, 'main.top-menu-content', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1276, 'main.top-menu-tools', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1277, 'main.top-menu-modules', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1278, 'main.top-menu-configuration', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1279, 'brand.edit-js', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1280, 'home.block', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1281, 'brands.top', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1282, 'brands.table-header', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1283, 'brands.table-row', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1284, 'brands.bottom', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1285, 'brand.create-form', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1286, 'brand.delete-form', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1287, 'brand.js', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1288, 'imports.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1289, 'imports.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1290, 'imports.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1291, 'imports.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1292, 'import.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1293, 'brand.tab-content', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (1294, 'customer.orders-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (1295, 'customer.orders-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + + (2001, 'invoice.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2002, 'invoice.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2003, 'invoice.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2004, 'invoice.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2005, 'invoice.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2006, 'invoice.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), + (2007, 'invoice.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2008, 'invoice.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), + (2009, 'invoice.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2010, 'invoice.after-products', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2011, 'invoice.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + + (2012, 'delivery.css', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2013, 'delivery.header', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2014, 'delivery.footer-top', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2015, 'delivery.imprint', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2016, 'delivery.footer-bottom', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2017, 'delivery.information', 3, 0, 1, 1, 1, 1, NOW(), NOW()), + (2018, 'delivery.after-information', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2019, 'delivery.delivery-address', 3, 1, 0, 1, 1, 1, NOW(), NOW()), + (2020, 'delivery.after-addresses', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (2021, 'delivery.after-summary', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + + (2022, 'order-placed.additional-payment-info', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + + (2023, 'wysiwyg.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} + (1, '{$locale}', {intl l='Invoice choice - at the top' locale=$locale}, '', ''), + (2, '{$locale}', {intl l='Invoice choice - delivery address' locale=$locale}, '', ''), + (3, '{$locale}', {intl l='Invoice choice - extra payment zone' locale=$locale}, '', ''), + (4, '{$locale}', {intl l='Invoice choice - at the bottom' locale=$locale}, '', ''), + (5, '{$locale}', {intl l='Invoice choice - after javascript initialisation' locale=$locale}, '', ''), + (6, '{$locale}', {intl l='Invoice choice - CSS stylesheet' locale=$locale}, '', ''), + (7, '{$locale}', {intl l='Invoice choice - after javascript include' locale=$locale}, '', ''), + (8, '{$locale}', {intl l='Payment gateway - main area' locale=$locale}, '', ''), + (9, '{$locale}', {intl l='Payment gateway - javascript' locale=$locale}, '', ''), + (10, '{$locale}', {intl l='Payment gateway - after javascript initialisation' locale=$locale}, '', ''), + (11, '{$locale}', {intl l='Payment gateway - CSS stylesheet' locale=$locale}, '', ''), + (12, '{$locale}', {intl l='Payment gateway - after javascript include' locale=$locale}, '', ''), + (13, '{$locale}', {intl l='Sitemap - at the bottom' locale=$locale}, '', ''), + (14, '{$locale}', {intl l='Curency selection page - at the top' locale=$locale}, '', ''), + (15, '{$locale}', {intl l='Curency selection page - at the bottom' locale=$locale}, '', ''), + (16, '{$locale}', {intl l='Curency selection page - CSS stylesheet' locale=$locale}, '', ''), + (17, '{$locale}', {intl l='Curency selection page - after javascript include' locale=$locale}, '', ''), + (18, '{$locale}', {intl l='Curency selection page - after javascript initialisation' locale=$locale}, '', ''), + (19, '{$locale}', {intl l='Login page - at the top' locale=$locale}, '', ''), + (20, '{$locale}', {intl l='Login page - at the top of the main area' locale=$locale}, '', ''), + (21, '{$locale}', {intl l='Login page - at the top of the form' locale=$locale}, '', ''), + (22, '{$locale}', {intl l='Login page - at the bottom of the form' locale=$locale}, '', ''), + (23, '{$locale}', {intl l='Login page - at the bottom of the main area' locale=$locale}, '', ''), + (24, '{$locale}', {intl l='Login page - at the bottom' locale=$locale}, '', ''), + (25, '{$locale}', {intl l='Login page - CSS stylesheet' locale=$locale}, '', ''), + (26, '{$locale}', {intl l='Login page - after javascript include' locale=$locale}, '', ''), + (27, '{$locale}', {intl l='Login page - after javascript initialisation' locale=$locale}, '', ''), + (28, '{$locale}', {intl l='Update customer account - at the top' locale=$locale}, '', ''), + (29, '{$locale}', {intl l='Update customer account - at the top of the form' locale=$locale}, '', ''), + (30, '{$locale}', {intl l='Update customer account - at the bottom of the form' locale=$locale}, '', ''), + (31, '{$locale}', {intl l='Update customer account - at the bottom' locale=$locale}, '', ''), + (32, '{$locale}', {intl l='Update customer account - CSS stylesheet' locale=$locale}, '', ''), + (33, '{$locale}', {intl l='Update customer account - after javascript include' locale=$locale}, '', ''), + (34, '{$locale}', {intl l='Update customer account - after javascript initialisation' locale=$locale}, '', ''), + (35, '{$locale}', {intl l='Cart - at the top' locale=$locale}, '', ''), + (36, '{$locale}', {intl l='Cart - at the bottom' locale=$locale}, '', ''), + (37, '{$locale}', {intl l='Cart - after javascript include' locale=$locale}, '', ''), + (38, '{$locale}', {intl l='Cart - CSS stylesheet' locale=$locale}, '', ''), + (39, '{$locale}', {intl l='Cart - javascript initialization' locale=$locale}, '', ''), + (40, '{$locale}', {intl l='Contact page - at the top' locale=$locale}, '', ''), + (41, '{$locale}', {intl l='Contact page - at the top of the form' locale=$locale}, '', ''), + (42, '{$locale}', {intl l='Contact page - at the bottom of the form' locale=$locale}, '', ''), + (43, '{$locale}', {intl l='Contact page - at the bottom' locale=$locale}, '', ''), + (44, '{$locale}', {intl l='Contact page - CSS stylesheet' locale=$locale}, '', ''), + (45, '{$locale}', {intl l='Contact page - after javascript include' locale=$locale}, '', ''), + (46, '{$locale}', {intl l='Contact page - after javascript initialisation' locale=$locale}, '', ''), + (47, '{$locale}', {intl l='Placed order - main area' locale=$locale}, '', ''), + (48, '{$locale}', {intl l='Placed order - CSS stylesheet' locale=$locale}, '', ''), + (49, '{$locale}', {intl l='Placed order - after javascript include' locale=$locale}, '', ''), + (50, '{$locale}', {intl l='Placed order - after javascript initialisation' locale=$locale}, '', ''), + (51, '{$locale}', {intl l='Search page - CSS stylesheet' locale=$locale}, '', ''), + (52, '{$locale}', {intl l='Search page - after javascript include' locale=$locale}, '', ''), + (53, '{$locale}', {intl l='Search page - after javascript initialisation' locale=$locale}, '', ''), + (54, '{$locale}', {intl l='Register - at the top' locale=$locale}, '', ''), + (55, '{$locale}', {intl l='Register - at the top of the form' locale=$locale}, '', ''), + (56, '{$locale}', {intl l='Register - at the bottom of the form' locale=$locale}, '', ''), + (57, '{$locale}', {intl l='Register - at the bottom' locale=$locale}, '', ''), + (58, '{$locale}', {intl l='Register - CSS stylesheet' locale=$locale}, '', ''), + (59, '{$locale}', {intl l='Register - after javascript include' locale=$locale}, '', ''), + (60, '{$locale}', {intl l='Register - after javascript initialisation' locale=$locale}, '', ''), + (61, '{$locale}', {intl l='Lost password - at the top' locale=$locale}, '', ''), + (62, '{$locale}', {intl l='Lost password - at the top of the form' locale=$locale}, '', ''), + (63, '{$locale}', {intl l='Lost password - at the bottom of the form' locale=$locale}, '', ''), + (64, '{$locale}', {intl l='Lost password - at the bottom' locale=$locale}, '', ''), + (65, '{$locale}', {intl l='Lost password - CSS stylesheet' locale=$locale}, '', ''), + (66, '{$locale}', {intl l='Lost password - after javascript include' locale=$locale}, '', ''), + (67, '{$locale}', {intl l='Lost password - javascript initialization' locale=$locale}, '', ''), + (68, '{$locale}', {intl l='language selection page - at the top' locale=$locale}, '', ''), + (69, '{$locale}', {intl l='language selection page - at the bottom' locale=$locale}, '', ''), + (70, '{$locale}', {intl l='language selection page - CSS stylesheet' locale=$locale}, '', ''), + (71, '{$locale}', {intl l='language selection page - after javascript include' locale=$locale}, '', ''), + (72, '{$locale}', {intl l='language selection page - after javascript initialisation' locale=$locale}, '', ''), + (73, '{$locale}', {intl l='Contact page - if successful response' locale=$locale}, '', ''), + (74, '{$locale}', {intl l='Newsletter page - at the top' locale=$locale}, '', ''), + (75, '{$locale}', {intl l='Newsletter page - at the bottom' locale=$locale}, '', ''), + (76, '{$locale}', {intl l='Newsletter page - CSS stylesheet' locale=$locale}, '', ''), + (77, '{$locale}', {intl l='Newsletter page - after javascript include' locale=$locale}, '', ''), + (78, '{$locale}', {intl l='Newsletter page - after javascript initialisation' locale=$locale}, '', ''), + (79, '{$locale}', {intl l='Payment failed - CSS stylesheet' locale=$locale}, '', ''), + (80, '{$locale}', {intl l='Payment failed - after javascript include' locale=$locale}, '', ''), + (81, '{$locale}', {intl l='Payment failed - javascript initialization' locale=$locale}, '', ''), + (82, '{$locale}', {intl l='Content page - at the top' locale=$locale}, '', ''), + (83, '{$locale}', {intl l='Content page - at the top of the main area' locale=$locale}, '', ''), + (84, '{$locale}', {intl l='Content page - at the bottom of the main area' locale=$locale}, '', ''), + (85, '{$locale}', {intl l='Content page - at the bottom' locale=$locale}, '', ''), + (86, '{$locale}', {intl l='Content page - CSS stylesheet' locale=$locale}, '', ''), + (87, '{$locale}', {intl l='Content page - after javascript include' locale=$locale}, '', ''), + (88, '{$locale}', {intl l='Content page - after javascript initialisation' locale=$locale}, '', ''), + (89, '{$locale}', {intl l='HTML layout - after the opening of the head tag' locale=$locale}, '', ''), + (90, '{$locale}', {intl l='HTML layout - CSS stylesheet' locale=$locale}, '', ''), + (91, '{$locale}', {intl l='HTML layout - before the end of the head tag' locale=$locale}, '', ''), + (92, '{$locale}', {intl l='HTML layout - after the opening of the body tag' locale=$locale}, '', ''), + (93, '{$locale}', {intl l='HTML layout - at the top of the header' locale=$locale}, '', ''), + (94, '{$locale}', {intl l='HTML layout - secondary navigation' locale=$locale}, '', ''), + (95, '{$locale}', {intl l='HTML layout - primary navigation' locale=$locale}, '', ''), + (96, '{$locale}', {intl l='HTML layout - at the bottom of the header' locale=$locale}, '', ''), + (97, '{$locale}', {intl l='HTML layout - before the main content area' locale=$locale}, '', ''), + (98, '{$locale}', {intl l='HTML layout - after the main content area' locale=$locale}, '', ''), + (99, '{$locale}', {intl l='HTML layout - at the top of the footer' locale=$locale}, '', ''), + (100, '{$locale}', {intl l='HTML layout - footer body' locale=$locale}, '', ''), + (101, '{$locale}', {intl l='HTML layout - bottom of the footer' locale=$locale}, '', ''), + (102, '{$locale}', {intl l='HTML layout - after javascript include' locale=$locale}, '', ''), + (103, '{$locale}', {intl l='HTML layout - javascript initialization' locale=$locale}, '', ''), + (104, '{$locale}', {intl l='HTML layout - before the end body tag' locale=$locale}, '', ''), + (105, '{$locale}', {intl l='Page 404 - content area' locale=$locale}, '', ''), + (106, '{$locale}', {intl l='Page 404 - CSS stylesheet' locale=$locale}, '', ''), + (107, '{$locale}', {intl l='Page 404 - after javascript include' locale=$locale}, '', ''), + (108, '{$locale}', {intl l='Page 404 - after javascript initialisation' locale=$locale}, '', ''), + (109, '{$locale}', {intl l='Delivery choice - at the top' locale=$locale}, '', ''), + (110, '{$locale}', {intl l='Delivery choice - at the top of the form' locale=$locale}, '', ''), + (111, '{$locale}', {intl l='Delivery choice - at the bottom of the form' locale=$locale}, '', ''), + (112, '{$locale}', {intl l='Delivery choice - at the bottom' locale=$locale}, '', ''), + (113, '{$locale}', {intl l='Delivery choice - after javascript initialisation' locale=$locale}, '', ''), + (114, '{$locale}', {intl l='Delivery choice - CSS stylesheet' locale=$locale}, '', ''), + (115, '{$locale}', {intl l='Delivery choice - after javascript include' locale=$locale}, '', ''), + (116, '{$locale}', {intl l='Address creation - at the top' locale=$locale}, '', ''), + (117, '{$locale}', {intl l='Address creation - at the top of the form' locale=$locale}, '', ''), + (118, '{$locale}', {intl l='Address creation - at the bottom of the form' locale=$locale}, '', ''), + (119, '{$locale}', {intl l='Address creation - at the bottom' locale=$locale}, '', ''), + (120, '{$locale}', {intl l='Address creation - CSS stylesheet' locale=$locale}, '', ''), + (121, '{$locale}', {intl l='Address creation - after javascript include' locale=$locale}, '', ''), + (122, '{$locale}', {intl l='Address creation - after javascript initialisation' locale=$locale}, '', ''), + (123, '{$locale}', {intl l='Folder page - at the top' locale=$locale}, '', ''), + (124, '{$locale}', {intl l='Folder page - at the top of the main area' locale=$locale}, '', ''), + (125, '{$locale}', {intl l='Folder page - at the bottom of the main area' locale=$locale}, '', ''), + (126, '{$locale}', {intl l='Folder page - at the bottom' locale=$locale}, '', ''), + (127, '{$locale}', {intl l='Folder page - CSS stylesheet' locale=$locale}, '', ''), + (128, '{$locale}', {intl l='Folder page - after javascript include' locale=$locale}, '', ''), + (129, '{$locale}', {intl l='Folder page - after javascript initialisation' locale=$locale}, '', ''), + (130, '{$locale}', {intl l='Order failed - at the top' locale=$locale}, '', ''), + (131, '{$locale}', {intl l='Order failed - at the bottom' locale=$locale}, '', ''), + (132, '{$locale}', {intl l='Order failed - CSS stylesheet' locale=$locale}, '', ''), + (133, '{$locale}', {intl l='Order failed - after javascript include' locale=$locale}, '', ''), + (134, '{$locale}', {intl l='Order failed - after javascript initialisation' locale=$locale}, '', ''), + (135, '{$locale}', {intl l='Category page - at the top' locale=$locale}, '', ''), + (136, '{$locale}', {intl l='Category page - at the top of the main area' locale=$locale}, '', ''), + (137, '{$locale}', {intl l='Category page - at the bottom of the main area' locale=$locale}, '', ''), + (138, '{$locale}', {intl l='Category page - at the bottom' locale=$locale}, '', ''), + (139, '{$locale}', {intl l='Category page - CSS stylesheet' locale=$locale}, '', ''), + (140, '{$locale}', {intl l='Category page - after javascript include' locale=$locale}, '', ''), + (141, '{$locale}', {intl l='Category page - after javascript initialisation' locale=$locale}, '', ''), + (142, '{$locale}', {intl l='Address update - at the top' locale=$locale}, '', ''), + (143, '{$locale}', {intl l='Address update - at the top of the form' locale=$locale}, '', ''), + (144, '{$locale}', {intl l='Address update - at the bottom of the form' locale=$locale}, '', ''), + (145, '{$locale}', {intl l='Address update - at the bottom' locale=$locale}, '', ''), + (146, '{$locale}', {intl l='Address update - CSS stylesheet' locale=$locale}, '', ''), + (147, '{$locale}', {intl l='Address update - after javascript include' locale=$locale}, '', ''), + (148, '{$locale}', {intl l='Address update - after javascript initialisation' locale=$locale}, '', ''), + (149, '{$locale}', {intl l='Home page - main area' locale=$locale}, '', ''), + (150, '{$locale}', {intl l='Home page - CSS stylesheet' locale=$locale}, '', ''), + (151, '{$locale}', {intl l='Home page - after javascript include' locale=$locale}, '', ''), + (152, '{$locale}', {intl l='Home page - after javascript initialisation' locale=$locale}, '', ''), + (153, '{$locale}', {intl l='Change password - at the top' locale=$locale}, '', ''), + (154, '{$locale}', {intl l='Change password - at the bottom' locale=$locale}, '', ''), + (155, '{$locale}', {intl l='Change password - CSS stylesheet' locale=$locale}, '', ''), + (156, '{$locale}', {intl l='Change password - after javascript include' locale=$locale}, '', ''), + (157, '{$locale}', {intl l='Change password - after javascript initialisation' locale=$locale}, '', ''), + (158, '{$locale}', {intl l='Product page - at the top' locale=$locale}, '', ''), + (159, '{$locale}', {intl l='Product page - photo gallery' locale=$locale}, '', ''), + (160, '{$locale}', {intl l='Product page - at the top of the detail' locale=$locale}, '', ''), + (161, '{$locale}', {intl l='Product page - at the bottom of the detail area' locale=$locale}, '', ''), + (162, '{$locale}', {intl l='Product page - additional information' locale=$locale}, '', ''), + (163, '{$locale}', {intl l='Product page - at the bottom' locale=$locale}, '', ''), + (164, '{$locale}', {intl l='Product page - CSS stylesheet' locale=$locale}, '', ''), + (165, '{$locale}', {intl l='Product page - after javascript include' locale=$locale}, '', ''), + (166, '{$locale}', {intl l='Product page - after javascript initialisation' locale=$locale}, '', ''), + (167, '{$locale}', {intl l='customer account - at the top' locale=$locale}, '', ''), + (168, '{$locale}', {intl l='customer account - at the bottom' locale=$locale}, '', ''), + (169, '{$locale}', {intl l='customer account - CSS stylesheet' locale=$locale}, '', ''), + (170, '{$locale}', {intl l='customer account - after javascript include' locale=$locale}, '', ''), + (171, '{$locale}', {intl l='customer account - after javascript initialisation' locale=$locale}, '', ''), + (172, '{$locale}', {intl l='All Products - at the top' locale=$locale}, '', ''), + (173, '{$locale}', {intl l='All Products - at the bottom' locale=$locale}, '', ''), + (174, '{$locale}', {intl l='All Products - CSS stylesheet' locale=$locale}, '', ''), + (175, '{$locale}', {intl l='All Products - after javascript include' locale=$locale}, '', ''), + (176, '{$locale}', {intl l='All Products - after javascript initialisation' locale=$locale}, '', ''), + (177, '{$locale}', {intl l='Product loop - at the top' locale=$locale}, '', ''), + (178, '{$locale}', {intl l='Product loop - at the bottom' locale=$locale}, '', ''), + (179, '{$locale}', {intl l='Category page - at the top of the sidebar' locale=$locale}, '', ''), + (180, '{$locale}', {intl l='Category page - the body of the sidebar' locale=$locale}, '', ''), + (181, '{$locale}', {intl l='Category page - at the bottom of the sidebar' locale=$locale}, '', ''), + (182, '{$locale}', {intl l='Content page - at the top of the sidebar' locale=$locale}, '', ''), + (183, '{$locale}', {intl l='Content page - the body of the sidebar' locale=$locale}, '', ''), + (184, '{$locale}', {intl l='Content page - at the bottom of the sidebar' locale=$locale}, '', ''), + (185, '{$locale}', {intl l='Delivery choice - extra area' locale=$locale}, '', ''), + (186, '{$locale}', {intl l='Delivery choice - javascript' locale=$locale}, '', ''), + (1000, '{$locale}', {intl l='Category - content' locale=$locale}, '', ''), + (1001, '{$locale}', {intl l='Content - content' locale=$locale}, '', ''), + (1002, '{$locale}', {intl l='Folder - content' locale=$locale}, '', ''), + (1003, '{$locale}', {intl l='Order - content' locale=$locale}, '', ''), + (1004, '{$locale}', {intl l='Product - content' locale=$locale}, '', ''), + (1005, '{$locale}', {intl l='Features value - table header' locale=$locale}, '', ''), + (1006, '{$locale}', {intl l='Features value - table row' locale=$locale}, '', ''), + (1007, '{$locale}', {intl l='Feature - Value create form' locale=$locale}, '', ''), + (1008, '{$locale}', {intl l='Feature - Edit JavaScript' locale=$locale}, '', ''), + (1009, '{$locale}', {intl l='Product - Edit JavaScript' locale=$locale}, '', ''), + (1010, '{$locale}', {intl l='Coupon - create JavaScript' locale=$locale}, '', ''), + (1011, '{$locale}', {intl l='Taxes - update form' locale=$locale}, '', ''), + (1012, '{$locale}', {intl l='tax rule - Edit JavaScript' locale=$locale}, '', ''), + (1013, '{$locale}', {intl l='Tools - at the top' locale=$locale}, '', ''), + (1014, '{$locale}', {intl l='Tools - at the top of the column' locale=$locale}, '', ''), + (1015, '{$locale}', {intl l='Tools - at the bottom of column 1' locale=$locale}, '', ''), + (1016, '{$locale}', {intl l='Tools - bottom' locale=$locale}, '', ''), + (1017, '{$locale}', {intl l='Tools - JavaScript' locale=$locale}, '', ''), + (1018, '{$locale}', {intl l='Messages - at the top' locale=$locale}, '', ''), + (1019, '{$locale}', {intl l='Messages - table header' locale=$locale}, '', ''), + (1020, '{$locale}', {intl l='Messages - table row' locale=$locale}, '', ''), + (1021, '{$locale}', {intl l='Messages - bottom' locale=$locale}, '', ''), + (1022, '{$locale}', {intl l='Message - create form' locale=$locale}, '', ''), + (1023, '{$locale}', {intl l='Message - delete form' locale=$locale}, '', ''), + (1024, '{$locale}', {intl l='Messages - JavaScript' locale=$locale}, '', ''), + (1025, '{$locale}', {intl l='Taxes rules - at the top' locale=$locale}, '', ''), + (1026, '{$locale}', {intl l='Taxes rules - bottom' locale=$locale}, '', ''), + (1027, '{$locale}', {intl l='Tax - create form' locale=$locale}, '', ''), + (1028, '{$locale}', {intl l='Tax - delete form' locale=$locale}, '', ''), + (1029, '{$locale}', {intl l='tax rule - create form' locale=$locale}, '', ''), + (1030, '{$locale}', {intl l='tax rule - delete form' locale=$locale}, '', ''), + (1031, '{$locale}', {intl l='Taxes rules - JavaScript' locale=$locale}, '', ''), + (1032, '{$locale}', {intl l='Exports - at the top' locale=$locale}, '', ''), + (1033, '{$locale}', {intl l='Exports - at the bottom of a category' locale=$locale}, '', ''), + (1034, '{$locale}', {intl l='Exports - at the bottom of column 1' locale=$locale}, '', ''), + (1035, '{$locale}', {intl l='Exports - JavaScript' locale=$locale}, '', ''), + (1036, '{$locale}', {intl l='Export - JavaScript' locale=$locale}, '', ''), + (1037, '{$locale}', {intl l='Product - folders table header' locale=$locale}, '', ''), + (1038, '{$locale}', {intl l='Product - folders table row' locale=$locale}, '', ''), + (1039, '{$locale}', {intl l='Product - details pricing form' locale=$locale}, '', ''), + (1040, '{$locale}', {intl l='Product - stock edit form' locale=$locale}, '', ''), + (1041, '{$locale}', {intl l='Product - details promotion form' locale=$locale}, '', ''), + (1042, '{$locale}', {intl l='Product - before combinations' locale=$locale}, '', ''), + (1043, '{$locale}', {intl l='Product - combinations list caption' locale=$locale}, '', ''), + (1044, '{$locale}', {intl l='Product - after combinations' locale=$locale}, '', ''), + (1045, '{$locale}', {intl l='Product - combination delete form' locale=$locale}, '', ''), + (1046, '{$locale}', {intl l='Modules - table header' locale=$locale}, '', ''), + (1047, '{$locale}', {intl l='Modules - table row' locale=$locale}, '', ''), + (1048, '{$locale}', {intl l='Currency - Edit JavaScript' locale=$locale}, '', ''), + (1049, '{$locale}', {intl l='Category - contents table header' locale=$locale}, '', ''), + (1050, '{$locale}', {intl l='Category - contents table row' locale=$locale}, '', ''), + (1051, '{$locale}', {intl l='Category - Edit JavaScript' locale=$locale}, '', ''), + (1052, '{$locale}', {intl l='Document - Edit JavaScript' locale=$locale}, '', ''), + (1053, '{$locale}', {intl l='Customer - at the top' locale=$locale}, '', ''), + (1054, '{$locale}', {intl l='Customers - caption' locale=$locale}, '', ''), + (1055, '{$locale}', {intl l='Customers - header' locale=$locale}, '', ''), + (1056, '{$locale}', {intl l='Customers - row' locale=$locale}, '', ''), + (1057, '{$locale}', {intl l='Customer - bottom' locale=$locale}, '', ''), + (1058, '{$locale}', {intl l='Customer - create form' locale=$locale}, '', ''), + (1059, '{$locale}', {intl l='Customer - delete form' locale=$locale}, '', ''), + (1060, '{$locale}', {intl l='Customers - JavaScript' locale=$locale}, '', ''), + (1061, '{$locale}', {intl l='Product - contents table header' locale=$locale}, '', ''), + (1062, '{$locale}', {intl l='Product - contents table row' locale=$locale}, '', ''), + (1063, '{$locale}', {intl l='Product - accessories table header' locale=$locale}, '', ''), + (1064, '{$locale}', {intl l='Product - accessories table row' locale=$locale}, '', ''), + (1065, '{$locale}', {intl l='Product - categories table header' locale=$locale}, '', ''), + (1066, '{$locale}', {intl l='Product - categories table row' locale=$locale}, '', ''), + (1067, '{$locale}', {intl l='Product - attributes table header' locale=$locale}, '', ''), + (1068, '{$locale}', {intl l='Product - attributes table row' locale=$locale}, '', ''), + (1069, '{$locale}', {intl l='Product - features-table-header' locale=$locale}, '', ''), + (1070, '{$locale}', {intl l='Product - features table row' locale=$locale}, '', ''), + (1071, '{$locale}', {intl l='Template - attributes table header' locale=$locale}, '', ''), + (1072, '{$locale}', {intl l='Template - attributes table row' locale=$locale}, '', ''), + (1073, '{$locale}', {intl l='Template - features-table-header' locale=$locale}, '', ''), + (1074, '{$locale}', {intl l='Template - features table row' locale=$locale}, '', ''), + (1075, '{$locale}', {intl l='Templates - at the top' locale=$locale}, '', ''), + (1076, '{$locale}', {intl l='Templates - table header' locale=$locale}, '', ''), + (1077, '{$locale}', {intl l='Templates - table row' locale=$locale}, '', ''), + (1078, '{$locale}', {intl l='Templates - bottom' locale=$locale}, '', ''), + (1079, '{$locale}', {intl l='Template - create form' locale=$locale}, '', ''), + (1080, '{$locale}', {intl l='Template - delete form' locale=$locale}, '', ''), + (1081, '{$locale}', {intl l='Templates - JavaScript' locale=$locale}, '', ''), + (1082, '{$locale}', {intl l='Configuration - at the top' locale=$locale}, '', ''), + (1083, '{$locale}', {intl l='Configuration - at the top of the catalog area' locale=$locale}, '', ''), + (1084, '{$locale}', {intl l='Configuration - at the bottom of the catalog' locale=$locale}, '', ''), + (1085, '{$locale}', {intl l='Configuration - at the top of the shipping area' locale=$locale}, '', ''), + (1086, '{$locale}', {intl l='Configuration - at the bottom of the shipping area' locale=$locale}, '', ''), + (1087, '{$locale}', {intl l='Configuration - at the top of the system area' locale=$locale}, '', ''), + (1088, '{$locale}', {intl l='Configuration - at the bottom of the system area' locale=$locale}, '', ''), + (1089, '{$locale}', {intl l='Configuration - bottom' locale=$locale}, '', ''), + (1090, '{$locale}', {intl l='Configuration - JavaScript' locale=$locale}, '', ''), + (1091, '{$locale}', {intl l='Dashboard - at the top' locale=$locale}, '', ''), + (1092, '{$locale}', {intl l='Dashboard - middle' locale=$locale}, '', ''), + (1093, '{$locale}', {intl l='Dashboard - bottom' locale=$locale}, '', ''), + (1094, '{$locale}', {intl l='Orders - at the top' locale=$locale}, '', ''), + (1095, '{$locale}', {intl l='Orders - table header' locale=$locale}, '', ''), + (1096, '{$locale}', {intl l='Orders - table row' locale=$locale}, '', ''), + (1097, '{$locale}', {intl l='Orders - bottom' locale=$locale}, '', ''), + (1098, '{$locale}', {intl l='Orders - JavaScript' locale=$locale}, '', ''), + (1099, '{$locale}', {intl l='Delivery zone - at the top' locale=$locale}, '', ''), + (1100, '{$locale}', {intl l='Delivery zone - table header' locale=$locale}, '', ''), + (1101, '{$locale}', {intl l='Delivery zone - table row' locale=$locale}, '', ''), + (1102, '{$locale}', {intl l='Delivery zone - bottom' locale=$locale}, '', ''), + (1103, '{$locale}', {intl l='Delivery zone - JavaScript' locale=$locale}, '', ''), + (1104, '{$locale}', {intl l='Content - Edit JavaScript' locale=$locale}, '', ''), + (1105, '{$locale}', {intl l='Home - at the top' locale=$locale}, '', ''), + (1106, '{$locale}', {intl l='Home - bottom' locale=$locale}, '', ''), + (1107, '{$locale}', {intl l='Home - JavaScript' locale=$locale}, '', ''), + (1108, '{$locale}', {intl l='Modules - at the top' locale=$locale}, '', ''), + (1109, '{$locale}', {intl l='Modules - bottom' locale=$locale}, '', ''), + (1110, '{$locale}', {intl l='Modules - JavaScript' locale=$locale}, '', ''), + (1111, '{$locale}', {intl l='Languages - at the top' locale=$locale}, '', ''), + (1112, '{$locale}', {intl l='Languages - bottom' locale=$locale}, '', ''), + (1113, '{$locale}', {intl l='Language - create form' locale=$locale}, '', ''), + (1114, '{$locale}', {intl l='Languages - delete form' locale=$locale}, '', ''), + (1115, '{$locale}', {intl l='Languages - JavaScript' locale=$locale}, '', ''), + (1116, '{$locale}', {intl l='Zone - delete form' locale=$locale}, '', ''), + (1117, '{$locale}', {intl l='Delivery zone - Edit JavaScript' locale=$locale}, '', ''), + (1118, '{$locale}', {intl l='System - logs JavaScript' locale=$locale}, '', ''), + (1119, '{$locale}', {intl l='Search - at the top' locale=$locale}, '', ''), + (1120, '{$locale}', {intl l='Search - bottom' locale=$locale}, '', ''), + (1121, '{$locale}', {intl l='Search - JavaScript' locale=$locale}, '', ''), + (1122, '{$locale}', {intl l='Administrators - at the top' locale=$locale}, '', ''), + (1123, '{$locale}', {intl l='Administrators - bottom' locale=$locale}, '', ''), + (1124, '{$locale}', {intl l='Administrator - create form' locale=$locale}, '', ''), + (1125, '{$locale}', {intl l='Administrator - update form' locale=$locale}, '', ''), + (1126, '{$locale}', {intl l='Administrator - delete form' locale=$locale}, '', ''), + (1127, '{$locale}', {intl l='Administrators - JavaScript' locale=$locale}, '', ''), + (1128, '{$locale}', {intl l='Module hook - Edit JavaScript' locale=$locale}, '', ''), + (1129, '{$locale}', {intl l='Shipping configuration - at the top' locale=$locale}, '', ''), + (1130, '{$locale}', {intl l='Shipping configuration - table header' locale=$locale}, '', ''), + (1131, '{$locale}', {intl l='Shipping configuration - table row' locale=$locale}, '', ''), + (1132, '{$locale}', {intl l='Shipping configuration - bottom' locale=$locale}, '', ''), + (1133, '{$locale}', {intl l='Shipping configuration - create form' locale=$locale}, '', ''), + (1134, '{$locale}', {intl l='Shipping configuration - delete form' locale=$locale}, '', ''), + (1135, '{$locale}', {intl l='Shipping configuration - JavaScript' locale=$locale}, '', ''), + (1136, '{$locale}', {intl l='Features - at the top' locale=$locale}, '', ''), + (1137, '{$locale}', {intl l='Features - table header' locale=$locale}, '', ''), + (1138, '{$locale}', {intl l='Features - table row' locale=$locale}, '', ''), + (1139, '{$locale}', {intl l='Features - bottom' locale=$locale}, '', ''), + (1140, '{$locale}', {intl l='Feature - create form' locale=$locale}, '', ''), + (1141, '{$locale}', {intl l='Feature - delete form' locale=$locale}, '', ''), + (1142, '{$locale}', {intl l='Feature - add to all form' locale=$locale}, '', ''), + (1143, '{$locale}', {intl l='Feature - remove to all form' locale=$locale}, '', ''), + (1144, '{$locale}', {intl l='Features - JavaScript' locale=$locale}, '', ''), + (1145, '{$locale}', {intl l='Module - Edit JavaScript' locale=$locale}, '', ''), + (1146, '{$locale}', {intl l='Module hook - create form' locale=$locale}, '', ''), + (1147, '{$locale}', {intl l='Module hook - delete form' locale=$locale}, '', ''), + (1148, '{$locale}', {intl l='Module hook - JavaScript' locale=$locale}, '', ''), + (1149, '{$locale}', {intl l='Shipping configuration - Edit' locale=$locale}, '', ''), + (1150, '{$locale}', {intl l='Shipping configuration - country delete form' locale=$locale}, '', ''), + (1151, '{$locale}', {intl l='Shipping configuration - Edit JavaScript' locale=$locale}, '', ''), + (1152, '{$locale}', {intl l='Mailing system - at the top' locale=$locale}, '', ''), + (1153, '{$locale}', {intl l='Mailing system - bottom' locale=$locale}, '', ''), + (1154, '{$locale}', {intl l='Mailing system - JavaScript' locale=$locale}, '', ''), + (1155, '{$locale}', {intl l='Categories - at the top' locale=$locale}, '', ''), + (1156, '{$locale}', {intl l='Categories - caption' locale=$locale}, '', ''), + (1157, '{$locale}', {intl l='Categories - header' locale=$locale}, '', ''), + (1158, '{$locale}', {intl l='Categories - row' locale=$locale}, '', ''), + (1159, '{$locale}', {intl l='Products - caption' locale=$locale}, '', ''), + (1160, '{$locale}', {intl l='Products - header' locale=$locale}, '', ''), + (1161, '{$locale}', {intl l='Products - row' locale=$locale}, '', ''), + (1162, '{$locale}', {intl l='Categories - bottom' locale=$locale}, '', ''), + (1163, '{$locale}', {intl l='Categories - at the bottom of the catalog' locale=$locale}, '', ''), + (1164, '{$locale}', {intl l='Category - create form' locale=$locale}, '', ''), + (1165, '{$locale}', {intl l='Product - create form' locale=$locale}, '', ''), + (1166, '{$locale}', {intl l='Category - delete form' locale=$locale}, '', ''), + (1167, '{$locale}', {intl l='Product - delete form' locale=$locale}, '', ''), + (1168, '{$locale}', {intl l='Categories - JavaScript' locale=$locale}, '', ''), + (1169, '{$locale}', {intl l='Variables - at the top' locale=$locale}, '', ''), + (1170, '{$locale}', {intl l='Variables - table header' locale=$locale}, '', ''), + (1171, '{$locale}', {intl l='Variables - table row' locale=$locale}, '', ''), + (1172, '{$locale}', {intl l='Variables - bottom' locale=$locale}, '', ''), + (1173, '{$locale}', {intl l='Variable - create form' locale=$locale}, '', ''), + (1174, '{$locale}', {intl l='Variable - delete form' locale=$locale}, '', ''), + (1175, '{$locale}', {intl l='Variables - JavaScript' locale=$locale}, '', ''), + (1176, '{$locale}', {intl l='Order - product list' locale=$locale}, '', ''), + (1177, '{$locale}', {intl l='Order - Edit JavaScript' locale=$locale}, '', ''), + (1178, '{$locale}', {intl l='Store Information - JavaScript' locale=$locale}, '', ''), + (1179, '{$locale}', {intl l='Translations - JavaScript' locale=$locale}, '', ''), + (1180, '{$locale}', {intl l='Folder - at the top' locale=$locale}, '', ''), + (1181, '{$locale}', {intl l='Folder - caption' locale=$locale}, '', ''), + (1182, '{$locale}', {intl l='Folder - header' locale=$locale}, '', ''), + (1183, '{$locale}', {intl l='Folder - row' locale=$locale}, '', ''), + (1184, '{$locale}', {intl l='Contents - caption' locale=$locale}, '', ''), + (1185, '{$locale}', {intl l='Contents - header' locale=$locale}, '', ''), + (1186, '{$locale}', {intl l='Contents - row' locale=$locale}, '', ''), + (1187, '{$locale}', {intl l='Folder - bottom' locale=$locale}, '', ''), + (1188, '{$locale}', {intl l='Folder - create form' locale=$locale}, '', ''), + (1189, '{$locale}', {intl l='Content - create form' locale=$locale}, '', ''), + (1190, '{$locale}', {intl l='Folder - delete form' locale=$locale}, '', ''), + (1191, '{$locale}', {intl l='Content - delete form' locale=$locale}, '', ''), + (1192, '{$locale}', {intl l='Folder - JavaScript' locale=$locale}, '', ''), + (1193, '{$locale}', {intl l='Template - Edit JavaScript' locale=$locale}, '', ''), + (1194, '{$locale}', {intl l='Tax - Edit JavaScript' locale=$locale}, '', ''), + (1195, '{$locale}', {intl l='Hook - Edit JavaScript' locale=$locale}, '', ''), + (1196, '{$locale}', {intl l='Countries - at the top' locale=$locale}, '', ''), + (1197, '{$locale}', {intl l='Countries - table header' locale=$locale}, '', ''), + (1198, '{$locale}', {intl l='Countries - table row' locale=$locale}, '', ''), + (1199, '{$locale}', {intl l='Countries - bottom' locale=$locale}, '', ''), + (1200, '{$locale}', {intl l='Country - create form' locale=$locale}, '', ''), + (1201, '{$locale}', {intl l='Country - delete form' locale=$locale}, '', ''), + (1202, '{$locale}', {intl l='Countries - JavaScript' locale=$locale}, '', ''), + (1203, '{$locale}', {intl l='Currencies - at the top' locale=$locale}, '', ''), + (1204, '{$locale}', {intl l='Currencies - table header' locale=$locale}, '', ''), + (1205, '{$locale}', {intl l='Currencies - table row' locale=$locale}, '', ''), + (1206, '{$locale}', {intl l='Currencies - bottom' locale=$locale}, '', ''), + (1207, '{$locale}', {intl l='Currency - create form' locale=$locale}, '', ''), + (1208, '{$locale}', {intl l='Currency - delete form' locale=$locale}, '', ''), + (1209, '{$locale}', {intl l='Currencies - JavaScript' locale=$locale}, '', ''), + (1210, '{$locale}', {intl l='Customer - Edit' locale=$locale}, '', ''), + (1211, '{$locale}', {intl l='Customer - address create form' locale=$locale}, '', ''), + (1212, '{$locale}', {intl l='Customer - address update form' locale=$locale}, '', ''), + (1213, '{$locale}', {intl l='Customer - address delete form' locale=$locale}, '', ''), + (1214, '{$locale}', {intl l='Customer - Edit JavaScript' locale=$locale}, '', ''), + (1215, '{$locale}', {intl l='Attributes value - table header' locale=$locale}, '', ''), + (1216, '{$locale}', {intl l='Attributes value - table row' locale=$locale}, '', ''), + (1217, '{$locale}', {intl l='Attribute value - create form' locale=$locale}, '', ''), + (1218, '{$locale}', {intl l='Attribut - id delete form' locale=$locale}, '', ''), + (1219, '{$locale}', {intl l='Attribut - Edit JavaScript' locale=$locale}, '', ''), + (1220, '{$locale}', {intl l='Profiles - at the top' locale=$locale}, '', ''), + (1221, '{$locale}', {intl l='Profiles - bottom' locale=$locale}, '', ''), + (1222, '{$locale}', {intl l='Profile - create form' locale=$locale}, '', ''), + (1223, '{$locale}', {intl l='Profile - delete form' locale=$locale}, '', ''), + (1224, '{$locale}', {intl l='Profiles - JavaScript' locale=$locale}, '', ''), + (1225, '{$locale}', {intl l='Country - Edit JavaScript' locale=$locale}, '', ''), + (1226, '{$locale}', {intl l='Profile - Edit JavaScript' locale=$locale}, '', ''), + (1227, '{$locale}', {intl l='Variable - Edit JavaScript' locale=$locale}, '', ''), + (1228, '{$locale}', {intl l='Coupon - update JavaScript' locale=$locale}, '', ''), + (1229, '{$locale}', {intl l='Coupon - at the top' locale=$locale}, '', ''), + (1230, '{$locale}', {intl l='Coupon - list caption' locale=$locale}, '', ''), + (1231, '{$locale}', {intl l='Coupon - table header' locale=$locale}, '', ''), + (1232, '{$locale}', {intl l='Coupon - table row' locale=$locale}, '', ''), + (1233, '{$locale}', {intl l='Coupon - bottom' locale=$locale}, '', ''), + (1234, '{$locale}', {intl l='Coupon - list JavaScript' locale=$locale}, '', ''), + (1235, '{$locale}', {intl l='Module - configuration' locale=$locale}, '', ''), + (1236, '{$locale}', {intl l='Module - configuration JavaScript' locale=$locale}, '', ''), + (1237, '{$locale}', {intl l='Message - Edit JavaScript' locale=$locale}, '', ''), + (1238, '{$locale}', {intl l='Image - Edit JavaScript' locale=$locale}, '', ''), + (1239, '{$locale}', {intl l='Attributes - at the top' locale=$locale}, '', ''), + (1240, '{$locale}', {intl l='Attributes - table header' locale=$locale}, '', ''), + (1241, '{$locale}', {intl l='Attributes - table row' locale=$locale}, '', ''), + (1242, '{$locale}', {intl l='Attributes - bottom' locale=$locale}, '', ''), + (1243, '{$locale}', {intl l='Attribut - create form' locale=$locale}, '', ''), + (1244, '{$locale}', {intl l='Attribut - delete form' locale=$locale}, '', ''), + (1245, '{$locale}', {intl l='Attribut - add to all form' locale=$locale}, '', ''), + (1246, '{$locale}', {intl l='Attribut - remove to all form' locale=$locale}, '', ''), + (1247, '{$locale}', {intl l='Attributes - JavaScript' locale=$locale}, '', ''), + (1248, '{$locale}', {intl l='Logs - at the top' locale=$locale}, '', ''), + (1249, '{$locale}', {intl l='Logs - bottom' locale=$locale}, '', ''), + (1250, '{$locale}', {intl l='Logs - JavaScript' locale=$locale}, '', ''), + (1251, '{$locale}', {intl l='Folder - Edit JavaScript' locale=$locale}, '', ''), + (1252, '{$locale}', {intl l='Hooks - at the top' locale=$locale}, '', ''), + (1253, '{$locale}', {intl l='Hooks - table header' locale=$locale}, '', ''), + (1254, '{$locale}', {intl l='Hooks - table row' locale=$locale}, '', ''), + (1255, '{$locale}', {intl l='Hooks - bottom' locale=$locale}, '', ''), + (1256, '{$locale}', {intl l='Hook - create form' locale=$locale}, '', ''), + (1257, '{$locale}', {intl l='Hook - delete form' locale=$locale}, '', ''), + (1258, '{$locale}', {intl l='Hooks - JavaScript' locale=$locale}, '', ''), + (1259, '{$locale}', {intl l='Layout - CSS' locale=$locale}, '', ''), + (1260, '{$locale}', {intl l='Layout - before topbar' locale=$locale}, '', ''), + (1261, '{$locale}', {intl l='Layout - inside top bar' locale=$locale}, '', ''), + (1262, '{$locale}', {intl l='Layout - after top bar' locale=$locale}, '', ''), + (1263, '{$locale}', {intl l='Layout - before top menu' locale=$locale}, '', ''), + (1264, '{$locale}', {intl l='Layout - in top menu items' locale=$locale}, '', ''), + (1265, '{$locale}', {intl l='Layout - after top menu' locale=$locale}, '', ''), + (1266, '{$locale}', {intl l='Layout - before footer' locale=$locale}, '', ''), + (1267, '{$locale}', {intl l='Layout - in footer' locale=$locale}, '', ''), + (1268, '{$locale}', {intl l='Layout - after footer' locale=$locale}, '', ''), + (1269, '{$locale}', {intl l='Layout - JavaScript' locale=$locale}, '', ''), + (1270, '{$locale}', {intl l='Layout - at the top of the top bar' locale=$locale}, '', ''), + (1271, '{$locale}', {intl l='Layout - at the bottom of the top bar' locale=$locale}, '', ''), + (1272, '{$locale}', {intl l='Layout - in the menu customers' locale=$locale}, '', ''), + (1273, '{$locale}', {intl l='Layout - in the menu orders' locale=$locale}, '', ''), + (1274, '{$locale}', {intl l='Layout - in the menu catalog' locale=$locale}, '', ''), + (1275, '{$locale}', {intl l='Layout - in the menu folders' locale=$locale}, '', ''), + (1276, '{$locale}', {intl l='Layout - in the menu tools' locale=$locale}, '', ''), + (1277, '{$locale}', {intl l='Layout - in the menu modules' locale=$locale}, '', ''), + (1278, '{$locale}', {intl l='Layout - in the menu configuration' locale=$locale}, '', ''), + (1279, '{$locale}', {intl l='Brand - Edit JavaScript' locale=$locale}, '', ''), + (1280, '{$locale}', {intl l='Home - block' locale=$locale}, '', ''), + (1281, '{$locale}', {intl l='Brands - at the top' locale=$locale}, '', ''), + (1282, '{$locale}', {intl l='Brands - table header' locale=$locale}, '', ''), + (1283, '{$locale}', {intl l='Brands - table row' locale=$locale}, '', ''), + (1284, '{$locale}', {intl l='Brands - bottom' locale=$locale}, '', ''), + (1285, '{$locale}', {intl l='Brand - create form' locale=$locale}, '', ''), + (1286, '{$locale}', {intl l='Brand - delete form' locale=$locale}, '', ''), + (1287, '{$locale}', {intl l='Brand - JavaScript' locale=$locale}, '', ''), + (1288, '{$locale}', {intl l='Exports - at the top' locale=$locale}, '', ''), + (1289, '{$locale}', {intl l='Exports - at the bottom of a category' locale=$locale}, '', ''), + (1290, '{$locale}', {intl l='Exports - at the bottom of column 1' locale=$locale}, '', ''), + (1291, '{$locale}', {intl l='Exports - JavaScript' locale=$locale}, '', ''), + (1292, '{$locale}', {intl l='Export - JavaScript' locale=$locale}, '', ''), + (1293, '{$locale}', {intl l='Brand - content' locale=$locale}, '', ''), + (1294, '{$locale}', {intl l='Customer - order table header' locale=$locale}, '', ''), + (1295, '{$locale}', {intl l='Customer - order table row' locale=$locale}, '', ''), + + (2001, '{$locale}', {intl l='Invoice - CSS' locale=$locale}, '', ''), + (2002, '{$locale}', {intl l='Invoice - in the header' locale=$locale}, '', ''), + (2003, '{$locale}', {intl l='Invoice - at the top of the footer' locale=$locale}, '', ''), + (2004, '{$locale}', {intl l='Invoice - imprint' locale=$locale}, '', ''), + (2005, '{$locale}', {intl l='Invoice - at the bottom of the footer' locale=$locale}, '', ''), + (2006, '{$locale}', {intl l='Invoice - at the bottom of information area' locale=$locale}, '', ''), + (2007, '{$locale}', {intl l='Invoice - after the information area' locale=$locale}, '', ''), + (2008, '{$locale}', {intl l='Invoice - delivery address' locale=$locale}, '', ''), + (2009, '{$locale}', {intl l='Invoice - after addresse area' locale=$locale}, '', ''), + (2010, '{$locale}', {intl l='Invoice - after product listing' locale=$locale}, '', ''), + (2011, '{$locale}', {intl l='Invoice - after the order summary' locale=$locale}, '', ''), + (2012, '{$locale}', {intl l='Delivery - CSS' locale=$locale}, '', ''), + (2013, '{$locale}', {intl l='Delivery - in the header' locale=$locale}, '', ''), + (2014, '{$locale}', {intl l='Delivery - at the top of the footer' locale=$locale}, '', ''), + (2015, '{$locale}', {intl l='Delivery - imprint' locale=$locale}, '', ''), + (2016, '{$locale}', {intl l='Delivery - at the bottom of the footer' locale=$locale}, '', ''), + (2017, '{$locale}', {intl l='Delivery - at the bottom of information area' locale=$locale}, '', ''), + (2018, '{$locale}', {intl l='Delivery - after the information area' locale=$locale}, '', ''), + (2019, '{$locale}', {intl l='Delivery - delivery address' locale=$locale}, '', ''), + (2020, '{$locale}', {intl l='Delivery - after addresse area' locale=$locale}, '', ''), + (2021, '{$locale}', {intl l='Delivery - after the order summary' locale=$locale}, '', ''), + + (2022, '{$locale}', {intl l='Order confirmation - after the order summary' locale=$locale}, '', ''), + + (2023, '{$locale}', {intl l='Where the WYSIWYG editor is required' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +# ====================================================================================================================== +# Image / Document visible +# ====================================================================================================================== + +ALTER TABLE `product_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `product_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `category_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `category_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `content_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `content_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `folder_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `folder_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `module_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; +ALTER TABLE `brand_document` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +ALTER TABLE `brand_image` + ADD COLUMN `visible` TINYINT DEFAULT 1 NOT NULL + AFTER `file` +; + +-- Add version to customer +ALTER TABLE `customer` + ADD COLUMN `version` INTEGER DEFAULT 0 +; + +ALTER TABLE `customer` + ADD COLUMN `version_created_at` DATETIME +; + +ALTER TABLE `customer` + ADD COLUMN `version_created_by` VARCHAR(100) +; + +-- --------------------------------------------------------------------- +-- customer_version +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `customer_version`; + +CREATE TABLE `customer_version` +( + `id` INTEGER NOT NULL, + `ref` VARCHAR(50), + `title_id` INTEGER NOT NULL, + `firstname` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(255) NOT NULL, + `email` VARCHAR(255), + `password` VARCHAR(255), + `algo` VARCHAR(128), + `reseller` TINYINT, + `lang` VARCHAR(10), + `sponsor` VARCHAR(50), + `discount` FLOAT, + `remember_me_token` VARCHAR(255), + `remember_me_serial` VARCHAR(255), + `created_at` DATETIME, + `updated_at` DATETIME, + `version` INTEGER DEFAULT 0 NOT NULL, + `version_created_at` DATETIME, + `version_created_by` VARCHAR(100), + `order_ids` TEXT, + `order_versions` TEXT, + PRIMARY KEY (`id`,`version`), + CONSTRAINT `customer_version_FK_1` + FOREIGN KEY (`id`) + REFERENCES `customer` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + + + +# ====================================================================================================================== +# Order placed notification +# ====================================================================================================================== + +SELECT @store_email := `value` FROM `config` where name='store_email'; + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +('store_notification_emails', IFNULL(@store_email, ''), 1, 1, NOW(), NOW()); + +SELECT @max_id := MAX(`id`) FROM `message`; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'order_notification', NULL, NULL, 'order_notification.txt', NULL, 'order_notification.html', NOW(), NOW()), + (@max_id+2, 'customer_account_changed', 0, NULL, 'account_changed_by_admin.txt', NULL, 'account_changed_by_admin.html', NOW(), NOW()), + (@max_id+3, 'customer_account_created', 0, NULL, 'account_created_by_admin.txt', NULL, 'account_created_by_admin.html', NOW(), NOW()); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Message sent to the shop owner when a new order is placed' locale=$locale}, {intl l='New order {$order_ref} placed on {config key="store_name"}' locale=$locale}, NULL, NULL), + (@max_id+2, '{$locale}', {intl l='Mail sent to the customer when its password or email is changed in the back-office' locale=$locale}, {intl l='Your account information on {config key="store_name"} has been changed.' locale=$locale}, NULL, NULL), + (@max_id+3, '{$locale}', {intl l='Mail sent to the customer when its account is created by an administrator in the back-office' locale=$locale}, {intl l='A {config key="store_name"} account has been created for you' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +# ====================================================================================================================== +# Add Virtual product +# ====================================================================================================================== + +ALTER TABLE `product` + ADD `virtual` TINYINT DEFAULT 0 NOT NULL + AFTER `ref`; + +ALTER TABLE `product_version` + ADD `virtual` TINYINT DEFAULT 0 NOT NULL + AFTER `ref`; + + +ALTER TABLE `order_product` + ADD `virtual` TINYINT DEFAULT 0 NOT NULL + AFTER `postscriptum`; + +ALTER TABLE `order_product` + ADD `virtual_document` VARCHAR(255) + AFTER `virtual`; + + +# ====================================================================================================================== +# Add Meta data +# ====================================================================================================================== + +DROP TABLE IF EXISTS `meta_data`; + +CREATE TABLE `meta_data` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `meta_key` VARCHAR(100) NOT NULL, + `element_key` VARCHAR(100) NOT NULL, + `element_id` INTEGER NOT NULL, + `is_serialized` TINYINT(1) NOT NULL, + `value` LONGTEXT NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `meta_data_key_element_idx` (`meta_key`, `element_key`, `element_id`) +) ENGINE=InnoDB CHARACTER SET='utf8'; + + +# ====================================================================================================================== +# Allow negative stock +# ====================================================================================================================== + +INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES + ('allow_negative_stock', '0', 0, 0, NOW(), NOW()); + +SELECT @max_id := MAX(`id`) FROM `config`; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max_id, '{$locale}', {intl l='Allow negative product stock (1) or not (0, default)' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +# ====================================================================================================================== +# Module configuration +# ====================================================================================================================== + +-- --------------------------------------------------------------------- +-- module_config +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_config`; + +CREATE TABLE `module_config` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `module_id` INTEGER NOT NULL, + `name` VARCHAR(255) NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_module_id_name` (`module_id`, `name`), + CONSTRAINT `fk_module_config_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- --------------------------------------------------------------------- +-- module_config_i18n +-- --------------------------------------------------------------------- + +DROP TABLE IF EXISTS `module_config_i18n`; + +CREATE TABLE `module_config_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `value` TEXT, + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `module_config_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `module_config` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +# ====================================================================================================================== +# Update of short title Mister +# ====================================================================================================================== + +-- en_US +UPDATE `customer_title_i18n` + SET `short` = 'Mr.' + WHERE `customer_title_i18n`.`id` = 1 + AND `customer_title_i18n`.`locale` = 'en_US'; +-- fr_FR +UPDATE `customer_title_i18n` + SET `short` = 'M.' + WHERE `customer_title_i18n`.`id` = 1 + AND `customer_title_i18n`.`locale` = 'fr_FR'; + + +# ====================================================================================================================== +# Adding missing resources +# ====================================================================================================================== + +SELECT @max_id := MAX(`id`) FROM `resource`; + +INSERT INTO resource (`id`, `code`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'admin.hook', NOW(), NOW()), +(@max_id+2, 'admin.module-hook', NOW(), NOW()), +(@max_id+3, 'admin.sales', NOW(), NOW()), +(@max_id+4, 'admin.administrator', NOW(), NOW()), +(@max_id+5, 'admin.configuration.category', NOW(), NOW()), +(@max_id+6, 'admin.configuration.shipping-configuration', NOW(), NOW()), +(@max_id+7, 'admin.configuration.tax-rule', NOW(), NOW()), +(@max_id+8, 'admin.hooks', NOW(), NOW()), +(@max_id+9, 'admin.import', NOW(), NOW()), +(@max_id+10, 'admin.modules', NOW(), NOW()), +(@max_id+11, 'admin.profile', NOW(), NOW()) +; + +INSERT INTO resource_i18n (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Hooks' locale=$locale}), + (@max_id+2, '{$locale}', {intl l='Hook positions' locale=$locale}), + (@max_id+3, '{$locale}', {intl l='Sales management' locale=$locale}), + (@max_id+4, '{$locale}', {intl l='Administrator list' locale=$locale}), + (@max_id+5, '{$locale}', {intl l='Category configuration' locale=$locale}), + (@max_id+6, '{$locale}', {intl l='Shipping configuration' locale=$locale}), + (@max_id+7, '{$locale}', {intl l='Tax rules configuration' locale=$locale}), + (@max_id+8, '{$locale}', {intl l='Hooks management' locale=$locale}), + (@max_id+9, '{$locale}', {intl l='Data import / export' locale=$locale}), + (@max_id+10, '{$locale}', {intl l='Modules management' locale=$locale}), + (@max_id+11, '{$locale}', {intl l='Administration profiles management' locale=$locale}){if ! $locale@last},{/if} + +{/foreach} +; + +# ====================================================================================================================== +# Adding cart id in order table +# ====================================================================================================================== + +ALTER TABLE `order_version` + ADD `customer_id_version` INTEGER DEFAULT 0 + AFTER `version_created_by`; + + +# ====================================================================================================================== +# End of changes +# ====================================================================================================================== + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.1.0-alpha2.sql.tpl b/setup/update/tpl/2.1.0-alpha2.sql.tpl new file mode 100644 index 00000000..1f8f4a04 --- /dev/null +++ b/setup/update/tpl/2.1.0-alpha2.sql.tpl @@ -0,0 +1,118 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0-alpha2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha2' WHERE `name`='thelia_extra_version'; + +UPDATE `config` SET `name`='form_firewall_active' WHERE `name`='from_firewall_active'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'cart.use_persistent_cookie', '1', 0, 0, NOW(), NOW()), +(@max_id + 2, 'cart.cookie_name', 'thelia_cart', 0, 0, NOW(), NOW()), +(@max_id + 3, 'cart.cookie_lifetime', '31536060', 0, 0, NOW(), NOW()), +(@max_id + 4, 'allow_slash_ended_uri', 1, 0, 0, NOW(), NOW()) +; + + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Use a persistent cookie to keep track of customer cart' locale=$locale}, NULL, NULL, NULL), +(@max_id + 2, '{$locale}', {intl l='Name the cart cookie' locale=$locale}, NULL, NULL, NULL), +(@max_id + 3, '{$locale}', {intl l='Life time of the cart cookie in the customer browser, in seconds' locale=$locale}, NULL, NULL, NULL), +(@max_id + 4, '{$locale}', {intl l='Allow slash ended uri' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +DELETE FROM `config` WHERE `name`='currency_rate_update_url'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'order-edit.cart-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'order-edit.cart-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+3, 'order-edit.bill-top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+4, 'order-edit.bill-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+5, 'order-edit.before-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+6, 'order-edit.before-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+7, 'order-edit.after-order-product-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+8, 'order-edit.after-order-product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+9, 'sales.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+10, 'sales.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+11, 'sales.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+12, 'sales.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+13, 'sale.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+14, 'sale.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+15, 'sales.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+16, 'product.combinations-row', 2, 0, 1, 1, 1, 1, NOW(), NOW()), + (@max_id+17, 'main.before-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+18, 'main.after-content', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Order - cart top' locale=$locale}, '', ''), + (@max_id+2, '{$locale}', {intl l='Order - cart bottom' locale=$locale}, '', ''), + (@max_id+3, '{$locale}', {intl l='Order - bill top' locale=$locale}, '', ''), + (@max_id+4, '{$locale}', {intl l='Order - bill bottom' locale=$locale}, '', ''), + (@max_id+5, '{$locale}', {intl l='Order - Before product list' locale=$locale}, '', ''), + (@max_id+6, '{$locale}', {intl l='Order - Before starting product row' locale=$locale}, '', ''), + (@max_id+7, '{$locale}', {intl l='Order - After closing product row' locale=$locale}, '', ''), + (@max_id+8, '{$locale}', {intl l='Order - After product list' locale=$locale}, '', ''), + (@max_id+9, '{$locale}', {intl l='Sales - at the top' locale=$locale}, '', ''), + (@max_id+10, '{$locale}', {intl l='Sales - table header' locale=$locale}, '', ''), + (@max_id+11, '{$locale}', {intl l='Sales - table row' locale=$locale}, '', ''), + (@max_id+12, '{$locale}', {intl l='Sales - at the bottom' locale=$locale}, '', ''), + (@max_id+13, '{$locale}', {intl l='Sale - create form' locale=$locale}, '', ''), + (@max_id+14, '{$locale}', {intl l='Sale - delete form' locale=$locale}, '', ''), + (@max_id+15, '{$locale}', {intl l='Sales - JavaScript' locale=$locale}, '', ''), + (@max_id+16, '{$locale}', {intl l='Product - at the bottom of a product combination' locale=$locale}, '', ''), + (@max_id+17, '{$locale}', {intl l='Layout - Before the main content' locale=$locale}, '', ''), + (@max_id+18, '{$locale}', {intl l='Admin layout - After the main content' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +# ====================================================================================================================== +# Module version, min & max Thelia version supported +# ====================================================================================================================== + +ALTER TABLE `module` + ADD COLUMN `category` VARCHAR(50) DEFAULT 'classic' NOT NULL + AFTER `type` +; + +UPDATE `module` SET `category` = 'classic' WHERE `type` = 1; +UPDATE `module` SET `category` = 'delivery' WHERE `type` = 2; +UPDATE `module` SET `category` = 'payment' WHERE `type` = 3; + +ALTER TABLE `module` + ADD COLUMN `version` VARCHAR(10) DEFAULT '' NOT NULL + AFTER `code` +; + +UPDATE `country` SET `isoalpha2` = 'BH' WHERE `isoalpha3` = 'BHR'; +UPDATE `country` SET `isoalpha2` = 'MG' WHERE `isoalpha3` = 'MDG'; + + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `module`; +SELECT @max_classic_position := IFNULL(MAX(`position`),0) FROM `module` WHERE `type`=1; + + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'TheliaSmarty', 1, 1, @max_classic_position+1, 'TheliaSmarty\\TheliaSmarty', NOW(), NOW()), +(@max_id+2, 'VirtualProductControl', 1, 1, @max_classic_position+2, 'VirtualProductControl\\VirtualProductControl', NOW(), NOW()) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max_id+1, '{$locale}', {intl l='Smarty template engine integration' locale=$locale}, NULL, NULL, NULL), +(@max_id+2, '{$locale}', {intl l='Virtual Product Controller' locale=$locale}, {intl l='Check if a virtual product delivery module is enabled if at least one product is virtual' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.1.0-beta1.sql.tpl b/setup/update/tpl/2.1.0-beta1.sql.tpl new file mode 100644 index 00000000..e849e1bb --- /dev/null +++ b/setup/update/tpl/2.1.0-beta1.sql.tpl @@ -0,0 +1,160 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0-beta1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta1' WHERE `name`='thelia_extra_version'; + +DELETE FROM `config` WHERE `name`='session_config.handlers'; + +CREATE TABLE IF NOT EXISTS `api` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `label` VARCHAR(255), + `api_key` VARCHAR(100), + `profile_id` INTEGER, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `idx_api_profile_id` (`profile_id`), + CONSTRAINT `fk_api_profile_id` + FOREIGN KEY (`profile_id`) + REFERENCES `profile` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT +) ENGINE=InnoDB CHARACTER SET='utf8'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +-- Add the session_config.lifetime configuration variable +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'session_config.lifetime', '0', 0, 0, NOW(), NOW()), +(@max_id + 2, 'error_message.show', '1', 0, 0, NOW(), NOW()), +(@max_id + 3, 'error_message.page_name', 'error.html', 0, 0, NOW(), NOW()) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Life time of the session cookie in the customer browser, in seconds' locale=$locale}, NULL, NULL, NULL), +(@max_id + 2, '{$locale}', {intl l='Show error message instead of a white page on a server error' locale=$locale}, NULL, NULL, NULL), +(@max_id + 3, '{$locale}', {intl l='Filename of the error page' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Hide the session_config.handlers configuration variable +UPDATE `config` SET `secured`=1, `hidden`=1 where `name`='session_config.handlers'; + +-- Hooks + +-- front hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) + VALUES +(@max_id + 1, 'category.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'category.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'content.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'content.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'folder.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'folder.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'brand.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 8, 'brand.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 9, 'brand.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 10, 'brand.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 11, 'brand.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 12, 'brand.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 13, 'brand.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 14, 'brand.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 15, 'brand.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 16, 'brand.sidebar-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 17, 'brand.sidebar-body', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 18, 'brand.sidebar-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 19, 'account-order.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 20, 'account-order.information', 1, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 21, 'account-order.after-information', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 22, 'account-order.delivery-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 23, 'account-order.delivery-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 24, 'account-order.invoice-information', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 25, 'account-order.invoice-address', 1, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 26, 'account-order.after-addresses', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 27, 'account-order.products-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 28, 'account-order.product-extra', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 29, 'account-order.products-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 30, 'account-order.after-products', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 31, 'account-order.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 32, 'account-order.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 33, 'account-order.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 34, 'account-order.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Category page - before the main content area' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='Category page - after the main content area' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='Content page - before the main content area' locale=$locale}, '', ''), +(@max_id + 4, '{$locale}', {intl l='Content page - after the main content area' locale=$locale}, '', ''), +(@max_id + 5, '{$locale}', {intl l='Folder page - before the main content area' locale=$locale}, '', ''), +(@max_id + 6, '{$locale}', {intl l='Folder page - after the main content area' locale=$locale}, '', ''), +(@max_id + 7, '{$locale}', {intl l='Brands page - at the top' locale=$locale}, '', ''), +(@max_id + 8, '{$locale}', {intl l='Brands page - at the bottom' locale=$locale}, '', ''), +(@max_id + 9, '{$locale}', {intl l='Brands page - at the top of the main area' locale=$locale}, '', ''), +(@max_id + 10, '{$locale}', {intl l='Brands page - at the bottom of the main area' locale=$locale}, '', ''), +(@max_id + 11, '{$locale}', {intl l='Brands page - before the main content area' locale=$locale}, '', ''), +(@max_id + 12, '{$locale}', {intl l='Brands page - after the main content area' locale=$locale}, '', ''), +(@max_id + 13, '{$locale}', {intl l='Brands page - CSS stylesheet' locale=$locale}, '', ''), +(@max_id + 14, '{$locale}', {intl l='Brands page - after javascript include' locale=$locale}, '', ''), +(@max_id + 15, '{$locale}', {intl l='Brands page - javascript initialization' locale=$locale}, '', ''), +(@max_id + 16, '{$locale}', {intl l='Brands page - at the top of the sidebar' locale=$locale}, '', ''), +(@max_id + 17, '{$locale}', {intl l='Brands page - the body of the sidebar' locale=$locale}, '', ''), +(@max_id + 18, '{$locale}', {intl l='Brands page - at the bottom of the sidebar' locale=$locale}, '', ''), +(@max_id + 19, '{$locale}', {intl l='Order details - at the top' locale=$locale}, '', ''), +(@max_id + 20, '{$locale}', {intl l='Order details - additional information' locale=$locale}, '', ''), +(@max_id + 21, '{$locale}', {intl l='Order details - after global information' locale=$locale}, '', ''), +(@max_id + 22, '{$locale}', {intl l='Order details - additional delivery information' locale=$locale}, '', ''), +(@max_id + 23, '{$locale}', {intl l='Order details - delivery address' locale=$locale}, '', ''), +(@max_id + 24, '{$locale}', {intl l='Order details - additional invoice information' locale=$locale}, '', ''), +(@max_id + 25, '{$locale}', {intl l='Order details - invoice address' locale=$locale}, '', ''), +(@max_id + 26, '{$locale}', {intl l='Order details - after addresses' locale=$locale}, '', ''), +(@max_id + 27, '{$locale}', {intl l='Order details - before products list' locale=$locale}, '', ''), +(@max_id + 28, '{$locale}', {intl l='Order details - additional product information' locale=$locale}, '', ''), +(@max_id + 29, '{$locale}', {intl l='Order details - after products list' locale=$locale}, '', ''), +(@max_id + 30, '{$locale}', {intl l='Order details - after products' locale=$locale}, '', ''), +(@max_id + 31, '{$locale}', {intl l='Order details - at the bottom' locale=$locale}, '', ''), +(@max_id + 32, '{$locale}', {intl l='Order details - CSS stylesheet' locale=$locale}, '', ''), +(@max_id + 33, '{$locale}', {intl l='Order details - after javascript include' locale=$locale}, '', ''), +(@max_id + 34, '{$locale}', {intl l='Order details - javascript initialization' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + + +-- admin hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'category.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'product.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'folder.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'content.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'brand.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'order-edit.bill-delivery-address', 2, 1, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Category - Tab' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='Product - Tab' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='Folder - Tab' locale=$locale}, '', ''), +(@max_id + 4, '{$locale}', {intl l='Content - Tab' locale=$locale}, '', ''), +(@max_id + 5, '{$locale}', {intl l='Brand - Tab' locale=$locale}, '', ''), +(@max_id + 6, '{$locale}', {intl l='Order edit - delivery address' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + + +SET FOREIGN_KEY_CHECKS = 1; + diff --git a/setup/update/tpl/2.1.0-beta2.sql.tpl b/setup/update/tpl/2.1.0-beta2.sql.tpl new file mode 100644 index 00000000..be1fd875 --- /dev/null +++ b/setup/update/tpl/2.1.0-beta2.sql.tpl @@ -0,0 +1,25 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- Hooks + +-- front hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'account.additional', 1, 0, 1, 1, 1, 1, NOW(), NOW()), + +(@max_id + 2, 'product.modification.form_top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'product.modification.form_bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Customer account - additional information' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='Product page - On the top of the form' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='Product page - On the bottom of the form' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.0.sql.tpl b/setup/update/tpl/2.1.0.sql.tpl new file mode 100644 index 00000000..8b599513 --- /dev/null +++ b/setup/update/tpl/2.1.0.sql.tpl @@ -0,0 +1,42 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + + +UPDATE `config` SET `value`='1' WHERE `name`='cart.use_persistent_cookie'; + +-- Order + +ALTER TABLE `order` ADD `postage_tax` FLOAT DEFAULT 0 NOT NULL AFTER `postage` ; +ALTER TABLE `order` ADD `postage_tax_rule_title` VARCHAR(255) AFTER `postage_tax` ; + +ALTER TABLE `order_version` ADD `postage_tax` FLOAT DEFAULT 0 NOT NULL AFTER `postage` ; +ALTER TABLE `order_version` ADD `postage_tax_rule_title` VARCHAR(255) AFTER `postage_tax` ; + +-- Hooks +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'brand.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'sale.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'api.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'api.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'api.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Brand edit page - in the form' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='Sale edit page - javascript last call block' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='Api page - at top' locale=$locale}, '', ''), +(@max_id + 4, '{$locale}', {intl l='Api page - at bottom' locale=$locale}, '', ''), +(@max_id + 5, '{$locale}', {intl l='Api page - in deletion form' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.1.sql.tpl b/setup/update/tpl/2.1.1.sql.tpl new file mode 100644 index 00000000..78876dec --- /dev/null +++ b/setup/update/tpl/2.1.1.sql.tpl @@ -0,0 +1,10 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.2.sql.tpl b/setup/update/tpl/2.1.2.sql.tpl new file mode 100644 index 00000000..70111121 --- /dev/null +++ b/setup/update/tpl/2.1.2.sql.tpl @@ -0,0 +1,46 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SELECT @maxHookId := MAX(`id`) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@maxHookId + 1, 'coupon.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@maxHookId + 1, '{$locale}', {intl l='Coupon page - in deletion form' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +UPDATE `config_i18n` SET `title`='Utiliser un cookie persistant pour memoriser le panier du client' WHERE `locale`='fr_FR' AND `id`=(SELECT`id` FROM `config` WHERE `name`='cart.use_persistent_cookie'); + +-- New ignored_module_hook table + +CREATE TABLE IF NOT EXISTS `ignored_module_hook` +( + `module_id` INTEGER NOT NULL, + `hook_id` INTEGER NOT NULL, + `method` VARCHAR(255), + `classname` VARCHAR(255), + INDEX `fk_deleted_module_hook_module_id_idx` (`module_id`), + INDEX `fk_deleted_module_hook_hook_id_idx` (`hook_id`), + CONSTRAINT `fk_deleted_module_hook_module_id` + FOREIGN KEY (`module_id`) + REFERENCES `module` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_deleted_module_hook_hook_id` + FOREIGN KEY (`hook_id`) + REFERENCES `hook` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.1.3.sql.tpl b/setup/update/tpl/2.1.3.sql.tpl new file mode 100644 index 00000000..72a6cdf4 --- /dev/null +++ b/setup/update/tpl/2.1.3.sql.tpl @@ -0,0 +1,16 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +-- Add the session_config.lifetime configuration variable +INSERT IGNORE INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'form.secret', 'ThisIsNotASecret', 0, 0, NOW(), NOW()); + + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.4.sql.tpl b/setup/update/tpl/2.1.4.sql.tpl new file mode 100644 index 00000000..b7d84201 --- /dev/null +++ b/setup/update/tpl/2.1.4.sql.tpl @@ -0,0 +1,24 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.4' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='4' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SELECT @max_id := MAX(`id`) FROM hook; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'export.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'export.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l="Export modal or page - top" locale=$locale}, '', ''), + (@max_id+2, '{$locale}', {intl l="Export modal or page - bottom" locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.5.sql.tpl b/setup/update/tpl/2.1.5.sql.tpl new file mode 100644 index 00000000..fb7260ef --- /dev/null +++ b/setup/update/tpl/2.1.5.sql.tpl @@ -0,0 +1,29 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.5' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='5' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `category` CHANGE `parent` `parent` INT( 11 ) NULL DEFAULT '0'; +ALTER TABLE `category_version` CHANGE `parent` `parent` INT( 11 ) NULL DEFAULT '0'; + +SELECT @max_id := MAX(`id`) FROM hook; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'invoice.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'delivery.order-product', 3, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `chapo`, `description`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Invoice - additional product information' locale=$locale}, '', ''), + (@max_id+2, '{$locale}', {intl l='Delivery - additional product information' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +UPDATE `hook` SET `by_module` = 1 WHERE `code` = 'module.config-js'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.6.sql.tpl b/setup/update/tpl/2.1.6.sql.tpl new file mode 100644 index 00000000..21713348 --- /dev/null +++ b/setup/update/tpl/2.1.6.sql.tpl @@ -0,0 +1,11 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.6' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='6' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +UPDATE hook SET by_module = '1' WHERE hook.code = 'module.configuration'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.7.sql.tpl b/setup/update/tpl/2.1.7.sql.tpl new file mode 100644 index 00000000..f5b7a5af --- /dev/null +++ b/setup/update/tpl/2.1.7.sql.tpl @@ -0,0 +1,45 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.7' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='7' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_image_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_image_id` +FOREIGN KEY (`product_image_id`) +REFERENCES `product_image` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_document_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_document_id` +FOREIGN KEY (`product_document_id`) +REFERENCES `product_document` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.1.8.sql.tpl b/setup/update/tpl/2.1.8.sql.tpl new file mode 100644 index 00000000..db58e354 --- /dev/null +++ b/setup/update/tpl/2.1.8.sql.tpl @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.8' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='8' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.1.9.sql.tpl b/setup/update/tpl/2.1.9.sql.tpl new file mode 100644 index 00000000..4591df91 --- /dev/null +++ b/setup/update/tpl/2.1.9.sql.tpl @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.1.9' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='9' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.2.0-alpha1.sql.tpl b/setup/update/tpl/2.2.0-alpha1.sql.tpl new file mode 100644 index 00000000..c84efb47 --- /dev/null +++ b/setup/update/tpl/2.2.0-alpha1.sql.tpl @@ -0,0 +1,222 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-alpha1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha1' WHERE `name`='thelia_extra_version'; + +-- order status + +SELECT @max_id := MAX(`id`) FROM `order_status`; + +INSERT INTO `order_status` VALUES + (@max_id + 1, "refunded", NOW(), NOW()) +; + +INSERT INTO `order_status_i18n` VALUES +{foreach $locales as $locale} +(@max_id + 1, "{$locale}", {intl l="Refunded" locale=$locale}, "", "", ""){if ! $locale@last},{/if} + +{/foreach} +; + +-- new column in admin_log + +ALTER TABLE `admin_log` ADD `resource_id` INTEGER AFTER `resource` ; + +-- new config + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'customer_change_email', '0', 0, 0, NOW(), NOW()), +(@max_id + 2, 'customer_confirm_email', '0', 0, 0, NOW(), NOW()) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Allow customers to change their email. 1 for yes, 0 for no' locale=$locale}, NULL, NULL, NULL), +(@max_id + 2, '{$locale}', {intl l='Ask the customers to confirm their email, 1 for yes, 0 for no' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- country area table + +create table IF NOT EXISTS `country_area` +( + `country_id` INTEGER NOT NULL, + `area_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + INDEX `country_area_area_id_idx` (`area_id`), + INDEX `fk_country_area_country_id_idx` (`country_id`), + CONSTRAINT `fk_country_area_area_id` + FOREIGN KEY (`area_id`) + REFERENCES `area` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + CONSTRAINT `fk_country_area_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +-- Initialize the table with existing data +INSERT INTO `country_area` (`country_id`, `area_id`, `created_at`, `updated_at`) select `id`, `area_id`, NOW(), NOW() FROM `country` WHERE `area_id` IS NOT NULL; + +-- Remove area_id column from country table +ALTER TABLE `country` DROP FOREIGN KEY `fk_country_area_id`; +ALTER TABLE `country` DROP KEY `idx_country_area_id`; +ALTER TABLE `country` DROP COLUMN `area_id`; +ALTER TABLE `category` ADD COLUMN `default_template_id` INTEGER AFTER `position`; + +-- new hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'profile.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'profile.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'import.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'import.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'export.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'export.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'category-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 8, 'category-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 9, 'brand-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 10, 'brand-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 11, 'attribute-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 12, 'attribute-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 13, 'currency-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 14, 'currency-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 15, 'country-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 16, 'country-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 17, 'content-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 18, 'content-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 19, 'feature-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 20, 'feature-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 21, 'document-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 22, 'document-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 23, 'customer-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 24, 'customer-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 25, 'image-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 26, 'image-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 27, 'hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 28, 'hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 29, 'folder-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 30, 'folder-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 31, 'module-hook-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 32, 'module-hook-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 33, 'module-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 34, 'module-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 35, 'message-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 36, 'message-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 37, 'profile-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 38, 'profile-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 39, 'product-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 40, 'product-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 41, 'order-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 42, 'order-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 43, 'shipping-zones-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 44, 'shipping-zones-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 45, 'shipping-configuration-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 46, 'shipping-configuration-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 47, 'sale-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 48, 'sale-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 49, 'variables-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 50, 'variables-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 51, 'template-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 52, 'template-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 53, 'tax-rule-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 54, 'tax-rule-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 55, 'tax-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 56, 'tax-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 57, 'order-edit.product-list', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 58, 'order.tab', 2, 0, 1, 1, 1, 1, NOW(), NOW()), +(@max_id + 59, 'account-order.product', 1, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 60, 'tab-seo.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 61, 'tab-seo.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 62, 'tab-image.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 63, 'tab-image.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 64, 'tab-document.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 65, 'tab-document.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Profile - table header' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='Profile - table row' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='Import - table header' locale=$locale}, '', ''), +(@max_id + 4, '{$locale}', {intl l='Import - table row' locale=$locale}, '', ''), +(@max_id + 5, '{$locale}', {intl l='Export - table header' locale=$locale}, '', ''), +(@max_id + 6, '{$locale}', {intl l='Export - table row' locale=$locale}, '', ''), +(@max_id + 7, '{$locale}', {intl l='Category edit - top' locale=$locale}, '', ''), +(@max_id + 8, '{$locale}', {intl l='Category edit - bottom' locale=$locale}, '', ''), +(@max_id + 9, '{$locale}', {intl l='Brand edit - top' locale=$locale}, '', ''), +(@max_id + 10, '{$locale}', {intl l='Brand edit - bottom' locale=$locale}, '', ''), +(@max_id + 11, '{$locale}', {intl l='Attribute edit - top' locale=$locale}, '', ''), +(@max_id + 12, '{$locale}', {intl l='Attribute edit - bottom' locale=$locale}, '', ''), +(@max_id + 13, '{$locale}', {intl l='Currency edit - top' locale=$locale}, '', ''), +(@max_id + 14, '{$locale}', {intl l='Currency edit - bottom' locale=$locale}, '', ''), +(@max_id + 15, '{$locale}', {intl l='Country edit - top' locale=$locale}, '', ''), +(@max_id + 16, '{$locale}', {intl l='Country edit - bottom' locale=$locale}, '', ''), +(@max_id + 17, '{$locale}', {intl l='Content edit - top' locale=$locale}, '', ''), +(@max_id + 18, '{$locale}', {intl l='Content edit - bottom' locale=$locale}, '', ''), +(@max_id + 19, '{$locale}', {intl l='Feature edit - top' locale=$locale}, '', ''), +(@max_id + 20, '{$locale}', {intl l='Feature edit - bottom' locale=$locale}, '', ''), +(@max_id + 21, '{$locale}', {intl l='Document edit - top' locale=$locale}, '', ''), +(@max_id + 22, '{$locale}', {intl l='Document edit - bottom' locale=$locale}, '', ''), +(@max_id + 23, '{$locale}', {intl l='Client edit - top' locale=$locale}, '', ''), +(@max_id + 24, '{$locale}', {intl l='Client edit - bottom' locale=$locale}, '', ''), +(@max_id + 25, '{$locale}', {intl l='Image edit - top' locale=$locale}, '', ''), +(@max_id + 26, '{$locale}', {intl l='Image edit - bottom' locale=$locale}, '', ''), +(@max_id + 27, '{$locale}', {intl l='Hook edit - top' locale=$locale}, '', ''), +(@max_id + 28, '{$locale}', {intl l='Hook edit - bottom' locale=$locale}, '', ''), +(@max_id + 29, '{$locale}', {intl l='Folder edit - top' locale=$locale}, '', ''), +(@max_id + 30, '{$locale}', {intl l='Folder edit - bottom' locale=$locale}, '', ''), +(@max_id + 31, '{$locale}', {intl l='Module hook edit - top' locale=$locale}, '', ''), +(@max_id + 32, '{$locale}', {intl l='Module hook edit - bottom' locale=$locale}, '', ''), +(@max_id + 33, '{$locale}', {intl l='Module edit - top' locale=$locale}, '', ''), +(@max_id + 34, '{$locale}', {intl l='Module edit - bottom' locale=$locale}, '', ''), +(@max_id + 35, '{$locale}', {intl l='Message edit - top' locale=$locale}, '', ''), +(@max_id + 36, '{$locale}', {intl l='Message edit - bottom' locale=$locale}, '', ''), +(@max_id + 37, '{$locale}', {intl l='Profile edit - top' locale=$locale}, '', ''), +(@max_id + 38, '{$locale}', {intl l='Profile edit - bottom' locale=$locale}, '', ''), +(@max_id + 39, '{$locale}', {intl l='Product edit - top' locale=$locale}, '', ''), +(@max_id + 40, '{$locale}', {intl l='Product edit - bottom' locale=$locale}, '', ''), +(@max_id + 41, '{$locale}', {intl l='Order edit - top' locale=$locale}, '', ''), +(@max_id + 42, '{$locale}', {intl l='Order edit - bottom' locale=$locale}, '', ''), +(@max_id + 43, '{$locale}', {intl l='Shipping zones edit - top' locale=$locale}, '', ''), +(@max_id + 44, '{$locale}', {intl l='Shipping zones edit - bottom' locale=$locale}, '', ''), +(@max_id + 45, '{$locale}', {intl l='Shipping configuration edit - top' locale=$locale}, '', ''), +(@max_id + 46, '{$locale}', {intl l='Shipping configuration edit - bottom' locale=$locale}, '', ''), +(@max_id + 47, '{$locale}', {intl l='Sale edit - top' locale=$locale}, '', ''), +(@max_id + 48, '{$locale}', {intl l='Sale edit - bottom' locale=$locale}, '', ''), +(@max_id + 49, '{$locale}', {intl l='Variable edit - top' locale=$locale}, '', ''), +(@max_id + 50, '{$locale}', {intl l='Variable edit - bottom' locale=$locale}, '', ''), +(@max_id + 51, '{$locale}', {intl l='Template edit - top' locale=$locale}, '', ''), +(@max_id + 52, '{$locale}', {intl l='Template edit - bottom' locale=$locale}, '', ''), +(@max_id + 53, '{$locale}', {intl l='Tax rule edit - top' locale=$locale}, '', ''), +(@max_id + 54, '{$locale}', {intl l='Tax rule edit - bottom' locale=$locale}, '', ''), +(@max_id + 55, '{$locale}', {intl l='Tax edit - top' locale=$locale}, '', ''), +(@max_id + 56, '{$locale}', {intl l='Tax edit - bottom' locale=$locale}, '', ''), +(@max_id + 57, '{$locale}', {intl l='Order edit - displayed after product information' locale=$locale}, '', ''), +(@max_id + 58, '{$locale}', {intl l='Order - Tab' locale=$locale}, '', ''), +(@max_id + 59, '{$locale}', {intl l='Order details - after product' locale=$locale}, '', ''), +(@max_id + 60, '{$locale}', {intl l='Tab SEO - top' locale=$locale}, '', ''), +(@max_id + 61, '{$locale}', {intl l='Tab SEO - bottom' locale=$locale}, '', ''), +(@max_id + 62, '{$locale}', {intl l='Tab image - top' locale=$locale}, '', ''), +(@max_id + 63, '{$locale}', {intl l='Tab image - bottom' locale=$locale}, '', ''), +(@max_id + 64, '{$locale}', {intl l='Tab document - top' locale=$locale}, '', ''), +(@max_id + 65, '{$locale}', {intl l='Tab document - bottom' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +-- Fix attribute_template and feature_template relations +ALTER TABLE `attribute_template` DROP FOREIGN KEY `fk_attribute_template`; ALTER TABLE `attribute_template` ADD CONSTRAINT `fk_attribute_template` FOREIGN KEY (`template_id`) REFERENCES `template`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT; +ALTER TABLE `feature_template` DROP FOREIGN KEY `fk_feature_template`; ALTER TABLE `feature_template` ADD CONSTRAINT `fk_feature_template` FOREIGN KEY (`template_id`) REFERENCES `template`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.2.0-alpha2.sql.tpl b/setup/update/tpl/2.2.0-alpha2.sql.tpl new file mode 100644 index 00000000..7533170d --- /dev/null +++ b/setup/update/tpl/2.2.0-alpha2.sql.tpl @@ -0,0 +1,36 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-alpha2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha2' WHERE `name`='thelia_extra_version'; + +-- Add cellphone column in order_address table +ALTER TABLE `order_address` ADD COLUMN `cellphone` VARCHAR (20) AFTER `phone`; + +-- new hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'order-edit.customer-information-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'order-edit.payment-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'order-edit.delivery-module-bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'invoice.after-payment-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'invoice.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'delivery.after-delivery-module', 3, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='Order - customer information bottom' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='Order - payment module bottom' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='Order - delivery module bottom' locale=$locale}, '', ''), +(@max_id + 4, '{$locale}', {intl l='Invoice - After payment module' locale=$locale}, NULL, NULL), +(@max_id + 5, '{$locale}', {intl l='Invoice - After delivery module' locale=$locale}, NULL, NULL), +(@max_id + 6, '{$locale}', {intl l='Delivery - After delivery module' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.2.0-beta1.sql.tpl b/setup/update/tpl/2.2.0-beta1.sql.tpl new file mode 100644 index 00000000..046a018b --- /dev/null +++ b/setup/update/tpl/2.2.0-beta1.sql.tpl @@ -0,0 +1,34 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-beta1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta1' WHERE `name`='thelia_extra_version'; + +-- fix currency already created +update currency set by_default = 0 where by_default is NULL; + +ALTER TABLE `category_version` ADD COLUMN `default_template_id` INTEGER AFTER `position`; + +-- new hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id + 1, 'order-edit.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id + 2, 'order-edit.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id + 3, 'mini-cart', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} + (@max_id + 1, '{$locale}', {intl l='Order - table header' locale=$locale}, '', ''), + (@max_id + 2, '{$locale}', {intl l='Order - table row' locale=$locale}, '', ''), + (@max_id + 3, '{$locale}', {intl l='Mini cart' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +ALTER TABLE `rewriting_url` CHANGE `url` `url` VARBINARY( 255 ) NOT NULL; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.2.0-beta2.sql.tpl b/setup/update/tpl/2.2.0-beta2.sql.tpl new file mode 100644 index 00000000..bc5a4e85 --- /dev/null +++ b/setup/update/tpl/2.2.0-beta2.sql.tpl @@ -0,0 +1,5 @@ +UPDATE `config` SET `value`='2.2.0-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; diff --git a/setup/update/tpl/2.2.0-beta3.sql.tpl b/setup/update/tpl/2.2.0-beta3.sql.tpl new file mode 100644 index 00000000..6f491b0c --- /dev/null +++ b/setup/update/tpl/2.2.0-beta3.sql.tpl @@ -0,0 +1,51 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0-beta3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta3' WHERE `name`='thelia_extra_version'; + +-- fix hook -- +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'tab-seo.update-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'order-edit.order-product-table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'order-edit.order-product-table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'administrators.header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'administrators.row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'advanced-configuration', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'advanced-configuration.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} + (@max_id + 1, '{$locale}', {intl l='Tab SEO - update form' locale=$locale}, '', ''), + (@max_id + 2, '{$locale}', {intl l='Order edit - order product table header' locale=$locale}, '', ''), + (@max_id + 3, '{$locale}', {intl l='Order edit - order product table row' locale=$locale}, '', ''), + (@max_id + 4, '{$locale}', {intl l='Administrators - header' locale=$locale}, '', ''), + (@max_id + 5, '{$locale}', {intl l='Administrators - row' locale=$locale}, '', ''), + (@max_id + 6, '{$locale}', {intl l='Advanced Configuration' locale=$locale}, '', ''), + (@max_id + 7, '{$locale}', {intl l='Advanced Configuration - Javascript' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'main.topbar-top' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'main.topbar-bottom' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'product.combinations-row' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.top' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.table-header' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.table-row' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brands.bottom' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.create-form' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.delete-form' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.js' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.tab-content' AND `type` = 2; +UPDATE `hook` SET `block` = '0', `updated_at` = NOW() WHERE `code` = 'brand.edit-js' AND `type` = 2; + +-- add index -- +ALTER TABLE `rewriting_url` ADD INDEX `idx_rewriting_url` (`view_locale`, `view`, `view_id`, `redirected`); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.2.0.sql.tpl b/setup/update/tpl/2.2.0.sql.tpl new file mode 100644 index 00000000..741a9784 --- /dev/null +++ b/setup/update/tpl/2.2.0.sql.tpl @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.2.1.sql.tpl b/setup/update/tpl/2.2.1.sql.tpl new file mode 100644 index 00000000..55e7c684 --- /dev/null +++ b/setup/update/tpl/2.2.1.sql.tpl @@ -0,0 +1,45 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_image` DROP FOREIGN KEY `fk_pse_product_image_product_image_id`; + +ALTER TABLE product_sale_elements_product_image +ADD CONSTRAINT `fk_pse_product_image_product_image_id` +FOREIGN KEY (`product_image_id`) +REFERENCES `product_image` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_sale_elements_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_sale_elements_id` +FOREIGN KEY (`product_sale_elements_id`) +REFERENCES `product_sale_elements` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + +ALTER TABLE `product_sale_elements_product_document` DROP FOREIGN KEY `fk_pse_product_document_product_document_id`; + +ALTER TABLE product_sale_elements_product_document +ADD CONSTRAINT `fk_pse_product_document_product_document_id` +FOREIGN KEY (`product_document_id`) +REFERENCES `product_document` (`id`) +ON UPDATE RESTRICT +ON DELETE CASCADE; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.2.2.sql.tpl b/setup/update/tpl/2.2.2.sql.tpl new file mode 100644 index 00000000..2c7f8a74 --- /dev/null +++ b/setup/update/tpl/2.2.2.sql.tpl @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.2.3.sql.tpl b/setup/update/tpl/2.2.3.sql.tpl new file mode 100644 index 00000000..b66c3fb1 --- /dev/null +++ b/setup/update/tpl/2.2.3.sql.tpl @@ -0,0 +1,11 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.2.3' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +ALTER TABLE `module` MODIFY `version` varchar(25) NOT NULL DEFAULT ''; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/setup/update/tpl/2.3.0-alpha1.sql.tpl b/setup/update/tpl/2.3.0-alpha1.sql.tpl new file mode 100644 index 00000000..3ebfbab1 --- /dev/null +++ b/setup/update/tpl/2.3.0-alpha1.sql.tpl @@ -0,0 +1,909 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-alpha1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha1' WHERE `name`='thelia_extra_version'; + +-- Add new column in module_hook table +ALTER TABLE `module_hook` ADD `templates` TEXT AFTER`position`; + +-- Add new columns in currency table +ALTER TABLE `currency` ADD `format` CHAR( 10 ) NOT NULL AFTER `symbol`; +ALTER TABLE `currency` ADD `visible` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `rate`; + +-- Update currencies +UPDATE `currency` SET `visible` = 1 WHERE 1; +UPDATE `currency` SET `format` = '%n %s' WHERE `code` NOT IN ('USD', 'GBP'); +UPDATE `currency` SET `format` = '%s%n' WHERE `code` IN ('USD', 'GBP'); + +-- Additional hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'brand.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+2, 'brand.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+3, 'category.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+4, 'category.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+5, 'content.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+6, 'content.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+7, 'folder.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+8, 'folder.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+9, 'product.modification.form-right.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+10, 'product.modification.form-right.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id+1, '{$locale}', {intl l='Brand edit - right column top' locale=$locale}, NULL, NULL), +(@max_id+2, '{$locale}', {intl l='Brand edit - right column bottom' locale=$locale}, NULL, NULL), +(@max_id+3, '{$locale}', {intl l='Category edit - right column top' locale=$locale}, NULL, NULL), +(@max_id+4, '{$locale}', {intl l='Category edit - right column bottom' locale=$locale}, NULL, NULL), +(@max_id+5, '{$locale}', {intl l='Content edit - right column top' locale=$locale}, NULL, NULL), +(@max_id+6, '{$locale}', {intl l='Content edit - right column bottom' locale=$locale}, NULL, NULL), +(@max_id+7, '{$locale}', {intl l='Folder edit - right column top' locale=$locale}, NULL, NULL), +(@max_id+8, '{$locale}', {intl l='Folder edit - right column bottom' locale=$locale}, NULL, NULL), +(@max_id+9, '{$locale}', {intl l='Product edit - right column top' locale=$locale}, NULL, NULL), +(@max_id+10, '{$locale}', {intl l='Product edit - right column bottom' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +/* States */ +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'state-edit.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 2, 'state-edit.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 3, 'state.edit-js', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 4, 'states.top', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 5, 'states.table-header', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 6, 'states.table-row', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 7, 'states.bottom', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 8, 'state.create-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 9, 'state.delete-form', 2, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id + 10, 'states.js', 2, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} +(@max_id + 1, '{$locale}', {intl l='state-edit - at the top' locale=$locale}, '', ''), +(@max_id + 2, '{$locale}', {intl l='state-edit - bottom' locale=$locale}, '', ''), +(@max_id + 3, '{$locale}', {intl l='state - Edit JavaScript' locale=$locale}, '', ''), +(@max_id + 4, '{$locale}', {intl l='states - at the top' locale=$locale}, '', ''), +(@max_id + 5, '{$locale}', {intl l='states - table header' locale=$locale}, '', ''), +(@max_id + 6, '{$locale}', {intl l='states - table row' locale=$locale}, '', ''), +(@max_id + 7, '{$locale}', {intl l='states - bottom' locale=$locale}, '', ''), +(@max_id + 8, '{$locale}', {intl l='state - creation form' locale=$locale}, '', ''), +(@max_id + 9, '{$locale}', {intl l='state - delete form' locale=$locale}, '', ''), +(@max_id + 10, '{$locale}', {intl l='states - JavaScript' locale=$locale}, '', ''){if ! $locale@last},{/if} + +{/foreach} +; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'email-html.template.css', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+2, 'email-html.layout.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+3, 'email-html.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+4, 'email-html.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+5, 'email-html.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+6, 'email-html.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+7, 'email-html.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+8, 'email-html.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+9, 'email-html.order-confirmation.footer', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+10, 'email-html.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+11, 'email-html.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+12, 'email-html.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+13, 'email-html.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+14, 'email-html.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+15, 'email-html.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+16, 'email-txt.order-confirmation.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+17, 'email-txt.order-confirmation.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+18, 'email-txt.order-confirmation.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+19, 'email-txt.order-confirmation.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+20, 'email-txt.order-confirmation.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+21, 'email-txt.order-confirmation.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+22, 'email-txt.order-notification.before-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+23, 'email-txt.order-notification.delivery-address', 4, 1, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+24, 'email-txt.order-notification.after-address', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+25, 'email-txt.order-notification.order-product', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+26, 'email-txt.order-notification.before-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()), +(@max_id+27, 'email-txt.order-notification.after-products', 4, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Email html - layout - CSS' locale=$locale}, NULL, NULL), + (@max_id+2, '{$locale}', {intl l='Email html - layout - footer' locale=$locale}, NULL, NULL), + (@max_id+3, '{$locale}', {intl l='Email html - order confirmation - before address' locale=$locale}, NULL, NULL), + (@max_id+4, '{$locale}', {intl l='Email html - order confirmation - delivery address' locale=$locale}, NULL, NULL), + (@max_id+5, '{$locale}', {intl l='Email html - order confirmation - after address' locale=$locale}, NULL, NULL), + (@max_id+6, '{$locale}', {intl l='Email html - order confirmation - order product' locale=$locale}, NULL, NULL), + (@max_id+7, '{$locale}', {intl l='Email html - order confirmation - before products' locale=$locale}, NULL, NULL), + (@max_id+8, '{$locale}', {intl l='Email html - order confirmation - after products' locale=$locale}, NULL, NULL), + (@max_id+9, '{$locale}', {intl l='Email html - order confirmation - footer' locale=$locale}, NULL, NULL), + (@max_id+10, '{$locale}', {intl l='Email html - order notification - before address' locale=$locale}, NULL, NULL), + (@max_id+11, '{$locale}', {intl l='Email html - order notification - delivery address' locale=$locale}, NULL, NULL), + (@max_id+12, '{$locale}', {intl l='Email html - order notification - after address' locale=$locale}, NULL, NULL), + (@max_id+13, '{$locale}', {intl l='Email html - order notification - order product' locale=$locale}, NULL, NULL), + (@max_id+14, '{$locale}', {intl l='Email html - order notification - before products' locale=$locale}, NULL, NULL), + (@max_id+15, '{$locale}', {intl l='Email html - order notification - after products' locale=$locale}, NULL, NULL), + (@max_id+16, '{$locale}', {intl l='Email txt - order confirmation - before address' locale=$locale}, NULL, NULL), + (@max_id+17, '{$locale}', {intl l='Email txt - order confirmation - delivery address' locale=$locale}, NULL, NULL), + (@max_id+18, '{$locale}', {intl l='Email txt - order confirmation - after address' locale=$locale}, NULL, NULL), + (@max_id+19, '{$locale}', {intl l='Email txt - order confirmation - order product' locale=$locale}, NULL, NULL), + (@max_id+20, '{$locale}', {intl l='Email txt - order confirmation - before products' locale=$locale}, NULL, NULL), + (@max_id+21, '{$locale}', {intl l='Email txt - order confirmation - after products' locale=$locale}, NULL, NULL), + (@max_id+22, '{$locale}', {intl l='Email txt - order notification - before address' locale=$locale}, NULL, NULL), + (@max_id+23, '{$locale}', {intl l='Email txt - order notification - delivery address' locale=$locale}, NULL, NULL), + (@max_id+24, '{$locale}', {intl l='Email txt - order notification - after address' locale=$locale}, NULL, NULL), + (@max_id+25, '{$locale}', {intl l='Email txt - order notification - order product' locale=$locale}, NULL, NULL), + (@max_id+26, '{$locale}', {intl l='Email txt - order notification - before products' locale=$locale}, NULL, NULL), + (@max_id+27, '{$locale}', {intl l='Email txt - order notification - after products' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +/* countries and states */ + +ALTER TABLE `country` + ADD COLUMN `visible` TINYINT DEFAULT 0 NOT NULL AFTER `id`, + ADD COLUMN `has_states` TINYINT DEFAULT 0 AFTER `isoalpha3`, + ADD COLUMN `need_zip_code` TINYINT DEFAULT 0 AFTER `has_states`, + ADD COLUMN `zip_code_format` VARCHAR(20) AFTER `need_zip_code`; + +CREATE TABLE `state` +( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `visible` TINYINT DEFAULT 0 NOT NULL, + `isocode` VARCHAR(4) NOT NULL, + `country_id` INTEGER NOT NULL, + `created_at` DATETIME, + `updated_at` DATETIME, + PRIMARY KEY (`id`), + INDEX `FI_state_country_id` (`country_id`), + CONSTRAINT `fk_state_country_id` + FOREIGN KEY (`country_id`) + REFERENCES `country` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +CREATE TABLE `state_i18n` +( + `id` INTEGER NOT NULL, + `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL, + `title` VARCHAR(255), + PRIMARY KEY (`id`,`locale`), + CONSTRAINT `state_i18n_FK_1` + FOREIGN KEY (`id`) + REFERENCES `state` (`id`) + ON DELETE CASCADE +) ENGINE=InnoDB CHARACTER SET='utf8'; + +ALTER TABLE `address` + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD CONSTRAINT `fk_address_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + ADD INDEX `FI_address_state_id` (`state_id`); + +ALTER TABLE `order_address` + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD CONSTRAINT `fk_order_address_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE RESTRICT, + ADD INDEX `FI_order_address_state_id` (`state_id`); + +ALTER TABLE `tax_rule_country` + DROP PRIMARY KEY, + ADD COLUMN `id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD CONSTRAINT `fk_tax_rule_country_state_id` + FOREIGN KEY (`state_id`) + REFERENCES `state` (`id`) + ON UPDATE RESTRICT + ON DELETE CASCADE, + ADD INDEX `idx_tax_rule_country_state_id` (`state_id`); + +ALTER TABLE `country_area` + ADD COLUMN `id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, + ADD COLUMN `state_id` INTEGER AFTER `country_id`, + ADD INDEX `fk_country_area_state_id_idx` (`state_id`); + +/* +we create new countries (not visible) and link them to states +the migration will be done with the module migrateCountryState +*/ + +UPDATE `country` SET `visible` = 1 WHERE 1; + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `country`; + +INSERT INTO `country` (`visible`, `isocode`, `isoalpha2`, `isoalpha3`, `by_default`, `shop_country`, `has_states`, `need_zip_code`, `zip_code_format`, `created_at`, `updated_at`) VALUES +(0, '840', 'US', 'USA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(0, '124', 'CA', 'CAN', 0, 0, '1', '1', 'LNL NLN', NOW(), NOW()), +(0, '32', 'AR', 'ARG', 0, 0, '1', '1', 'LNNNN', NOW(), NOW()), +(0, '360', 'ID', 'IDN', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(0, '380', 'IT', 'ITA', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()), +(0, '392', 'JP', 'JPN', 0, 0, '1', '1', 'NNN-NNNN', NOW(), NOW()), +(0, '484', 'MX', 'MEX', 0, 0, '1', '1', 'NNNNN', NOW(), NOW()) +; + +INSERT INTO `country_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES +{foreach $locales as $locale} + (@max_id + 1, '{$locale}', {intl l='USA' locale=$locale}, NULL, NULL, NULL), + (@max_id + 2, '{$locale}', {intl l='Canada' locale=$locale}, NULL, NULL, NULL), + (@max_id + 3, '{$locale}', {intl l='Argentina' locale=$locale}, NULL, NULL, NULL), + (@max_id + 4, '{$locale}', {intl l='Indonesia' locale=$locale}, NULL, NULL, NULL), + (@max_id + 5, '{$locale}', {intl l='Italy' locale=$locale}, NULL, NULL, NULL), + (@max_id + 6, '{$locale}', {intl l='Japan' locale=$locale}, NULL, NULL, NULL), + (@max_id + 7, '{$locale}', {intl l='Mexico' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +INSERT INTO `state` (`id`, `visible`, `isocode`, `country_id`, `created_at`, `updated_at`) VALUES +(1, 1, 'AL', @max_id + 1, NOW(), NOW()), +(2, 1, 'AK', @max_id + 1, NOW(), NOW()), +(3, 1, 'AZ', @max_id + 1, NOW(), NOW()), +(4, 1, 'AR', @max_id + 1, NOW(), NOW()), +(5, 1, 'CA', @max_id + 1, NOW(), NOW()), +(6, 1, 'CO', @max_id + 1, NOW(), NOW()), +(7, 1, 'CT', @max_id + 1, NOW(), NOW()), +(8, 1, 'DE', @max_id + 1, NOW(), NOW()), +(9, 1, 'FL', @max_id + 1, NOW(), NOW()), +(10, 1, 'GA', @max_id + 1, NOW(), NOW()), +(11, 1, 'HI', @max_id + 1, NOW(), NOW()), +(12, 1, 'ID', @max_id + 1, NOW(), NOW()), +(13, 1, 'IL', @max_id + 1, NOW(), NOW()), +(14, 1, 'IN', @max_id + 1, NOW(), NOW()), +(15, 1, 'IA', @max_id + 1, NOW(), NOW()), +(16, 1, 'KS', @max_id + 1, NOW(), NOW()), +(17, 1, 'KY', @max_id + 1, NOW(), NOW()), +(18, 1, 'LA', @max_id + 1, NOW(), NOW()), +(19, 1, 'ME', @max_id + 1, NOW(), NOW()), +(20, 1, 'MD', @max_id + 1, NOW(), NOW()), +(21, 1, 'MA', @max_id + 1, NOW(), NOW()), +(22, 1, 'MI', @max_id + 1, NOW(), NOW()), +(23, 1, 'MN', @max_id + 1, NOW(), NOW()), +(24, 1, 'MS', @max_id + 1, NOW(), NOW()), +(25, 1, 'MO', @max_id + 1, NOW(), NOW()), +(26, 1, 'MT', @max_id + 1, NOW(), NOW()), +(27, 1, 'NE', @max_id + 1, NOW(), NOW()), +(28, 1, 'NV', @max_id + 1, NOW(), NOW()), +(29, 1, 'NH', @max_id + 1, NOW(), NOW()), +(30, 1, 'NJ', @max_id + 1, NOW(), NOW()), +(31, 1, 'NM', @max_id + 1, NOW(), NOW()), +(32, 1, 'NY', @max_id + 1, NOW(), NOW()), +(33, 1, 'NC', @max_id + 1, NOW(), NOW()), +(34, 1, 'ND', @max_id + 1, NOW(), NOW()), +(35, 1, 'OH', @max_id + 1, NOW(), NOW()), +(36, 1, 'OK', @max_id + 1, NOW(), NOW()), +(37, 1, 'OR', @max_id + 1, NOW(), NOW()), +(38, 1, 'PA', @max_id + 1, NOW(), NOW()), +(39, 1, 'RI', @max_id + 1, NOW(), NOW()), +(40, 1, 'SC', @max_id + 1, NOW(), NOW()), +(41, 1, 'SD', @max_id + 1, NOW(), NOW()), +(42, 1, 'TN', @max_id + 1, NOW(), NOW()), +(43, 1, 'TX', @max_id + 1, NOW(), NOW()), +(44, 1, 'UT', @max_id + 1, NOW(), NOW()), +(45, 1, 'VT', @max_id + 1, NOW(), NOW()), +(46, 1, 'VA', @max_id + 1, NOW(), NOW()), +(47, 1, 'WA', @max_id + 1, NOW(), NOW()), +(48, 1, 'WV', @max_id + 1, NOW(), NOW()), +(49, 1, 'WI', @max_id + 1, NOW(), NOW()), +(50, 1, 'WY', @max_id + 1, NOW(), NOW()), +(51, 1, 'PR', @max_id + 1, NOW(), NOW()), +(52, 1, 'VI', @max_id + 1, NOW(), NOW()), +(53, 1, 'DC', @max_id + 1, NOW(), NOW()), +(54, 1, 'AGS', @max_id + 7, NOW(), NOW()), +(55, 1, 'BCN', @max_id + 7, NOW(), NOW()), +(56, 1, 'BCS', @max_id + 7, NOW(), NOW()), +(57, 1, 'CAM', @max_id + 7, NOW(), NOW()), +(58, 1, 'CHP', @max_id + 7, NOW(), NOW()), +(59, 1, 'CHH', @max_id + 7, NOW(), NOW()), +(60, 1, 'COA', @max_id + 7, NOW(), NOW()), +(61, 1, 'COL', @max_id + 7, NOW(), NOW()), +(62, 1, 'DIF', @max_id + 7, NOW(), NOW()), +(63, 1, 'DUR', @max_id + 7, NOW(), NOW()), +(64, 1, 'GUA', @max_id + 7, NOW(), NOW()), +(65, 1, 'GRO', @max_id + 7, NOW(), NOW()), +(66, 1, 'HID', @max_id + 7, NOW(), NOW()), +(67, 1, 'JAL', @max_id + 7, NOW(), NOW()), +(68, 1, 'MEX', @max_id + 7, NOW(), NOW()), +(69, 1, 'MIC', @max_id + 7, NOW(), NOW()), +(70, 1, 'MOR', @max_id + 7, NOW(), NOW()), +(71, 1, 'NAY', @max_id + 7, NOW(), NOW()), +(72, 1, 'NLE', @max_id + 7, NOW(), NOW()), +(73, 1, 'OAX', @max_id + 7, NOW(), NOW()), +(74, 1, 'PUE', @max_id + 7, NOW(), NOW()), +(75, 1, 'QUE', @max_id + 7, NOW(), NOW()), +(76, 1, 'ROO', @max_id + 7, NOW(), NOW()), +(77, 1, 'SLP', @max_id + 7, NOW(), NOW()), +(78, 1, 'SIN', @max_id + 7, NOW(), NOW()), +(79, 1, 'SON', @max_id + 7, NOW(), NOW()), +(80, 1, 'TAB', @max_id + 7, NOW(), NOW()), +(81, 1, 'TAM', @max_id + 7, NOW(), NOW()), +(82, 1, 'TLA', @max_id + 7, NOW(), NOW()), +(83, 1, 'VER', @max_id + 7, NOW(), NOW()), +(84, 1, 'YUC', @max_id + 7, NOW(), NOW()), +(85, 1, 'ZAC', @max_id + 7, NOW(), NOW()), +(86, 1, 'ON', @max_id + 2, NOW(), NOW()), +(87, 1, 'QC', @max_id + 2, NOW(), NOW()), +(88, 1, 'BC', @max_id + 2, NOW(), NOW()), +(89, 1, 'AB', @max_id + 2, NOW(), NOW()), +(90, 1, 'MB', @max_id + 2, NOW(), NOW()), +(91, 1, 'SK', @max_id + 2, NOW(), NOW()), +(92, 1, 'NS', @max_id + 2, NOW(), NOW()), +(93, 1, 'NB', @max_id + 2, NOW(), NOW()), +(94, 1, 'NL', @max_id + 2, NOW(), NOW()), +(95, 1, 'PE', @max_id + 2, NOW(), NOW()), +(96, 1, 'NT', @max_id + 2, NOW(), NOW()), +(97, 1, 'YT', @max_id + 2, NOW(), NOW()), +(98, 1, 'NU', @max_id + 2, NOW(), NOW()), +(99, 1, 'B', @max_id + 3, NOW(), NOW()), +(100, 1, 'K', @max_id + 3, NOW(), NOW()), +(101, 1, 'H', @max_id + 3, NOW(), NOW()), +(102, 1, 'U', @max_id + 3, NOW(), NOW()), +(103, 1, 'C', @max_id + 3, NOW(), NOW()), +(104, 1, 'X', @max_id + 3, NOW(), NOW()), +(105, 1, 'W', @max_id + 3, NOW(), NOW()), +(106, 1, 'E', @max_id + 3, NOW(), NOW()), +(107, 1, 'P', @max_id + 3, NOW(), NOW()), +(108, 1, 'Y', @max_id + 3, NOW(), NOW()), +(109, 1, 'L', @max_id + 3, NOW(), NOW()), +(110, 1, 'F', @max_id + 3, NOW(), NOW()), +(111, 1, 'M', @max_id + 3, NOW(), NOW()), +(112, 1, 'N', @max_id + 3, NOW(), NOW()), +(113, 1, 'Q', @max_id + 3, NOW(), NOW()), +(114, 1, 'R', @max_id + 3, NOW(), NOW()), +(115, 1, 'A', @max_id + 3, NOW(), NOW()), +(116, 1, 'J', @max_id + 3, NOW(), NOW()), +(117, 1, 'D', @max_id + 3, NOW(), NOW()), +(118, 1, 'Z', @max_id + 3, NOW(), NOW()), +(119, 1, 'S', @max_id + 3, NOW(), NOW()), +(120, 1, 'G', @max_id + 3, NOW(), NOW()), +(121, 1, 'V', @max_id + 3, NOW(), NOW()), +(122, 1, 'T', @max_id + 3, NOW(), NOW()), +(123, 1, 'AG', @max_id + 5, NOW(), NOW()), +(124, 1, 'AL', @max_id + 5, NOW(), NOW()), +(125, 1, 'AN', @max_id + 5, NOW(), NOW()), +(126, 1, 'AO', @max_id + 5, NOW(), NOW()), +(127, 1, 'AR', @max_id + 5, NOW(), NOW()), +(128, 1, 'AP', @max_id + 5, NOW(), NOW()), +(129, 1, 'AT', @max_id + 5, NOW(), NOW()), +(130, 1, 'AV', @max_id + 5, NOW(), NOW()), +(131, 1, 'BA', @max_id + 5, NOW(), NOW()), +(132, 1, 'BT', @max_id + 5, NOW(), NOW()), +(133, 1, 'BL', @max_id + 5, NOW(), NOW()), +(134, 1, 'BN', @max_id + 5, NOW(), NOW()), +(135, 1, 'BG', @max_id + 5, NOW(), NOW()), +(136, 1, 'BI', @max_id + 5, NOW(), NOW()), +(137, 1, 'BO', @max_id + 5, NOW(), NOW()), +(138, 1, 'BZ', @max_id + 5, NOW(), NOW()), +(139, 1, 'BS', @max_id + 5, NOW(), NOW()), +(140, 1, 'BR', @max_id + 5, NOW(), NOW()), +(141, 1, 'CA', @max_id + 5, NOW(), NOW()), +(142, 1, 'CL', @max_id + 5, NOW(), NOW()), +(143, 1, 'CB', @max_id + 5, NOW(), NOW()), +(144, 1, 'CI', @max_id + 5, NOW(), NOW()), +(145, 1, 'CE', @max_id + 5, NOW(), NOW()), +(146, 1, 'CT', @max_id + 5, NOW(), NOW()), +(147, 1, 'CZ', @max_id + 5, NOW(), NOW()), +(148, 1, 'CH', @max_id + 5, NOW(), NOW()), +(149, 1, 'CO', @max_id + 5, NOW(), NOW()), +(150, 1, 'CS', @max_id + 5, NOW(), NOW()), +(151, 1, 'CR', @max_id + 5, NOW(), NOW()), +(152, 1, 'KR', @max_id + 5, NOW(), NOW()), +(153, 1, 'CN', @max_id + 5, NOW(), NOW()), +(154, 1, 'EN', @max_id + 5, NOW(), NOW()), +(155, 1, 'FM', @max_id + 5, NOW(), NOW()), +(156, 1, 'FE', @max_id + 5, NOW(), NOW()), +(157, 1, 'FI', @max_id + 5, NOW(), NOW()), +(158, 1, 'FG', @max_id + 5, NOW(), NOW()), +(159, 1, 'FC', @max_id + 5, NOW(), NOW()), +(160, 1, 'FR', @max_id + 5, NOW(), NOW()), +(161, 1, 'GE', @max_id + 5, NOW(), NOW()), +(162, 1, 'GO', @max_id + 5, NOW(), NOW()), +(163, 1, 'GR', @max_id + 5, NOW(), NOW()), +(164, 1, 'IM', @max_id + 5, NOW(), NOW()), +(165, 1, 'IS', @max_id + 5, NOW(), NOW()), +(166, 1, 'AQ', @max_id + 5, NOW(), NOW()), +(167, 1, 'SP', @max_id + 5, NOW(), NOW()), +(168, 1, 'LT', @max_id + 5, NOW(), NOW()), +(169, 1, 'LE', @max_id + 5, NOW(), NOW()), +(170, 1, 'LC', @max_id + 5, NOW(), NOW()), +(171, 1, 'LI', @max_id + 5, NOW(), NOW()), +(172, 1, 'LO', @max_id + 5, NOW(), NOW()), +(173, 1, 'LU', @max_id + 5, NOW(), NOW()), +(174, 1, 'MC', @max_id + 5, NOW(), NOW()), +(175, 1, 'MN', @max_id + 5, NOW(), NOW()), +(176, 1, 'MS', @max_id + 5, NOW(), NOW()), +(177, 1, 'MT', @max_id + 5, NOW(), NOW()), +(178, 1, 'VS', @max_id + 5, NOW(), NOW()), +(179, 1, 'ME', @max_id + 5, NOW(), NOW()), +(180, 1, 'MI', @max_id + 5, NOW(), NOW()), +(181, 1, 'MO', @max_id + 5, NOW(), NOW()), +(182, 1, 'MB', @max_id + 5, NOW(), NOW()), +(183, 1, 'NA', @max_id + 5, NOW(), NOW()), +(184, 1, 'NO', @max_id + 5, NOW(), NOW()), +(185, 1, 'NU', @max_id + 5, NOW(), NOW()), +(186, 1, 'OG', @max_id + 5, NOW(), NOW()), +(187, 1, 'OT', @max_id + 5, NOW(), NOW()), +(188, 1, 'OR', @max_id + 5, NOW(), NOW()), +(189, 1, 'PD', @max_id + 5, NOW(), NOW()), +(190, 1, 'PA', @max_id + 5, NOW(), NOW()), +(191, 1, 'PR', @max_id + 5, NOW(), NOW()), +(192, 1, 'PV', @max_id + 5, NOW(), NOW()), +(193, 1, 'PG', @max_id + 5, NOW(), NOW()), +(194, 1, 'PU', @max_id + 5, NOW(), NOW()), +(195, 1, 'PE', @max_id + 5, NOW(), NOW()), +(196, 1, 'PC', @max_id + 5, NOW(), NOW()), +(197, 1, 'PI', @max_id + 5, NOW(), NOW()), +(198, 1, 'PT', @max_id + 5, NOW(), NOW()), +(199, 1, 'PN', @max_id + 5, NOW(), NOW()), +(200, 1, 'PZ', @max_id + 5, NOW(), NOW()), +(201, 1, 'PO', @max_id + 5, NOW(), NOW()), +(202, 1, 'RG', @max_id + 5, NOW(), NOW()), +(203, 1, 'RA', @max_id + 5, NOW(), NOW()), +(204, 1, 'RC', @max_id + 5, NOW(), NOW()), +(205, 1, 'RE', @max_id + 5, NOW(), NOW()), +(206, 1, 'RI', @max_id + 5, NOW(), NOW()), +(207, 1, 'RN', @max_id + 5, NOW(), NOW()), +(208, 1, 'RM', @max_id + 5, NOW(), NOW()), +(209, 1, 'RO', @max_id + 5, NOW(), NOW()), +(210, 1, 'SA', @max_id + 5, NOW(), NOW()), +(211, 1, 'SS', @max_id + 5, NOW(), NOW()), +(212, 1, 'SV', @max_id + 5, NOW(), NOW()), +(213, 1, 'SI', @max_id + 5, NOW(), NOW()), +(214, 1, 'SR', @max_id + 5, NOW(), NOW()), +(215, 1, 'SO', @max_id + 5, NOW(), NOW()), +(216, 1, 'TA', @max_id + 5, NOW(), NOW()), +(217, 1, 'TE', @max_id + 5, NOW(), NOW()), +(218, 1, 'TR', @max_id + 5, NOW(), NOW()), +(219, 1, 'TO', @max_id + 5, NOW(), NOW()), +(220, 1, 'TP', @max_id + 5, NOW(), NOW()), +(221, 1, 'TN', @max_id + 5, NOW(), NOW()), +(222, 1, 'TV', @max_id + 5, NOW(), NOW()), +(223, 1, 'TS', @max_id + 5, NOW(), NOW()), +(224, 1, 'UD', @max_id + 5, NOW(), NOW()), +(225, 1, 'VA', @max_id + 5, NOW(), NOW()), +(226, 1, 'VE', @max_id + 5, NOW(), NOW()), +(227, 1, 'VB', @max_id + 5, NOW(), NOW()), +(228, 1, 'VC', @max_id + 5, NOW(), NOW()), +(229, 1, 'VR', @max_id + 5, NOW(), NOW()), +(230, 1, 'VV', @max_id + 5, NOW(), NOW()), +(231, 1, 'VI', @max_id + 5, NOW(), NOW()), +(232, 1, 'VT', @max_id + 5, NOW(), NOW()), +(233, 1, 'AC', @max_id + 4, NOW(), NOW()), +(234, 1, 'BA', @max_id + 4, NOW(), NOW()), +(235, 1, 'BB', @max_id + 4, NOW(), NOW()), +(236, 1, 'BT', @max_id + 4, NOW(), NOW()), +(237, 1, 'BE', @max_id + 4, NOW(), NOW()), +(238, 1, 'JT', @max_id + 4, NOW(), NOW()), +(239, 1, 'KT', @max_id + 4, NOW(), NOW()), +(240, 1, 'ST', @max_id + 4, NOW(), NOW()), +(241, 1, 'JI', @max_id + 4, NOW(), NOW()), +(242, 1, 'KI', @max_id + 4, NOW(), NOW()), +(243, 1, 'NT', @max_id + 4, NOW(), NOW()), +(244, 1, 'GO', @max_id + 4, NOW(), NOW()), +(245, 1, 'JK', @max_id + 4, NOW(), NOW()), +(246, 1, 'JA', @max_id + 4, NOW(), NOW()), +(247, 1, 'LA', @max_id + 4, NOW(), NOW()), +(248, 1, 'MA', @max_id + 4, NOW(), NOW()), +(249, 1, 'MU', @max_id + 4, NOW(), NOW()), +(250, 1, 'SA', @max_id + 4, NOW(), NOW()), +(251, 1, 'SU', @max_id + 4, NOW(), NOW()), +(252, 1, 'PA', @max_id + 4, NOW(), NOW()), +(253, 1, 'RI', @max_id + 4, NOW(), NOW()), +(254, 1, 'KR', @max_id + 4, NOW(), NOW()), +(255, 1, 'SG', @max_id + 4, NOW(), NOW()), +(256, 1, 'KS', @max_id + 4, NOW(), NOW()), +(257, 1, 'SN', @max_id + 4, NOW(), NOW()), +(258, 1, 'SS', @max_id + 4, NOW(), NOW()), +(259, 1, 'JB', @max_id + 4, NOW(), NOW()), +(260, 1, 'KB', @max_id + 4, NOW(), NOW()), +(261, 1, 'NB', @max_id + 4, NOW(), NOW()), +(262, 1, 'PB', @max_id + 4, NOW(), NOW()), +(263, 1, 'SR', @max_id + 4, NOW(), NOW()), +(264, 1, 'SB', @max_id + 4, NOW(), NOW()), +(265, 1, 'YO', @max_id + 4, NOW(), NOW()), +(266, 1, '23', @max_id + 6, NOW(), NOW()), +(267, 1, '05', @max_id + 6, NOW(), NOW()), +(268, 1, '02', @max_id + 6, NOW(), NOW()), +(269, 1, '12', @max_id + 6, NOW(), NOW()), +(270, 1, '38', @max_id + 6, NOW(), NOW()), +(271, 1, '18', @max_id + 6, NOW(), NOW()), +(272, 1, '40', @max_id + 6, NOW(), NOW()), +(273, 1, '07', @max_id + 6, NOW(), NOW()), +(274, 1, '21', @max_id + 6, NOW(), NOW()), +(275, 1, '10', @max_id + 6, NOW(), NOW()), +(276, 1, '34', @max_id + 6, NOW(), NOW()), +(277, 1, '01', @max_id + 6, NOW(), NOW()), +(278, 1, '28', @max_id + 6, NOW(), NOW()), +(279, 1, '08', @max_id + 6, NOW(), NOW()), +(280, 1, '17', @max_id + 6, NOW(), NOW()), +(281, 1, '03', @max_id + 6, NOW(), NOW()), +(282, 1, '37', @max_id + 6, NOW(), NOW()), +(283, 1, '46', @max_id + 6, NOW(), NOW()), +(284, 1, '14', @max_id + 6, NOW(), NOW()), +(285, 1, '39', @max_id + 6, NOW(), NOW()), +(286, 1, '43', @max_id + 6, NOW(), NOW()), +(287, 1, '26', @max_id + 6, NOW(), NOW()), +(288, 1, '24', @max_id + 6, NOW(), NOW()), +(289, 1, '04', @max_id + 6, NOW(), NOW()), +(290, 1, '45', @max_id + 6, NOW(), NOW()), +(291, 1, '20', @max_id + 6, NOW(), NOW()), +(292, 1, '42', @max_id + 6, NOW(), NOW()), +(293, 1, '29', @max_id + 6, NOW(), NOW()), +(294, 1, '15', @max_id + 6, NOW(), NOW()), +(295, 1, '44', @max_id + 6, NOW(), NOW()), +(296, 1, '33', @max_id + 6, NOW(), NOW()), +(297, 1, '47', @max_id + 6, NOW(), NOW()), +(298, 1, '27', @max_id + 6, NOW(), NOW()), +(299, 1, '41', @max_id + 6, NOW(), NOW()), +(300, 1, '11', @max_id + 6, NOW(), NOW()), +(301, 1, '25', @max_id + 6, NOW(), NOW()), +(302, 1, '32', @max_id + 6, NOW(), NOW()), +(303, 1, '22', @max_id + 6, NOW(), NOW()), +(304, 1, '09', @max_id + 6, NOW(), NOW()), +(305, 1, '36', @max_id + 6, NOW(), NOW()), +(306, 1, '13', @max_id + 6, NOW(), NOW()), +(307, 1, '31', @max_id + 6, NOW(), NOW()), +(308, 1, '16', @max_id + 6, NOW(), NOW()), +(309, 1, '30', @max_id + 6, NOW(), NOW()), +(310, 1, '06', @max_id + 6, NOW(), NOW()), +(311, 1, '35', @max_id + 6, NOW(), NOW()), +(312, 1, '19', @max_id + 6, NOW(), NOW()), +(313, 1, '', @max_id + 3, NOW(), NOW()), +(314, 1, '', @max_id + 4, NOW(), NOW()), +(315, 1, '', @max_id + 5, NOW(), NOW()), +(316, 1, '', @max_id + 6, NOW(), NOW()), +(317, 1, '', @max_id + 7, NOW(), NOW()); + + +INSERT INTO `state_i18n` (`id`, `locale`, `title`) VALUES +{foreach $locales as $locale} + + (1, '{$locale}', {intl l='Alabama' locale=$locale}), + (2, '{$locale}', {intl l='Alaska' locale=$locale}), + (3, '{$locale}', {intl l='Arizona' locale=$locale}), + (4, '{$locale}', {intl l='Arkansas' locale=$locale}), + (5, '{$locale}', {intl l='California' locale=$locale}), + (6, '{$locale}', {intl l='Colorado' locale=$locale}), + (7, '{$locale}', {intl l='Connecticut' locale=$locale}), + (8, '{$locale}', {intl l='Delaware' locale=$locale}), + (9, '{$locale}', {intl l='Florida' locale=$locale}), + (10, '{$locale}', {intl l='Georgia' locale=$locale}), + (11, '{$locale}', {intl l='Hawaii' locale=$locale}), + (12, '{$locale}', {intl l='Idaho' locale=$locale}), + (13, '{$locale}', {intl l='Illinois' locale=$locale}), + (14, '{$locale}', {intl l='Indiana' locale=$locale}), + (15, '{$locale}', {intl l='Iowa' locale=$locale}), + (16, '{$locale}', {intl l='Kansas' locale=$locale}), + (17, '{$locale}', {intl l='Kentucky' locale=$locale}), + (18, '{$locale}', {intl l='Louisiana' locale=$locale}), + (19, '{$locale}', {intl l='Maine' locale=$locale}), + (20, '{$locale}', {intl l='Maryland' locale=$locale}), + (21, '{$locale}', {intl l='Massachusetts' locale=$locale}), + (22, '{$locale}', {intl l='Michigan' locale=$locale}), + (23, '{$locale}', {intl l='Minnesota' locale=$locale}), + (24, '{$locale}', {intl l='Mississippi' locale=$locale}), + (25, '{$locale}', {intl l='Missouri' locale=$locale}), + (26, '{$locale}', {intl l='Montana' locale=$locale}), + (27, '{$locale}', {intl l='Nebraska' locale=$locale}), + (28, '{$locale}', {intl l='Nevada' locale=$locale}), + (29, '{$locale}', {intl l='New Hampshire' locale=$locale}), + (30, '{$locale}', {intl l='New Jersey' locale=$locale}), + (31, '{$locale}', {intl l='New Mexico' locale=$locale}), + (32, '{$locale}', {intl l='New York' locale=$locale}), + (33, '{$locale}', {intl l='North Carolina' locale=$locale}), + (34, '{$locale}', {intl l='North Dakota' locale=$locale}), + (35, '{$locale}', {intl l='Ohio' locale=$locale}), + (36, '{$locale}', {intl l='Oklahoma' locale=$locale}), + (37, '{$locale}', {intl l='Oregon' locale=$locale}), + (38, '{$locale}', {intl l='Pennsylvania' locale=$locale}), + (39, '{$locale}', {intl l='Rhode Island' locale=$locale}), + (40, '{$locale}', {intl l='South Carolina' locale=$locale}), + (41, '{$locale}', {intl l='South Dakota' locale=$locale}), + (42, '{$locale}', {intl l='Tennessee' locale=$locale}), + (43, '{$locale}', {intl l='Texas' locale=$locale}), + (44, '{$locale}', {intl l='Utah' locale=$locale}), + (45, '{$locale}', {intl l='Vermont' locale=$locale}), + (46, '{$locale}', {intl l='Virginia' locale=$locale}), + (47, '{$locale}', {intl l='Washington' locale=$locale}), + (48, '{$locale}', {intl l='West Virginia' locale=$locale}), + (49, '{$locale}', {intl l='Wisconsin' locale=$locale}), + (50, '{$locale}', {intl l='Wyoming' locale=$locale}), + (51, '{$locale}', {intl l='Puerto Rico' locale=$locale}), + (52, '{$locale}', {intl l='US Virgin Islands' locale=$locale}), + (53, '{$locale}', {intl l='District of Columbia' locale=$locale}), + (54, '{$locale}', {intl l='Aguascalientes' locale=$locale}), + (55, '{$locale}', {intl l='Baja California' locale=$locale}), + (56, '{$locale}', {intl l='Baja California Sur' locale=$locale}), + (57, '{$locale}', {intl l='Campeche' locale=$locale}), + (58, '{$locale}', {intl l='Chiapas' locale=$locale}), + (59, '{$locale}', {intl l='Chihuahua' locale=$locale}), + (60, '{$locale}', {intl l='Coahuila' locale=$locale}), + (61, '{$locale}', {intl l='Colima' locale=$locale}), + (62, '{$locale}', {intl l='Distrito Federal' locale=$locale}), + (63, '{$locale}', {intl l='Durango' locale=$locale}), + (64, '{$locale}', {intl l='Guanajuato' locale=$locale}), + (65, '{$locale}', {intl l='Guerrero' locale=$locale}), + (66, '{$locale}', {intl l='Hidalgo' locale=$locale}), + (67, '{$locale}', {intl l='Jalisco' locale=$locale}), + (68, '{$locale}', {intl l='Estado de México' locale=$locale}), + (69, '{$locale}', {intl l='Michoacán' locale=$locale}), + (70, '{$locale}', {intl l='Morelos' locale=$locale}), + (71, '{$locale}', {intl l='Nayarit' locale=$locale}), + (72, '{$locale}', {intl l='Nuevo León' locale=$locale}), + (73, '{$locale}', {intl l='Oaxaca' locale=$locale}), + (74, '{$locale}', {intl l='Puebla' locale=$locale}), + (75, '{$locale}', {intl l='Querétaro' locale=$locale}), + (76, '{$locale}', {intl l='Quintana Roo' locale=$locale}), + (77, '{$locale}', {intl l='San Luis Potosí' locale=$locale}), + (78, '{$locale}', {intl l='Sinaloa' locale=$locale}), + (79, '{$locale}', {intl l='Sonora' locale=$locale}), + (80, '{$locale}', {intl l='Tabasco' locale=$locale}), + (81, '{$locale}', {intl l='Tamaulipas' locale=$locale}), + (82, '{$locale}', {intl l='Tlaxcala' locale=$locale}), + (83, '{$locale}', {intl l='Veracruz' locale=$locale}), + (84, '{$locale}', {intl l='Yucatán' locale=$locale}), + (85, '{$locale}', {intl l='Zacatecas' locale=$locale}), + (86, '{$locale}', {intl l='Ontario' locale=$locale}), + (87, '{$locale}', {intl l='Quebec' locale=$locale}), + (88, '{$locale}', {intl l='British Columbia' locale=$locale}), + (89, '{$locale}', {intl l='Alberta' locale=$locale}), + (90, '{$locale}', {intl l='Manitoba' locale=$locale}), + (91, '{$locale}', {intl l='Saskatchewan' locale=$locale}), + (92, '{$locale}', {intl l='Nova Scotia' locale=$locale}), + (93, '{$locale}', {intl l='New Brunswick' locale=$locale}), + (94, '{$locale}', {intl l='Newfoundland and Labrador' locale=$locale}), + (95, '{$locale}', {intl l='Prince Edward Island' locale=$locale}), + (96, '{$locale}', {intl l='Northwest Territories' locale=$locale}), + (97, '{$locale}', {intl l='Yukon' locale=$locale}), + (98, '{$locale}', {intl l='Nunavut' locale=$locale}), + (99, '{$locale}', {intl l='Buenos Aires' locale=$locale}), + (100, '{$locale}', {intl l='Catamarca' locale=$locale}), + (101, '{$locale}', {intl l='Chaco' locale=$locale}), + (102, '{$locale}', {intl l='Chubut' locale=$locale}), + (103, '{$locale}', {intl l='Ciudad de Buenos Aires' locale=$locale}), + (104, '{$locale}', {intl l='Córdoba' locale=$locale}), + (105, '{$locale}', {intl l='Corrientes' locale=$locale}), + (106, '{$locale}', {intl l='Entre Ríos' locale=$locale}), + (107, '{$locale}', {intl l='Formosa' locale=$locale}), + (108, '{$locale}', {intl l='Jujuy' locale=$locale}), + (109, '{$locale}', {intl l='La Pampa' locale=$locale}), + (110, '{$locale}', {intl l='La Rioja' locale=$locale}), + (111, '{$locale}', {intl l='Mendoza' locale=$locale}), + (112, '{$locale}', {intl l='Misiones' locale=$locale}), + (113, '{$locale}', {intl l='Neuquén' locale=$locale}), + (114, '{$locale}', {intl l='Río Negro' locale=$locale}), + (115, '{$locale}', {intl l='Salta' locale=$locale}), + (116, '{$locale}', {intl l='San Juan' locale=$locale}), + (117, '{$locale}', {intl l='San Luis' locale=$locale}), + (118, '{$locale}', {intl l='Santa Cruz' locale=$locale}), + (119, '{$locale}', {intl l='Santa Fe' locale=$locale}), + (120, '{$locale}', {intl l='Santiago del Estero' locale=$locale}), + (121, '{$locale}', {intl l='Tierra del Fuego' locale=$locale}), + (122, '{$locale}', {intl l='Tucumán' locale=$locale}), + (123, '{$locale}', {intl l='Agrigento' locale=$locale}), + (124, '{$locale}', {intl l='Alessandria' locale=$locale}), + (125, '{$locale}', {intl l='Ancona' locale=$locale}), + (126, '{$locale}', {intl l='Aosta' locale=$locale}), + (127, '{$locale}', {intl l='Arezzo' locale=$locale}), + (128, '{$locale}', {intl l='Ascoli Piceno' locale=$locale}), + (129, '{$locale}', {intl l='Asti' locale=$locale}), + (130, '{$locale}', {intl l='Avellino' locale=$locale}), + (131, '{$locale}', {intl l='Bari' locale=$locale}), + (132, '{$locale}', {intl l='Barletta-Andria-Trani' locale=$locale}), + (133, '{$locale}', {intl l='Belluno' locale=$locale}), + (134, '{$locale}', {intl l='Benevento' locale=$locale}), + (135, '{$locale}', {intl l='Bergamo' locale=$locale}), + (136, '{$locale}', {intl l='Biella' locale=$locale}), + (137, '{$locale}', {intl l='Bologna' locale=$locale}), + (138, '{$locale}', {intl l='Bolzano' locale=$locale}), + (139, '{$locale}', {intl l='Brescia' locale=$locale}), + (140, '{$locale}', {intl l='Brindisi' locale=$locale}), + (141, '{$locale}', {intl l='Cagliari' locale=$locale}), + (142, '{$locale}', {intl l='Caltanissetta' locale=$locale}), + (143, '{$locale}', {intl l='Campobasso' locale=$locale}), + (144, '{$locale}', {intl l='Carbonia-Iglesias' locale=$locale}), + (145, '{$locale}', {intl l='Caserta' locale=$locale}), + (146, '{$locale}', {intl l='Catania' locale=$locale}), + (147, '{$locale}', {intl l='Catanzaro' locale=$locale}), + (148, '{$locale}', {intl l='Chieti' locale=$locale}), + (149, '{$locale}', {intl l='Como' locale=$locale}), + (150, '{$locale}', {intl l='Cosenza' locale=$locale}), + (151, '{$locale}', {intl l='Cremona' locale=$locale}), + (152, '{$locale}', {intl l='Crotone' locale=$locale}), + (153, '{$locale}', {intl l='Cuneo' locale=$locale}), + (154, '{$locale}', {intl l='Enna' locale=$locale}), + (155, '{$locale}', {intl l='Fermo' locale=$locale}), + (156, '{$locale}', {intl l='Ferrara' locale=$locale}), + (157, '{$locale}', {intl l='Firenze' locale=$locale}), + (158, '{$locale}', {intl l='Foggia' locale=$locale}), + (159, '{$locale}', {intl l='Forlì-Cesena' locale=$locale}), + (160, '{$locale}', {intl l='Frosinone' locale=$locale}), + (161, '{$locale}', {intl l='Genova' locale=$locale}), + (162, '{$locale}', {intl l='Gorizia' locale=$locale}), + (163, '{$locale}', {intl l='Grosseto' locale=$locale}), + (164, '{$locale}', {intl l='Imperia' locale=$locale}), + (165, '{$locale}', {intl l='Isernia' locale=$locale}), + (166, '{$locale}', {intl l='L\'Aquila' locale=$locale}), + (167, '{$locale}', {intl l='La Spezia' locale=$locale}), + (168, '{$locale}', {intl l='Latina' locale=$locale}), + (169, '{$locale}', {intl l='Lecce' locale=$locale}), + (170, '{$locale}', {intl l='Lecco' locale=$locale}), + (171, '{$locale}', {intl l='Livorno' locale=$locale}), + (172, '{$locale}', {intl l='Lodi' locale=$locale}), + (173, '{$locale}', {intl l='Lucca' locale=$locale}), + (174, '{$locale}', {intl l='Macerata' locale=$locale}), + (175, '{$locale}', {intl l='Mantova' locale=$locale}), + (176, '{$locale}', {intl l='Massa' locale=$locale}), + (177, '{$locale}', {intl l='Matera' locale=$locale}), + (178, '{$locale}', {intl l='Medio Campidano' locale=$locale}), + (179, '{$locale}', {intl l='Messina' locale=$locale}), + (180, '{$locale}', {intl l='Milano' locale=$locale}), + (181, '{$locale}', {intl l='Modena' locale=$locale}), + (182, '{$locale}', {intl l='Monza e della Brianza' locale=$locale}), + (183, '{$locale}', {intl l='Napoli' locale=$locale}), + (184, '{$locale}', {intl l='Novara' locale=$locale}), + (185, '{$locale}', {intl l='Nuoro' locale=$locale}), + (186, '{$locale}', {intl l='Ogliastra' locale=$locale}), + (187, '{$locale}', {intl l='Olbia-Tempio' locale=$locale}), + (188, '{$locale}', {intl l='Oristano' locale=$locale}), + (189, '{$locale}', {intl l='Padova' locale=$locale}), + (190, '{$locale}', {intl l='Palermo' locale=$locale}), + (191, '{$locale}', {intl l='Parma' locale=$locale}), + (192, '{$locale}', {intl l='Pavia' locale=$locale}), + (193, '{$locale}', {intl l='Perugia' locale=$locale}), + (194, '{$locale}', {intl l='Pesaro-Urbino' locale=$locale}), + (195, '{$locale}', {intl l='Pescara' locale=$locale}), + (196, '{$locale}', {intl l='Piacenza' locale=$locale}), + (197, '{$locale}', {intl l='Pisa' locale=$locale}), + (198, '{$locale}', {intl l='Pistoia' locale=$locale}), + (199, '{$locale}', {intl l='Pordenone' locale=$locale}), + (200, '{$locale}', {intl l='Potenza' locale=$locale}), + (201, '{$locale}', {intl l='Prato' locale=$locale}), + (202, '{$locale}', {intl l='Ragusa' locale=$locale}), + (203, '{$locale}', {intl l='Ravenna' locale=$locale}), + (204, '{$locale}', {intl l='Reggio Calabria' locale=$locale}), + (205, '{$locale}', {intl l='Reggio Emilia' locale=$locale}), + (206, '{$locale}', {intl l='Rieti' locale=$locale}), + (207, '{$locale}', {intl l='Rimini' locale=$locale}), + (208, '{$locale}', {intl l='Roma' locale=$locale}), + (209, '{$locale}', {intl l='Rovigo' locale=$locale}), + (210, '{$locale}', {intl l='Salerno' locale=$locale}), + (211, '{$locale}', {intl l='Sassari' locale=$locale}), + (212, '{$locale}', {intl l='Savona' locale=$locale}), + (213, '{$locale}', {intl l='Siena' locale=$locale}), + (214, '{$locale}', {intl l='Siracusa' locale=$locale}), + (215, '{$locale}', {intl l='Sondrio' locale=$locale}), + (216, '{$locale}', {intl l='Taranto' locale=$locale}), + (217, '{$locale}', {intl l='Teramo' locale=$locale}), + (218, '{$locale}', {intl l='Terni' locale=$locale}), + (219, '{$locale}', {intl l='Torino' locale=$locale}), + (220, '{$locale}', {intl l='Trapani' locale=$locale}), + (221, '{$locale}', {intl l='Trento' locale=$locale}), + (222, '{$locale}', {intl l='Treviso' locale=$locale}), + (223, '{$locale}', {intl l='Trieste' locale=$locale}), + (224, '{$locale}', {intl l='Udine' locale=$locale}), + (225, '{$locale}', {intl l='Varese' locale=$locale}), + (226, '{$locale}', {intl l='Venezia' locale=$locale}), + (227, '{$locale}', {intl l='Verbano-Cusio-Ossola' locale=$locale}), + (228, '{$locale}', {intl l='Vercelli' locale=$locale}), + (229, '{$locale}', {intl l='Verona' locale=$locale}), + (230, '{$locale}', {intl l='Vibo Valentia' locale=$locale}), + (231, '{$locale}', {intl l='Vicenza' locale=$locale}), + (232, '{$locale}', {intl l='Viterbo' locale=$locale}), + (233, '{$locale}', {intl l='Aceh' locale=$locale}), + (234, '{$locale}', {intl l='Bali' locale=$locale}), + (235, '{$locale}', {intl l='Bangka' locale=$locale}), + (236, '{$locale}', {intl l='Banten' locale=$locale}), + (237, '{$locale}', {intl l='Bengkulu' locale=$locale}), + (238, '{$locale}', {intl l='Central Java' locale=$locale}), + (239, '{$locale}', {intl l='Central Kalimantan' locale=$locale}), + (240, '{$locale}', {intl l='Central Sulawesi' locale=$locale}), + (241, '{$locale}', {intl l='Coat of arms of East Java' locale=$locale}), + (242, '{$locale}', {intl l='East kalimantan' locale=$locale}), + (243, '{$locale}', {intl l='East Nusa Tenggara' locale=$locale}), + (244, '{$locale}', {intl l='Lambang propinsi' locale=$locale}), + (245, '{$locale}', {intl l='Jakarta' locale=$locale}), + (246, '{$locale}', {intl l='Jambi' locale=$locale}), + (247, '{$locale}', {intl l='Lampung' locale=$locale}), + (248, '{$locale}', {intl l='Maluku' locale=$locale}), + (249, '{$locale}', {intl l='North Maluku' locale=$locale}), + (250, '{$locale}', {intl l='North Sulawesi' locale=$locale}), + (251, '{$locale}', {intl l='North Sumatra' locale=$locale}), + (252, '{$locale}', {intl l='Papua' locale=$locale}), + (253, '{$locale}', {intl l='Riau' locale=$locale}), + (254, '{$locale}', {intl l='Lambang Riau' locale=$locale}), + (255, '{$locale}', {intl l='Southeast Sulawesi' locale=$locale}), + (256, '{$locale}', {intl l='South Kalimantan' locale=$locale}), + (257, '{$locale}', {intl l='South Sulawesi' locale=$locale}), + (258, '{$locale}', {intl l='South Sumatra' locale=$locale}), + (259, '{$locale}', {intl l='West Java' locale=$locale}), + (260, '{$locale}', {intl l='West Kalimantan' locale=$locale}), + (261, '{$locale}', {intl l='West Nusa Tenggara' locale=$locale}), + (262, '{$locale}', {intl l='Lambang Provinsi Papua Barat' locale=$locale}), + (263, '{$locale}', {intl l='West Sulawesi' locale=$locale}), + (264, '{$locale}', {intl l='West Sumatra' locale=$locale}), + (265, '{$locale}', {intl l='Yogyakarta' locale=$locale}), + (266, '{$locale}', {intl l='Aichi' locale=$locale}), + (267, '{$locale}', {intl l='Akita' locale=$locale}), + (268, '{$locale}', {intl l='Aomori' locale=$locale}), + (269, '{$locale}', {intl l='Chiba' locale=$locale}), + (270, '{$locale}', {intl l='Ehime' locale=$locale}), + (271, '{$locale}', {intl l='Fukui' locale=$locale}), + (272, '{$locale}', {intl l='Fukuoka' locale=$locale}), + (273, '{$locale}', {intl l='Fukushima' locale=$locale}), + (274, '{$locale}', {intl l='Gifu' locale=$locale}), + (275, '{$locale}', {intl l='Gunma' locale=$locale}), + (276, '{$locale}', {intl l='Hiroshima' locale=$locale}), + (277, '{$locale}', {intl l='Hokkaido' locale=$locale}), + (278, '{$locale}', {intl l='Hyogo' locale=$locale}), + (279, '{$locale}', {intl l='Ibaraki' locale=$locale}), + (280, '{$locale}', {intl l='Ishikawa' locale=$locale}), + (281, '{$locale}', {intl l='Iwate' locale=$locale}), + (282, '{$locale}', {intl l='Kagawa' locale=$locale}), + (283, '{$locale}', {intl l='Kagoshima' locale=$locale}), + (284, '{$locale}', {intl l='Kanagawa' locale=$locale}), + (285, '{$locale}', {intl l='Kochi' locale=$locale}), + (286, '{$locale}', {intl l='Kumamoto' locale=$locale}), + (287, '{$locale}', {intl l='Kyoto' locale=$locale}), + (288, '{$locale}', {intl l='Mie' locale=$locale}), + (289, '{$locale}', {intl l='Miyagi' locale=$locale}), + (290, '{$locale}', {intl l='Miyazaki' locale=$locale}), + (291, '{$locale}', {intl l='Nagano' locale=$locale}), + (292, '{$locale}', {intl l='Nagasaki' locale=$locale}), + (293, '{$locale}', {intl l='Nara' locale=$locale}), + (294, '{$locale}', {intl l='Niigata' locale=$locale}), + (295, '{$locale}', {intl l='Oita' locale=$locale}), + (296, '{$locale}', {intl l='Okayama' locale=$locale}), + (297, '{$locale}', {intl l='Okinawa' locale=$locale}), + (298, '{$locale}', {intl l='Osaka' locale=$locale}), + (299, '{$locale}', {intl l='Saga' locale=$locale}), + (300, '{$locale}', {intl l='Saitama' locale=$locale}), + (301, '{$locale}', {intl l='Shiga' locale=$locale}), + (302, '{$locale}', {intl l='Shimane' locale=$locale}), + (303, '{$locale}', {intl l='Shizuoka' locale=$locale}), + (304, '{$locale}', {intl l='Tochigi' locale=$locale}), + (305, '{$locale}', {intl l='Tokushima' locale=$locale}), + (306, '{$locale}', {intl l='Tokyo' locale=$locale}), + (307, '{$locale}', {intl l='Tottori' locale=$locale}), + (308, '{$locale}', {intl l='Toyama' locale=$locale}), + (309, '{$locale}', {intl l='Wakayama' locale=$locale}), + (310, '{$locale}', {intl l='Yamagata' locale=$locale}), + (311, '{$locale}', {intl l='Yamaguchi' locale=$locale}), + (312, '{$locale}', {intl l='Yamanashi' locale=$locale}), + (313, '{$locale}', ''), + (314, '{$locale}', ''), + (315, '{$locale}', ''), + (316, '{$locale}', ''), + (317, '{$locale}', ''){if ! $locale@last},{/if} + +{/foreach} +; + +-- Add new column in lang table +ALTER TABLE `lang` ADD `active` BOOLEAN NOT NULL DEFAULT FALSE AFTER `decimals` ; +ALTER TABLE `lang` ADD `visible` TINYINT NOT NULL DEFAULT '0' AFTER `active` ; + +-- Update lang +UPDATE `lang` SET `active` = '1', `visible` = '1' WHERE 1; + +-- add missing primary key +ALTER TABLE `coupon_customer_count` ADD PRIMARY KEY(`coupon_id`, `customer_id`); +ALTER TABLE `ignored_module_hook` ADD PRIMARY KEY(`module_id`, `hook_id`); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.3.0-alpha2.sql.tpl b/setup/update/tpl/2.3.0-alpha2.sql.tpl new file mode 100644 index 00000000..aa9b8c27 --- /dev/null +++ b/setup/update/tpl/2.3.0-alpha2.sql.tpl @@ -0,0 +1,182 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-alpha2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='alpha2' WHERE `name`='thelia_extra_version'; + +-- Add column unsubscribed in newsletter table +ALTER TABLE `newsletter` ADD `unsubscribed` TINYINT(1) NOT NULL DEFAULT '0' AFTER `locale`; + +-- add admin email +ALTER TABLE `admin` ADD `email` VARCHAR(255) NOT NULL AFTER `remember_me_serial` ; +ALTER TABLE `admin` ADD `password_renew_token` VARCHAR(255) NOT NULL AFTER `email` ; + +-- add admin password renew message + +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES +(@max, 'new_admin_password', NULL, NULL, 'admin_password.txt', NULL, 'admin_password.html', NOW(), NOW()); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +{foreach $locales as $locale} + (@max, '{$locale}', {intl l='Mail sent to an administrator who requested a new password' locale=$locale}, {intl l='New password request on %store' store={config key="store_name"} locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Insert a fake email address for administrators, to trigger the admin update dialog +-- at next admin login. + +UPDATE `admin` set email = CONCAT('CHANGE_ME_', ID); + +ALTER TABLE `admin` ADD UNIQUE `email_UNIQUE` (`email`); + +-- additional config variables + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES +(@max_id + 1, 'minimum_admin_password_length', '4', 0, 0, NOW(), NOW()), +(@max_id + 2, 'enable_lost_admin_password_recovery', '1', 0, 0, NOW(), NOW()), +(@max_id + 3, 'notify_newsletter_subscription', '1', 0, 0, NOW(), NOW()) +; + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} + (@max_id + 1, '{$locale}', {intl l='The minimum length required for an administrator password' locale=$locale}, NULL, NULL, NULL), + (@max_id + 2, '{$locale}', {intl l='Allow an administrator to recreate a lost password (1 = yes, 0 = no)' locale=$locale}, NULL, NULL, NULL), + (@max_id + 3, '{$locale}', {intl l='Send a confirmation email to newsletter subscribers (1 = yes, 0 = no)' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Additional hooks + +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `hook`; + +INSERT INTO `hook` (`id`, `code`, `type`, `by_module`, `block`, `native`, `activate`, `position`, `created_at`, `updated_at`) VALUES + (@max_id+1, 'sale.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+2, 'sale.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+3, 'sale.main-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+4, 'sale.main-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+5, 'sale.content-top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+6, 'sale.content-bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+7, 'sale.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+8, 'sale.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+9, 'sale.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+10, 'account-order.invoice-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+11, 'account-order.delivery-address-bottom', 1, 1, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+12, 'newsletter-unsubscribe.top', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+13, 'newsletter-unsubscribe.bottom', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+14, 'newsletter-unsubscribe.stylesheet', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+15, 'newsletter-unsubscribe.after-javascript-include', 1, 0, 0, 1, 1, 1, NOW(), NOW()), + (@max_id+16, 'newsletter-unsubscribe.javascript-initialization', 1, 0, 0, 1, 1, 1, NOW(), NOW()) +; + +INSERT INTO `hook_i18n` (`id`, `locale`, `title`, `description`, `chapo`) VALUES +{foreach $locales as $locale} + (@max_id+1, '{$locale}', {intl l='Sale - at the top' locale=$locale}, NULL, NULL), + (@max_id+2, '{$locale}', {intl l='Sale - at the bottom' locale=$locale}, NULL, NULL), + (@max_id+3, '{$locale}', {intl l='Sale - at the top of the main area' locale=$locale}, NULL, NULL), + (@max_id+4, '{$locale}', {intl l='Sale - at the bottom of the main area' locale=$locale}, NULL, NULL), + (@max_id+5, '{$locale}', {intl l='Sale - before the main content area' locale=$locale}, NULL, NULL), + (@max_id+6, '{$locale}', {intl l='Sale - after the main content area' locale=$locale}, NULL, NULL), + (@max_id+7, '{$locale}', {intl l='Sale - CSS stylesheet' locale=$locale}, NULL, NULL), + (@max_id+8, '{$locale}', {intl l='Sale - after javascript include' locale=$locale}, NULL, NULL), + (@max_id+9, '{$locale}', {intl l='Sale - javascript initialization' locale=$locale}, NULL, NULL), + (@max_id+10, '{$locale}', {intl l='Order details - after invoice address' locale=$locale}, NULL, NULL), + (@max_id+11, '{$locale}', {intl l='Order details - after delivery address' locale=$locale}, NULL, NULL), + (@max_id+12, '{$locale}', {intl l='Newsletter unsubscribe page - at the top' locale=$locale}, NULL, NULL), + (@max_id+13, '{$locale}', {intl l='Newsletter unsubscribe page - at the bottom' locale=$locale}, NULL, NULL), + (@max_id+14, '{$locale}', {intl l='Newsletter unsubscribe page - CSS stylesheet' locale=$locale}, NULL, NULL), + (@max_id+15, '{$locale}', {intl l='Newsletter unsubscribe page - after javascript include' locale=$locale}, NULL, NULL), + (@max_id+16, '{$locale}', {intl l='Newsletter unsubscribe page - after javascript initialisation' locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Update module version column +ALTER TABLE `module` MODIFY `version` varchar(25) NOT NULL DEFAULT ''; + +-- Add new column in coupon table +ALTER TABLE `coupon` ADD `start_date` DATETIME AFTER`is_enabled`; +ALTER TABLE `coupon` ADD INDEX `idx_start_date` (`start_date`); + +-- Add new column in coupon version table +ALTER TABLE `coupon_version` ADD `start_date` DATETIME AFTER`is_enabled`; + +-- Add new column in order coupon table +ALTER TABLE `order_coupon` ADD `start_date` DATETIME AFTER`description`; + +-- Add new column in attribute combination table +ALTER TABLE `attribute_combination` ADD `position` INT NULL AFTER `product_sale_elements_id`; + +-- Add newsletter subscription confirmation message + +SELECT @max := MAX(`id`) FROM `message`; +SET @max := @max+1; + +INSERT INTO `message` (`id`, `name`, `secured`, `text_layout_file_name`, `text_template_file_name`, `html_layout_file_name`, `html_template_file_name`, `created_at`, `updated_at`) VALUES +(@max, 'newsletter_subscription_confirmation', NULL, NULL, 'newsletter_subscription_confirmation.txt', NULL, 'newsletter_subscription_confirmation.html', NOW(), NOW()); + +INSERT INTO `message_i18n` (`id`, `locale`, `title`, `subject`, `text_message`, `html_message`) VALUES +{foreach $locales as $locale} + (@max, '{$locale}', {intl l='Mail sent after a subscription to newsletter' locale=$locale}, {intl l='Your subscription to %store newsletter' store={config key="store_name"} locale=$locale}, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- add new config variables number_default_results_per_page +SELECT @max := IFNULL(MAX(`id`),0) FROM `config`; + +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES (@max+1, 'number_default_results_per_page.product_list', '20', '0', '0', NOW(), NOW()); +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES (@max+2, 'number_default_results_per_page.order_list', '20', '0', '0', NOW(), NOW()); +INSERT INTO `config` (`id`, `name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES (@max+3, 'number_default_results_per_page.customer_list', '20', '0', '0', NOW(), NOW()); + +INSERT INTO `config_i18n` (`id`, `locale`, `title`, `chapo`, `description`, `postscriptum`) VALUES +{foreach $locales as $locale} + (@max+1, '{$locale}', {intl l='Number by default of results per page for product list' locale=$locale}, NUll, NULL, NULL), + (@max+2, '{$locale}', {intl l='Number by default of results per page for order list' locale=$locale}, NUll, NULL, NULL), + (@max+3, '{$locale}', {intl l='Number by default of results per page for customer list' locale=$locale}, NUll, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Add module HookAdminHome +SELECT @max_id := IFNULL(MAX(`id`),0) FROM `module`; +SELECT @max_classic_position := IFNULL(MAX(`position`),0) FROM `module` WHERE `type`=1; + +INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namespace`, `created_at`, `updated_at`) VALUES +(@max_id+1, 'HookAdminHome', 1, 1, @max_classic_position+1, 'HookAdminHome\\HookAdminHome', NOW(), NOW()) +; + +INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +{foreach $locales as $locale} +(@max_id+1, '{$locale}', {intl l='Displays the default blocks on the homepage of the administration' locale=$locale}, NULL, NULL, NULL){if ! $locale@last},{/if} + +{/foreach} +; + +-- Update customer lang FK +ALTER TABLE `customer` CHANGE `lang` `lang_id` INT(11) NULL DEFAULT NULL; +ALTER TABLE `customer` ADD INDEX `idx_email` (`email`); +ALTER TABLE `customer` ADD INDEX `idx_customer_lang_id` (`lang_id`); +ALTER TABLE `customer` ADD CONSTRAINT `fk_customer_lang_id` FOREIGN KEY (`lang_id`) REFERENCES `lang` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +OPTIMIZE TABLE `customer`; + + +-- Update customer version +ALTER TABLE `customer_version` CHANGE `lang` `lang_id` INT(11) NULL DEFAULT NULL; + + +-- Update newletter index +ALTER TABLE `newsletter` ADD INDEX `idx_unsubscribed` (`unsubscribed`); + +OPTIMIZE TABLE `newsletter`; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.3.0-beta1.sql.tpl b/setup/update/tpl/2.3.0-beta1.sql.tpl new file mode 100644 index 00000000..b694fc63 --- /dev/null +++ b/setup/update/tpl/2.3.0-beta1.sql.tpl @@ -0,0 +1,18 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-beta1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta1' WHERE `name`='thelia_extra_version'; + +-- Add column position in the product_category and content_folder table +ALTER TABLE `product_category` ADD `position` INT(11) NOT NULL AFTER `default_category`; +ALTER TABLE `content_folder` ADD `position` INT(11) NOT NULL AFTER `default_folder`; + +UPDATE `product_category` INNER JOIN `product` ON `product_category`.`product_id`=`product`.`id` SET `product_category`.`position`=`product`.`position`; + +ALTER TABLE `product` CHANGE `position` `position` INT(11) COMMENT 'This column is deprecated since 2.3, and will be removed in 2.5'; +ALTER TABLE `content` CHANGE `position` `position` INT(11) COMMENT 'This column is deprecated since 2.3, and will be removed in 2.5'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.3.0-beta2.sql.tpl b/setup/update/tpl/2.3.0-beta2.sql.tpl new file mode 100644 index 00000000..3322e6c6 --- /dev/null +++ b/setup/update/tpl/2.3.0-beta2.sql.tpl @@ -0,0 +1,12 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0-beta2' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='beta2' WHERE `name`='thelia_extra_version'; + +-- Fix content folder position +UPDATE `content_folder` INNER JOIN `content` ON `content_folder`.`content_id`=`content`.`id` SET `content_folder`.`position`=`content`.`position`; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.3.0.sql.tpl b/setup/update/tpl/2.3.0.sql.tpl new file mode 100644 index 00000000..57f9ef0c --- /dev/null +++ b/setup/update/tpl/2.3.0.sql.tpl @@ -0,0 +1,12 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.0' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='0' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +-- Fix lang date/time format for fr_FR +UPDATE `lang` SET datetime_format = 'd/m/Y H:i:s' WHERE locale = 'fr_FR' and datetime_format = 'd/m/y H:i:s'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/setup/update/tpl/2.3.1.sql.tpl b/setup/update/tpl/2.3.1.sql.tpl new file mode 100644 index 00000000..eeb3bef8 --- /dev/null +++ b/setup/update/tpl/2.3.1.sql.tpl @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +UPDATE `config` SET `value`='2.3.1' WHERE `name`='thelia_version'; +UPDATE `config` SET `value`='2' WHERE `name`='thelia_major_version'; +UPDATE `config` SET `value`='3' WHERE `name`='thelia_minus_version'; +UPDATE `config` SET `value`='1' WHERE `name`='thelia_release_version'; +UPDATE `config` SET `value`='' WHERE `name`='thelia_extra_version'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/templates/.gitkeep b/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/templates/backOffice/default/404.html b/templates/backOffice/default/404.html new file mode 100644 index 00000000..c72b43b0 --- /dev/null +++ b/templates/backOffice/default/404.html @@ -0,0 +1,9 @@ +{extends file="general_error.html"} + +{block name="page-title"}{intl l='Page not found'}{/block} +{block name="content-title"}{intl l='Page not found'}{/block} + +{block name="error-message"} +

    {intl l='The server returned a "404 Not Found"'}

    +

    {intl l='The page you\'ve requested was not found. Please check the page address, and try again.'}

    +{/block} \ No newline at end of file diff --git a/templates/backOffice/default/I18n/ar_SA.php b/templates/backOffice/default/I18n/ar_SA.php new file mode 100644 index 00000000..d5684404 --- /dev/null +++ b/templates/backOffice/default/I18n/ar_SA.php @@ -0,0 +1,341 @@ + ' (الافتراضي)', + '%count more...' => '%count أكثر...', + '(edit)' => '(تحرير)', + 'Check the list of ISO 639-1 codes' => ' تحقق من القائمة من رموز ISO 639-1', + '0 combinations' => ' 0 تركيبات', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'لا يمكن ترجمة كافة الحقول. ووفقا للتكوين الخاص بك PHP، لا يمكن أن يحتوي على أشكال أكثر من %current_max_input_vars إدخال الحقول، ولكن في required_max_input_vars % أقل من المطلوب. الرجاء تغيير قيمة max_input_vars في التكوين الخاص بك PHP لتغيير ملف الترجمة باليد.', + 'Congratulations, all text is now translated !' => 'تهانينا، كل النصوص مترجمة بالكامل الآن!', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'لم يتم العثور على أي نص ترجمة. ومن الطبيعي المحتمل. إذا لم يكن الأمر كذلك، يرجى التأكد من استخدام دالة "intl" في القوالب، أو أسلوب المترجم:: trans() في ملفات PHP.', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'تحذير، بعض من مناطق الشحن الخاص بك غير مرفقة بأي وحدة التسليم:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'يمكن أن يرفق محتوى إلى مجلد واحد أو أكثر. حدد هنا مجلدات إضافية لهذا المحتوى.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'يمكن أن ترفق منتج لأكثر من فئة واحدة. حدد هنا فئات إضافية لهذا المنتج.', + 'Accessory title' => 'العنوان التبعي', + 'Action' => 'إجراء', + 'Actions' => 'إجراءات', + 'Activate this log destination' => 'تنشيط وجهة هذا السجل', + 'Active' => 'مفعل', + 'Add' => 'اضافة', + 'Add a condition' => 'إضافة شرط', + 'Add a new Customer' => 'إضافة عميل جديد', + 'Add a new address' => 'إضافة عنوان جديد', + 'Add a new category' => 'إضافة فئة جديدة', + 'Add a new combination' => 'إضافة مجموعة جديدة', + 'Add a new content' => 'إضافة محتوى جديد', + 'Add a new country' => 'إضافة بلد جديد', + 'Add a new currency' => 'إضافة عمله جديدة', + 'Add a new folder' => 'إضافة مجلد جديد', + 'Add a new language' => 'إضافة لغة جديدة', + 'Add a new mailing template' => 'إضافة قالب بريدي جديد', + 'Add a new product' => 'إضافة منتج جديد', + 'Add a new product attribute' => 'أضف سمة جديدة للمنتج', + 'Add a new product feature' => 'إضافة ميزة للمنتج الجديد', + 'Add a new product template' => 'إضافة قالب المنتج الجديد', + 'Add a new shipping zone' => 'إضافة منطقة شحن جديدة', + 'Add a new variable' => 'إضافة تغيير جديد', + 'Add tax to this group' => 'إضافة ضريبة لهذه المجموعة', + 'Add this attribute to all product templates' => 'إضافة هذه السمة على كافة قوالب المنتج', + 'Add this feature to all product templates' => 'إضافة هذه الميزة لكافة قوالب المنتج', + 'Add to all product templates' => 'إضافة إلى كافة قوالب المنتج', + 'Additional Folders' => 'مجلدات إضافية', + 'Additional address' => 'عنوان إضافي', + 'Additional categories' => 'فئات إضافية', + 'Address' => 'عنوان', + 'Administration logs' => 'إدارة السجلات', + 'Administration profiles' => 'إدارة ملفات التعريف', + 'Administrators' => 'المسؤولين', + 'Advanced configuration' => 'التكوين المتقدم', + 'Advanced configuration and tools' => 'التكوين المتقدم والأدوات', + 'All orders' => 'جميع الطلبات', + 'Amount' => 'القيمة', + 'An error occured' => 'حدث خطأ', + 'An unknow error happend' => 'حدث خطأ غير معروف', + 'And' => 'و', + 'Apply' => 'طبق', + 'Associate documents' => 'ربط المستندات', + 'Associate images' => 'ربط الصور', + 'Associations' => 'الجمعيات', + 'Attribute' => 'الخاصية', + 'Attribute Combinations' => 'تكوين السمة', + 'Attribute Name' => 'اسم الخاصية', + 'Attribute information' => 'معلومات السمة', + 'Attribute title' => 'سمة العنوان', + 'Attribute values' => 'قيم السمات', + 'Attributes' => 'عنوان الصفحة', + 'Attributes & Features' => 'سمات & وميزات', + 'Auth Mode' => 'وضع المصادقة', + 'Auth Mode :' => 'وضع المصادقة :', + 'Back' => 'خلف', + 'Back Office' => 'ادارة النظام', + 'Back-office home' => 'صفحة المكتب الخلفية', + 'Back-office template you want to translate' => 'قالب المكاتب الخلفية التي تريد ترجمتها', + 'Back-office templates' => 'قوالب المكتب الخلفي', + 'Back-office users' => 'مستخدمي المكتب الخلفي', + 'Brands' => 'العلامات التجارية', + 'Browse files' => 'تصفح الملفات', + 'Browse this category' => 'تصفح هذه الفئة', + 'Browse this folder' => 'تصفح هذا المجلد', + 'Can\'t load documents, please refresh this page.' => 'لا يمكن تحميل الوثائق، الرجاء تحديث هذه الصفحة.', + 'Can\'t load images, please refresh this page.' => 'لا يمكن تحميل الصور، الرجاء تحديث هذه الصفحة.', + 'Can\'t reorder documents, please refresh this page.' => 'لا يمكن إعادة طلب المستندات، الرجاء تحديث هذه الصفحة.', + 'Can\'t reorder images, please refresh this page.' => 'لا يمكن إعادة ترتيب الصور، الرجاء تحديث هذه الصفحة.', + 'Cancel' => 'إالغاء', + 'Cancel changes and revert to original value' => 'إلغاء التغييرات والعودة إلى القيمة الأصلية', + 'Cancel this order' => 'إلغاء هذا الطلب', + 'Cart - Prices in %currency' => 'عربة-أسعار في %currency', + 'Catalog' => 'دليل', + 'Categories' => 'الفئات', + 'Categories in %cat' => 'الفئات في %cat', + 'Category' => 'الفئة', + 'Category created on %date_create. Last modification: %date_change' => 'الفئة التي تم إنشاؤها في %date_create. آخر تعديل: %date_change', + 'Category title' => 'عنوان الفئة', + 'Cellphone' => 'الهاتف المحمول', + 'Cellular phone' => 'الهاتف الخلوي', + 'Cellular phone number' => 'رقم الهاتف الخلوي', + 'Change this administrator' => 'تغيير هذا المسؤول', + 'Change this attribute' => 'تغيير هذه السمة', + 'Change this condition' => 'تغيير هذا الشرط', + 'Change this country' => 'تغيير هذا البلد', + 'Change this coupon' => 'تغيير هذه القسيمة', + 'Change this currency' => 'تغيير هذه العملة', + 'Change this feature' => 'تغيير هذه الميزة', + 'Change this language' => 'تغيير هذه اللغة', + 'Change this mailing template' => 'تغيير هذا القالب البريدي', + 'Change this product attribute' => 'تغيير سمة هذا المنتج', + 'Change this product feature' => 'تغيير ميزة هذا المنتج', + 'Change this product template' => 'تغيير قالب هذا المنتج', + 'Change this profile' => 'تغيير ملف التعريف', + 'Change this shipping zone' => 'تغيير منطقة الشحن', + 'Change this tax' => 'تغيير هذه الضريبة', + 'Change this tax rule' => 'تغيير هذه القاعدة الضريبية', + 'Change this template' => 'تغيير هذا القالب', + 'Change this variable' => 'تغيير هذا المتغير', + 'Chapo' => 'تشابو', + 'Check this box if you want to add this attributes to all product templates' => 'حدد هذا المربع إذا كنت ترغب في إضافة هذه السمات لجميع قوالب المنتج', + 'Check this box if you want to add this features to all product templates' => 'حدد هذا المربع إذا كنت ترغب في إضافة هذه السمات لجميع قوالب المنتج', + 'Choose a country' => 'اختر البلد', + 'City' => 'المدينة', + 'Classic modules' => 'الوحدات النمطية الكلاسيكية', + 'Close' => 'إغلاق', + 'Close administation session' => 'إغلاق منطقة الإدارة', + 'Code' => 'الرمز', + 'Combinable with other promotions' => 'يمكن أن يجتمع مع عروض أخرى', + 'Combination EAN Code' => 'تركيبة كود EAN', + 'Combination builder' => 'منشئ مجموعة', + 'Combination reference' => 'إشارة الجمع', + 'Company' => 'شركة', + 'Condition category :' => 'شرط الفئة:', + 'Condition description' => 'وصف الحالة', + 'Configuration' => 'لوحة التحكم', + 'Configuration mailing system' => 'تهيئة النظام البريدي', + 'Configure' => 'تهيئة', + 'Configure this module' => 'تكوين وحدة نمطية لهذا المنتج', + 'Confirm' => 'تأكيد', + 'Confirm changes' => 'تأكيد التغييرات', + 'Confirmation' => 'تأكيد', + 'Content title' => 'عنوان المحتوى', + 'Contents in %fold' => 'محتويات في %fold', + 'Copy source text in input field' => 'نسخ نص المصدر في حقل الإدخال', + 'Countries' => 'البلدان', + 'Countries assigned to this zone' => 'البلدان التي تم تعيينها إلى هذه المنطقة', + 'Country' => 'الدولة', + 'Coupon' => 'قسيمة خصم', + 'Coupon code' => 'رمز قسيمة الخصم', + 'Coupon code * :' => 'رمز القسيمة *:', + 'Coupon type * :' => 'نوع القسيمة *:', + 'Coupons' => 'كوبونات', + 'Create' => 'إنشاء', + 'Create a customer address' => 'إنشاء عنوان العميل', + 'Create a new administrator' => 'إنشاء مدير جديد', + 'Create a new attribute' => 'إنشاء سمة جديدة', + 'Create a new attribute value' => 'قم بإنشاء قيمة السمة الجديدة', + 'Create a new category' => 'إنشاء قسم جديد', + 'Create a new combination' => 'إنشاء مجموعة جديدة', + 'Create a new content' => 'إنشاء محتوى جديد', + 'Create a new country' => 'إنشاء دولة جديدة', + 'Create a new coupon' => 'إنشاء قسيمة جديدة', + 'Create a new currency' => 'إنشاء عمله جديدة', + 'Create a new customer' => 'إنشاء عميل جديد', + 'Create a new feature' => 'إنشاء سمة جديدة', + 'Create a new feature value' => 'قم بإنشاء قيمة ميزة الجديدة', + 'Create a new folder' => 'إنشاء مجلد جديد', + 'Create a new language' => 'إنشاء لغة جديدة', + 'Create a new mailing template' => 'إنشاء قالب جديد للمراسلة البريدية', + 'Create a new product' => 'إنشاء منتج جديد', + 'Create a new product template' => 'إنشاء قالب لمنتج جديد', + 'Create a new profile' => 'إنشاء ملف شخصي', + 'Currency name' => 'اسم العملة', + 'Currency rate' => 'أسعار العملات', + 'Currency symbol' => 'رمز العملة', + 'Current product template' => 'قالب المنتج الحالي', + 'Current quantity' => 'الكمية الحالية', + 'Customer' => 'العميل', + 'Customers' => 'العملاء', + 'Customers list' => 'قائمة العملاء', + 'Cutomer Name' => 'اسم العميل', + 'Date & Hour' => 'التاريخ و الساعة', + 'Date of last order' => 'تاريخ آخر طلب', + 'Days before expiration' => 'أيام قبل انتهاء الصلاحية', + 'Deactivate %title module' => 'إلغاء تنشيط الوحدة النمطية %title', + 'Default' => 'إفتراضي', + 'Default address' => 'العنوان الإفتراضي', + 'Define here this product\'s accessories' => 'عرف هنا ملحقات هذا المنتج', + 'Delete' => 'حذف', + 'Delete a combination' => 'حذف مجموعة', + 'Delete a module' => 'حذف وحدة نمطية', + 'Delete a variable' => 'حذف التغيير', + 'Delete address' => 'حذف عنوان', + 'Delete administrator' => 'حذف المسؤول', + 'Delete also module data' => 'أيضا قم بحذف بيانات الوحدة النمطية', + 'Delete an order' => 'حذف طلب', + 'Delete attribute' => 'حذف السمة', + 'Delete attribute value' => 'حذف قيمة السمة', + 'Delete category' => 'حذف فئة', + 'Delete content' => 'حذف المحتوى', + 'Delete country' => 'حذف البلد', + 'Delete currency' => 'حذف العملة', + 'Delete customer' => 'حذف العميل', + 'Delete feature' => 'حذف سمة', + 'Delete feature value' => 'حذف قيمة الميزة', + 'Delete folder' => 'حذف مجلد', + 'Delete language' => 'حذف اللغة', + 'Delete mailing template' => 'حذف القالب البريدي', + 'Delete product' => 'حذف المنتج', + 'Delete profile' => 'حذف الملف الشخصي', + 'Delete shipping zone' => 'حذف منطقة الشحن', + 'Delete tax' => 'حذف الضرائب', + 'Delete tax rule' => 'حذف القاعدة الضريبية', + 'Delete template' => 'حذف قالب', + 'Delete this accessory' => 'حذف هذا الملحق', + 'Delete this administrator' => 'حذف هذا المسؤول', + 'Delete this attribute' => 'حذف هذه السمة', + 'Delete this category and all its contents' => 'حذف هذه الفئة وجميع محتوياتها', + 'Delete this combination' => 'حذف هذا المزيج', + 'Delete this condition' => 'حذف هذا الشرط', + 'Delete this content' => 'حذف هذا المحتوى', + 'Delete this country' => 'حذف هذا البلد', + 'Delete this currency' => 'حذف هذه العملة', + 'Delete this customer and all his orders' => 'حذف هذا العميل وجميع طلباته', + 'Delete this feature' => 'حذف هذه الميزة', + 'Delete this folder and all its contents' => 'حذف هذا المجلد وكافة محتوياته', + 'Delete this language' => 'حذف هذه اللغة', + 'Delete this mailing template' => 'حذف هذا القالب البريدي', + 'Delete this module' => 'حذف هذه الوحدة النمطية', + 'Delete this product' => 'حذف هذا المنتج', + 'Delete this product attribute' => 'حذف سمة هذا المنتج', + 'Delete this product feature' => 'حذف ميزة هذا المنتج', + 'Delete this product template' => 'حذف قالب هذا المنتج', + 'Delete this profile' => 'هل تريد حذف الملف الشخصي؟', + 'Delete this shipping zone' => 'حذف منطقة الشحن', + 'Delete this tax' => 'حذف هذه الضريبة', + 'Delete this tax rule' => 'حذف القاعدة الضريبية', + 'Delete this value' => 'حذف هذه القيمة', + 'Delete this variable' => 'حذف هذا المتغير', + 'Delete this zone' => 'حذف هذه المنطقة', + 'Delivery address' => 'عنوان التوصيل', + 'Delivery module' => 'طريقة التوصيل', + 'Delivery modules' => 'طريقة التوصيل', + 'Description' => 'الوصف', + 'Destinations' => 'الوجهات', + 'Disabled' => 'تعطيل', + 'Discount' => 'خصم', + 'Do not use a product template' => 'لا تستخدم قالب المنتج', + 'Do you really want to add this attribute to all product templates ?' => 'هل تريد حقاً اضافة هذه السمة إلى جميع قوالب المنتج؟', + 'Do you really want to add this feature to all product templates ?' => 'هل تريد حقاً اضافة هذه الميزة لكافة قوالب المنتج؟', + 'Do you really want to cancel this order ?' => 'هل تريد إلغاء هذا الطلب حقاً؟', + 'Do you really want to delete this address ?' => 'هل تريد حذف هذا العنوان حقاً؟', + 'Do you really want to delete this administrator ?' => 'هل تريد حذف هذا المسؤول حقاً؟', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'هل تريد حذف هذه السمة حقاً؟ يمكن إزالتها من كافة قوالب المنتج.', + 'Do you really want to delete this attribute value ?' => 'هل تريد حذف قيمة السمة حقاً؟', + 'Do you really want to delete this category and all its content ?' => 'هل تريد فعلا حذف هذه الفئة وكافة محتوياتها؟', + 'Do you really want to delete this combination ?' => 'هل تريد حذف هذا المزيج حقاً؟', + 'Do you really want to delete this condition ?' => 'هل تريد حذف هذا المزيج حقاً؟', + 'Do you really want to delete this content ?' => 'هل تريد حذف هذا المحتوى حقاً؟', + 'Do you really want to delete this country ?' => 'هل تريد حذف هذا البلد حقاً؟', + 'Do you really want to delete this currency ?' => 'هل تريد حذف هذه العملة حقاً؟', + 'Do you really want to delete this customer ?' => 'هل تريد حذف هذا العميل حقاً؟', + 'Do you really want to delete this element ?' => 'هل حقاً تريد حذف هذا العنصر؟', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'هل تريد فعلا حذف هذه الميزة؟ يمكن إزالتها من كافة قوالب المنتج.', + 'Do you really want to delete this feature value ?' => 'هل تريد حذف قيمة الميزة حقاً؟', + 'Do you really want to delete this folder and all its content ?' => 'هل حقاً تريد حذف هذا المجلد وكافة محتوياته؟', + 'Do you really want to delete this image ?' => 'هل تريد حذف هذه الصورة حقاً؟', + 'Do you really want to delete this language ?' => 'هل تريد حذف هذه اللغة حقاً؟', + 'EAN Code' => 'كود EAN', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.', + 'Edit' => 'تحرير', + 'Edit a template' => 'تحرير قالب', + 'Edit an attribute' => 'تحرير السمة', + 'Edit an image' => 'تحرير الصورة', + 'Edit an order' => 'تحرير الطلب', + 'Edit attribute "%name"' => 'تحرير السمة "%name"', + 'Edit category' => 'تحرير الفئة', + 'Edit category %title' => 'تحرير الفئة %title', + 'Edit content' => 'مراجعة المحتوى', + 'Edit content %title' => 'تحرير محتوى %title', + 'Edit this address' => 'تحرير عنوان هذا', + 'Email address' => 'عنوان البريد الإلكتروني', + 'Encryption' => 'التشفير', + 'Errors' => 'أخطاء', + 'First Name' => 'الاسم الأول', + 'Folder' => 'مجلّد', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'Front Office' => 'الواجهة', + 'Home' => 'صفحة البداية', + 'Hooks' => 'روابط', + 'Host' => 'المضيف / Host', + 'If a translation is missing or incomplete :' => 'إذا كانت الترجمة مفقودة أو غير كاملة:', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.', + 'In order to manges your shop taxes you can manage' => 'In order to manges your shop taxes you can manage', + 'Invoice' => 'الفاتورة', + 'Language name' => 'اسم اللغة', + 'Last Name' => 'الاسم الأخير', + 'Lastname' => 'الإسم الأخير', + 'Login' => 'تسجل الدخول', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rule taxes appliance order', + 'Maximum usage count :' => 'Maximum usage count :', + 'Name' => 'الإسم', + 'Order details' => 'تفاصيل الطلب', + 'Password' => 'كلمة المرور', + 'Phone' => 'الهاتف', + 'Port' => 'منفذ Port', + 'Position' => 'موضع', + 'Postage' => 'الارسالية', + 'Price' => 'السعر', + 'Product price including taxes' => 'سعر المنتج مع الضرائب', + 'Profil' => 'الملف الشخصي', + 'Profile' => 'الملف الشخصي', + 'Quantity' => 'الكمية', + 'Reference' => 'مرجع', + 'Save chages' => 'Save chages', + 'Save changes' => 'Save chages', + 'Search' => 'بحث', + 'Send' => 'إرسل', + 'Source IP' => 'مصدر IP', + 'Status' => 'الحالة', + 'Tax rules' => 'Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of different taxes.', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes define the amount of money which is added to a bought product.', + 'There is currently no available attributes.' => 'There is currently no available attributes.', + 'There is currently no available features.' => 'There is currently no available features.', + 'There is no documents attached to this %type.' => 'There is no documents attached to this %type.', + 'There is no images attached to this %type.' => 'There is no images attached to this %type.', + 'Timeout' => 'انتهاء المهلة', + 'Title' => 'العنوان', + 'Total' => 'الإجمالي', + 'Update' => 'تحديث', + 'Usage count' => 'Usage count', + 'Usages left' => 'Usage count', + 'Username' => 'اسم المستخدم', + 'Value' => 'القيمة', + 'View' => 'عرض', + 'Warning' => 'تحذير', + 'Weight' => 'الوزن', + 'Zip code' => 'الرمز البريدي', + 'firstname & lastname' => 'firstname & lastname', + 'permanent discount' => 'خصم دائم (في المائة)', + 'tracking reference' => 'tracking reference', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.', +]; diff --git a/templates/backOffice/default/I18n/cs_CZ.php b/templates/backOffice/default/I18n/cs_CZ.php new file mode 100644 index 00000000..5ec97be2 --- /dev/null +++ b/templates/backOffice/default/I18n/cs_CZ.php @@ -0,0 +1,39 @@ + 'Přidat novou adresu', + 'Address' => 'Adresa', + 'All' => 'Vše', + 'Amount' => 'Množství', + 'An error occured' => 'Došlo k chybě', + 'Back' => 'Zpět', + 'Cancel' => 'Zrušit', + 'Categories' => 'Kategorie', + 'Category' => 'Kategorie', + 'Cellphone' => 'Mobilní telefon', + 'Content' => 'Obsah', + 'Coupon code' => 'Kód kupónu', + 'Create' => 'Vytvořit', + 'Decimal places' => 'Počet desetinných míst', + 'Delivery address' => 'Doručovací adresa', + 'Description' => 'Popis', + 'Do you really want to delete this address ?' => 'Opravdu chcete odstranit tuto adresu?', + 'Edit' => 'Upravit', + 'Edit this address' => 'Upravit tuto adresu', + 'Email address' => 'E-mailová adresa', + 'Home' => 'Domů', + 'Login' => 'Přihlášení', + 'Name' => 'Název', + 'Order details' => 'Detail objednávky', + 'Password' => 'Heslo', + 'Position' => 'Pozice', + 'Price' => 'Cena', + 'Quantity' => 'Množství', + 'Search' => 'Vyhledávání', + 'Send' => 'Odeslat', + 'Status' => 'Stav', + 'Total' => 'Celkem', + 'Update' => 'Aktualizovat', + 'View' => 'Prohlížet', + 'Warning' => 'Upozornění', +]; diff --git a/templates/backOffice/default/I18n/de_DE.php b/templates/backOffice/default/I18n/de_DE.php new file mode 100644 index 00000000..d6fb286f --- /dev/null +++ b/templates/backOffice/default/I18n/de_DE.php @@ -0,0 +1,1287 @@ + '(standart)', + '%count more...' => '%count mehr...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count Lieferzone(n) sind zu diesem Modul assoziiert: %zones. Klicken Sie hier um zu ändern', + '(edit)' => '(bearbeiten)', + 'Check the list of ISO 639-1 codes' => 'Liste ansehen von ISO 639-1 codes', + '0 combinations' => '0 Kombinationen', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Unmöglich alle Datenfelder zu übersetzen. Ihre PHP-Konfiguration limitiert die Anzahl den Datenfelder auf %current_max_input_vars Datenfelder. Mindestens %required_max_input_vars sind erforderlich. Bitte ändern Sie die Angabe max_input_vars in Ihre PHP-Konfiguration oder ändern Sie die Übersetzungsdatei von Hand. ', + 'Congratulations, all text is now translated !' => 'Alle Texten sind jetzt übersetzt !', + 'Developer : to change the translations of the resource' => 'Entwickler: die Übersetzungen der Ressource ändern', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Es gibt keinen Text zu übersetzen. Es ist wahrscheinlich normal. Wenn nicht, bitten wir Sie die Smartys Funktion "intl" in den Templates zu benutzen, oder die Translator::trans() Methode in den PHP Dateien. ', + 'User : to redefine the translations for your website' => 'Benutzer: die Übersetzungen für Ihre Website neu definieren', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Warnung, für mindestens eine Währung wurde kein Wechselkurs gefunden: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Warnung, einige Länder sind in keine Lieferzone enthalten : ', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Warnung, einige Lieferzonen sind mit keinem Modul verbunden', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Ein Inhalt kann zu mehreren Ordner assoziiert sein. Wählen Sie hier die zusätzlichen Ordner für diesen Inhalt aus. ', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Ein Produkt kann zu mehr als einer Kategorie verbunden sein. Wählen Sie hier die zusätzlichen Kategorien für dieses Produkt.', + 'API configuration' => 'API Konfiguration', + 'API list access' => 'Api Liste Access', + 'API users' => 'API Benutzer', + 'Accessory title' => 'Zubehörtitel', + 'Action' => 'Aktion', + 'Actions' => 'Aktionen', + 'Activate this log destination' => 'Diese Protokolldestination aktivieren', + 'Active' => 'Aktiv', + 'Add' => 'Hinzufügen', + 'Add a condition' => 'Eine Bedingung hinzufügen', + 'Add a module to a hook' => 'Ein Modul zu einem Hook hinzufügen', + 'Add a new Customer' => 'Neuen Kunden anlegen', + 'Add a new address' => 'Neue Adresse hinzufügen', + 'Add a new brand' => 'Eine neue Marke hinzufügen', + 'Add a new category' => 'Eine neue Kategorie hinzufügen', + 'Add a new combination' => 'Eine neue Kombination hinzufügen', + 'Add a new content' => 'Ein neuen Inhalt hinzufügen', + 'Add a new country' => 'Neues Land hinzufügen', + 'Add a new currency' => 'Eine neue Währung hinzufügen', + 'Add a new folder' => 'Neuen Ordner hinzufügen', + 'Add a new hook' => 'Neues Hook hinzufügen', + 'Add a new language' => 'Eine neue Sprache hinzufügen', + 'Add a new mailing template' => 'Neuen Mailing Template erstellen', + 'Add a new module in a hook' => 'An einem Hook ein neues Modul fügen', + 'Add a new module to this hook' => 'An diesem Hook ein neues Modul fügen', + 'Add a new product' => 'Ein neues Produkt hinzufügen', + 'Add a new product attribute' => 'Neue Produktdeklination hinzufügen', + 'Add a new product feature' => 'Neue Thelias Produktcharakteristik erstellen', + 'Add a new product template' => 'Eine neue Produktvorlage hinzufügen', + 'Add a new sale' => 'Ein neues Sonderangebot hinzufügen', + 'Add a new shipping zone' => 'Neue Fieferzone hinzufügen', + 'Add a new state' => 'Bundesland hinzufügen', + 'Add a new variable' => 'Eine neue Variabel hinzufügen', + 'Add document to your product.' => 'Dokument zu den Produkt hinzufügen', + 'Add selected countries' => 'Ausgewählten Länder hinzufugen', + 'Add tax to this group' => 'Taxe in dieser Gruppe hinzufügen', + 'Add this attribute to all product templates' => 'Diese Produktdeklination zu allen Vorlagen hinzufügen', + 'Add this feature to all product templates' => 'Diese Charakteristik für alle Produktvorlagen hinzufügen', + 'Add to all product templates' => 'Zu allen Produktvorlagen hinzufügen', + 'Add to selected categories' => 'Zu den ausgewählten Kategorien hinzufügen', + 'Additional Folders' => 'Zusätzlichen Ordner', + 'Additional address' => 'Zusätzliche Adresse', + 'Additional categories' => 'Weitere Kategorien', + 'Address' => 'Adresse', + 'Administration logs' => 'Verwaltungsprotokolle', + 'Administration profiles' => 'Administrationsprofile', + 'Administrators' => 'Administratoren', + 'Advanced configuration' => 'Erweiterte Konfiguration', + 'Advanced configuration and tools' => 'Erweiterte Konfiguration und Werkzeuge', + 'All' => 'Alle', + 'All States' => 'Alle Bundesländer', + 'All orders' => 'Alle Bestellungen', + 'Amount' => 'Betrag', + 'Amount, e.g. 12.50' => 'Betrag, zb. 12.50', + 'An error occured' => 'Ein Fehler ist aufgetreten', + 'An unexpected error occured' => 'Einen Fehler ist aufgetreten', + 'An unknow error happend' => 'Ein unerwarteter Fehler ist aufgetreten', + 'An unknown error occured, please try again.' => 'Einen Fehler ist aufgetreten, bitte probieren Sie es erneut.', + 'And' => 'Und', + 'Api' => 'Api', + 'Api key' => 'Api key', + 'Applies to attribute values :' => 'Für die Deklinationsangaben : ', + 'Applies to products :' => 'Für die Produkte : ', + 'Applies to products in categories :' => 'Für die Produktkategorien', + 'Apply' => 'Anwenden', + 'Assigned modules' => 'Zugeordnete Module', + 'Associate documents' => 'Zugeordnete Dokumente', + 'Associate downloadable file' => 'Assoziierte herunterladbare Datei', + 'Associate files to your combinations' => 'Dateien zu Ihren Kombinationen assoziieren', + 'Associate images' => 'Zugehörige Bilder', + 'Associated' => 'Verbunden', + 'Associations' => 'Verbindungen', + 'Attribute' => 'Deklination', + 'Attribute %title' => 'Deklination %title', + 'Attribute Combinations' => 'Deklinations-Kombinationen', + 'Attribute Name' => 'Deklinationsname', + 'Attribute information' => 'Deklinationsinformation', + 'Attribute title' => 'Deklinationstitel', + 'Attribute values' => 'Deklinationsangaben', + 'Attributes' => 'Deklinationen', + 'Attributes & Features' => 'Deklinationen & Charakteristiken', + 'Auth Mode' => 'Auth-Modus', + 'Auth Mode :' => 'Auth-Modus :', + 'Author' => 'Autor', + 'Available product categories' => 'Verfügbare Produktkategorien', + 'Available taxes' => 'Verfügbaren Steuern', + 'Back' => 'Zurück', + 'Back Office' => 'Back-Office', + 'Back-office home' => 'Back Office Startseite', + 'Back-office template you want to translate' => 'Back-Office Template zu übersetzen', + 'Back-office templates' => 'Back-office Templates', + 'Back-office users' => 'Back Office Benutzer', + 'Best taxed price' => 'Beste besteuert Preis', + 'Block' => 'Block', + 'Block :' => 'Block : ', + 'Brand created on %date_create. Last modification: %date_change' => 'Marke den %date_create erstellt. Letzte Bearbeitung: %date_change', + 'Brands' => 'Marken', + 'Browse files' => 'Dateien durchsuchen', + 'Browse this category' => 'Diese Kategorie durchsuchen', + 'Browse this folder' => 'Diesen Ordner durchsuchen', + 'By module' => 'Nach Modul', + 'By module:' => 'Per Modul : ', + 'By status' => 'Nach Status', + 'By type' => 'Nach Typ', + 'Can\'t load documents, please refresh this page.' => 'Dokumente können nicht geladen werden, bitte aktualisieren Sie diese Seite.', + 'Can\'t load images, please refresh this page.' => 'Bilder können nicht geladen werden, bitte aktualisieren Sie diese Seite.', + 'Can\'t reorder documents, please refresh this page.' => 'Dokumente können nicht geordnet werden, bitte aktualisieren Sie diese Seite.', + 'Can\'t reorder images, please refresh this page.' => 'Bilder können nicht geordnet werden, bitte aktualisieren Sie diese Seite.', + 'Cancel' => 'Abbrechen', + 'Cancel changes and revert to original value' => 'Diese Variable löschen', + 'Cancel this order' => 'Diese Bestellung stornieren', + 'Cart - Prices in %currency' => 'Warenkorb - Preise in %currency', + 'Catalog' => 'Katalog', + 'Categories' => 'Kategorien', + 'Categories in %cat' => 'Kategorien in %cat', + 'Category' => 'Kategorie', + 'Category created on %date_create. Last modification: %date_change' => 'Kategorie den %date_create erstellt. Letzte Bearbeitung : %date_change', + 'Category title' => 'Kategorie Titel', + 'Cellphone' => 'Mobiltelefonnummer', + 'Cellular phone' => 'Mobiltelefon', + 'Cellular phone number' => 'Mobiltelefonnummer', + 'Change sale configuration' => 'Sonderangebotskonfiguration ändern', + 'Change this administrator' => 'Diesen Administrator ändern', + 'Change this api access' => 'Diesen Api Access ändern', + 'Change this attribute' => 'Diese Produktdeklination ändern', + 'Change this brand' => 'Dieses Marke ändern ', + 'Change this condition' => 'Diese Bedingung ändern', + 'Change this country' => 'Dieses Land ändern', + 'Change this coupon' => 'Diesen Gutschein ändern', + 'Change this currency' => 'Diese Währung ändern', + 'Change this feature' => 'Diese Charakteristik ändern', + 'Change this hook' => 'Diesen Hook ändern', + 'Change this language' => 'Diese Sprache ändern', + 'Change this mailing template' => 'Diesen E-Mail Template bearbeiten', + 'Change this product attribute' => 'Diese Produktdeklination ändern', + 'Change this product feature' => 'Diese Produktcharakteristik ändern', + 'Change this product template' => 'Diese Produktvorlage ändern', + 'Change this profile' => 'Dieses Profil ändern', + 'Change this sale' => 'Dieses Sonderangebot ändern', + 'Change this shipping zone' => 'Diese Lieferzone ändern', + 'Change this state' => 'Bundesland ändern', + 'Change this tax' => 'Diese Taxe ändern', + 'Change this tax rule' => 'Diese Taxregel ändern', + 'Change this template' => 'Diese Vorlage ändern', + 'Change this variable' => 'Diese Variable ändern', + 'Chapo' => 'Vorspann', + 'Check sale activation' => 'Sonderangebot-Aktivierung überprüfen', + 'Check the support of hooks.' => 'Hook-Support überprüfen. ', + 'Check this box if you want to add this attributes to all product templates' => 'Markieren Sie dieses Kästchen, wenn Sie diese Deklination zu allen Produkt-Templates beifügen möchten', + 'Check this box if you want to add this features to all product templates' => 'Markieren Sie das Kästchen um diese Charakteristik zu allen Produktvorlagen zu hinzufügen', + 'Choose a configuration' => 'Wählen Sie eine Konfiguration', + 'Choose a country' => 'Wählen Sie ein Land aus', + 'City' => 'Stadt', + 'Classic modules' => 'Standartmodule', + 'Click to view' => 'Clicken um zu ansehen', + 'Click to view details.' => 'Klicken Sie hier um Informationen zu erhalten.', + 'Clone' => 'klonen', + 'Clone product' => 'Produkt klonen', + 'Close' => 'Sperren', + 'Close administation session' => 'Adminsitzug schließen', + 'Code' => 'Code', + 'Code:' => 'Code :', + 'Combinable with other promotions' => 'Mit anderen Sonderangebote kombinierbar', + 'Combination EAN Code' => 'EAN Code Kombination', + 'Combination builder' => 'Kombinations-Builder ', + 'Combination reference' => 'Kombinationsreferenz', + 'Company' => 'Firma', + 'Condition category :' => 'Bedingungskategorie :', + 'Condition description' => 'Bedingungsbeschreibung', + 'Configuration' => 'Einstellungen', + 'Configuration mailing system' => 'Mailing System Konfiguration', + 'Configure' => 'Konfigurieren', + 'Configure this module' => 'Dieses Modul konfigurieren', + 'Confirm' => 'Bestätigen', + 'Confirm changes' => 'Änderungen speichern', + 'Confirmation' => 'Bestätigung', + 'Congratulations, your password was successfully changed. You can now login.' => 'Herzlichen Glückwunsch, wurde Ihr Passwort erfolgreich geändert. Sie können sich jetzt anmelden.', + 'Content' => 'Inhalt', + 'Content title' => 'Inhalt Titel', + 'Contents in %fold' => 'Inhalte in %fold', + 'Copy all missing translations.' => 'Alle fehlenden Übersetzungen kopieren', + 'Copy all translations.' => 'Alle Übersetzungen kopieren', + 'Copy source text in input field' => 'Ursprungtext im input field kopieren', + 'Countries' => 'Länder', + 'Countries assigned to this zone' => 'Dieser Zone zugeordnete Länder', + 'Countries/states configuration' => 'Länder/Staaten Konfiguration', + 'Country' => 'Land', + 'Coupon' => 'Gutschein', + 'Coupon code' => 'Gutschein Code : ', + 'Coupon code * :' => 'Gutschein Code * :', + 'Coupon conditions' => 'Gutschein Bedingungen', + 'Coupon type * :' => 'Gutscheintyp * : ', + 'Coupons' => 'Gutscheine', + 'Create' => 'Erstellen', + 'Create a customer address' => 'Eine Kundeadresse erstellen', + 'Create a new API access' => 'Neuen API Access erstellen', + 'Create a new Hook' => 'Neues Hook erstellen', + 'Create a new administrator' => 'Neuen Administrator erstellen', + 'Create a new attribute' => 'Eine neue Deklination erstellen', + 'Create a new attribute value' => 'Neue Deklinationsangabe erstellen', + 'Create a new brand' => 'Eine neue Marke erstellen', + 'Create a new category' => 'Eine neue Kategorie herstellen', + 'Create a new combination' => 'Neue Kombination erstellen', + 'Create a new content' => 'Ein neuen Inhalt erstellen', + 'Create a new country' => 'Neues Land erstellen', + 'Create a new coupon' => 'Neuen Gutschein erstellen', + 'Create a new currency' => 'Eine neue Währung erstellen', + 'Create a new customer' => 'Ein neuen Kunde erstellen', + 'Create a new feature' => 'Neue Charakteristik erstellen', + 'Create a new feature value' => 'Eine neue Charakteristikangabe erstellen', + 'Create a new folder' => 'Ein neuen Ordner erstellen', + 'Create a new language' => 'Eine neue Sprache erstellen', + 'Create a new mailing template' => 'Neuen E-Mail Template erstellen', + 'Create a new product' => 'Neues Produkt erstellen', + 'Create a new product template' => 'Eine neue Produktvorlage erstellen', + 'Create a new profile' => 'Ein neues Profil erstellen', + 'Create a new sale' => 'Neue Sonderangebot erstellen', + 'Create a new shipping zone' => 'Neue Lieferzone erstellen', + 'Create a new state' => 'Neues Bundesland erstellen', + 'Create a new tax' => 'Eine neue Taxe erstellen', + 'Create a new tax rule' => 'Neue Taxregel erstellen', + 'Create a new variable' => 'Eine neue Variable erstellen', + 'Create combinations' => 'Kombinationen erstellen', + 'Create coupon' => 'Gutschein erstellen', + 'Create this address' => 'Diese Adresse erstellen', + 'Create this attribute' => 'Diese Deklination erstellen', + 'Create this brand' => 'Diese Marke erstellen', + 'Create this category' => 'Dieses Kategorie erstellen', + 'Create this combination' => 'Diese Kombination erstellen', + 'Create this content' => 'Diesen Inhalt erstellen', + 'Create this country' => 'Dieses Land erstellen', + 'Create this currency' => 'Diese Währung erstellen', + 'Create this customer' => 'Diesen Kunde erstellen', + 'Create this feature' => 'Diese Charakteristik erstellen', + 'Create this folder' => 'Diesen Ordner erstellen', + 'Create this hook' => 'Dieses hook erstellen', + 'Create this hooks' => 'Dieses Hook erstellen', + 'Create this language' => 'Diese Sprache erstellen', + 'Create this mailing template' => 'Diesen E-Mail Template erstellen', + 'Create this product' => 'Dieses Produkt erstellen', + 'Create this product template' => 'Diese Produktvorlage erstellen', + 'Create this sale' => 'Diese Sonderangebot erstellen', + 'Create this shipping zone' => 'Diese Lieferzone erstellen', + 'Create this state' => 'Dieses Bundesland erstellen', + 'Create this value' => 'Diese Angabe erstellen', + 'Create this variable' => 'Diese Variable erstellen', + 'Currencies' => 'Währungen', + 'Currency name' => 'Währungsname', + 'Currency rate' => 'Währungskurs', + 'Currency symbol' => 'Währung Symbol', + 'Current product template' => 'Aktuelle Produktevorlage', + 'Current quantity' => 'Aktuelle Menge', + 'Customer' => 'Kunde', + 'Customer information' => 'Kunde Informationen', + 'Customer informations' => 'Kunde Informationen', + 'Customer is' => 'Der Kunde ist', + 'Customers' => 'Kunden', + 'Customers list' => 'Kundenliste', + 'Cutomer Name' => 'Kundenname', + 'Date & Hour' => 'Datum & Uhrzeit', + 'Date of last order' => 'Letzte Bestellung', + 'Days before expiration' => 'Tage vor Ablauf', + 'Deactivate %title module' => 'Modul %title deaktivieren', + 'Deactivate hook' => 'Hook deaktivieren', + 'Deactivate this hooks' => 'Dieses Hook deaktivieren', + 'Decimal places' => 'Anzahl der Nachkommastellen', + 'Default' => 'Standart', + 'Default address' => 'Standart Adresse', + 'Define here this product\'s accessories' => 'Wählen Sie hier die Zubehöre für dieses Produkt', + 'Delete' => 'Löschen', + 'Delete a combination' => 'Eine Kombination löschen', + 'Delete a module' => 'Ein Modul löschen', + 'Delete a variable' => 'Diese Variable löschen', + 'Delete address' => 'Adresse löschen', + 'Delete administrator' => 'Administrator löschen', + 'Delete also module data' => 'Moduldateien auch löschen', + 'Delete an order' => 'Eine Bestellung löschen', + 'Delete api access' => 'Api Access löschen', + 'Delete attribute' => 'Deklination löschen', + 'Delete attribute value' => 'Deklinationsangabe löschen', + 'Delete brand' => 'Dieses Marke löschen', + 'Delete category' => 'Diese Kategorie löschen', + 'Delete content' => 'Inhalt löschen', + 'Delete country' => 'Land löschen', + 'Delete coupon' => 'Gutschein löschen', + 'Delete currency' => 'Währung löschen', + 'Delete customer' => 'Kunde löschen', + 'Delete feature' => 'Diese Charakteristik löschen', + 'Delete feature value' => 'Charakteristikangabe löschen', + 'Delete folder' => 'Ordner löschen', + 'Delete hook' => 'Hook löschen', + 'Delete language' => 'Sprache löschen', + 'Delete mailing template' => 'Diesen E-Mail löschen', + 'Delete product' => 'Dieses Produkt löschen', + 'Delete profile' => 'Profil löschen', + 'Delete sale' => 'Sonderangebot löschen', + 'Delete selected countries' => 'Gewählten Länder löschen', + 'Delete shipping zone' => 'Diese Lieferzone löschen', + 'Delete state' => 'Bundesland löschen', + 'Delete tax' => 'Taxe löschen', + 'Delete tax rule' => 'Taxregel löschen', + 'Delete template' => 'Vorlage löschen', + 'Delete this accessory' => 'Diese Kategorie löschen', + 'Delete this administrator' => 'Diesen Administrator löschen', + 'Delete this api access' => 'Diesen Api Access löschen', + 'Delete this attribute' => 'Diese Deklination löschen', + 'Delete this brand' => 'Diese Marke löschen', + 'Delete this category and all its contents' => 'Diese Kategorie und alle Inhalte löschen ', + 'Delete this combination' => 'Diese Kombination löschen', + 'Delete this condition' => 'Diese Bedingung löschen', + 'Delete this content' => 'Diesen Inhalt löschen', + 'Delete this country' => 'Dieses Land löschen', + 'Delete this coupon' => 'Diesen Gutschein löschen', + 'Delete this currency' => 'Diese Währung löschen', + 'Delete this customer address' => 'Diese Adresse löschen', + 'Delete this customer and all his orders' => 'An diese Kunde eine E-mail senden', + 'Delete this feature' => 'Diese Charakteristik löschen', + 'Delete this folder' => 'Ordner löschen', + 'Delete this folder and all its contents' => 'Diesen Ordner löschen und alle Inhalte', + 'Delete this hook' => 'Dieses Hook löschen', + 'Delete this language' => 'Diese Sprache löschen', + 'Delete this mailing template' => 'Diesen E-Mail Template löschen', + 'Delete this module' => 'Dieses Modul löschen', + 'Delete this product' => 'dieses Produkt löschen', + 'Delete this product attribute' => 'Diese Produktdeklination löschen', + 'Delete this product feature' => 'Diese Produktcharakteristik löschen', + 'Delete this product template' => 'Diese Produktvorlage löschen', + 'Delete this profile' => 'Dieses Profil löschen', + 'Delete this sale' => 'Dieses Sonderangebot löschen', + 'Delete this shipping zone' => 'Diese Lieferzone löschen', + 'Delete this state' => 'Dieses Bundesland löschen', + 'Delete this tax' => 'Diese Taxe löschen', + 'Delete this tax rule' => 'Diese Taxregel löschen', + 'Delete this value' => 'Diese Angabe löschen', + 'Delete this variable' => 'Diese Variable löschen', + 'Delete this zone' => 'Diese Zone löschen', + 'Delivery' => 'Lieferung', + 'Delivery address' => 'Lieferadresse', + 'Delivery module' => 'Liefermodul', + 'Delivery modules' => 'Liefermodule', + 'Description' => 'Beschreibung', + 'Destinations' => 'Destinationen', + 'Developer mode' => 'Entwicklermodus', + 'Disabled' => 'Deaktiviert ', + 'Discount' => 'Rabatt', + 'Discount amount' => 'Rabattbetrag', + 'Discount percentage' => 'Rabatt Prozent', + 'Discover all our modules on Thelia Modules !' => 'Finden Sie alle unsere Module auf Thelia Module ! ', + 'Do not use a product template' => 'Keine Produktvorlage benutzen', + 'Do this export' => 'Diesen Export machen', + 'Do this import' => 'Diesen Import tun', + 'Do you really want to add this attribute to all product templates ?' => 'Möchten Sie wirklich diese Deklination zu allen Produktvorlagen hinzufügen ?', + 'Do you really want to add this feature to all product templates ?' => 'Möchten Sie wirklich diese Charakteristik zu allen Produktvorlagen hinzufügen ?', + 'Do you really want to cancel this order ?' => 'Möchten Sie wirklich diese Bestellung löschen ?', + 'Do you really want to delete this address ?' => 'Möchten sie wirklich diese Adresse löschen ?', + 'Do you really want to delete this administrator ?' => 'Möchten Sie wirklich diesen Administrator löschen ?', + 'Do you really want to delete this api access ?' => 'Möchten Sie wirklich diesen Api Access löschen ?', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'Möchten Sie wirklich diese Deklination löschen ? Es wird von allen Produktvorlagen gelöscht.', + 'Do you really want to delete this attribute value ?' => 'Möchten Sie wirklich diese Deklinationsangabe löschen ?', + 'Do you really want to delete this brand ?' => 'Möchten Sie wirklich diese Marke löschen ?', + 'Do you really want to delete this category and all its content ?' => 'Möchten Sie wirklich diese Kategorie und alle Inhalte löschen ?', + 'Do you really want to delete this combination ?' => 'Möchten Sie wirklich diese Kombination löschen ?', + 'Do you really want to delete this condition ?' => 'Möchten Sie wirklich diese Bedingung löschen ?', + 'Do you really want to delete this content ?' => 'Möchten Sie wirklich diesen Inhalt löschen ?', + 'Do you really want to delete this country ?' => 'Möchten Sie wirklich dieses Land löschen ?', + 'Do you really want to delete this coupon ?' => 'Möchten Sie wirklich diesen Gutschein löschen ?', + 'Do you really want to delete this currency ?' => 'Möchten Sie wirklich diese Währung löschen ?', + 'Do you really want to delete this customer ?' => 'Möchten Sie wirklich diesen Kunde löschen ?', + 'Do you really want to delete this document ?' => 'Möchten Sie wirklich dieses Dokument löschen', + 'Do you really want to delete this element ?' => 'Möchten Sie wirklich dieses Element löschen ?', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'Möchten Sie wirklich diese Charakteristik löschen ? Sie wird von allen Produkt Templates entfernt.', + 'Do you really want to delete this feature value ?' => 'Möchten Sie wirklich diese Charakteristikangabe löschen ?', + 'Do you really want to delete this folder and all its content ?' => 'Möchten Sie wirklich diesen Ordner und alle Inhalte löschen ?', + 'Do you really want to delete this hook ?' => 'Möchten Sie wirklich dieses Hook löschen', + 'Do you really want to delete this image ?' => 'Möchten Sie wirklich dieses Bild löschen ? ', + 'Do you really want to delete this language ?' => 'Möchten Sie wirklich diese Sprache löschen', + 'Do you really want to delete this mailing template ?' => 'Möchten Sie wirklich diesen E-Mail Template löschen ?', + 'Do you really want to delete this module ?' => 'Möchten Sie wirklich dieses Modul löschen ?', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => 'Möchten Sie wirklich dieses Produkt löschen und alle Komponenten (Bilder, Dokumente)?
    Keine Stornierung möglich.', + 'Do you really want to delete this profile ?' => 'Möchten Sie wirklich dieses Profil löschen ?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'Möchten Sie wirklich diese Sonderangebot löschen ? ', + 'Do you really want to delete this shipping zone ?' => 'Möchten Sie wirklich diese Lieferzone löschen ?', + 'Do you really want to delete this state ?' => 'Möchten Sie dieses Bundesland wirklich löschen?', + 'Do you really want to delete this tax ?' => 'Möchten Sie wirlich diese Taxe löschen ?', + 'Do you really want to delete this tax rule ?' => 'Möchten Sie wirklich diese Taxregel löschen ?', + 'Do you really want to delete this template ? It will be removed from all products.' => 'Möchten Sie wirklich diese Vorlage löschen ? Es wird von allen Produkt entfernt.', + 'Do you really want to delete this variable ?' => 'Möchten Sie wirklich diese Variable löschen ?', + 'Do you really want to remove the content from this folder ?' => 'Möchten Sie wirklich diesen Inhalt von diesem Ordner entfernen ?', + 'Do you really want to remove the product from this category ?' => 'Möchten Sie wirklich dieses Produkt von dieser Kategorie entfernen ?', + 'Do you really want to remove this accessory from the product ?' => 'Möchten Sie wirklich dieses Zubehör von dem Produkt entfernen ?', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => 'Möchten Sie wirklich diese Deklination von allen Produkt-Templates entfernen ? Sie werden alle Produktbezogenen Daten für diese Deklination verlieren. ', + 'Do you really want to remove this attribute from the template ?' => 'Möchten Sie wirklich diese Deklination von der Vorlage entfernen ?', + 'Do you really want to remove this country from this shipping zone ?' => 'Möchten Sie wirklich dieses Land von dieser Lieferzone entfernen ?', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => 'Möchten Sie wirklich Diese Charakteristik von den Produktvorlagen entfernen ? Sie werden alle produktbezogenen Daten für diese Charakteristik verlieren.', + 'Do you really want to remove this feature from the template ?' => 'Möchten Sie wirklich diese Charakteristik von der Vorlage löschen ?', + 'Do you really want to remove this module from this hook ?' => 'Möchten Sie wirklich dieses Modul von diesem Hook entfernen ?', + 'Do you really want to remove this related content ?' => 'Möchten Sie wirklich diesen behörigen Inhalt entfernen ?', + 'Do you really want to remove this related content from the product ?' => 'Möchten Sie wirklich diesen zugehörigen Inhalt von dem Produkt entfernen ?', + 'Do you really want to remove this zone ?' => 'Möchten Sie wircklich dises Zone entfernen', + 'Do you really want to set this coupon available to everyone ?' => 'Soll diesen Gutschein für alle verfügbar sein ?', + 'Do you really want to use this address by default ?' => 'Möchten Sie wirklich diese Adresse standardmäßig Verwenden ?', + 'Document informations' => 'Dokumentinformationen', + 'Documents' => 'Dokumente', + 'Download invoice as PDF' => 'Rechung als PDF herunterladen', + 'Download purchase order as PDF' => 'Bestellschein als PDF herunterladen', + 'Drop files to upload' => 'Datei fallenlassen um zu hochladen', + 'Drop tax here to create a tax group' => 'Taxe hier ablegen um eine Taxgruppe zu erstellen', + 'Drop tax here to delete from group' => 'Taxe hier ablegen um sie von der Gruppe zu löschen', + 'E-mail' => 'E-Mail', + 'E-mail template you want to translate' => 'E-mail Template zu übersetzen', + 'E-mail templates' => 'E-mail Templates', + 'EAN Code' => 'EAN-Code', + 'Each group of taxes are applied from top to bottom.' => 'Jede Steuergruppe wird von oben nach unten angewendet.', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax ist eine Taxe die einen gewählten Preis (Charakteristik) zu den Produktpreis addiert. ', + 'Edit' => 'Ändern', + 'Edit Prices' => 'Preise bearbeiten', + 'Edit a country' => 'Ein Land bearbeiten', + 'Edit a currency' => 'Eine Währung bearbeiten', + 'Edit a customer' => 'Einen Kunde bearbeiten', + 'Edit a customer address' => 'Eine Kundeadresse bearbeiten', + 'Edit a document' => 'Ein Dokument bearbeiten', + 'Edit a feature' => 'Eine Charakteristik bearbeiten', + 'Edit a hook' => 'Einen Hook bearbeiten', + 'Edit a language' => 'Eine Sprache ändern', + 'Edit a mailing template' => 'Eine Mailing Vorlage erstellen', + 'Edit a module' => 'Ein Modul bearbeiten', + 'Edit a module hook' => 'Ein Modulhook bearbeiten', + 'Edit a profile' => 'Ein Profil bearbeiten', + 'Edit a shipping configuration' => 'Eine Lieferungskonfiguration bearbeiten', + 'Edit a shipping zone' => 'Eine Lieferzone Bearbeiten', + 'Edit a state' => 'Bundesland bearbeiten', + 'Edit a system variable' => 'System-Variable bearbeiten', + 'Edit a tax' => 'Eine Taxe bearbeiten', + 'Edit a tax rule' => 'Eine Taxregel bearbeiten', + 'Edit a template' => 'Eine Vorlage bearbeiten', + 'Edit an attribute' => 'Eine Deklination bearbeiten', + 'Edit an image' => 'Ein Bild bearbeiten', + 'Edit an order' => 'Eine Bestellung bearbeiten', + 'Edit api access' => 'Api Access bearbeiten', + 'Edit attribute "%name"' => 'Deklination "%name" bearbeiten', + 'Edit brand' => 'Marke bearbeiten', + 'Edit brand %title' => 'Marke "%title" bearbeiten', + 'Edit category' => 'Kategorie bearbeiten', + 'Edit category %title' => 'Kategorie %title bearbeiten', + 'Edit content' => 'Inhalt bearbeiten', + 'Edit content %title' => 'Inhalt %title bearbeiten', + 'Edit country "%name"' => 'Land "%name" bearbeiten', + 'Edit currency "%name"' => 'Währung "%name" bearbeiten', + 'Edit customer %firstname %lastname' => 'Den Kunde %firstname %lastname bearbeiten', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Den Kunde %firstname %lastname (Ref : %ref) bearbeiten ', + 'Edit delivery address' => 'Lieferadresse bearbeiten', + 'Edit document "%name"' => 'Bearbeitung von dem Dokument "%name"', + 'Edit feature "%name"' => 'Charakteristik "%name" bearbeiten', + 'Edit folder' => 'Ordner bearbeiten', + 'Edit folder %title' => 'Ordner %title bearbeiten', + 'Edit hook "%name"' => 'Hook "%name" bearbeiten', + 'Edit image "%name"' => 'Bild "%name" bearbeiten', + 'Edit information in %lng' => 'Informationen in %lng bearbeiten', + 'Edit invoice address' => 'Rechnungsadresse bearbeiten', + 'Edit mailing template "%name"' => 'Mailing Vorlage "%name" bearbeiten', + 'Edit next brand' => 'Nächste Marke bearbeiten', + 'Edit next category' => 'Nächste Kategorie bearbeiten', + 'Edit next content' => 'Nächsten Inhlat bearbeiten', + 'Edit next customer' => 'Nächsten Kunde Bearbeiten', + 'Edit next folder' => 'Nächsten Ordner bearbeiten', + 'Edit next order' => 'Nächste Bestellung bearbeiten', + 'Edit next product' => 'Nächtes Produkt bearbeiten', + 'Edit order address' => 'Bestelladresse bearbeiten', + 'Edit previous brand' => 'Vorherige Marke bearbeiten', + 'Edit previous category' => 'Vorherige Kategorie bearbeiten', + 'Edit previous content' => 'Vorherigen Inhlat bearbeiten', + 'Edit previous customer' => 'Vorherigen Kunden Bearbeiten', + 'Edit previous folder' => 'Vorherigen Ordner bearbeiten', + 'Edit previous order' => 'Vorherige Bestellung bearbeiten', + 'Edit previous product' => 'Vorheriges Produkt bearbeiten', + 'Edit prices in %curr' => 'Preise in %curr bearbeiten', + 'Edit product' => 'Produkt bearbeiten', + 'Edit product %title' => 'Produkt %title bearbeiten', + 'Edit state "%name"' => 'Bundesland "%name" bearbeiten', + 'Edit template "%name"' => 'Vorlage "%name" bearbeiten', + 'Edit this address' => 'Diese Adresse ändern', + 'Edit this brand' => 'Diese Marke bearbeiten', + 'Edit this category' => 'Dises Kategorie Bearbeiten', + 'Edit this content' => 'Diesen Inhalt bearbeiten', + 'Edit this customer' => 'Diesen Kunde Bearbeiten', + 'Edit this delivery zone' => 'Diese Lieferzone bearbeiten', + 'Edit this folder' => 'Diesen Ordner bearbeiten', + 'Edit this module' => 'Dieses Modul bearbeiten', + 'Edit this order' => 'Diese Bestellung bearbeiten', + 'Edit this product' => 'Dieses Produkt bearbeiten', + 'Edit variable %name' => '%name Variable bearbeiten', + 'Editing %cat' => '%cat Bearbeitung', + 'Editing %fold' => '%fold Bearbeitung', + 'Editing %title' => '%title Bearbeitung', + 'Editing attribute "%name"' => 'Deklination "%name" Bearbeitung', + 'Editing brand "%title"' => 'Marke "%title" Bearbeitung', + 'Editing country "%name"' => 'Land "%name" Bearbeitung', + 'Editing coupon "%title"' => 'Gutschein "%title" bearbeiten', + 'Editing currency "%name"' => 'Währung "%name" Bearbeitung', + 'Editing document "%name"' => 'Den Dokument "%name" bearbeiten', + 'Editing feature "%name"' => 'Charakteristik "%name" Bearbeitung', + 'Editing hook "%name"' => 'Hook "%name" Bearbeitung', + 'Editing hook for module "%name"' => 'Hook Bearbeitung für den Modul "%name"', + 'Editing image "%name"' => 'Bild "%name" Bearbeitung', + 'Editing mailing template "%name"' => 'Mailing Vorlage "%name" Bearbeitung', + 'Editing module' => 'Modul Bearbeitung', + 'Editing profile' => 'Profil Bearbeitung', + 'Editing profile \'%name\'' => 'Profil \'%name\' Bearbeitung', + 'Editing shipping configuration for module "%name"' => 'Lieferkonfiguration bearbeitung für den Modul "%name"', + 'Editing shipping zone "%name"' => 'Bearbeitung der Lieferungskonfiguration "%name"', + 'Editing tax' => 'Taxe Bearbeitung', + 'Editing tax rule' => 'Taxregel Bearbeitung', + 'Editing template "%name"' => 'Vorlage "%name" Bearbeitung', + 'Editing variable "%name"' => 'Variable "%name" Bearbeitung', + 'Email' => 'E-Mail', + 'Email address' => 'E-mail Adresse', + 'Email addresses' => 'E-mail Adressen', + 'Email confirmation address' => 'E-Mail Adresse', + 'Enable remote SMTP use : ' => 'Remote SMTP aktivieren : ', + 'Enable/Disable' => 'Aktivieren/Deaktivieren', + 'Enabled' => 'Aktiviert', + 'Encryption' => 'Verschlüsselung', + 'Encryption :' => 'Verschlüsselung:', + 'End Date' => 'Endedatum', + 'Enter here all possible attribute values.' => 'Geben Sie hier alle mögliche Deklinationsangaben.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Hinzufügen Sie alle möglichen Charakteristiken. Um einen freien Text in der Produktform zu haben, bitte nichts hinzufügen.', + 'Enter here the attribute name in the default language (%language_name)' => 'Die Deklinationsname hier in der Standartsprache (%language_name) hinzufügen', + 'Enter here the category name in the default language (%title)' => 'Hinzufügen Sie hier die Kategoriename in der standart Sprache (%title)', + 'Enter here the content name in the default language (%title)' => 'Hinzufügen Sie hier die Name des Inhalts in der standart Sprache (%title)', + 'Enter here the currency name in the default language (%title)' => 'Hinzufügen Sie hier die Währungsname in der standart Sprache (%title)', + 'Enter here the feature name in the default language (%title)' => 'Hinzufügen Sie hier die Name der Charakteristik in der standart Sprache (%title)', + 'Enter here the feature value as free text' => 'Hinzufügen Sie hier die Charakteristiksangabe', + 'Enter here the folder name in the default language (%title)' => 'Hinzufügen Sie hier die Name der Ordner in der standart Sprache (%title)', + 'Enter here the product name in the default language (%title)' => 'Hinzufügen Sie hier die Produktname in der standart Sprache (%title)', + 'Enter here the product price in %title' => 'Hinzufügen Sie hier den Produktpreis in %title', + 'Enter here the product reference' => 'Hinzufügen Sie hier die Produktreferenz', + 'Enter here the product stock' => 'Geben Sie hier den Produktbestand ein', + 'Enter here the product tax price in %title' => 'Geben Sie hier den Produkttax-Preis in %title', + 'Enter here the product weight, in Kilogrammes' => 'Hinzufügen Sie hier das Produktgewicht in Kilogramm', + 'Enter here the template name in the default language (%title)' => 'Hinzufügen Sie hier die Name der Template in der standart Sprache (%title)', + 'Enter here the value in the current edit language (%language_name)' => 'Hinzufügen Sie hier die Angabe in der aktuelle Bearbeitungssprache (%language_name)', + 'Enter here the value in the current edit language (%title)' => 'Geben Sie hier die Angabe in der aktuelle Bearbeitungssprache (%title)', + 'Enter here the value in the default language (%title)' => 'Die Angabe in der Stadartsprache (%title) hier hinzufügen', + 'Enter information in the default language (%title)' => 'Hinzufügen Sie hier Informationen in der standart Sprache (%title)', + 'Enter new accessory position' => 'Neue Zubehörposition hinzufügen', + 'Enter new attribute position' => 'Neue Deklinationsposition hinzufügen', + 'Enter new brand position' => 'Eine neue Marke Position hinzufügen', + 'Enter new category position' => 'Neue Kategorieposition hinzufügen', + 'Enter new content position' => 'Neue Inhaltposition hinzufügen', + 'Enter new currency position' => 'Neue Währungsposition hinzufügen', + 'Enter new export category position' => 'Neue Exportkategorie Position hinzufügen', + 'Enter new export position' => 'Neue Exportposition hinzufügen', + 'Enter new feature position' => 'Neue Charakteristik Position hinzufügen', + 'Enter new folder position' => 'Neue Ordnerposition hinzufügen', + 'Enter new import category position' => 'Neue Import Kategorie Position geben', + 'Enter new import position' => 'Neue Importposition geben', + 'Enter new module hook position' => 'Neue Modul Hook Position eingeben', + 'Enter new module position' => 'Neue Modulposition hinzufügen', + 'Enter new product position' => 'Neue Produktposition hinzufügen', + 'Enter new value position' => 'Neue Angabe Position hinzufügen', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'Hinzufügen Sie eine oder mehrere IP-V4-Adressen durch ";" getrennt. Leer lassen, um Protokolle für alle IP-Adressen anzeigen', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'Hinzufügen Sie einen oder mehrere Dateinamen ohne Leerzeichen durch ";" getrennt. Verwenden Sie "!" vor einer Dateiname, um sie auszuschließen. Verwenden Sie "*", um Protokolle für alle Dateien aktivieren.', + 'Enter quantity' => 'Hinzufügen Sie eine Menge', + 'Error' => 'Fehler', + 'Errors' => 'Ferhler', + 'Example :' => 'Beispiel :', + 'Exchange rate' => 'Umtauschkurs', + 'Existing combinations will be deleted. Do you want to continue ?' => 'Die Kombinationen werden gelöscht. Möchten Sie weitermachen ?', + 'Expiration date' => 'Ablaufdatum', + 'Expiration date * :' => 'Ablaufdatum * : ', + 'Expired' => 'Abgelaufen', + 'Export' => 'Export', + 'Exports' => 'Exporte', + 'Failed to get converted prices. Please try again.' => 'Fehler beim konvertierten Preise zu erhalten. Bitte probieren Sie es erneut. ', + 'Failed to get prices. Please try again.' => 'Die Preise konnte nicht erhalten werden. Bitte probieren Sie noch einmal. ', + 'Feature Name' => 'Charakteristiksname', + 'Feature information' => 'Charakteristik Information ', + 'Feature title' => 'Charakteristiktitel', + 'Feature value' => 'Charakteristikangabe', + 'Feature value for this product' => 'Charakteristiksangabe für dieses Produkt', + 'Feature values' => 'Charakteristiksangabe', + 'Features' => 'Charakteristiken', + 'File' => 'Datei', + 'File names' => 'Dateinamen', + 'Filename' => 'Dateiname', + 'Filter' => 'Filter', + 'Filter by hook name:' => 'Nach Hookname ordnen', + 'First Name' => 'Vorname', + 'First name' => 'Vorname', + 'Firstname' => 'Vorname', + 'Flush the Thelia internal cache' => 'Den internen Cache leeren', + 'Flush the assets cache directory' => 'Web assets Cache leeren', + 'Flush the images and documents cache' => 'Bilder und Dokument Cache leeren', + 'Folder' => 'Ordner', + 'Folder created on %date_create. Last modification: %date_change' => 'Ordner den %date_create erstellt. Letzte bearbeitung: %date_change', + 'Folder title' => 'Ordner Titel', + 'Folders' => 'Ordner', + 'Folders in %fold' => 'Ordner in %fold', + 'For prices in %currency' => 'Für Preise in %currency', + 'Forgot your password ?' => 'Passwort vergessen?', + 'Format: %fmt' => 'Format: %fmt', + 'Format: %fmt, e.g. %date' => 'Format: %fmt, zb. %date', + 'Free shipping for methods :' => 'Kostenlose Lieferung für die Methoden :', + 'Free shipping to countries :' => 'Kostenlose Lieferung für die Länder :', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'Französische 19.6% VAT ist die Taxe die 19.6% zu den Produktpreis addiert. ', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => ' Französische 19,6 % MwSt mit Ökosteuer ist die Appliance der Ökosteuer (auf den Produktpreis) dann die Appliance der 19,6 % Steuer (auf den Produktpreis + die Ökosteuer-Menge).', + 'From' => 'Von', + 'Front Office' => 'Front Office', + 'Front-office template you want to translate' => 'Front-office Template zu überstzen', + 'Front-office templates' => 'Front-office Templates', + 'General' => 'Allgemein', + 'General configuration' => 'Allgemeine Konfiguration', + 'General description' => 'Allgemeine Beschreibung', + 'General tools' => 'Allgemeine Werkzeuge', + 'Generate new password' => 'Neues Passwort generieren', + 'Get more information about this module' => 'Weitere Informationen über dieses Modul bekommen ', + 'Go to administration home' => 'Auf die Administration Startseite gehen', + 'Go to first page' => 'Zur erste Seite gehen', + 'Go to last page' => 'Zur letzte Seite gehen', + 'Go to next page' => 'Zur nächste Seite gehen', + 'Go to previous page' => 'Zur vorherige Seite gehen', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'HTML Version von dieser Nachricht ', + 'Hide empty hook' => 'Leere Hook verstecken', + 'Home' => 'Startseite', + 'Hook positions' => 'Hook Positionen', + 'Hooks' => 'Andockpunkte', + 'Host' => 'Host', + 'Host :' => 'Host : ', + 'ID' => 'ID', + 'IP Addresses' => 'IP Adressen', + 'ISO 4217 Code' => 'ISO 4217 Code', + 'ISO 4217 code' => 'ISO 4217 Code', + 'ISO 639 Code' => 'ISO 639-Code', + 'ISO Code' => 'ISO-Code', + 'If a translation is missing or incomplete :' => 'Wenn eine Übersetzung fehlet oder unvollständig ist :', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'Wenn ja, Weiterleitungen durch Redirect::exec() werden als Links angezeigt', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'Wenn Sie den Template ändern, alle Preise werden gelöscht', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'Wenn Sie Kernkomponenten von Thelia übersetzen möchten: Kern, Installation, Standardmodule oder Vorlagen.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'Wenn Sie nur den Text für Ihre Website übersetzen möchten, dann verwenden Sie bitte den Benutzermodus
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Es scheint, dass diese Zeichenfolge ein Smarty Variable enthält. Wenn dies der Fall ist, kann sie nicht richtig übersetzt werden.', + 'Image information' => 'Bildinformationen', + 'Image+file+not+found' => 'Dateibild+nicht+gefunden', + 'Images' => 'Bilder', + 'Import' => 'Import', + 'Import this file' => 'Diese Datei importieren', + 'Imports' => 'Importe', + 'Impossible to change active flag. Please contact your administrator or try later' => 'Unmöglich den Hook-Status zu ändern. Bitte kontaktieren Sie den Administrator oder versuchen Sie es später erneut.', + 'Impossible to change default country. Please contact your administrator or try later' => 'Es ist unmöglich das Standartland zu wechseln. Bitte kontaktieren Sie den Administrator oder probieren Sie es später erneut. ', + 'Impossible to change default languages. Please contact your administrator or try later' => 'Es ist unmöglich die Standartsprachen zu ändern. Bitte kontaktieren Sie den Administrator oder versuchen Sie es später erneut. ', + 'Impossible to change official hook. Please contact your administrator or try later' => 'Unmöglich offizielles Hook zu ändern. Bitte kontaktieren Sie den Administrator oder versuchen Sie es später erneut.', + 'In order to manges your shop taxes you can manage' => 'Um Ihre Shop Taxen zu leiten Sie können leiten ', + 'In page' => 'Auf die Seite', + 'In pages:' => 'Auf die Seiten :', + 'Inactive' => 'Inaktiv', + 'Included countries' => 'Enthalten Module', + 'Information on this hook' => 'Informationen über diesen Hook', + 'Install !' => 'Installieren !', + 'Install or update a module' => 'Ein modul installieren oder aktualisieren', + 'Invoice' => 'Rechnung', + 'Invoice and Delivery' => 'Rechung und Lieferung', + 'Invoice date' => 'Rechnungsdatum', + 'Invoice informations' => 'Rechungs-Informationen', + 'Invoice reference' => 'Rechnungsreferenz', + 'It\'s strongly recommended to use our translation platform' => 'Es wird empfohlen unsere Übersetzungs-Plattform zu nutzen', + 'Items to translate' => 'Artikeln zu übersetzen', + 'Keep attention that in translating you can override the resource translations.
    ' => 'Bitte beachten Sie, dass bei der Übersetzung die Original-Übersetzungen überschrieben werden.
    ', + 'Kg' => 'kg', + 'Label' => 'Bezeichnung', + 'Language name' => 'Sprachname', + 'Language title' => 'Sprachtitel', + 'Languages' => 'Sprachen', + 'Languages & URLs' => 'Sprachen & URLs', + 'Languages management' => 'Sprache Management', + 'Last Name' => 'Nachname', + 'Last name' => 'Nachname', + 'Last order amount' => 'Letzter Bestellwert', + 'Lastname' => 'Nachname', + 'Leave empty to keep current password' => 'Leer lassen, um das aktuelles Passwort zu halten', + 'Locale' => 'Sprache', + 'Log lines format' => 'Protokollzeile Format', + 'Log lines header format. You may use the following variables: ' => 'Protokollzeile Header Format. Sie können diese Variablen benutzen :', + 'Login' => 'Anmeldung', + 'Logout' => 'Abmeldung', + 'Long description :' => 'Lange Beschreibung : ', + 'Mailing system' => 'Mailing System', + 'Mailing templates' => 'Mailing Templates', + 'Manage attributes included in this product template' => 'Deklinationen in dieser Produktvorlage vewalten', + 'Manage features included in this product template' => 'Charakteristken in dieser Produktvorlage vewalten', + 'Manage hooks' => 'Hooks verwalten', + 'Manage its hooks' => 'Seinen Hooks verwalten', + 'Manage module rights' => 'Modul-Rechte verwalten', + 'Manage modules' => 'Module verwalten', + 'Manage modules attachements' => 'Module Anhänge verwalten', + 'Manage resource rights' => 'Ressourcen-Rechte verwalten', + 'Manage taxes' => 'Taxen verwalten', + 'Manage the tax rule taxes appliance order' => 'Die Taxregeln und ihre Anwendung verwalten ', + 'Maximum usage count :' => 'Maximale Anzahl von Nutzugen', + 'Message created on %date_create. Last modification: %date_change' => 'Nachricht den %date_create erstellt. Letzte bearbeitung: %date_change', + 'Message data' => 'Nachricht Data', + 'Message level' => 'Nachricht Level', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'Nachrichten mit einem höheres oder gleiches Level werden zu den Log-Destinationen hinzugefügt.', + 'Minimum required Thelia version' => 'Minimal erforderliche Thelia Version', + 'Module' => 'Modul', + 'Module %mod: %error' => 'Modul %mod: %error', + 'Module access rights' => 'Zugriffsrechte für Module', + 'Module code' => 'Modul Code', + 'Module component' => 'Modul-Komponent', + 'Module created on %date_create. Last modification: %date_change' => 'Modul den %date_create erstellt. Letzte Modifikation: %date_change', + 'Module detailed information' => 'Modul detaillierte Informationen', + 'Module file' => 'Modul-Datei', + 'Module name' => 'Modul Name', + 'Module type' => 'Modul Typ', + 'Module you want to translate' => 'Modul zu übersetzen', + 'Modules' => 'Module', + 'Modules attachments' => 'Module Anhänge', + 'More information about ISO 4217' => 'Weitere Informationen über ISO 4217', + 'More pages after' => 'Folgende Seite', + 'More pages before' => 'Vorherige Seite', + 'Name' => 'Name', + 'Namespace of main class' => 'Namespace der Hauptklasse', + 'New' => 'Neu', + 'New Configuration' => 'Neue Konfiguration', + 'No' => 'Nein', + 'No Folders found' => 'Keinen Ordner wurde gefunden', + 'No administration profile defined yet. Click the + button to create one.' => 'Noch kein Administrator Profil definiert. Klicken Sie auf + um ein zu erstellen', + 'No area defined with this id' => 'Keine Zone mit dieser ID definiert', + 'No attributes.' => 'Keine Deklinationen. ', + 'No available content in this folder' => 'Kein verfügbaren Inhalt in diesem Ordner', + 'No available product in this category' => 'Kein verfügbares Produkt in dieser Kategorie', + 'No available value for this attribute' => 'Keine verfügbare Angabe für diese Deklination', + 'No brand' => 'Keine Marke', + 'No brand has been created yet. Click the + button to create one.' => 'Keine Marke wurde erstellt. Klicken Sie auf die Schaltfläche + um eine zu erstellen.', + 'No categories found' => 'Es wurde keine Kategorie gefunden', + 'No category found for "%term"' => 'Keine Kategorie für "%term" gefunden', + 'No config.' => 'Keine Konfiguration.', + 'No content found for "%term"' => 'Kein Seiteninhalt für "%term" gefunden', + 'No country' => 'Kein Land', + 'No country has been created yet. Click the + button to create one.' => 'Kein Land wurde erstellt. Klicken Sie auf die Schaltfläche + um ein zu erstellen.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'Noch keinen Gutschein definiert. Klicken Sie auf + um einen Gutschein zu erstellen.', + 'No currency has been created yet. Click the + button to create one.' => 'Keine Währung wurde derzeit erstellt. Klicken Sie auf die Schaltfläche + um eine zu erstellen.', + 'No customer found for "%term"' => 'Kein Kunde für "%term" gefunden', + 'No description for this hook' => 'Keine beschreibung für diesen Hook', + 'No document' => 'Kein Dokument', + 'No email defined' => 'Keine E-Mail Adresse definiert', + 'No filters' => 'Keine Filter', + 'No folder found for "%term"' => 'Kein Ordner für "%term" gefunden', + 'No folders found' => 'Keinen Ordner wurde gefunden', + 'No hooks has been created yet. Click the + button to create one.' => 'Kein Modul wurde erstellt. Klicken Sie auf + um ein zu erstellen. ', + 'No logo image' => 'Kein Logo', + 'No mailing template has been created yet. Click the + button to create one.' => 'Kein E-Mail Template wurde erstellt. Klicken Sie auf die Schaltfläche + um einen zu erstellen.', + 'No module of this type was found.' => 'Kein Modul mit diesem Typ wurde gefunden. ', + 'No order found for "%term"' => 'Keine Bestellung für "%term" gefunden', + 'No orders fo this customer.' => 'Keine Bestellungen für diesen Kunde. ', + 'No product attribute has been created yet. Click the + button to create one.' => 'Keine Produktdeklination wurde erstellt. Klicken Sie auf die Schaltfläche + um eine zu erstellen.', + 'No product feature has been created yet. Click the + button to create one.' => 'Keine Produktcharakteristik wurde erstellt. Klicken Sie auf die Schaltfläche + um eine zu erstellen.', + 'No product found for "%term"' => 'Kein Produkt für "%term" gefunden', + 'No product template has been created yet. Click the + button to create one.' => 'Keine Produkt-Vorlage wurde erstellt. Click + um eine zu erstellen. ', + 'No sale has been created yet. Click the + button to create one.' => 'Kein Sonderangebot wurde erstellt. Klicken Sie auf + um ein zu erstellen.', + 'No shipping zone attached to this module, click here to attach one' => 'Keine Lieferzone ist mit diesem Modul verbunde, klicken Sie hier um eine zu verbinden', + 'No shipping zone defined yet. Click the + button to create one.' => 'Noch keine Lieferzone definiert. Klicken Sie auf + um eine zu erstellen', + 'No state has been created yet. Click the + button to create one.' => 'Noch kein Bundesland erstellt. Klicken Sie auf die Schaltfläche + um eines zu erstellen.', + 'No value has been created yet. Click the + button to create one.' => 'Keine Angabe wurde erstellt. Clicken Sie auf + um eine zu erstellen. ', + 'None' => 'Keine Angabe', + 'None defined' => 'Nicht definiert', + 'N° ISO' => 'ISO Nr.', + 'OK' => 'OK', + 'Official' => 'Offiziell', + 'Online' => 'Online', + 'Oops! An Error Occurred' => 'Oops! Einen Fehler ist aufgetreten', + 'Or' => 'Oder', + 'Order %ref - ID %id' => 'Bestellung %ref - ID %id', + 'Order details' => 'Bestelldaten', + 'Order n°' => 'Bestellung Nr.', + 'Order status:' => 'Bestellstatus : ', + 'Ordered products' => 'Bestellte Produkte', + 'Orders' => 'Bestellungen', + 'Originating file line number ' => 'Ursprungsdateizeilenummer', + 'Originating file name' => 'Ursprungsdateiname', + 'Originating function name ' => 'Ursprungsfunktionsname', + 'Other addresses' => 'Andere Adressen', + 'PDF template you want to translate' => 'PDF Template zu übersetzen', + 'PDF templates' => 'PDF Templates', + 'PDF | Invoice' => 'PDF | Rechnung', + 'PDF | Purchase order' => 'PDF | Bestellschein', + 'Page not found' => 'Die Seite wurde nicht gefunden', + 'Parameters' => 'Parameter', + 'Parse template' => 'Template analysieren', + 'Password' => 'Passwort', + 'Password :' => 'Passwort :', + 'Password changed' => 'Passwort geändert', + 'Payment information' => 'Zahlungs-Informationen', + 'Payment module' => 'Zahlungsmodul', + 'Payment modules' => 'Zahlungsmodule', + 'Percent Discount' => 'Prozent Rabatt', + 'Period' => 'Zeitraum', + 'Phone' => 'Telefon', + 'Phone & Fax' => 'Telefon & Fax', + 'Phone number' => 'Telefonnummer', + 'Please enter the date using the %fmt format' => 'Bitte hinzufügen Sie die Datum mit dem %fmt Format', + 'Please retry' => 'Bitte versuchen Sie es erneut', + 'Please save this coupon first to define coupon conditions' => 'Bitte speicher Sie zuerst diesen Gutschein um die Begriffe zu definieren', + 'Please select a condition' => 'Bitte wählen Sie eine Bedingung aus', + 'Please select a coupon type' => 'Bitte wählen Sie einen Gutscheintyp', + 'Please select another condition' => 'Bitte wählen Sie eine andere Bedingung', + 'Please select at least one category.' => 'Bitte wählen Sie mindestens eine Kategorie', + 'Please select items to translate' => 'Bitte wählen Sie Artikeln zu übersetzen', + 'Please select one or more categories which contains some products' => 'Bitte wählen Sie eine oder mehrere Kategorien die Produkten enthalten', + 'Please select the B.O. template to translate' => 'Bitte wählen Sie den B.O. Template zu übersetzen', + 'Please select the E-mail template to translate' => 'Bitte wählen Sie den E-mail Template zu übersetzen', + 'Please select the F.O. template to translate' => 'Bitte wählen Sie den F.O. Template zu übersetzen', + 'Please select the PDF template to translate' => 'Bitte wählen Sie den PDF Template zu übersetzen', + 'Please select the module component' => 'Bitte wählen Sie den Modul-Komponent', + 'Please select the module to translate' => 'Bitte wählen Sie den Modul zu übersetzen', + 'Please select your editing mode :' => 'Bitte wählen Sie Ihre Bearbeitungsmodus', + 'Please select...' => 'Bitte auswählen ...', + 'Please wait, loading' => 'Bitte warten, Laden', + 'Please wait, loading products list' => 'Bitte warten, Produktliste Laden', + 'Port' => 'Port', + 'Port :' => 'Port :', + 'Position' => 'Position', + 'Postage' => 'Porto', + 'Postscriptum' => 'Postscriptum', + 'Preview' => 'Zurück', + 'Preview HTML' => 'HTML Vorschau', + 'Preview brand page' => 'Marken-Seite Vorschau', + 'Preview category page' => 'Kategorie-Seite Vorschau', + 'Preview content page' => 'Inhalts-Seite Vorschau', + 'Preview folder page' => 'Ordnerseite Vorschau', + 'Preview product page' => 'Produkt-Seite Vorschau', + 'Preview text' => 'Text Vorschau', + 'Price' => 'Preis', + 'Price (%currency)
    w/ taxes' => 'Preis (%currency)
    inkl. Taxen', + 'Price (%currency)
    w/o taxes' => 'Preis (%currency)
    exl. Taxen', + 'Price excl. taxes' => 'Preis ohne Taxen', + 'Price incl. taxes' => 'Produktpreis inkl. Taxen', + 'Pricing' => 'Preisgestaltung', + 'Product' => 'Produkt', + 'Product Attributes' => 'Produktdeklinationen', + 'Product EAN Code' => 'Produkt EAN Code', + 'Product Features' => 'Produktcharakteristiken', + 'Product accessories' => 'Zubehör', + 'Product attribute selection' => 'Produktdeklination Auswahl', + 'Product attributes' => 'Produktdeklinationen', + 'Product catalog configuration' => 'Produktkatalog Konfiguration', + 'Product created on %date_create. Last modification: %date_change' => 'Produkt den %date_create erstellt. Letzte Bearbeitung : %date_change', + 'Product features' => 'Produktcharakteristiken', + 'Product price' => 'Produktpreis', + 'Product price including taxes' => 'Produkt Preis inkl. Taxen *', + 'Product stock' => 'Produktbestand', + 'Product tax price' => 'Produkt Taxpreis', + 'Product templates' => 'Produktvorlagen', + 'Product title' => 'Produkt Titel', + 'Product weight' => 'Produktgewicht', + 'Product\'s attributes included in this sale operation' => 'Produktdeklinationen in diesem Sonderangebot', + 'Products' => 'Produkte', + 'Products are :' => 'Produkte sind :', + 'Products in %cat' => 'Produkte in %cat', + 'Products selection' => 'Produktauswahl', + 'Profil' => 'Profil', + 'Profile' => 'Profil', + 'Profile code' => 'Profilcode', + 'Profile created on %date_create. Last modification: %date_change' => 'Profil den %date_create erstellt. Letzte Bearbeitung den: %date_change', + 'Profiles' => 'Profile', + 'Promotion' => 'Rabatt', + 'Provides free shipping' => 'Bietet Kostenlose Lieferung', + 'Published by OpenStudio' => 'Herausgegeben von OpenStudio', + 'Purpose' => 'Zweck', + 'Put module in hook' => 'Modul zu den Hook hinzufügen', + 'Quantity' => 'Menge', + 'Quickly create combinations using the combination builder' => 'Kombinationen mit dem Kombinations-Builder erstellen', + 'Rate' => 'Kurs', + 'Read module documentation' => 'Modul Dokumentation lesen', + 'Read the documentation of this module' => 'Dokumentation des Moduls lesen', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'Definieren Sie den Text global. Jeder Text wird mit dieser Übersetzung übersetzt, außer wenn es eine Übersetzung für diese Ressource gibt.', + 'Redefine the text only for this resource.' => 'Definieren Sie den Text nur für diese Ressource.', + 'Reference' => 'Referenz', + 'Registration date' => 'Anmeldungsdatum', + 'Related content' => 'Zugehörigen Inhalt', + 'Remove a module from a hook' => 'Ein Modul von einem Hook entfernen', + 'Remove an accessory' => 'Ein Zubehör entfernen', + 'Remove associated folder' => 'Assoziierten Ordner entfernen', + 'Remove attribute' => 'Deklination entfernen', + 'Remove country' => 'Land entfernen', + 'Remove feature' => 'Charakteristik entfernen', + 'Remove from all product templates' => 'Von allen Produktvorlagen entfernen', + 'Remove from category' => 'Von der Kategorie entfernen', + 'Remove from selected categories' => 'Von den ausgewählten Kategorien entfernen', + 'Remove related content' => 'Zugehörigen Inhalt entfernen', + 'Remove selected values' => 'Ausgewählten Angaben entfernen', + 'Remove the product from this category' => 'Dieses Produkt von der Kategorie entfernen', + 'Remove this attribute from all product templates' => 'Diese Produktdeklination von allen Vorlagen entfernen', + 'Remove this feature from all product templates' => 'Diese Charakteristik von allen Produkt Templates entfernen', + 'Remove zone' => 'Zone entfernen', + 'Request a new password' => 'Neues Passwort anfordern', + 'Required modules' => 'Benötigten Module', + 'Reset' => 'Zurücksetzen', + 'Reset sale status for all products' => 'Alle Sonderangebot-Status für alle Produkte rücksetzen', + 'Resource' => 'Ressourcen', + 'Resource access rights' => 'Zugriffsrechte für die Ressourcen', + 'Resources' => 'Resourcen', + 'Rights' => 'Rechte', + 'SEO' => 'SEO', + 'Sale' => 'Sonderangebot', + 'Sale configuration' => 'Sonderangebotskonfiguration', + 'Sale created on %date_create. Last modification: %date_change' => 'Sonderangebot den %date_create erstellt. Letzte Bearbeitung: %date_change', + 'Sale operation description' => 'Sonderangebotsbeschreibung', + 'Sale operation features' => 'Sonderangebots Charakteristik ', + 'Sale price (%currency)
    w/ taxes' => 'Sonderangebotpreis
    inkl. Taxen', + 'Sale price (%currency)
    w/o taxes' => 'Sonderangebotpreis
    exl. Taxen', + 'Sale price incl. taxes' => 'Sonderangebot inkl. Taxen', + 'Sales management' => 'Sonderangebotsmanagement', + 'Save' => 'Speichern', + 'Save and close' => 'Speichern und sperren', + 'Save chages' => 'Änderungen speichern', + 'Save changes' => 'Änderungen speichern', + 'Save tax rule taxes' => 'Steuerregeln speichern', + 'Save this address' => 'Diese Adresse speichern', + 'Save this condition' => 'Diese Bedingung speichern', + 'Search' => 'Suchen', + 'Search a module' => 'Ein Modul suchen', + 'Search for \'%term\'' => 'Suche für \'%term\'', + 'Search on Thelia Modules' => 'Auf Thelia Modules suchen', + 'Secure key' => 'Sicherheitsschlüssel', + 'Select' => 'Wählen', + 'Select a category and click (+) to add it to the additional category list' => 'Wählen Sie eine Kategorie aus und clicken Sie auf (+) um sie auf die zusätzlichen Kategorienliste zu hinzufügen', + 'Select a category to get its products' => 'Wählen Sie eine Kategorie aus um die Produkte anzusehen', + 'Select a category...' => 'Wählen Sie eine Kategorie aus ...', + 'Select a configuration' => 'Konfiguration wählen', + 'Select a content and click (+) to add it to this category' => 'Wählen Sie einen Inhalt und clicken Sie (+) um zu dieser Kategorie zu hinzufügen', + 'Select a content and click (+) to add it to this product' => 'Wählen Sie einen Inhalt aus und clicken Sie auf (+) um diesen Inhalt zu diesen Produkt zu hinzufügen', + 'Select a feature and click (+) to add it to this template' => 'Wählen Sie eine Charakteristik aus und clicken sie auf (+) um sie zu dieser Vorlage hinzufügen', + 'Select a feature...' => 'Wählen Sie eine Charakteristik aus ...', + 'Select a folder and click (+) to add it to the additional folder list' => 'Wählen Sie einen Ordner aus und klicken Sie auf (+) um es in die zusätzliche Ordner-Liste hinzufügen.', + 'Select a folder content...' => 'Wählen Sie den Ordnerinhalt aus ...', + 'Select a folder to get its content' => 'Wählen Sie einen Ordner aus um den Inhalt anzusehen', + 'Select a folder...' => 'Wählen Sie einen Ordner aus ...', + 'Select a product and click (+) to add it as an accessory' => 'Wählen Sie ein Produkt aus und clicken sie auf (+) um es als Zubehör hinzufügen', + 'Select a product...' => 'Wählen Sie ein Produkt aus ...', + 'Select a tax tule' => 'Wählen Sie eine Taxregel', + 'Select a template' => 'Wählen Sie eine Vorlage', + 'Select a value click (+) to add it to the combination' => 'Wählen Sie eine Angabe aus und klicken Sie auf (+) um sie zu der Kombination beifügen', + 'Select an attribute and click (+) to add it to this template' => 'Wählen Sie eine Deklination aus und clicken Sie auf (+) um sie zu dieser Vorlage zu hinzufügen', + 'Select an attribute and click (+) to view available values' => 'Wählen Sie eine Deklination aus und Klicken Sie auf (+) um die verschiedenen Angaben anzusehen', + 'Select an attribute value...' => 'Eine Deklinationsangabe auswählen ...', + 'Select an attribute...' => 'Wählen Sie eine Deklination aus ...', + 'Select attribute :' => 'Deklination wählen : ', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'Wählen Sie Deklinations-Angabenzu Kombinieren aus. Sie können einen Standardwert für einige Felder der generierten Kombinationen eingeben.', + 'Select here a template for this product' => 'Wählen Sie hier eine Vorlage für dieses Produkt', + 'Select here the tax applicable to this product' => 'Wählen Sie hier die anwendbare Taxregel für diesen Artikel', + 'Select offered product :' => 'Angebotenen Produkt :', + 'Select offrered product category :' => 'Angebotene produktkategorie :', + 'Select or deselect all products' => 'Aktivieren oder deaktivieren alle Produkte', + 'Select product category :' => 'Produktkategorie wählen : ', + 'Select the attributes values of "%title" that should be included in this sale operation.' => 'Wählen Sie die Attribut-Werte von "%title", die bei diesem Verkaufsvorgang enthalten sein sollten.', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Wählen Sie die Produkten in diesem Sonderangebot. Sie können Ihre Auswahl an Produktdeklinationen begrenzen.', + 'Selected categories' => 'Ausgewählten Kategorien', + 'Send' => 'Senden', + 'Send a mail to this customer' => 'Zu die', + 'Send files' => 'Dateien senden', + 'Sequential number of log line' => 'Sequenznummer der Protokollzeile', + 'Set as default tax rule' => 'Als Standart Taxe benutzen', + 'Sets the separator for the decimal point' => 'Trennzeichen für den Dezimalpunkt', + 'Sets the thousands separator.' => 'Tausendertrennzeichen', + 'Shipping configuration' => 'Lieferungskonfiguration', + 'Shipping configuration of delivery module "%title"' => 'Lieferkonfiguration für den Modul "%title"', + 'Shipping zone' => 'Lieferzone', + 'Shipping zone "%title"' => 'Lieferzone "%title"', + 'Shipping zones' => 'Lieferzonen', + 'Shipping zones for this country' => 'Lieferzonen für dieses Land', + 'Shipping zones for this module' => 'Lieferzonen für dieses Modul', + 'Shipping zones management' => 'Lieferzonen-Management', + 'Short description' => 'Kurze Beschreibung', + 'Short description :' => 'Kurze Beschreibung : ', + 'Show logs' => 'Protokoll ansehen', + 'Some of your translations are not saved. Continue anyway ?' => 'Einige Ihrer Übersetzungen werden nicht gespeichert. Trotzdem fortfahren?', + 'Something goes wrong, please try again' => 'Einen Fehler ist aufgetreten, bitte probieren Sie es erneut. ', + 'Something goes wrong, please try again.' => 'Einen Fehler ist aufgetreten, bitte probieren Sie es erneut.', + 'Sorry, attribute ID=%id was not found.' => 'Es tut uns Leid, aber die Deklination ID=%id wurde nicht gefunden. ', + 'Sorry, country ID=%id was not found.' => 'Es tut uns Leid, aber das Land ID=%id wurde nicht gefunden. ', + 'Sorry, currency ID=%id was not found.' => 'Es tut un Leid, aber die Währung ID=%id wurde nicht gefunden', + 'Sorry, customer ID=%id was not found.' => 'Es tut uns Leid, aber den Kunde OD=%id wurde nicht gefunden', + 'Sorry, document ID=%id was not found.' => 'Der Dokument ID=%id wurde nicht gefunden', + 'Sorry, feature ID=%id was not found.' => 'Es tut uns Leid, die Charakteristik ID=%id wurde nicht gefunden.', + 'Sorry, hook ID=%id was not found.' => 'Es tut uns Leid, aber den Hook "%name" wurde icht gefunden.', + 'Sorry, image ID=%id was not found.' => 'Es tut uns Leid, aber das Bild ID=%id wurde nicht gefunden.', + 'Sorry, message ID=%id was not found.' => 'Es tut uns Leid, aber die Nachricht ID=%id wurde nicht gefunden. ', + 'Sorry, module hook ID=%id was not found.' => 'Es tut uns Leid, aber das Modulhook ID=%id wurde nicht gefunden.', + 'Sorry, template ID=%id was not found.' => 'Es tut uns Leid, aber die Vorlage ID=%id wurde nicht gefunden.', + 'Sorry, variable ID=%id was not found.' => 'Es tut uns Leib, aber die Variable ID=%id wurde nicht gefunden. ', + 'Source IP' => 'Quell-IP', + 'Source IP :' => 'Quell-IP :', + 'Stability' => 'Stabilität', + 'Start Date' => 'Anfangsdatum', + 'State' => 'Bundesland', + 'States' => 'Bundesländer', + 'States / Provinces' => 'Staaten / Provinzen', + 'Status' => 'Status', + 'Stock' => 'Lagerbestand', + 'Store' => 'Store', + 'Store address' => 'Geschäft Adresse', + 'Store configuration' => 'Store-Konfiguration', + 'Street address' => 'Adresse', + 'Subtitle' => 'Untertitle', + 'Superadministrator' => 'Superadministrator', + 'Supported locales' => 'Unterstützte Sprachen', + 'Symbol' => 'Symbol', + 'System Logs' => 'Systemlog', + 'System Logs configuration' => 'Systemlog Konfiguration', + 'System logs' => 'Systemlog', + 'System parameters' => 'Systemparameter', + 'System variables' => 'System Variablen', + 'Tags' => 'Stichwörter', + 'Tax' => 'Taxe', + 'Tax created on %date_create. Last modification: %date_change' => 'Taxe den %date_create erstellt. Letzte Bearbeitung : %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => 'Taxregel den %date_create erstellt. Letzte Änderung : %date_change', + 'Tax rules' => 'Taxregeln', + 'Tax rules are combination of different taxes.' => 'Taxregeln sind Kombinationen von verschiedenen Taxen. ', + 'Taxed total' => 'Gesamtsumme', + 'Taxes' => 'Taxen', + 'Taxes configuration' => 'Steuer Konfiguration', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxen sind die Beträge die zu den gekauften Produkt addieren werden', + 'Taxes rules' => 'Taxregeln', + 'Template name' => 'Vorlagename', + 'Template title' => 'Vorlagename', + 'Template type' => 'Template -Typ', + 'Templates' => 'Vorlagen', + 'Test your configuration' => 'Testen Sie Ihre Konfiguration', + 'Text version of this message' => 'Text-Version dieser Nachricht', + 'That way, Thelia community will benefit of your translations' => 'Auf diese Weise wird die Thelia-Community von Ihren Übersetzungen profitieren', + 'The default pricing is used when no combination is defined.' => 'Die Standart-Tarifierung wird verwendet, wenn keine Kombination definiert ist.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'Die Destinationen verarbeiten Protokolle zu angezeigen, speichern oder senden. Sie können unten null, ein oder mehrere Destinationen auswählen und konfigurieren.', + 'The detailed description.' => 'Die detaillierte Beschreibung.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'Der Ordner local/I18n existiert nicht oder kann nicht bearbeiten werden. Bitte korrigieren Sie dieses Problem. ', + 'The following error message has been found: %msg' => 'Fehler Nachricht : %msg', + 'The hooks have been updated successfuly !' => 'Die Hooks wurden gespeichert!', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'Die von Ihnen angeforderter Seite hat ein Problem. Bitte kontaktieren Sie den Modul-Entwickler oder geben Sie dem Thelia Team ein Feedback auf github: %url.', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'Die Seite wurde nicht gefunden. Bitte prüfen Sie die Adresse und versuchen Sie es erneut. ', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'Wechselkurs vom Euro (Preis in Euro * Kurs = Preis in dieser Währung)', + 'The selected categories :' => 'Die ausgewählten Kategorien : ', + 'The selected countries :' => 'Die gewählten Länder :', + 'The selected customer :' => 'Der gewählten Kunde :', + 'The selected products :' => 'Die ausgewählten Produkte :', + 'The server returned a "404 Not Found"' => 'Der Server hat einen "404 Not Found" Fehler zurückgegeben', + 'The syntax used is identical to the PHP date() function' => 'Die Syntax ist identisch mit der PHP date() Funktion ', + 'Thelia Back Office' => 'Thelia Back Office', + 'Thelia Installation' => 'Thelia Installierung', + 'Thelia Installation Wizard' => ' Thelia Installations-Assistent', + 'Thelia Languages' => 'Thelias Sprachen', + 'Thelia Mailing System' => 'Thelias Mailing System', + 'Thelia Mailing Templates' => 'Thelia E-Mail Vorlagen', + 'Thelia Product Attributes' => 'Thelias Produktdeklinationen', + 'Thelia Product Features' => 'Thelias Produktcharakteristiken', + 'Thelia Product Templates' => 'Thelias Produktvorlagen', + 'Thelia Shipping configuration' => 'Thelias Lieferung Konfiguration', + 'Thelia Shipping zones' => 'Thelias Lieferzonen', + 'Thelia System Variables' => 'Thelias System Variablen', + 'Thelia caches flushing' => 'Thelias Cache leeren', + 'Thelia contributions' => 'Thelia Beiträge', + 'Thelia core' => 'Thelia Core', + 'Thelia mailing templates' => 'Thelia Mailing Templates', + 'Thelia product attributes' => 'Thelias Produktdeklinationen', + 'Thelia product features' => 'Thelias Produktcharakteristiken', + 'Thelia product templates' => 'Thelias Produktvorlagen', + 'Thelia support forum' => 'Thelias Support Forum', + 'Thelia system variables' => 'Thelias System Variablen ', + 'There are no shipping zones attached to this module.' => 'Es sind keine Lieferzonen zu diesem Modul verbunden. ', + 'There is 2 kind of translations :' => 'Es gibt 2 verschiedenen Übersetzungsarten', + 'There is currently no active module here.' => 'Es gibt kein aktiviertes Modul.', + 'There is currently no available attributes.' => 'Derzeit gibt es keine verfügbaren Deklinationen.', + 'There is currently no available features.' => 'Derzeit gibt es keine verfügbaren Charakteristiken.', + 'There is no documents attached to this %type.' => 'Kein Dokument ist zu diesem %type assoziiert. ', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'Keine Datei ist mit Ihrem Produkt verbunden. Nur Dokumente, die nicht sichtbar sind, können ausgewählt werden!', + 'There is no images attached to this %type.' => 'Kein Bild ist zu diesem %type assoziiert. ', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Es gibt einige Administratoren die zu diesem Administrator verbunden sind. Bitte ändern / entfernen Sie sie vor dem Löschen diesem Administrator. ', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'Es gibt einige Administratoren die zu diesem Profil verbunden sind. Bitte ändern / entfernen Sie sie vor dem Löschen diesem Profil. ', + 'This category contains no contents' => 'Dieses Kategorie enthält keinen Inhalt', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Diese Kategorie enthält keine Produkte. Um ein neues Produkt zu hinzufügen, clicken Sie auf die Schaltfläche + oben.', + 'This category has no sub-categories.' => 'Diese Kategorie hat keine Unterkategorie. ', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Diese Kategorie hat keine Unterkategorien. Um eine neue zu erstellen, clicken Sie auf die Schaltfläche + oben.', + 'This country is not included in any shipping zone' => 'Dieses Land ist zu ohne Lieferzone verbunden', + 'This customer has not defined any delivery address' => 'Dieser Kunde hat keine Lieferadresse definiert', + 'This customer has orders, and can\'t be deleted.' => 'Dieser Kunde hat Bestellungen und kann somit nicht gelöscht werden.', + 'This delivery module handles all shipping zones.' => 'Dieses Liefermodul behandelt alle Lieferzonen. ', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'Diesen Ordner enthält keinen Inhalt. Um neue Inhalte zu hinzufügen, clicken Sie auf + oben', + 'This folder has no sub-folders.' => 'Diesen Ordner hat keinen Unterordner.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'Diesen Ordner hat keinen Unterordner. Um einen zu erstellen, clicken Sie auf + oben. ', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'Dies ist kein Problem solange Sie diese Ressourcen (Thelia, Modul, Vorlage) nicht aktualisieren.
    ', + 'This is the code entered by your customers to use this coupon' => 'Code der von dem Kunde eingegeben wurde um diesen Gutschein zu benutzen', + 'This mailing template could not be changed.' => 'Diesen E-Mail Template konnte nicht bearbeiten werden', + 'This module cannot be started, some files are probably missing.' => 'Dieses Modul kann nicht gestartet werden, es fehlt wahrscheinlich einige Dateien. ', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'Auf dieser Seite können Sie jede resources Ihrer Website übersetzen : Thelia, Modulen, Templates.
    ', + 'This product contains no accessories' => 'Dieses Produkt enthält kein Zubehör', + 'This product contains no contents' => 'Dieses Produkt enthält keinen Inhalt', + 'This product doesn\'t belong to any additional category.' => 'Dieses Produkt gehört zu keiner zusätzlichen Kategorie. ', + 'This product doesn\'t belong to any additional folder.' => 'Dieses Produkt gehört zu keiner zusätzlischen Ordner', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'Dieses Produkt hat keine Kombination. Der Standart-Preis ist benutzt. Klicken Sie hier um eine neue Kombination zu erstellen. ', + 'This product template does not contains any features' => 'Diese Produktvorlage enthält keine Charakteristik', + 'This shipping zone does not contains any country.' => 'Diese Lieferzone enthält kein Land. ', + 'This template contains no attributes' => 'Diese Vorlange enthält keine Deklination', + 'This template contains no features' => 'Diese Vorlage enthält keine Charakteristiken', + 'This variable could not be changed.' => 'Diese Variable konnte nicht geändert werden.', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'Diese Aktion wird alle Sonderangebot-Status zurücksetzen. Möchten Sie wirklich weitermachen ?', + 'Timeout' => 'Zeitüberschreitung', + 'Timeout :' => 'Zeitüberschreitung :', + 'Title' => 'Titel', + 'Title * :' => 'Titel *:', + 'To' => 'Bis', + 'To create a new content, select an existing folder, or create a new one.' => 'Um einen Inhalt zu erstellen, wählen einen Ordner oder erstellen Sie einen neuen. ', + 'To create a new product, select an existing category, or create a new one.' => 'Um ein neues Produkt zu erstellen, wählen Sie eine Kategorie, order erstellen Sie eine neue. ', + 'To remove a value from the combination, select it and click "remove"' => 'Um eine Angabe zu entfernen, wählen Sie sie aus und klicken Sie auf "entfernen"', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'Um Charakteristiken oder Deklinationen zu benutzen, bitte wählen Sie eine Produktvorlage. Sie können Produktorlagen in der Konfigurationsrubrik erstellen', + 'Toggle select all' => 'Alle aktivieren / deaktivieren', + 'Tools' => 'Werkzeuge', + 'Top level' => 'Oberste Ebene', + 'Top level Contents' => 'Top Level Inhalte', + 'Top level Products' => 'Top Level Produkte', + 'Top level categories' => 'Top Level Kategorien', + 'Top level folders' => 'Top Level Ordner', + 'Total' => 'Gesamtsumme', + 'Total including discount' => 'Gesamtsumme mit Rabatt', + 'Total without discount' => 'Gesamtsumme ohne Rabatt', + 'Transaction' => 'Transaktion', + 'Transaction reference' => 'Transaktions-Referenz', + 'Translation' => 'Übersetzung', + 'Translations' => 'Übersetzung', + 'Type:' => 'Typ :', + 'Unit taxed price' => 'Besteuert Einzelpreis', + 'Unit. price' => 'Einzelpreis', + 'Unlimited' => 'Unendlich', + 'Unlimited number of uses' => 'Unbegrenzte Nutzungen', + 'Unspecified' => 'nNcht spezifiziert', + 'Unsupported field type \'%type\' in form-field.html' => 'Nicht unterstützter Feldtyp "% Typ" in form-field.html', + 'Update' => 'Update', + 'Update URL' => 'URL aktualisieren', + 'Update an administrator' => 'Einen Administrator bearbeiten', + 'Update coupon' => 'Gutschein Aktualisierung', + 'Update password' => 'Passwort ändern', + 'Update rates' => 'Kurse bearbeiten', + 'Update tax rule taxes' => 'Taxregeln aktualisieren', + 'Update this image' => 'Dieses Bild aktualisieren', + 'Usage count' => 'Verbleibenden Nutzungen', + 'Usages left' => 'Verbleibenden Nutzungen', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'Benutzen Sie Ctrl + Click um mehr als eine Deklinationangabe zu wählen (order abwählen)', + 'Use Ctrl+click to select (or deselect) more that one category' => 'Benutzen Sie Ctrl + Click um mehr als eine Kategorie zu wählen (order abwählen)', + 'Use Ctrl+click to select (or deselect) more that one country' => 'Benutzen Sie Ctrl + Click um mehr als ein Land zu wählen (order abwählen)', + 'Use Ctrl+click to select (or deselect) more that one item' => 'Benutzen Sie Ctrl + Click um mehr als einen Artikel zu wählen (order abwählen)', + 'Use Ctrl+click to select (or deselect) more that one product' => 'Benutzen Sie Ctrl + Click um mehr als ein Produkt zu wählen (order abwählen)', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'Benutzen Sie Ctrl+click um eine oder mehrere Liefermethoden zu aktivieren.', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Benutzen Sie Ctrl+Click um mehr als eine Angabe zu wählen. Sie können auch alles abwählen. ', + 'Use HTML message defined below' => 'Benutzen Sie die HTML Nachricht so wie unten definert', + 'Use Text message defined below' => 'Benutzen Sie die Text Nachricht so wie unten definert', + 'Use address by default' => 'Standardmäßige Adresse benutzen', + 'Use an other config.' => 'Andere Konfiguration verwenden.', + 'Use default layout' => 'Standart Layout benutzen', + 'Use this address by default' => 'Diese Adresse standardmäßig verwenden', + 'Use this config.' => 'Diese Konfiguration verwenden.', + 'User mode' => 'Benutzermodus', + 'Username' => 'Benutzername', + 'Username :' => 'Benutzername :', + 'Username or e-mail address' => 'Benutzername oder E-Mail Adresse', + 'Using a domain or subdomain for each language' => 'Benutzung einen Domain oder Subdomain für jede Sprache', + 'Valid on special offers' => 'Gültig für Sonderangebote', + 'Validity start date' => 'Gültigkeitsbeginn', + 'Value' => 'Angabe', + 'Variable created on %date_create. Last modification: %date_change' => 'Variable den %date_create erstellt. Letzte Bearbeitung : %date_change', + 'Variable name' => 'Variablename', + 'Variable purpose' => 'Variable-Betreff', + 'Variable value' => 'Variableangabe', + 'Variables to inject' => 'Variablen zu hinzufügen', + 'Version %ver' => 'Version %ver', + 'View' => 'Ansehen', + 'View invoice PDF' => 'PDF Rechnung ansehen', + 'View only missing translations.' => 'Nur fehlende Übersetzungen anzeigen.', + 'View purchase order as PDF' => 'PDF Bestellung ansehen', + 'View shop' => 'Shop anzeigen', + 'View site' => 'Seite anzeigen', + 'View this page in %langname' => 'Diese Seite in %langname anzeigen', + 'View this product in a new page' => 'Dieses Produkt auf eine neue Seite ansehen', + 'Virtual product' => 'Virtuelles Produkt', + 'Visibility' => 'Sichtbarkeit', + 'Visible' => 'Sichtbar', + 'Visible in front' => 'Sichtbar im Frontend', + 'Warning' => 'Warnung', + 'Web site' => 'Website', + 'Weight' => 'Gewicht', + 'Weight
    (Kg)' => 'Gewicht
    (kg)', + 'Welcome' => 'Willkommen', + 'Welcome to Thelia administration !' => 'Willkommen !', + 'Yes' => 'Ja', + 'You can attach here some content to this category' => 'Hier können Sie Inhalte zu dieser Kategorie verbinden', + 'You can attach here some content to this product' => 'Hier können Sie Inhalte zu diesem Produkt verbinden', + 'You can attach this product to more categories in the details tab.' => 'Sie können dieses Produkt zu weitere Kategorien im Tab Detail assoziieren.', + 'You can change attributes and their positions in the attributes configuration page.' => 'Sie können die Deklinationen und ihre Position ändern auf die Deklination Konfigurationsseite. ', + 'You can change feature and their positions in the features configuration page.' => 'Sie können die Charakteristiken und ihre Position ändern auf die Charakteristik Konfigurationsseite. ', + 'You can change template attributes and their positions in the template configuration page.' => 'Sie können die Vorlagedeklinationen und ihre Position ändern auf die Vorlage Konfigurationsseite. ', + 'You can change templates features and their positions in the template configuration page.' => 'Sie können die Vorlagecharakteristiken und ihre Position ändern auf die Vorlage Konfigurationsseite. ', + 'You can change the default category (%title) in the "General" tab.' => 'Sie können die Standartkategorie (%title) in dem Tab "Allgemein" ändern. ', + 'You can change the default folder (%title) in the "General" tab.' => 'Sie können den Standart-Ordner (%title) im "Allgemein" Tab ändern.', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'Hier können Sie eine bestimmte Preisunterschied für jede Währung Ihres Shops nach Betrag oder Prozentsatz festlegen, abhängig von dem ausgewählten Rabatt.', + 'You can\'t delete this administrator' => 'Sie können diesen Administrator nicht löschen', + 'You can\'t delete this profile' => 'Sie können dieses Profil nicht löschen', + 'You don\'t have any export' => 'Sie haben keinen Exporte', + 'You don\'t have any import' => 'Sie haben keinen Import', + 'You have no orders for the moment.' => 'Sie haben im Moment keine Bestellungen. ', + 'You have no registred customers for the moment.' => 'Sie haben noch keine registrierte Kunden.', + 'You may also quickly create combinations from products attributes using the Combination Builder.' => 'Sie können auch eine Reihe von Kombinationen erstellen mit dem Kombinations-Builder. ', + 'Your current IP address is %ip' => 'Ihre IP Adresse ist %ip', + 'Your email' => 'Ihre E-mail', + 'Your module should be packaged in a zip file.' => 'Das Modul muss in einem Zip-Datei komprimiert sein. ', + 'Your search is too short' => 'Ihre Suche ist zu kurz', + 'Your template define new hooks' => 'Ihren Template definiert neuen Hooks', + 'Your template does not support this hooks' => 'Ihren Template kann dieses Hook nicht tragen', + 'Your template is clean. No missing hooks and no new hooks.' => 'Ihren Template ist korrekt. Keinen fehlenden Hooks und keinen neuen Hooks.', + 'Zip code' => 'PLZ', + 'Zone name' => 'Zone Name', + 'activate' => 'Aktivieren', + 'activate %title module' => 'Modul %title aktivieren', + 'activate hook' => 'Hook aktivieren', + 'activation' => 'Aktivierung', + 'all' => 'alle', + 'all states' => 'Alle Bundesländer', + 'all states/provinces' => 'Alle Bundesländer/Provinzen', + 'and' => 'und', + 'caption' => 'Beschreibung', + 'classic modules' => 'Klassische Modulen ', + 'code' => 'Code', + 'company' => 'Firma', + 'country has an other configuration' => 'Land hat eine andere Konfiguration', + 'country has no configuration' => 'Land hat keine Konfiguration', + 'country has the current configuration' => 'Land hat die aktuelle Konfiguration', + 'customer ref' => 'Kunde Ref', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'Datum im jjjj-mm-tt Format', + 'deactivate' => 'Deaktivieren', + 'deactivated' => 'Deaktiviert', + 'deactivation' => 'Deaktivierung', + 'delete document' => 'Dokument löschen', + 'delete image' => 'Bild löschen', + 'download' => 'Herunterladen', + 'eg: . or ,' => 'zb: . oder , ', + 'email' => 'E-mail', + 'en_US' => 'en_US', + 'filter country' => 'Länder filtern', + 'firstname & lastname' => 'Vorname & Nachname', + 'hour in hh:mm:ss format' => 'Zeit im hh:mm:ss Format', + 'last order' => 'letzte Bestellung', + 'long description' => 'Ausführliche Beschreibung', + 'none' => 'kein', + 'ok' => 'Ok', + 'on' => 'an', + 'or' => 'oder', + 'order amount' => 'Bestellmenge', + 'orders for this customer' => 'Bestellungen für diesen Kunden', + 'pdf' => 'Pdf', + 'permanent discount' => 'Dauerrabatt', + 'profile' => 'Profil', + 'ref.:' => 'Ref.:', + 'reverse' => 'stornieren', + 'short description' => 'kurze Beschreibung', + 'tax rules' => 'taxregeln', + 'taxes' => 'Taxen', + 'title' => 'Titel', + 'tracking reference' => 'Versandnummer', + 'version' => 'Version', + 'warning' => 'Warnung', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'Sie können einerseits Steuerregeln erstellen die nur auf den alleinigen Produktpreis angewendet werden, und andererseits steuerliche Regeln erstellen, die eine Steuer auf das Ergebnis einer vorherigen Steuer-Berechnung anwenden.', +]; diff --git a/templates/backOffice/default/I18n/el_GR.php b/templates/backOffice/default/I18n/el_GR.php new file mode 100644 index 00000000..9cc553f7 --- /dev/null +++ b/templates/backOffice/default/I18n/el_GR.php @@ -0,0 +1,62 @@ + '(επεξεργασία)', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'A content could be attached to more than one folder. Select here the additional folders for this content.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'A product could be attached to more than one category. Select here the additional categories for this product.', + 'Action' => 'Ενέργεια', + 'Actions' => 'Ενέργειες', + 'Add' => 'Προσθήκη', + 'Add a new address' => 'Προσθέστε μια νέα διεύθυνση', + 'Address' => 'Διεύθυνση', + 'Amount' => 'Ποσό', + 'An error occured' => 'An error occured', + 'Back' => 'Προηγούμενο', + 'Cancel' => 'Ακύρωση', + 'Categories' => 'Kατηγορίες', + 'Coupon code' => 'Κωδικός κουπονιού', + 'Create' => 'Δημιουργία', + 'Cutomer Name' => 'Cutomer Name', + 'Delivery address' => 'Διεύθυνση παράδοσης', + 'Description' => 'Περιγραφή', + 'Do you really want to delete this address ?' => 'Θέλετε να διαγράψετε αυτή τη διεύθυνση;', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.', + 'Edit' => 'Επεξεργασία', + 'Edit this address' => 'Επεξεργαστείτε αυτή τη διεύθυνση', + 'Email address' => 'Διεύθυνση E-mail', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'Home' => 'Αρχή', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.', + 'In order to manges your shop taxes you can manage' => 'In order to manges your shop taxes you can manage', + 'Login' => 'Σύνδεση', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rule taxes appliance order', + 'Maximum usage count :' => 'Maximum usage count :', + 'Name' => 'Όνομα', + 'Order details' => 'Λεπτομέρειες παραγγελίας', + 'Password' => 'Κωδικός', + 'Position' => 'Θέση', + 'Price' => 'Τιμή', + 'Quantity' => 'Ποσότητα', + 'Save chages' => 'Save chages', + 'Save changes' => 'Save chages', + 'Search' => 'Αναζήτηση', + 'Send' => 'Αποστολή', + 'Status' => 'Κατάσταση', + 'Tax rules' => 'Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of different taxes.', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes define the amount of money which is added to a bought product.', + 'There is currently no available attributes.' => 'There is currently no available attributes.', + 'There is currently no available features.' => 'There is currently no available features.', + 'There is no documents attached to this %type.' => 'There is no documents attached to this %type.', + 'There is no images attached to this %type.' => 'There is no images attached to this %type.', + 'Total' => 'Σύνολο', + 'Update' => 'Ενημέρωση', + 'Usage count' => 'Usage count', + 'Usages left' => 'Usage count', + 'View' => 'Προβολή', + 'Warning' => 'Προειδοποίηση', + 'firstname & lastname' => 'firstname & lastname', + 'tracking reference' => 'tracking reference', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.', +]; diff --git a/templates/backOffice/default/I18n/en_US.php b/templates/backOffice/default/I18n/en_US.php new file mode 100644 index 00000000..c3e63a74 --- /dev/null +++ b/templates/backOffice/default/I18n/en_US.php @@ -0,0 +1,1307 @@ + ' (default)', + '%count more...' => '%count more...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count shipping zone(s) are attached to this module: %zones. Click here to change', + '(according to a country the taxes applied could be different)' => '(according to a country the taxes applied could be different)', + '(edit)' => '(edit)', + 'Check the list of ISO 639-1 codes' => 'Check the list of ISO 639-1 codes', + '0 combinations' => '0 combinations', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.', + 'Congratulations, all text is now translated !' => 'Congratulations, all text is now translated !', + 'Developer : to change the translations of the resource' => 'Developer : to change the translations of the resource', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.', + 'User : to redefine the translations for your website' => 'User : to redefine the translations for your website', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Warning, an exchange rate was not found for at least one currency: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Warning, some of your countries are not included in any shipping zone:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Warning, some of your shipping zones are not attached to any delivery module:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'You can attach more than one folder to a content. Select the additional folders for this content here.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'You can attach more than one category to a product. Select the additional categories for this product here.', + 'API configuration' => 'API configuration', + 'API list access' => 'API list access', + 'API users' => 'API users', + 'Accessory title' => 'Accessory title', + 'Action' => 'Action', + 'Actions' => 'Actions', + 'Activate this log destination' => 'Activate this log destination', + 'Active' => 'Active', + 'Add' => 'Add', + 'Add a condition' => 'Add a condition', + 'Add a module to a hook' => 'Add a module to a hook', + 'Add a new Customer' => 'Add a new Customer', + 'Add a new address' => 'Add a new address', + 'Add a new brand' => 'Add a new brand', + 'Add a new category' => 'Add a new category', + 'Add a new combination' => 'Add a new combination', + 'Add a new content' => 'Add a new content', + 'Add a new country' => 'Add a new country', + 'Add a new currency' => 'Add a new currency', + 'Add a new folder' => 'Add a new folder', + 'Add a new hook' => 'Add a new hook', + 'Add a new language' => 'Add a new language', + 'Add a new mailing template' => 'Add a new mailing template', + 'Add a new module in a hook' => 'Add a new module in a hook', + 'Add a new module to this hook' => 'Add a new module to this hook', + 'Add a new product' => 'Add a new product', + 'Add a new product attribute' => 'Add a new product attribute', + 'Add a new product feature' => 'Add a new product feature', + 'Add a new product template' => 'Add a new product template', + 'Add a new sale' => 'Add a new sale', + 'Add a new shipping zone' => 'Add a new shipping zone', + 'Add a new state' => 'Add a new state', + 'Add a new variable' => 'Add a new variable', + 'Add document to your product.' => 'Add document to your product.', + 'Add selected countries' => 'Add selected countries', + 'Add tax to this group' => 'Add tax to this group', + 'Add this attribute to all product templates' => 'Add this attribute to all product templates', + 'Add this feature to all product templates' => 'Add this feature to all product templates', + 'Add to all product templates' => 'Add to all product templates', + 'Add to selected categories' => 'Add to selected categories', + 'Additional Folders' => 'Additional Folders', + 'Additional address' => 'Additional address', + 'Additional categories' => 'Additional categories', + 'Address' => 'Address', + 'Administration logs' => 'Administration logs', + 'Administration profiles' => 'Administration profiles', + 'Administrators' => 'Administrators', + 'Advanced configuration' => 'Advanced configuration', + 'Advanced configuration and tools' => 'Advanced configuration and tools', + 'Afficher ce profil' => 'Afficher ce profil', + 'All' => 'All', + 'All States' => 'All States', + 'All orders' => 'All orders', + 'Amount' => 'Amount', + 'Amount, e.g. 12.50' => 'Amount, e.g. 12.50', + 'An email containing instructions to create a new password was sent to your email address. If you don\'t receive this email, please try again.' => 'An email containing instructions to create a new password was sent to your email address. If you don\'t receive this email, please try again.', + 'An error occured' => 'An error occurred', + 'An invalid token was provided, your password cannot be changed. Please try again, and be sure to use the exact URL which is in the e-mail sent to you.' => 'An invalid token was provided, your password cannot be changed. Please try again, and be sure to use the exact URL which is in the e-mail sent to you.', + 'An unexpected error occured' => 'An unexpected error occurred', + 'An unknow error happend' => 'An unknown error happened', + 'An unknown error occured, please try again.' => 'An unknown error occurred, please try again.', + 'And' => 'And', + 'Api' => 'API', + 'Api key' => 'API key', + 'Applies to attribute values :' => 'Applies to attribute values :', + 'Applies to products :' => 'Applies to products :', + 'Applies to products in categories :' => 'Applies to products in categories :', + 'Apply' => 'Apply', + 'Assigned modules' => 'Assigned modules', + 'Associate documents' => 'Associate documents', + 'Associate downloadable file' => 'Associate downloadable file', + 'Associate files to your combinations' => 'Associate files to your combinations', + 'Associate images' => 'Associate images', + 'Associated' => 'Associated', + 'Associations' => 'Associations', + 'Attribute' => 'Attribute', + 'Attribute %title' => 'Attribute %title', + 'Attribute Combinations' => 'Attribute Combinations', + 'Attribute Name' => 'Attribute Name', + 'Attribute information' => 'Attribute information', + 'Attribute title' => 'Attribute title', + 'Attribute values' => 'Attribute values', + 'Attributes' => 'Attributes', + 'Attributes & Features' => 'Attributes & Features', + 'Auth Mode' => 'Auth Mode', + 'Auth Mode :' => 'Auth Mode :', + 'Author' => 'Author', + 'Available product categories' => 'Available product categories', + 'Available taxes' => 'Available taxes', + 'Back' => 'Back', + 'Back Office' => 'Back Office', + 'Back-office home' => 'Back-office home', + 'Back-office template you want to translate' => 'Back-office template you want to translate', + 'Back-office templates' => 'Back-office templates', + 'Back-office users' => 'Back-office users', + 'Best taxed price' => 'Best taxed price', + 'Block' => 'Block', + 'Block :' => 'Block :', + 'Brand created on %date_create. Last modification: %date_change' => 'Brand created on %date_create. Last modification: %date_change', + 'Brands' => 'Brands', + 'Browse files' => 'Browse files', + 'Browse this category' => 'Browse this category', + 'Browse this folder' => 'Browse this folder', + 'By module' => 'By module', + 'By module:' => 'By module:', + 'By status' => 'By status', + 'By type' => 'By type', + 'Can\'t load documents, please refresh this page.' => 'Can\'t load documents, please refresh this page.', + 'Can\'t load images, please refresh this page.' => 'Can\'t load images, please refresh this page.', + 'Can\'t reorder documents, please refresh this page.' => 'Can\'t reorder documents, please refresh this page.', + 'Can\'t reorder images, please refresh this page.' => 'Can\'t reorder images, please refresh this page.', + 'Cancel' => 'Cancel', + 'Cancel changes and revert to original value' => 'Cancel changes and revert to original value', + 'Cancel this order' => 'Cancel this order', + 'Cart - Prices in %currency' => 'Cart - Prices in %currency', + 'Catalog' => 'Catalog', + 'Categories' => 'Categories', + 'Categories in %cat' => 'Categories in %cat', + 'Category' => 'Category', + 'Category created on %date_create. Last modification: %date_change' => 'Category created on %date_create. Last modification: %date_change', + 'Category title' => 'Category title', + 'Cellphone' => 'Cellphone', + 'Cellular phone' => 'Cellular phone', + 'Cellular phone number' => 'Cellular phone number', + 'Change sale configuration' => 'Change sale configuration', + 'Change this administrator' => 'Change this administrator', + 'Change this api access' => 'Change this API access', + 'Change this attribute' => 'Change this attribute', + 'Change this brand' => 'Change this brand', + 'Change this condition' => 'Change this condition', + 'Change this country' => 'Change this country', + 'Change this coupon' => 'Change this coupon', + 'Change this currency' => 'Change this currency', + 'Change this feature' => 'Change this feature', + 'Change this hook' => 'Change this hook', + 'Change this language' => 'Change this language', + 'Change this mailing template' => 'Change this mailing template', + 'Change this product attribute' => 'Change this product attribute', + 'Change this product feature' => 'Change this product feature', + 'Change this product template' => 'Change this product template', + 'Change this profile' => 'Change this profile', + 'Change this sale' => 'Change this sale', + 'Change this shipping zone' => 'Change this shipping zone', + 'Change this state' => 'Change this state', + 'Change this tax' => 'Change this tax', + 'Change this tax rule' => 'Change this tax rule', + 'Change this template' => 'Change this template', + 'Change this variable' => 'Change this variable', + 'Chapo' => 'Chapo', + 'Check sale activation' => 'Check sale activation', + 'Check the support of hooks.' => 'Check the support of hooks.', + 'Check this box if you want to add this attributes to all product templates' => 'Check this box if you want to add this attributes to all product templates', + 'Check this box if you want to add this features to all product templates' => 'Check this box if you want to add this features to all product templates', + 'Choose a configuration' => 'Choose a configuration', + 'Choose a country' => 'Choose a country', + 'City' => 'City', + 'Classic modules' => 'Classic modules', + 'Click to view' => 'Click to view', + 'Click to view details.' => 'Click to view details.', + 'Clone' => 'Clone', + 'Clone product' => 'Clone product', + 'Close' => 'Close', + 'Close administation session' => 'Close administration session', + 'Code' => 'Code', + 'Code:' => 'Code:', + 'Combinable with other promotions' => 'Combinable with other promotions', + 'Combination EAN Code' => 'Combination EAN Code', + 'Combination builder' => 'Combination builder', + 'Combination reference' => 'Combination reference', + 'Company' => 'Company', + 'Condition category :' => 'Condition category :', + 'Condition description' => 'Condition description', + 'Configuration' => 'Configuration', + 'Configuration mailing system' => 'Configuration mailing system', + 'Configure' => 'Configure', + 'Configure this module' => 'Configure this module', + 'Confirm' => 'Confirm', + 'Confirm changes' => 'Confirm changes', + 'Confirmation' => 'Confirmation', + 'Congratulations, your password was successfully changed. You can now login.' => 'Congratulations, your password was successfully changed. You can now login.', + 'Content' => 'Content', + 'Content title' => 'Content title', + 'Contents in %fold' => 'Contents in %fold', + 'Copy all missing translations.' => 'Copy all missing translations.', + 'Copy all translations.' => 'Copy all translations.', + 'Copy source text in input field' => 'Copy source text in input field', + 'Countries' => 'Countries', + 'Countries assigned to this zone' => 'Countries assigned to this zone', + 'Countries/states configuration' => 'Countries/states configuration', + 'Countries/states deleted of this configuration' => 'Countries/states deleted of this configuration', + 'Countries/states that will use this configuration' => 'Countries/states that will use this configuration', + 'Country' => 'Country', + 'Coupon' => 'Coupon', + 'Coupon code' => 'Coupon code', + 'Coupon code * :' => 'Coupon code * :', + 'Coupon conditions' => 'Coupon conditions', + 'Coupon type * :' => 'Coupon type * :', + 'Coupons' => 'Coupons', + 'Create' => 'Create', + 'Create a customer address' => 'Create a customer address', + 'Create a new API access' => 'Create a new API access', + 'Create a new Hook' => 'Create a new Hook', + 'Create a new administrator' => 'Create a new administrator', + 'Create a new attribute' => 'Create a new attribute', + 'Create a new attribute value' => 'Create a new attribute value', + 'Create a new brand' => 'Create a new brand', + 'Create a new category' => 'Create a new category', + 'Create a new combination' => 'Create a new combination', + 'Create a new content' => 'Create a new content', + 'Create a new country' => 'Create a new country', + 'Create a new coupon' => 'Create a new coupon', + 'Create a new currency' => 'Create a new currency', + 'Create a new customer' => 'Create a new customer', + 'Create a new feature' => 'Create a new feature', + 'Create a new feature value' => 'Create a new feature value', + 'Create a new folder' => 'Create a new folder', + 'Create a new language' => 'Create a new language', + 'Create a new mailing template' => 'Create a new mailing template', + 'Create a new product' => 'Create a new product', + 'Create a new product template' => 'Create a new product template', + 'Create a new profile' => 'Create a new profile', + 'Create a new sale' => 'Create a new sale', + 'Create a new shipping zone' => 'Create a new shipping zone', + 'Create a new state' => 'Create a new state', + 'Create a new tax' => 'Create a new tax', + 'Create a new tax rule' => 'Create a new tax rule', + 'Create a new variable' => 'Create a new variable', + 'Create combinations' => 'Create combinations', + 'Create coupon' => 'Create coupon', + 'Create this address' => 'Create this address', + 'Create this attribute' => 'Create this attribute', + 'Create this brand' => 'Create this brand', + 'Create this category' => 'Create this category', + 'Create this combination' => 'Create this combination', + 'Create this content' => 'Create this content', + 'Create this country' => 'Create this country', + 'Create this currency' => 'Create this currency', + 'Create this customer' => 'Create this customer', + 'Create this feature' => 'Create this feature', + 'Create this folder' => 'Create this folder', + 'Create this hook' => 'Create this hook', + 'Create this hooks' => 'Create this hooks', + 'Create this language' => 'Create this language', + 'Create this mailing template' => 'Create this mailing template', + 'Create this product' => 'Create this product', + 'Create this product template' => 'Create this product template', + 'Create this sale' => 'Create this sale', + 'Create this shipping zone' => 'Create this shipping zone', + 'Create this state' => 'Create this state', + 'Create this value' => 'Create this value', + 'Create this variable' => 'Create this variable', + 'Currencies' => 'Currencies', + 'Currency name' => 'Currency name', + 'Currency rate' => 'Currency rate', + 'Currency symbol' => 'Currency symbol', + 'Current product template' => 'Current product template', + 'Current quantity' => 'Current quantity', + 'Customer' => 'Customer', + 'Customer information' => 'Customer information', + 'Customer informations' => 'Customer information', + 'Customer is' => 'Customer is', + 'Customers' => 'Customers', + 'Customers list' => 'Customers list', + 'Cutomer Name' => 'Customer Name', + 'Date & Hour' => 'Date & Hour', + 'Date of last order' => 'Date of last order', + 'Days before expiration' => 'Days before expiration', + 'Deactivate %title module' => 'Deactivate %title module', + 'Deactivate hook' => 'Deactivate hook', + 'Deactivate this hooks' => 'Deactivate this hooks', + 'Decimal places' => 'Decimal places', + 'Default' => 'Default', + 'Default address' => 'Default address', + 'Define here this product\'s accessories' => 'Define here this product\'s accessories', + 'Delete' => 'Delete', + 'Delete a combination' => 'Delete a combination', + 'Delete a module' => 'Delete a module', + 'Delete a variable' => 'Delete a variable', + 'Delete address' => 'Delete address', + 'Delete administrator' => 'Delete administrator', + 'Delete also module data' => 'Delete also module data', + 'Delete an order' => 'Delete an order', + 'Delete api access' => 'Delete API access', + 'Delete attribute' => 'Delete attribute', + 'Delete attribute value' => 'Delete attribute value', + 'Delete brand' => 'Delete brand', + 'Delete category' => 'Delete category', + 'Delete content' => 'Delete content', + 'Delete country' => 'Delete country', + 'Delete coupon' => 'Delete coupon', + 'Delete currency' => 'Delete currency', + 'Delete customer' => 'Delete customer', + 'Delete feature' => 'Delete feature', + 'Delete feature value' => 'Delete feature value', + 'Delete folder' => 'Delete folder', + 'Delete hook' => 'Delete hook', + 'Delete language' => 'Delete language', + 'Delete mailing template' => 'Delete mailing template', + 'Delete product' => 'Delete product', + 'Delete profile' => 'Delete profile', + 'Delete sale' => 'Delete sale', + 'Delete selected countries' => 'Delete selected countries', + 'Delete shipping zone' => 'Delete shipping zone', + 'Delete state' => 'Delete state', + 'Delete tax' => 'Delete tax', + 'Delete tax rule' => 'Delete tax rule', + 'Delete template' => 'Delete template', + 'Delete this accessory' => 'Delete this accessory', + 'Delete this administrator' => 'Delete this administrator', + 'Delete this api access' => 'Delete this API access', + 'Delete this attribute' => 'Delete this attribute', + 'Delete this brand' => 'Delete this brand', + 'Delete this category and all its contents' => 'Delete this category and all its contents', + 'Delete this combination' => 'Delete this combination', + 'Delete this condition' => 'Delete this condition', + 'Delete this content' => 'Delete this content', + 'Delete this country' => 'Delete this country', + 'Delete this coupon' => 'Delete this coupon', + 'Delete this currency' => 'Delete this currency', + 'Delete this customer address' => 'Delete this customer address', + 'Delete this customer and all his orders' => 'Delete this customer and all his orders', + 'Delete this feature' => 'Delete this feature', + 'Delete this folder' => 'Delete this folder', + 'Delete this folder and all its contents' => 'Delete this folder and all its contents', + 'Delete this hook' => 'Delete this hook', + 'Delete this language' => 'Delete this language', + 'Delete this mailing template' => 'Delete this mailing template', + 'Delete this module' => 'Delete this module', + 'Delete this product' => 'Delete this product', + 'Delete this product attribute' => 'Delete this product attribute', + 'Delete this product feature' => 'Delete this product feature', + 'Delete this product template' => 'Delete this product template', + 'Delete this profile' => 'Delete this profile', + 'Delete this sale' => 'Delete this sale', + 'Delete this shipping zone' => 'Delete this shipping zone', + 'Delete this state' => 'Delete this state', + 'Delete this tax' => 'Delete this tax', + 'Delete this tax rule' => 'Delete this tax rule', + 'Delete this value' => 'Delete this value', + 'Delete this variable' => 'Delete this variable', + 'Delete this zone' => 'Delete this zone', + 'Delivery' => 'Delivery', + 'Delivery address' => 'Delivery address', + 'Delivery module' => 'Delivery module', + 'Delivery modules' => 'Delivery modules', + 'Description' => 'Description', + 'Destinations' => 'Destinations', + 'Developer mode' => 'Developer mode', + 'Disabled' => 'Disabled', + 'Discount' => 'Discount', + 'Discount amount' => 'Discount amount', + 'Discount percentage' => 'Discount percentage', + 'Discover all our modules on Thelia Modules !' => 'Discover all our modules on Thelia Modules !', + 'Do not use a product template' => 'Do not use a product template', + 'Do this export' => 'Do this export', + 'Do this import' => 'Do this import', + 'Do you really want to add this attribute to all product templates ?' => 'Do you really want to add this attribute to all product templates ?', + 'Do you really want to add this feature to all product templates ?' => 'Do you really want to add this feature to all product templates ?', + 'Do you really want to cancel this order ?' => 'Do you really want to cancel this order ?', + 'Do you really want to delete this address ?' => 'Do you really want to delete this address ?', + 'Do you really want to delete this administrator ?' => 'Do you really want to delete this administrator ?', + 'Do you really want to delete this api access ?' => 'Do you really want to delete this API access ?', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'Do you really want to delete this attribute ? It will be removed from all product templates.', + 'Do you really want to delete this attribute value ?' => 'Do you really want to delete this attribute value ?', + 'Do you really want to delete this brand ?' => 'Do you really want to delete this brand ?', + 'Do you really want to delete this category and all its content ?' => 'Do you really want to delete this category and all its content ?', + 'Do you really want to delete this combination ?' => 'Do you really want to delete this combination ?', + 'Do you really want to delete this condition ?' => 'Do you really want to delete this condition ?', + 'Do you really want to delete this content ?' => 'Do you really want to delete this content ?', + 'Do you really want to delete this country ?' => 'Do you really want to delete this country ?', + 'Do you really want to delete this coupon ?' => 'Do you really want to delete this coupon ?', + 'Do you really want to delete this currency ?' => 'Do you really want to delete this currency ?', + 'Do you really want to delete this customer ?' => 'Do you really want to delete this customer ?', + 'Do you really want to delete this document ?' => 'Do you really want to delete this document ?', + 'Do you really want to delete this element ?' => 'Do you really want to delete this element ?', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'Do you really want to delete this feature ? It will be removed from all product templates.', + 'Do you really want to delete this feature value ?' => 'Do you really want to delete this feature value ?', + 'Do you really want to delete this folder and all its content ?' => 'Do you really want to delete this folder and all its content ?', + 'Do you really want to delete this hook ?' => 'Do you really want to delete this hook ?', + 'Do you really want to delete this image ?' => 'Do you really want to delete this image ?', + 'Do you really want to delete this language ?' => 'Do you really want to delete this language ?', + 'Do you really want to delete this mailing template ?' => 'Do you really want to delete this mailing template ?', + 'Do you really want to delete this module ?' => 'Do you really want to delete this module ?', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.', + 'Do you really want to delete this profile ?' => 'Do you really want to delete this profile ?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'Do you really want to delete this sale ? All related products will no longer be on sale', + 'Do you really want to delete this shipping zone ?' => 'Do you really want to delete this shipping zone ?', + 'Do you really want to delete this state ?' => 'Do you really want to delete this state ?', + 'Do you really want to delete this tax ?' => 'Do you really want to delete this tax ?', + 'Do you really want to delete this tax rule ?' => 'Do you really want to delete this tax rule ?', + 'Do you really want to delete this template ? It will be removed from all products.' => 'Do you really want to delete this template ? It will be removed from all products.', + 'Do you really want to delete this variable ?' => 'Do you really want to delete this variable ?', + 'Do you really want to remove the content from this folder ?' => 'Do you really want to remove the content from this folder ?', + 'Do you really want to remove the product from this category ?' => 'Do you really want to remove the product from this category ?', + 'Do you really want to remove this accessory from the product ?' => 'Do you really want to remove this accessory from the product ?', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.', + 'Do you really want to remove this attribute from the template ?' => 'Do you really want to remove this attribute from the template ?', + 'Do you really want to remove this country from this shipping zone ?' => 'Do you really want to remove this country from this shipping zone ?', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.', + 'Do you really want to remove this feature from the template ?' => 'Do you really want to remove this feature from the template ?', + 'Do you really want to remove this module from this hook ?' => 'Do you really want to remove this module from this hook ?', + 'Do you really want to remove this related content ?' => 'Do you really want to remove this related content ?', + 'Do you really want to remove this related content from the product ?' => 'Do you really want to remove this related content from the product ?', + 'Do you really want to remove this zone ?' => 'Do you really want to remove this zone ?', + 'Do you really want to set this coupon available to everyone ?' => 'Do you really want to set this coupon available to everyone ?', + 'Do you really want to use this address by default ?' => 'Do you really want to use this address by default ?', + 'Document informations' => 'Document information', + 'Documents' => 'Documents', + 'Download invoice as PDF' => 'Download invoice as PDF', + 'Download purchase order as PDF' => 'Download purchase order as PDF', + 'Drop files to upload' => 'Drop files to upload', + 'Drop tax here to create a tax group' => 'Drop tax here to create a tax group', + 'Drop tax here to delete from group' => 'Drop tax here to delete from group', + 'E-mail' => 'E-mail', + 'E-mail template you want to translate' => 'E-mail template you want to translate', + 'E-mail templates' => 'E-mail templates', + 'EAN Code' => 'EAN Code', + 'Each group of taxes are applied from top to bottom.' => 'Each group of taxes are applied from top to bottom.', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax which adds an amount defined by a product feature to the product price.', + 'Edit' => 'Edit', + 'Edit Prices' => 'Edit Prices', + 'Edit a country' => 'Edit a country', + 'Edit a currency' => 'Edit a currency', + 'Edit a customer' => 'Edit a customer', + 'Edit a customer address' => 'Edit a customer address', + 'Edit a document' => 'Edit a document', + 'Edit a feature' => 'Edit a feature', + 'Edit a hook' => 'Edit a hook', + 'Edit a language' => 'Edit a language', + 'Edit a mailing template' => 'Edit a mailing template', + 'Edit a module' => 'Edit a module', + 'Edit a module hook' => 'Edit a module hook', + 'Edit a profile' => 'Edit a profile', + 'Edit a shipping configuration' => 'Edit a shipping configuration', + 'Edit a shipping zone' => 'Edit a shipping zone', + 'Edit a state' => 'Edit a state', + 'Edit a system variable' => 'Edit a system variable', + 'Edit a tax' => 'Edit a tax', + 'Edit a tax rule' => 'Edit a tax rule', + 'Edit a template' => 'Edit a template', + 'Edit an attribute' => 'Edit an attribute', + 'Edit an image' => 'Edit an image', + 'Edit an order' => 'Edit an order', + 'Edit api access' => 'Edit API access', + 'Edit attribute "%name"' => 'Edit attribute "%name"', + 'Edit brand' => 'Edit brand', + 'Edit brand %title' => 'Edit brand %title', + 'Edit category' => 'Edit category', + 'Edit category %title' => 'Edit category %title', + 'Edit content' => 'Edit content', + 'Edit content %title' => 'Edit content %title', + 'Edit country "%name"' => 'Edit country "%name"', + 'Edit currency "%name"' => 'Edit currency "%name"', + 'Edit customer %firstname %lastname' => 'Edit customer %firstname %lastname', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Edit customer %firstname %lastname (Ref : %ref)', + 'Edit delivery address' => 'Edit delivery address', + 'Edit document "%name"' => 'Edit document "%name"', + 'Edit feature "%name"' => 'Edit feature "%name"', + 'Edit folder' => 'Edit folder', + 'Edit folder %title' => 'Edit folder %title', + 'Edit hook "%name"' => 'Edit hook "%name"', + 'Edit image "%name"' => 'Edit image "%name"', + 'Edit information in %lng' => 'Edit information in %lng', + 'Edit invoice address' => 'Edit invoice address', + 'Edit mailing template "%name"' => 'Edit mailing template "%name"', + 'Edit next brand' => 'Edit next brand', + 'Edit next category' => 'Edit next category', + 'Edit next content' => 'Edit next content', + 'Edit next customer' => 'Edit next customer', + 'Edit next folder' => 'Edit next folder', + 'Edit next order' => 'Edit next order', + 'Edit next product' => 'Edit next product', + 'Edit order address' => 'Edit order address', + 'Edit previous brand' => 'Edit previous brand', + 'Edit previous category' => 'Edit previous category', + 'Edit previous content' => 'Edit previous content', + 'Edit previous customer' => 'Edit previous customer', + 'Edit previous folder' => 'Edit previous folder', + 'Edit previous order' => 'Edit previous order', + 'Edit previous product' => 'Edit previous product', + 'Edit prices in %curr' => 'Edit prices in %curr', + 'Edit product' => 'Edit product', + 'Edit product %title' => 'Edit product %title', + 'Edit state "%name"' => 'Edit state "%name"', + 'Edit template "%name"' => 'Edit template "%name"', + 'Edit this address' => 'Edit this address', + 'Edit this brand' => 'Edit this brand', + 'Edit this category' => 'Edit this category', + 'Edit this content' => 'Edit this content', + 'Edit this customer' => 'Edit this customer', + 'Edit this delivery zone' => 'Edit this delivery zone', + 'Edit this folder' => 'Edit this folder', + 'Edit this module' => 'Edit this module', + 'Edit this order' => 'Edit this order', + 'Edit this product' => 'Edit this product', + 'Edit variable %name' => 'Edit variable %name', + 'Editing %cat' => 'Editing %cat', + 'Editing %fold' => 'Editing %fold', + 'Editing %title' => 'Editing %title', + 'Editing attribute "%name"' => 'Editing attribute "%name"', + 'Editing brand "%title"' => 'Editing brand "%title"', + 'Editing country "%name"' => 'Editing country "%name"', + 'Editing coupon "%title"' => 'Editing coupon "%title"', + 'Editing currency "%name"' => 'Editing currency "%name"', + 'Editing document "%name"' => 'Editing document "%name"', + 'Editing feature "%name"' => 'Editing feature "%name"', + 'Editing hook "%name"' => 'Editing hook "%name"', + 'Editing hook for module "%name"' => 'Editing hook for module "%name"', + 'Editing image "%name"' => 'Editing image "%name"', + 'Editing mailing template "%name"' => 'Editing mailing template "%name"', + 'Editing module' => 'Editing module', + 'Editing profile' => 'Editing profile', + 'Editing profile \'%name\'' => 'Editing profile \'%name\'', + 'Editing shipping configuration for module "%name"' => 'Editing shipping configuration for module "%name"', + 'Editing shipping zone "%name"' => 'Editing shipping zone "%name"', + 'Editing state "%name"' => 'Editing state "%name"', + 'Editing tax' => 'Editing tax', + 'Editing tax rule' => 'Editing tax rule', + 'Editing template "%name"' => 'Editing template "%name"', + 'Editing variable "%name"' => 'Editing variable "%name"', + 'Email' => 'Email', + 'Email address' => 'Email address', + 'Email addresses' => 'Email addresses', + 'Email confirmation address' => 'Email confirmation address', + 'Enable remote SMTP use : ' => 'Enable remote SMTP use : ', + 'Enable/Disable' => 'Enable/Disable', + 'Enabled' => 'Enabled', + 'Encryption' => 'Encryption', + 'Encryption :' => 'Encryption :', + 'End Date' => 'End Date', + 'Enter here all possible attribute values.' => 'Enter here all possible attribute values.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.', + 'Enter here the attribute name in the default language (%language_name)' => 'Enter here the attribute name in the default language (%language_name)', + 'Enter here the category name in the default language (%title)' => 'Enter here the category name in the default language (%title)', + 'Enter here the content name in the default language (%title)' => 'Enter here the content name in the default language (%title)', + 'Enter here the currency name in the default language (%title)' => 'Enter here the currency name in the default language (%title)', + 'Enter here the feature name in the default language (%title)' => 'Enter here the feature name in the default language (%title)', + 'Enter here the feature value as free text' => 'Enter here the feature value as free text', + 'Enter here the folder name in the default language (%title)' => 'Enter here the folder name in the default language (%title)', + 'Enter here the product name in the default language (%title)' => 'Enter here the product name in the default language (%title)', + 'Enter here the product price in %title' => 'Enter here the product price in %title', + 'Enter here the product reference' => 'Enter here the product reference', + 'Enter here the product stock' => 'Enter here the product stock', + 'Enter here the product tax price in %title' => 'Enter here the product tax price in %title', + 'Enter here the product weight, in Kilogrammes' => 'Enter here the product weight, in Kilogrammes', + 'Enter here the template name in the default language (%title)' => 'Enter here the template name in the default language (%title)', + 'Enter here the value in the current edit language (%language_name)' => 'Enter here the value in the current edit language (%language_name)', + 'Enter here the value in the current edit language (%title)' => 'Enter here the value in the current edit language (%title)', + 'Enter here the value in the default language (%title)' => 'Enter here the value in the default language (%title)', + 'Enter information in the default language (%title)' => 'Enter information in the default language (%title)', + 'Enter new accessory position' => 'Enter new accessory position', + 'Enter new attribute position' => 'Enter new attribute position', + 'Enter new brand position' => 'Enter new brand position', + 'Enter new category position' => 'Enter new category position', + 'Enter new content position' => 'Enter new content position', + 'Enter new currency position' => 'Enter new currency position', + 'Enter new export category position' => 'Enter new export category position', + 'Enter new export position' => 'Enter new export position', + 'Enter new feature position' => 'Enter new feature position', + 'Enter new folder position' => 'Enter new folder position', + 'Enter new import category position' => 'Enter new import category position', + 'Enter new import position' => 'Enter new import position', + 'Enter new module hook position' => 'Enter new module hook position', + 'Enter new module position' => 'Enter new module position', + 'Enter new product position' => 'Enter new product position', + 'Enter new value position' => 'Enter new value position', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.', + 'Enter quantity' => 'Enter quantity', + 'Error' => 'Error', + 'Errors' => 'Errors', + 'Example :' => 'Example :', + 'Exchange rate' => 'Exchange rate', + 'Existing combinations will be deleted. Do you want to continue ?' => 'Existing combinations will be deleted. Do you want to continue ?', + 'Expiration date' => 'Expiration date', + 'Expiration date * :' => 'Expiration date * :', + 'Expired' => 'Expired', + 'Export' => 'Export', + 'Exports' => 'Exports', + 'Failed to get converted prices. Please try again.' => 'Failed to get converted prices. Please try again.', + 'Failed to get prices. Please try again.' => 'Failed to get prices. Please try again.', + 'Feature Name' => 'Feature Name', + 'Feature information' => 'Feature information', + 'Feature title' => 'Feature title', + 'Feature value' => 'Feature value', + 'Feature value for this product' => 'Feature value for this product', + 'Feature values' => 'Feature values', + 'Features' => 'Features', + 'File' => 'File', + 'File names' => 'File names', + 'Filename' => 'Filename', + 'Filter' => 'Filter', + 'Filter by hook name:' => 'Filter by hook name:', + 'First Name' => 'First Name', + 'First name' => 'First name', + 'Firstname' => 'First name', + 'Flush the Thelia internal cache' => 'Flush the Thelia internal cache', + 'Flush the assets cache directory' => 'Flush the assets cache directory', + 'Flush the images and documents cache' => 'Flush the images and documents cache', + 'Folder' => 'Folder', + 'Folder created on %date_create. Last modification: %date_change' => 'Folder created on %date_create. Last modification: %date_change', + 'Folder title' => 'Folder title', + 'Folders' => 'Folders', + 'Folders in %fold' => 'Folders in %fold', + 'For a tax rule, you can have multiple configurations, as only one tax rule is affected to a product.' => 'For a tax rule, you can have multiple configurations, as only one tax rule is affected to a product.', + 'For prices in %currency' => 'For prices in %currency', + 'Forgot your password ?' => 'Forgot your password ?', + 'Format: %fmt' => 'Format: %fmt ', + 'Format: %fmt, e.g. %date' => 'Format: %fmt, e.g. %date', + 'Free shipping for methods :' => 'Free shipping for methods :', + 'Free shipping to countries :' => 'Free shipping to countries :', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 20% VAT is a tax which adds 20% of the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => ' French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'From' => 'From', + 'From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below.' => 'From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below.', + 'Front Office' => 'Front Office', + 'Front-office template you want to translate' => 'Front-office template you want to translate', + 'Front-office templates' => 'Front-office templates', + 'General' => 'General', + 'General configuration' => 'General configuration', + 'General description' => 'General description', + 'General tools' => 'General tools', + 'Generate new password' => 'Generate new password', + 'Get more information about this module' => 'Get more information about this module', + 'Go to administration home' => 'Go to administration home', + 'Go to first page' => 'Go to first page', + 'Go to last page' => 'Go to last page', + 'Go to next page' => 'Go to next page', + 'Go to previous page' => 'Go to previous page', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'HTML version of this message', + 'Here, just drag and drog the available taxes in groups.' => 'Here, just drag and drog the available taxes in groups.', + 'Hide empty hook' => 'Hide empty hook', + 'Home' => 'Home', + 'Hook positions' => 'Hook positions', + 'Hooks' => 'Hooks', + 'Host' => 'Host', + 'Host :' => 'Host :', + 'ID' => 'ID', + 'IP Addresses' => 'IP Addresses', + 'ISO 4217 Code' => 'ISO 4217 Code', + 'ISO 4217 code' => 'ISO 4217 code', + 'ISO 639 Code' => 'ISO 639 Code', + 'ISO Code' => 'ISO Code', + 'If a translation is missing or incomplete :' => 'If a translation is missing or incomplete :', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'If yes, redirections through Redirect::exec() will be displayed as links', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'If you change the template, all the prices will be reset and you have to configure them again.', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'If you want to translate core components of Thelia : core, install, default modules or templates.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'If your aim is just to translate text for your website, please use the user mode.
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be translated properly.', + 'Image information' => 'Image information', + 'Image+file+not+found' => 'Image+file+not+found', + 'Images' => 'Images', + 'Import' => 'Import', + 'Import this file' => 'Import this file', + 'Imports' => 'Imports', + 'Impossible to change active flag. Please contact your administrator or try later' => 'Impossible to change active flag. Please contact your administrator or try later', + 'Impossible to change default country. Please contact your administrator or try later' => 'Impossible to change default country. Please contact your administrator or try later', + 'Impossible to change default languages. Please contact your administrator or try later' => 'Impossible to change default languages. Please contact your administrator or try later', + 'Impossible to change official hook. Please contact your administrator or try later' => 'Impossible to change official hook. Please contact your administrator or try later', + 'In a group, each taxes are applied independently on the incomming price (the price without tax for the first group).' => 'In a group, each taxes are applied independently on the incomming price (the price without tax for the first group).', + 'In order to manges your shop taxes you can manage' => 'In order to manage your shop taxes you can manage', + 'In page' => 'In page', + 'In pages:' => 'In pages:', + 'Inactive' => 'Inactive', + 'Included countries' => 'Included countries', + 'Information on this hook' => 'Information on this hook', + 'Install !' => 'Install !', + 'Install or update a module' => 'Install or update a module', + 'Invoice' => 'Invoice', + 'Invoice and Delivery' => 'Invoice and Delivery', + 'Invoice date' => 'Invoice date', + 'Invoice informations' => 'Invoice information', + 'Invoice reference' => 'Invoice reference', + 'It\'s strongly recommended to use our translation platform' => 'It\'s strongly recommended to use our translation platform', + 'Items to translate' => 'Items to translate', + 'Keep attention that in translating you can override the resource translations.
    ' => 'Keep attention that in translating you can override the resource translations.
    ', + 'Kg' => 'Kg', + 'Label' => 'Label', + 'Language name' => 'Language name', + 'Language title' => 'Language title', + 'Languages' => 'Languages', + 'Languages & URLs' => 'Languages & URLs', + 'Languages management' => 'Languages management', + 'Last Name' => 'Last Name', + 'Last name' => 'Last name', + 'Last order amount' => 'Last order amount', + 'Lastname' => 'Lastname', + 'Leave empty to keep current password' => 'Leave empty to keep current password', + 'Locale' => 'Locale', + 'Log lines format' => 'Log lines format', + 'Log lines header format. You may use the following variables: ' => 'Log lines header format. You may use the following variables: ', + 'Login' => 'Login', + 'Logout' => 'Logout', + 'Long description :' => 'Long description :', + 'Mailing system' => 'Mailing system', + 'Mailing templates' => 'Mailing templates', + 'Manage attributes included in this product template' => 'Manage attributes included in this product template', + 'Manage features included in this product template' => 'Manage features included in this product template', + 'Manage hooks' => 'Manage hooks', + 'Manage its hooks' => 'Manage module attachments', + 'Manage module rights' => 'Manage module rights', + 'Manage modules' => 'Manage modules', + 'Manage modules attachements' => 'Manage modules attachements', + 'Manage resource rights' => 'Manage resource rights', + 'Manage taxes' => 'Manage taxes', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rules application order', + 'Maximum usage count :' => 'Number of usages left:', + 'Message created on %date_create. Last modification: %date_change' => 'Message created on %date_create. Last modification: %date_change', + 'Message data' => 'Message data', + 'Message level' => 'Message level', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ', + 'Minimum required Thelia version' => 'Minimum required Thelia version', + 'Module' => 'Module', + 'Module %mod: %error' => 'Module %mod: %error', + 'Module access rights' => 'Module access rights', + 'Module code' => 'Module code', + 'Module component' => 'Module component', + 'Module created on %date_create. Last modification: %date_change' => 'Module created on %date_create. Last modification: %date_change', + 'Module detailed information' => 'Module detailed information', + 'Module file' => 'Module file', + 'Module name' => 'Module name', + 'Module type' => 'Module type', + 'Module you want to translate' => 'Module you want to translate', + 'Modules' => 'Modules', + 'Modules attachments' => 'Modules attachments', + 'More information about ISO 4217' => 'More information about ISO 4217', + 'More pages after' => 'More pages after', + 'More pages before' => 'More pages before', + 'More results are available.' => 'More results are available.', + 'Name' => 'Name', + 'Namespace of main class' => 'Namespace of main class', + 'New' => 'New', + 'New Configuration' => 'New Configuration', + 'No' => 'No', + 'No Folders found' => 'No Folders found', + 'No administration profile defined yet. Click the + button to create one.' => 'No administration profile defined yet. Click the + button to create one.', + 'No area defined with this id' => 'No area defined with this id', + 'No attributes.' => 'No attributes.', + 'No available content in this folder' => 'No available content in this folder', + 'No available product in this category' => 'No available product in this category', + 'No available value for this attribute' => 'No available value for this attribute', + 'No brand' => 'No brand', + 'No brand has been created yet. Click the + button to create one.' => 'No brand has been created yet. Click the + button to create one.', + 'No categories found' => 'No categories found', + 'No category found for "%term"' => 'No category found for "%term"', + 'No config.' => 'No config.', + 'No content found for "%term"' => 'No content found for "%term"', + 'No country' => 'No country', + 'No country has been created yet. Click the + button to create one.' => 'No country has been created yet. Click the + button to create one.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'No coupon is currently defined. Please use the (+) button above to create your first coupon.', + 'No currency has been created yet. Click the + button to create one.' => 'No currency has been created yet. Click the + button to create one.', + 'No customer found for "%term"' => 'No customer found for "%term"', + 'No description for this hook' => 'No description for this hook', + 'No document' => 'No document', + 'No email defined' => 'No email defined', + 'No filters' => 'No filters', + 'No folder found for "%term"' => 'No folder found for "%term"', + 'No folders found' => 'No folders found', + 'No hooks has been created yet. Click the + button to create one.' => 'No hooks has been created yet. Click the + button to create one.', + 'No logo image' => 'No logo image', + 'No mailing template has been created yet. Click the + button to create one.' => 'No mailing template has been created yet. Click the + button to create one.', + 'No module of this type was found.' => 'No module of this type was found.', + 'No order found for "%term"' => 'No order found for "%term"', + 'No orders fo this customer.' => 'No orders fo this customer.', + 'No product attribute has been created yet. Click the + button to create one.' => 'No product attribute has been created yet. Click the + button to create one.', + 'No product feature has been created yet. Click the + button to create one.' => 'No product feature has been created yet. Click the + button to create one.', + 'No product found for "%term"' => 'No product found for "%term"', + 'No product template has been created yet. Click the + button to create one.' => 'No product template has been created yet. Click the + button to create one.', + 'No sale has been created yet. Click the + button to create one.' => 'No sale has been created yet. Click the + button to create one.', + 'No shipping zone attached to this module, click here to attach one' => 'No shipping zone attached to this module, click here to attach one', + 'No shipping zone defined yet. Click the + button to create one.' => 'No shipping zone defined yet. Click the + button to create one.', + 'No state has been created yet. Click the + button to create one.' => 'No state has been created yet. Click the + button to create one.', + 'No value has been created yet. Click the + button to create one.' => 'No value has been created yet. Click the + button to create one.', + 'None' => 'None', + 'None defined' => 'None defined', + 'N° ISO' => 'N° ISO', + 'OK' => 'OK', + 'Official' => 'Official', + 'Online' => 'Online', + 'Oops! An Error Occurred' => 'Oops! An Error Occurred', + 'Or' => 'Or', + 'Order %ref - ID %id' => 'Order %ref - ID %id', + 'Order details' => 'Order details', + 'Order n°' => 'Order n°', + 'Order status:' => 'Order status:', + 'Ordered products' => 'Ordered products', + 'Orders' => 'Orders', + 'Originating file line number ' => 'Originating file line number ', + 'Originating file name' => 'Originating file name', + 'Originating function name ' => 'Originating function name ', + 'Other addresses' => 'Other addresses', + 'PDF template you want to translate' => 'PDF template you want to translate', + 'PDF templates' => 'PDF templates', + 'PDF | Invoice' => 'PDF | Invoice', + 'PDF | Purchase order' => 'PDF | Purchase order', + 'Page not found' => 'Page not found', + 'Parameters' => 'Parameters', + 'Parse template' => 'Parse template', + 'Password' => 'Password', + 'Password :' => 'Password :', + 'Password changed' => 'Password changed', + 'Payment information' => 'Payment information', + 'Payment module' => 'Payment module', + 'Payment modules' => 'Payment modules', + 'Percent Discount' => 'Percent Discount', + 'Period' => 'Period', + 'Phone' => 'Phone', + 'Phone & Fax' => 'Phone & Fax', + 'Phone number' => 'Phone number', + 'Please enter the date using the %fmt format' => 'Merci d\'indiquer une date au format %fmt', + 'Please refine your search to see the other results.' => 'Please refine your search to see the other results.', + 'Please retry' => 'Please retry', + 'Please save this coupon first to define coupon conditions' => 'Please save this coupon first to define coupon conditions', + 'Please select a condition' => 'Please select a condition', + 'Please select a coupon type' => 'Please select a coupon type', + 'Please select another condition' => 'Please select another condition', + 'Please select at least one category.' => 'Please select at least one category.', + 'Please select items to translate' => 'Please select items to translate', + 'Please select one or more categories which contains some products' => 'Please select one or more categories which contains some products', + 'Please select the B.O. template to translate' => 'Please select the B.O. template to translate', + 'Please select the E-mail template to translate' => 'Please select the E-mail template to translate', + 'Please select the F.O. template to translate' => 'Please select the F.O. template to translate', + 'Please select the PDF template to translate' => 'Please select the PDF template to translate', + 'Please select the module component' => 'Please select the module component', + 'Please select the module to translate' => 'Please select the module to translate', + 'Please select your editing mode :' => 'Please select your editing mode :', + 'Please select...' => 'Please select...', + 'Please wait, loading' => 'Please wait, loading', + 'Please wait, loading products list' => 'Please wait, loading products list', + 'Port' => 'Port', + 'Port :' => 'Port :', + 'Position' => 'Position', + 'Postage' => 'Postage', + 'Postscriptum' => 'Postscriptum', + 'Preview' => 'Preview', + 'Preview HTML' => 'Preview HTML', + 'Preview brand page' => 'Preview brand page', + 'Preview category page' => 'Preview category page', + 'Preview content page' => 'Preview content page', + 'Preview folder page' => 'Preview folder page', + 'Preview product page' => 'Preview product page', + 'Preview text' => 'Preview text', + 'Price' => 'Price', + 'Price (%currency)
    w/ taxes' => 'Price (%currency)
    w/ taxes', + 'Price (%currency)
    w/o taxes' => 'Price (%currency)
    w/o taxes', + 'Price excl. taxes' => 'Price excl. taxes', + 'Price incl. taxes' => 'Price incl. taxes', + 'Pricing' => 'Pricing', + 'Product' => 'Product', + 'Product Attributes' => 'Product Attributes', + 'Product EAN Code' => 'Product EAN Code', + 'Product Features' => 'Product Features', + 'Product accessories' => 'Product accessories', + 'Product attribute selection' => 'Product attribute selection', + 'Product attributes' => 'Product attributes', + 'Product catalog configuration' => 'Product catalog configuration', + 'Product created on %date_create. Last modification: %date_change' => 'Product created on %date_create. Last modification: %date_change', + 'Product features' => 'Product features', + 'Product price' => 'Product price', + 'Product price including taxes' => 'Product price including taxes', + 'Product stock' => 'Product stock', + 'Product tax price' => 'Product tax price', + 'Product templates' => 'Product templates', + 'Product title' => 'Product title', + 'Product weight' => 'Product weight', + 'Product\'s attributes included in this sale operation' => 'Product\'s attributes included in this sale operation', + 'Products' => 'Products', + 'Products are :' => 'Products are :', + 'Products in %cat' => 'Products in %cat', + 'Products selection' => 'Products selection', + 'Profil' => 'Profile', + 'Profile' => 'Profile', + 'Profile code' => 'Profile code', + 'Profile created on %date_create. Last modification: %date_change' => 'Profile created on %date_create. Last modification: %date_change', + 'Profiles' => 'Profiles', + 'Promotion' => 'Promotion', + 'Provides free shipping' => 'Provides free shipping', + 'Published by OpenStudio' => 'Published by OpenStudio', + 'Purpose' => 'Purpose', + 'Put module in hook' => 'Put module in hook', + 'Quantity' => 'Quantity', + 'Quickly create combinations using the combination builder' => 'Quickly create combinations using the combination builder', + 'Rate' => 'Rate', + 'Read module documentation' => 'Read module documentation', + 'Read the documentation of this module' => 'Read the documentation of this module', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.', + 'Redefine the text only for this resource.' => 'Redefine the text only for this resource.', + 'Reference' => 'Reference', + 'Registration date' => 'Registration date', + 'Related content' => 'Related content', + 'Remove a module from a hook' => 'Remove a module from a hook', + 'Remove an accessory' => 'Remove an accessory', + 'Remove associated folder' => 'Remove associated folder', + 'Remove attribute' => 'Remove attribute', + 'Remove country' => 'Remove country', + 'Remove feature' => 'Remove feature', + 'Remove from all product templates' => 'Remove from all product templates', + 'Remove from category' => 'Remove from category', + 'Remove from selected categories' => 'Remove from selected categories', + 'Remove related content' => 'Remove related content', + 'Remove selected values' => 'Remove selected values', + 'Remove the product from this category' => 'Remove the product from this category', + 'Remove this attribute from all product templates' => 'Remove this attribute from all product templates', + 'Remove this feature from all product templates' => 'Remove this feature from all product templates', + 'Remove zone' => 'Remove zone', + 'Request a new password' => 'Request a new password', + 'Required modules' => 'Required modules', + 'Reset' => 'Reset', + 'Reset sale status for all products' => 'Reset sale status for all products', + 'Resource' => 'Resource', + 'Resource access rights' => 'Resource access rights', + 'Resources' => 'Resources', + 'Rights' => 'Rights', + 'SEO' => 'SEO', + 'Sale' => 'Sale', + 'Sale configuration' => 'Sale configuration', + 'Sale created on %date_create. Last modification: %date_change' => 'Sale created on %date_create. Last modification: %date_change', + 'Sale operation description' => 'Sale operation description', + 'Sale operation features' => 'Sale operation features', + 'Sale price (%currency)
    w/ taxes' => 'Sale price (%currency)
    w/ taxes', + 'Sale price (%currency)
    w/o taxes' => 'Sale price (%currency)
    w/o taxes', + 'Sale price incl. taxes' => 'Sale price incl. taxes', + 'Sales management' => 'Sales management', + 'Save' => 'Save', + 'Save and close' => 'Save and close', + 'Save chages' => 'Save changes', + 'Save changes' => 'Save changes', + 'Save tax rule taxes' => 'Save tax rule taxes', + 'Save this address' => 'Save this address', + 'Save this condition' => 'Save this condition', + 'Search' => 'Search', + 'Search a module' => 'Search a module', + 'Search for \'%term\'' => 'Search for \'%term\'', + 'Search on Thelia Modules' => 'Search on Thelia Modules', + 'Secure key' => 'Secure key', + 'Select' => 'Select', + 'Select a category and click (+) to add it to the additional category list' => 'Select a category and click (+) to add it to the additional category list', + 'Select a category to get its products' => 'Select a category to get its products', + 'Select a category...' => 'Select a category...', + 'Select a configuration' => 'Select a configuration', + 'Select a content and click (+) to add it to this category' => 'Select a content and click (+) to add it to this category', + 'Select a content and click (+) to add it to this product' => 'Select a content and click (+) to add it to this product', + 'Select a feature and click (+) to add it to this template' => 'Select a feature and click (+) to add it to this template', + 'Select a feature...' => 'Select a feature...', + 'Select a folder and click (+) to add it to the additional folder list' => 'Select a folder and click (+) to add it to the additional folder list', + 'Select a folder content...' => 'Select a folder content...', + 'Select a folder to get its content' => 'Select a folder to get its content', + 'Select a folder...' => 'Select a folder...', + 'Select a product and click (+) to add it as an accessory' => 'Select a product and click (+) to add it as an accessory', + 'Select a product...' => 'Select a product...', + 'Select a tax tule' => 'Select a tax tule', + 'Select a template' => 'Select a template', + 'Select a value click (+) to add it to the combination' => 'Select a value click (+) to add it to the combination', + 'Select an attribute and click (+) to add it to this template' => 'Select an attribute and click (+) to add it to this template', + 'Select an attribute and click (+) to view available values' => 'Select an attribute and click (+) to view available values', + 'Select an attribute value...' => 'Select an attribute value...', + 'Select an attribute...' => 'Select an attribute...', + 'Select attribute :' => 'Select attribute :', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.', + 'Select here a template for this product' => 'Select here a template for this product', + 'Select here the tax applicable to this product' => 'Select here the tax applicable to this product', + 'Select offered product :' => 'Select offered product :', + 'Select offrered product category :' => 'Select offered product category :', + 'Select or deselect all products' => 'Select or deselect all products', + 'Select product category :' => 'Select product category :', + 'Select the attributes values of "%title" that should be included in this sale operation.' => 'Select the attributes values of "%title" that should be included in this sale operation.', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.', + 'Selected categories' => 'Selected categories', + 'Send' => 'Send', + 'Send a mail to this customer' => 'Send a mail to this customer', + 'Send files' => 'Send files', + 'Sequential number of log line' => 'Sequential number of log line', + 'Set as default tax rule' => 'Set as default tax rule', + 'Sets the separator for the decimal point' => 'Sets the separator for the decimal point', + 'Sets the thousands separator.' => 'Sets the thousands separator.', + 'Shipping configuration' => 'Shipping configuration', + 'Shipping configuration of delivery module "%title"' => 'Shipping configuration of delivery module "%title"', + 'Shipping zone' => 'Shipping zone', + 'Shipping zone "%title"' => 'Shipping zone "%title"', + 'Shipping zones' => 'Shipping zones', + 'Shipping zones for this country' => 'Shipping zones for this country', + 'Shipping zones for this module' => 'Shipping zones for this module', + 'Shipping zones management' => 'Shipping zones management', + 'Short description' => 'Short description', + 'Short description :' => 'Short description :', + 'Show logs' => 'Show logs', + 'So, each configuration is a list of taxes applied to a list of countries/states.' => 'So, each configuration is a list of taxes applied to a list of countries/states.', + 'Some of your translations are not saved. Continue anyway ?' => 'Some of your translations are not saved. Continue anyway ?', + 'Something goes wrong, please try again' => 'Une erreur est survenue, merci de ré-essayer', + 'Something goes wrong, please try again.' => 'Une erreur est survenue, merci de ré-essayer.', + 'Sorry, attribute ID=%id was not found.' => 'Sorry, attribute ID=%id was not found.', + 'Sorry, country ID=%id was not found.' => 'Sorry, country ID=%id was not found.', + 'Sorry, currency ID=%id was not found.' => 'Sorry, currency ID=%id was not found.', + 'Sorry, customer ID=%id was not found.' => 'Sorry, customer ID=%id was not found.', + 'Sorry, document ID=%id was not found.' => 'Sorry, document ID=%id was not found.', + 'Sorry, feature ID=%id was not found.' => 'Sorry, feature ID=%id was not found.', + 'Sorry, hook ID=%id was not found.' => 'Sorry, hook ID=%id was not found.', + 'Sorry, image ID=%id was not found.' => 'Sorry, image ID=%id was not found.', + 'Sorry, message ID=%id was not found.' => 'Sorry, message ID=%id was not found.', + 'Sorry, module hook ID=%id was not found.' => 'Sorry, module hook ID=%id was not found.', + 'Sorry, state ID=%id was not found.' => 'Sorry, state ID=%id was not found.', + 'Sorry, template ID=%id was not found.' => 'Sorry, template ID=%id was not found.', + 'Sorry, variable ID=%id was not found.' => 'Sorry, variable ID=%id was not found.', + 'Source IP' => 'Source IP', + 'Source IP :' => 'Source IP :', + 'Stability' => 'Stability', + 'Start Date' => 'Start Date', + 'State' => 'State', + 'States' => 'States', + 'States / Provinces' => 'States / Provinces', + 'States/provinces assigned to this country' => 'States/provinces assigned to this country', + 'Status' => 'Status', + 'Stock' => 'Stock', + 'Store' => 'Store', + 'Store address' => 'Store address', + 'Store configuration' => 'Store configuration', + 'Street address' => 'Street address', + 'Subtitle' => 'Subtitle', + 'Superadministrator' => 'Superadministrator', + 'Supported locales' => 'Supported locales', + 'Symbol' => 'Symbol', + 'System Logs' => 'System Logs', + 'System Logs configuration' => 'System Logs configuration', + 'System logs' => 'System logs', + 'System parameters' => 'System parameters', + 'System variables' => 'System variables', + 'Tags' => 'Tags', + 'Tax' => 'Tax', + 'Tax created on %date_create. Last modification: %date_change' => 'Tax created on %date_create. Last modification: %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => 'Tax rule created on %date_create. Last modification: %date_change', + 'Tax rules' => 'Taxes and Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of one ore more taxes.', + 'Taxed total' => 'Taxed total', + 'Taxes' => 'Taxes', + 'Taxes configuration' => 'Taxes configuration', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes defines the amount added to the product price.', + 'Taxes rules' => 'Taxes rules', + 'Template name' => 'Template name', + 'Template title' => 'Template title', + 'Template type' => 'Template type', + 'Templates' => 'Templates', + 'Test your configuration' => 'Test your configuration', + 'Text version of this message' => 'Text version of this message', + 'That way, Thelia community will benefit of your translations' => 'That way, Thelia community will benefit of your translations', + 'The default pricing is used when no combination is defined.' => 'The default pricing is used when no combination is defined.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.', + 'The detailed description.' => 'The detailed description.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'The directory local/I18n does not exist or is not writable. Please fix this issue before.', + 'The following error message has been found: %msg' => 'The following error message has been found: %msg', + 'The hooks have been updated successfuly !' => 'The hooks have been updated successfuly !', + 'The outcomming price is the sum of the incomming one and the sum of taxes.' => 'The outcomming price is the sum of the incomming one and the sum of taxes.', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'The page you\'ve requested was not found. Please check the page address, and try again.', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'The rate from Euro (Price in Euro * rate = Price in this currency)', + 'The selected categories :' => 'The selected categories :', + 'The selected countries :' => 'Les pays sélectionnés :', + 'The selected customer :' => 'The selected customer :', + 'The selected products :' => 'The selected products :', + 'The server returned a "404 Not Found"' => 'The server returned a "404 Not Found"', + 'The syntax used is identical to the PHP date() function' => 'The syntax used is identical to the PHP date() function', + 'Thelia Back Office' => 'Thelia Back Office', + 'Thelia Installation' => 'Thelia Installation', + 'Thelia Installation Wizard' => ' Thelia Installation Wizard', + 'Thelia Languages' => 'Thelia Languages', + 'Thelia Mailing System' => 'Thelia Mailing System', + 'Thelia Mailing Templates' => 'Thelia Mailing Templates', + 'Thelia Product Attributes' => 'Thelia Product Attributes', + 'Thelia Product Features' => 'Thelia Product Features', + 'Thelia Product Templates' => 'Thelia Product Templates', + 'Thelia Shipping configuration' => 'Thelia Shipping configuration', + 'Thelia Shipping zones' => 'Thelia Shipping zones', + 'Thelia System Variables' => 'Thelia System Variables', + 'Thelia caches flushing' => 'Thelia caches flushing', + 'Thelia contributions' => 'Thelia contributions', + 'Thelia core' => 'Thelia core', + 'Thelia mailing templates' => 'Thelia mailing templates', + 'Thelia product attributes' => 'Thelia product attributes', + 'Thelia product features' => 'Thelia product features', + 'Thelia product templates' => 'Thelia product templates', + 'Thelia support forum' => 'Thelia support forum', + 'Thelia system variables' => 'Thelia system variables', + 'There are no shipping zones attached to this module.' => 'There are no shipping zones attached to this module.', + 'There is 2 kind of translations :' => 'There is 2 kind of translations :', + 'There is currently no active module here.' => 'There is currently no active module here.', + 'There is currently no available attributes.' => 'Currently, none of the attributes are available', + 'There is currently no available features.' => 'Currently, none of the features are available', + 'There is no documents attached to this %type.' => 'There are no documents attached to this %type.', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'There are no files present which can be associated to your product. Only documents that are not visible can be selected !', + 'There is no images attached to this %type.' => 'There are no images attached to this %type.', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.', + 'This category contains no contents' => 'This category contains no contents', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'This category doesn\'t contains any products. To add a new product, click the + button above.', + 'This category has no sub-categories.' => 'This category has no sub-categories.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'This category has no sub-categories. To create a new one, click the + button above.', + 'This country is not included in any shipping zone' => 'This country is not included in any shipping zone', + 'This customer has not defined any delivery address' => 'This customer has not defined any delivery address', + 'This customer has orders, and can\'t be deleted.' => 'This customer has orders, and can\'t be deleted.', + 'This delivery module handles all shipping zones.' => 'This delivery module handles all shipping zones.', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'This folder doesn\'t contains any contents. To add a new content, click the + button above.', + 'This folder has no sub-folders.' => 'This folder has no sub-folders.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'This folder has no sub-folders. To create a new one, click the + button above.', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ', + 'This is the code entered by your customers to use this coupon' => 'This is the code entered by your customers to use this coupon', + 'This mailing template could not be changed.' => 'This mailing template could not be changed.', + 'This module cannot be started, some files are probably missing.' => 'This module cannot be started, some files are probably missing.', + 'This outcomming price is then passed to the next group as its incomming price, etc...' => 'This outcomming price is then passed to the next group as its incomming price, etc...', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ', + 'This product contains no accessories' => 'This product contains no accessories', + 'This product contains no contents' => 'This product contains no contents', + 'This product doesn\'t belong to any additional category.' => 'This product doesn\'t belong to any additional category.', + 'This product doesn\'t belong to any additional folder.' => 'This product doesn\'t belong to any additional folder.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'This product has no combination. The default price is used. Click here to create a new combination.', + 'This product template does not contains any features' => 'This product template does not contains any features', + 'This shipping zone does not contains any country.' => 'This shipping zone does not contains any country.', + 'This template contains no attributes' => 'This template contains no attributes', + 'This template contains no features' => 'This template contains no features', + 'This variable could not be changed.' => 'This variable could not be changed.', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'This will reset the sale status of all products, and disable all active sales. Do you really want to continue ?', + 'Timeout' => 'Timeout', + 'Timeout :' => 'Timeout :', + 'Title' => 'Title', + 'Title * :' => 'Title * :', + 'To' => 'To', + 'To create a new content, select an existing folder, or create a new one.' => 'To create a new content, select an existing folder, or create a new one.', + 'To create a new product, select an existing category, or create a new one.' => 'To create a new product, select an existing category, or create a new one.', + 'To remove a value from the combination, select it and click "remove"' => 'To remove a value from the combination, select it and click "remove"', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.', + 'Toggle select all' => 'Toggle select all', + 'Tools' => 'Tools', + 'Top level' => 'Top level', + 'Top level Contents' => 'Top level Contents', + 'Top level Products' => 'Top level Products', + 'Top level categories' => 'Top level categories', + 'Top level folders' => 'Top level folders', + 'Total' => 'Total', + 'Total including discount' => 'Total including discount', + 'Total without discount' => 'Total without discount', + 'Transaction' => 'Transaction', + 'Transaction reference' => 'Transaction reference', + 'Translation' => 'Translation', + 'Translations' => 'Translation', + 'Type:' => 'Type:', + 'Unit taxed price' => 'Unit taxed price', + 'Unit. price' => 'Unit. price', + 'Unlimited' => 'Unlimited', + 'Unlimited number of uses' => 'Unlimited number of uses', + 'Unspecified' => 'Unspecified', + 'Unsupported field type \'%type\' in form-field.html' => 'Unsupported field type \'%type\' in form-field.html', + 'Update' => 'Update', + 'Update URL' => 'Update URL', + 'Update an administrator' => 'Update an administrator', + 'Update coupon' => 'Update coupon', + 'Update password' => 'Update password', + 'Update rates' => 'Update rates', + 'Update tax rule taxes' => 'Update tax rule taxes', + 'Update this image' => 'Update this image', + 'Usage count' => 'Usages left', + 'Usages left' => 'Usages left', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'Use Ctrl+click to select (or deselect) more that one attribute value', + 'Use Ctrl+click to select (or deselect) more that one category' => 'Use Ctrl+click to select (or deselect) more that one category', + 'Use Ctrl+click to select (or deselect) more that one country' => 'Utiliser Ctrl+clic pour sélectionner (ou dé-sélectionner) plusieurs pays.', + 'Use Ctrl+click to select (or deselect) more that one item' => 'Use Ctrl+click to select (or deselect) more that one item', + 'Use Ctrl+click to select (or deselect) more that one product' => 'Use Ctrl+click to select (or deselect) more that one product', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'Use Ctrl+click to select (or deselect) more that one shipping method', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Use Ctrl+click to select more than one value. You can also clear selected values.', + 'Use HTML message defined below' => 'Use HTML message defined below', + 'Use Text message defined below' => 'Use Text message defined below', + 'Use address by default' => 'Use address by default', + 'Use an other config.' => 'Use an other config.', + 'Use default layout' => 'Use default layout', + 'Use this address by default' => 'Use this address by default', + 'Use this config.' => 'Use this config.', + 'User mode' => 'User mode', + 'Username' => 'Username', + 'Username :' => 'Username :', + 'Username or e-mail address' => 'Username or e-mail address', + 'Using a domain or subdomain for each language' => 'Using a domain or subdomain for each language', + 'Valid on special offers' => 'Valid on special offers', + 'Validity start date' => 'Date de début de validité', + 'Value' => 'Value', + 'Variable created on %date_create. Last modification: %date_change' => 'Variable created on %date_create. Last modification: %date_change', + 'Variable name' => 'Variable name', + 'Variable purpose' => 'Variable purpose', + 'Variable value' => 'Variable value', + 'Variables to inject' => 'Variables to inject', + 'Version %ver' => 'Version %ver', + 'View' => 'View', + 'View invoice PDF' => 'View invoice PDF', + 'View only missing translations.' => 'View only missing translations.', + 'View purchase order as PDF' => 'View purchase order as PDF', + 'View shop' => 'View shop', + 'View site' => 'View site', + 'View this page in %langname' => 'View this page in %langname', + 'View this product in a new page' => 'View this product in a new page', + 'Virtual product' => 'Virtual product', + 'Visibility' => 'Visibility', + 'Visible' => 'Visible', + 'Visible in front' => 'Visible in front', + 'Warning' => 'Warning', + 'Web site' => 'Web site', + 'Weight' => 'Weight', + 'Weight
    (Kg)' => 'Weight
    (Kg)', + 'Welcome' => 'Welcome', + 'Welcome to Thelia administration !' => 'Welcome to Thelia administration !', + 'Yes' => 'Yes', + 'You can attach here some content to this category' => 'You can attach here some content to this category', + 'You can attach here some content to this product' => 'You can attach here some content to this product', + 'You can attach this product to more categories in the details tab.' => 'You can attach this product to more categories in the details tab.', + 'You can change attributes and their positions in the attributes configuration page.' => 'You can change attributes and their positions in the attributes configuration page.', + 'You can change feature and their positions in the features configuration page.' => 'You can change feature and their positions in the features configuration page.', + 'You can change template attributes and their positions in the template configuration page.' => 'You can change template attributes and their positions in the template configuration page.', + 'You can change templates features and their positions in the template configuration page.' => 'You can change templates features and their positions in the template configuration page.', + 'You can change the default category (%title) in the "General" tab.' => 'You can change the default category (%title) in the "General" tab.', + 'You can change the default folder (%title) in the "General" tab.' => 'You can change the default folder (%title) in the "General" tab.', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.', + 'You can\'t delete this administrator' => 'You can\'t delete this administrator', + 'You can\'t delete this profile' => 'You can\'t delete this profile', + 'You can\'t do exports, you don\'t have any serializer that handles this.' => 'You can\'t do exports, you don\'t have any serializer that handles this.', + 'You don\'t have any export' => 'You don\'t have any export', + 'You don\'t have any import' => 'You don\'t have any import', + 'You have no orders for the moment.' => 'You have no orders for the moment.', + 'You have no registred customers for the moment.' => 'You have no registered customers for the moment.', + 'You may also quickly create combinations from products attributes using the Combination Builder.' => 'You may also quickly create combinations from products attributes using the Combination Builder.', + 'Your current IP address is %ip' => 'Your current IP address is %ip', + 'Your email' => 'Your email', + 'Your module should be packaged in a zip file.' => 'Your module should be packaged in a zip file.', + 'Your search is too short' => 'Your search is too short', + 'Your template define new hooks' => 'Your template define new hooks', + 'Your template does not support this hooks' => 'Your template does not support this hooks', + 'Your template is clean. No missing hooks and no new hooks.' => 'Your template is clean. No missing hooks and no new hooks.', + 'Zip code' => 'Zip code', + 'Zone name' => 'Zone name', + 'activate' => 'activate', + 'activate %title module' => 'activate %title module', + 'activate hook' => 'activate hook', + 'activation' => 'activation', + 'all' => 'all', + 'all states' => 'all states', + 'all states/provinces' => 'all states/provinces', + 'and' => 'and', + 'caption' => 'caption', + 'classic modules' => 'classic modules', + 'code' => 'code', + 'company' => 'company', + 'country has an other configuration' => 'country has an other configuration', + 'country has no configuration' => 'country has no configuration', + 'country has the current configuration' => 'country has the current configuration', + 'customer ref' => 'customer ref', + 'd-m-Y' => 'd-m-Y', + 'd-m-Y H:i:s' => 'd-m-Y H:i:s', + 'date in yyyy-mm-dd format' => 'date in yyyy-mm-dd format', + 'deactivate' => 'deactivate', + 'deactivated' => 'deactivated', + 'deactivation' => 'deactivation', + 'delete document' => 'delete document', + 'delete image' => 'delete image', + 'download' => 'download', + 'eg: . or ,' => 'eg: . or ,', + 'email' => 'email', + 'en_US' => 'en_US', + 'filter country' => 'filter country', + 'firstname & lastname' => 'first name & last name', + 'hour in hh:mm:ss format' => 'hour in hh:mm:ss format', + 'last order' => 'last order', + 'long description' => 'long description', + 'none' => 'none', + 'ok' => 'ok', + 'on' => 'on', + 'or' => 'or', + 'order amount' => 'order amount', + 'orders for this customer' => 'orders for this customer', + 'pdf' => 'pdf', + 'permanent discount' => 'permanent discount (in percent)', + 'profile' => 'profile', + 'ref.:' => 'ref.:', + 'reverse' => 'reverse', + 'short description' => 'short description', + 'tax rules' => 'tax rules', + 'taxes' => 'taxes', + 'title' => 'title', + 'tracking reference' => 'Tracking reference', + 'version' => 'Version', + 'warning' => 'warning', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'You can build tax rules where the taxes are applied on the sole product price, and tax rules where a tax is applied on the result of a previous tax calculation.', +); diff --git a/templates/backOffice/default/I18n/es_ES.php b/templates/backOffice/default/I18n/es_ES.php new file mode 100644 index 00000000..a9f08e4b --- /dev/null +++ b/templates/backOffice/default/I18n/es_ES.php @@ -0,0 +1,1297 @@ + ' (por defecto)', + '%count more...' => '%count más...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => 'zona(s) de envío de %count se ha(n) añadido a este módulo: %zones. Haga click aquí para cambiar', + '(according to a country the taxes applied could be different)' => '(de acuerdo al país los impuestos aplicados podrían ser diferentes)', + '(edit)' => '(editar)', + 'Check the list of ISO 639-1 codes' => ' Comprueba la lista de códigos ISO 639-1', + '0 combinations' => '0 combinaciones', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'No puede traducir todos los campos. Según su configuración de PHP los formularios no pueden contener más de %current_max_input_vars campos, pero al menos %required_max_input_vars son necesarios. Por favor, cambie el valor de max_input_vars en archivo de configuración del PHP o cambia el archivo de traducción a mano.', + 'Congratulations, all text is now translated !' => '¡Felicidades, toda la traducción ha sido realizada!', + 'Developer : to change the translations of the resource' => 'Desarrollador: para cambiar las traducciones del recurso', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'No se encontró ningún texto para traducir. Probablemente sea normal. Si no, por favor, asegúrate de utilizar la función "internacional" de Smarty en las plantillas o el método Traductor:: trans() en los archivos PHP.', + 'User : to redefine the translations for your website' => 'Usuario: para redefinir las traducciones de tu sitio web', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Advertencia, un tipo de cambio no se ha encontrado para al menos una moneda: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Avertencia, algunos de los países no están incluidos en cualquier zona de envío:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Advertencia, algunas de las zonas de envío no están vinculados a cualquier módulo de entrega:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Puedes adjuntar más de una carpeta a un contenido. Selecciona las carpetas adicionales para este contenido aquí.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Puedes adjuntar más de una categoría a un producto. Seleccione las categorías adicionales para este producto aquí.', + 'API configuration' => 'Configuración de API', + 'API list access' => 'Lista de acceso a API', + 'API users' => 'Usuarios de API', + 'Accessory title' => 'Título del accesorio', + 'Action' => 'Acción', + 'Actions' => 'Acciones', + 'Activate this log destination' => 'Activar este destino de registro', + 'Active' => 'Activado', + 'Add' => 'Añadir', + 'Add a condition' => 'Añadir una condición', + 'Add a module to a hook' => 'Añadir un módulo a un Hook', + 'Add a new Customer' => 'Añadir un nuevo cliente', + 'Add a new address' => 'Añadir una nueva dirección', + 'Add a new brand' => 'Añadir una nueva marca', + 'Add a new category' => 'Añadir una nueva categoría', + 'Add a new combination' => 'Añadir una nueva combinación', + 'Add a new content' => 'Añadir un nuevo contenido', + 'Add a new country' => 'Añadir un nuevo país', + 'Add a new currency' => 'Añadir una nueva moneda', + 'Add a new folder' => 'Añadir una nueva carpeta', + 'Add a new hook' => 'Añadir un Hook nuevo', + 'Add a new language' => 'Añadir un nuevo idioma', + 'Add a new mailing template' => 'Añadir una nueva plantilla de correo electrónico', + 'Add a new module in a hook' => 'Agregar un nuevo módulo en un Hook', + 'Add a new module to this hook' => 'Añadir un nuevo módulo a este Hook', + 'Add a new product' => 'Añadir un nuevo producto', + 'Add a new product attribute' => 'Añadir un nuevo atributo de producto', + 'Add a new product feature' => 'Añadir una nueva característica de producto', + 'Add a new product template' => 'Añadir una nueva plantilla de producto', + 'Add a new sale' => 'Añadir una nueva venta', + 'Add a new shipping zone' => 'Añadir una nueva zona de envío', + 'Add a new state' => 'Agrega un nuevo estado', + 'Add a new variable' => 'Añadir una nueva variable', + 'Add document to your product.' => 'Agregar documento a su producto.', + 'Add selected countries' => 'Añadir países seleccionados', + 'Add tax to this group' => 'Añadir impuestos a este grupo', + 'Add this attribute to all product templates' => 'Añadir este atributo a todas las plantillas de producto', + 'Add this feature to all product templates' => 'Añadir esta característica a todas las plantillas de producto', + 'Add to all product templates' => 'Añadir a todas las plantillas de producto', + 'Add to selected categories' => 'Añadir a las categorías seleccionadas', + 'Additional Folders' => 'Carpetas adicionales', + 'Additional address' => 'Dirección adicional', + 'Additional categories' => 'Categorías adicionales', + 'Address' => 'Dirección', + 'Administration logs' => 'Logs de administración', + 'Administration profiles' => 'Perfiles de administración', + 'Administrators' => 'Administradores', + 'Advanced configuration' => 'Configuración avanzada', + 'Advanced configuration and tools' => 'Herramientas y configuración avanzada', + 'All' => 'Todo', + 'All States' => 'Todos los Estados', + 'All orders' => 'Todos los pedidos', + 'Amount' => 'Importe', + 'Amount, e.g. 12.50' => 'Cantidad, por ejemplo, 12.50', + 'An email containing instructions to create a new password was sent to your email address. If you don\'t receive this email, please try again.' => 'Un correo con las instrucciones para crear una nueva contraseña fue enviado a tu dirección de correo. Si no lo recibes, por favor intenta de nuevo.', + 'An error occured' => 'Ha ocurrido un error', + 'An invalid token was provided, your password cannot be changed. Please try again, and be sure to use the exact URL which is in the e-mail sent to you.' => 'Una llave invalida fue enviada, tu contraseña no puede ser cambiada. Por favor intenta nuevamente y asegúrate de usar la URL exacta que está en el correo que te enviamos.', + 'An unexpected error occured' => 'Ocurrió un error inesperado', + 'An unknow error happend' => 'Ocurrió un error desconocido', + 'An unknown error occured, please try again.' => 'Se ha producido un error desconocido, por favor vuelve a intentarlo.', + 'And' => 'Y', + 'Api' => 'API', + 'Api key' => 'API key', + 'Applies to attribute values :' => 'Se aplica a los valores de atributo :', + 'Applies to products :' => 'Se aplica a productos :', + 'Applies to products in categories :' => 'Se aplica a los productos en categorías:', + 'Apply' => 'Aplicar', + 'Assigned modules' => 'Módulos asignados', + 'Associate documents' => 'Documentos asociados', + 'Associate downloadable file' => 'Archivo descargable asociado', + 'Associate files to your combinations' => 'Asociar archivos a tus combinaciones', + 'Associate images' => 'Imágenes asociadas', + 'Associated' => 'Asociado', + 'Associations' => 'Asociaciones', + 'Attribute' => 'Atributo', + 'Attribute %title' => 'Atributo %title', + 'Attribute Combinations' => 'Combinaciones de atributo', + 'Attribute Name' => 'Nombre del atributo', + 'Attribute information' => 'Información de atributo', + 'Attribute title' => 'Título de atributo', + 'Attribute values' => 'Valores del atributo', + 'Attributes' => 'Atributos', + 'Attributes & Features' => 'Atributos y características', + 'Auth Mode' => 'Modo de identificación', + 'Auth Mode :' => 'Modo de identificación:', + 'Author' => 'Autor', + 'Available product categories' => 'Categorías de productos disponibles', + 'Available taxes' => 'Impuestos disponibles', + 'Back' => 'Volver', + 'Back Office' => 'Panel de administración', + 'Back-office home' => 'Página de inicio del panel de adñinistración', + 'Back-office template you want to translate' => 'Plantilla de back office que deseas traducir', + 'Back-office templates' => 'Plantillad de Back office', + 'Back-office users' => 'Usuarios del back office', + 'Best taxed price' => 'Mejor precio con impuestos', + 'Block' => 'Bloque', + 'Block :' => 'Bloque:', + 'Brand created on %date_create. Last modification: %date_change' => 'Marca creada en %date_create. Última modificación: %date_change', + 'Brands' => 'Marcas', + 'Browse files' => 'Examinar los archivos', + 'Browse this category' => 'Explorar esta categoría', + 'Browse this folder' => 'Explorar esta carpeta', + 'By module' => 'Por módulo', + 'By module:' => 'Por módulo:', + 'By status' => 'Por estado', + 'By type' => 'Por tipo', + 'Can\'t load documents, please refresh this page.' => 'No se puede cargar documentos, por favor, actualiza esta página.', + 'Can\'t load images, please refresh this page.' => 'No se puede cargar imágenes, por favor, actualiza esta página.', + 'Can\'t reorder documents, please refresh this page.' => 'No se puede reordenar los documentos, por favor, actualiza esta página.', + 'Can\'t reorder images, please refresh this page.' => 'No se puede ordenar imágenes, por favor, actualiza esta página.', + 'Cancel' => 'Cancelar', + 'Cancel changes and revert to original value' => 'Cancelar los cambios y volver al valor original', + 'Cancel this order' => 'Cancelar este pedido', + 'Cart - Prices in %currency' => 'Carrito - Precio en %currency', + 'Catalog' => 'Catálogo', + 'Categories' => 'Categorías', + 'Categories in %cat' => 'Categorías en %cat', + 'Category' => 'Categoria', + 'Category created on %date_create. Last modification: %date_change' => 'Categoría creada en %date_create. Última modificación: %date_change', + 'Category title' => 'Título de la categoría', + 'Cellphone' => 'Teléfono móvil', + 'Cellular phone' => 'Teléfono móvil', + 'Cellular phone number' => 'Número de teléfono móvil', + 'Change sale configuration' => 'Cambiar configuración de venta', + 'Change this administrator' => 'Cambiar este administrador', + 'Change this api access' => 'Cambiar este acceso a API', + 'Change this attribute' => 'Modificar este atributo', + 'Change this brand' => 'Cambiar esta marca', + 'Change this condition' => 'Cambiar esta condición', + 'Change this country' => 'Modificar este país', + 'Change this coupon' => 'Cambiar este cupón', + 'Change this currency' => 'Cambiar esta moneda', + 'Change this feature' => 'Cambiar esta característica', + 'Change this hook' => 'Cambiar este Hook', + 'Change this language' => 'Cambiar este idioma', + 'Change this mailing template' => 'Cambiar esta plantilla de correo electrónico', + 'Change this product attribute' => 'Cambiar el atributo de este producto', + 'Change this product feature' => 'Cambiar la característica de este producto', + 'Change this product template' => 'Cambiar la plantilla de este producto', + 'Change this profile' => 'Cambiar este perfil', + 'Change this sale' => 'Cambiar esta venta', + 'Change this shipping zone' => 'Cambiar esta zona de envío', + 'Change this state' => 'Cambiar este estado', + 'Change this tax' => 'Cambiar este impuesto', + 'Change this tax rule' => 'Cambiar esta regla de impuesto', + 'Change this template' => 'Cambiar esta plantilla', + 'Change this variable' => 'Cambiar esta variable', + 'Chapo' => 'Sombrero', + 'Check sale activation' => 'Comprobar la activación de la venta', + 'Check the support of hooks.' => 'Consulte la ayuda sobre Hooks.', + 'Check this box if you want to add this attributes to all product templates' => 'Comprueba este cuadro si deseas añadir este atributo a todas las plantillas de producto', + 'Check this box if you want to add this features to all product templates' => 'Comprueba este cuadro si deseas añadir esta característica a todas las plantillas de producto', + 'Choose a configuration' => 'Elige una configuración', + 'Choose a country' => 'Eligir un país', + 'City' => 'Ciudad', + 'Classic modules' => 'Módulos clásicos', + 'Click to view' => 'Haga clic para ver', + 'Click to view details.' => 'Haga clic para ver detalles.', + 'Clone' => 'Clonar', + 'Clone product' => 'Clonar producto', + 'Close' => 'Cerrar', + 'Close administation session' => 'Cerrar la sesión de administración', + 'Code' => 'Código', + 'Code:' => 'Código:', + 'Combinable with other promotions' => 'Acumulable con otras promociones', + 'Combination EAN Code' => 'Combinación de código EAN', + 'Combination builder' => 'Constructor de combinación', + 'Combination reference' => 'Referencia de combinación', + 'Company' => 'Empresa', + 'Condition category :' => 'Categoría de condición:', + 'Condition description' => 'Descripción de la condición', + 'Configuration' => 'Configuración', + 'Configuration mailing system' => 'Sistema de configuración de correo electrónico', + 'Configure' => 'Configurar', + 'Configure this module' => 'Configurar este módulo', + 'Confirm' => 'Confirmar', + 'Confirm changes' => 'Confirmar cambios', + 'Confirmation' => 'Confirmación', + 'Congratulations, your password was successfully changed. You can now login.' => 'Felicidades, tu contraseña fue actualizada. Ahora puedes iniciar sesión.', + 'Content' => 'Contenido', + 'Content title' => 'Título del contenido', + 'Contents in %fold' => 'Contenido en %fold', + 'Copy all missing translations.' => 'Copiar todas las traducciones que faltan.', + 'Copy all translations.' => 'Copiar todas las traducciones.', + 'Copy source text in input field' => 'Copiar texto de origen en el campo de entrada', + 'Countries' => 'Países', + 'Countries assigned to this zone' => 'Países asignados a esta zona', + 'Countries/states configuration' => 'Configuración de países/estados', + 'Countries/states deleted of this configuration' => 'Países/estados borrados de esta configuración', + 'Countries/states that will use this configuration' => 'Países/estados que usarán esta configuración', + 'Country' => 'País', + 'Coupon' => 'Cupón', + 'Coupon code' => 'Código de cupón', + 'Coupon code * :' => 'Código de cupón *:', + 'Coupon conditions' => 'Condiciones del cupón', + 'Coupon type * :' => 'Tipo de cupón *:', + 'Coupons' => 'Cupones', + 'Create' => 'Crear', + 'Create a customer address' => 'Crear una dirección de cliente', + 'Create a new API access' => 'Crear un nuevo acceso a este API', + 'Create a new Hook' => 'Crear un nuevo Hook', + 'Create a new administrator' => 'Crear un nuevo administrador', + 'Create a new attribute' => 'Crear un nuevo atributo', + 'Create a new attribute value' => 'Crear un nuevo valor de atributo', + 'Create a new brand' => 'Crear una nueva marca', + 'Create a new category' => 'Crear una nueva categoría', + 'Create a new combination' => 'Crear una nueva combinación', + 'Create a new content' => 'Crear un nuevo contenido', + 'Create a new country' => 'Crear un nuevo país', + 'Create a new coupon' => 'Crear un nuevo cupón', + 'Create a new currency' => 'Crear una nueva moneda', + 'Create a new customer' => 'Crear un nuevo cliente', + 'Create a new feature' => 'Crear una nueva característica', + 'Create a new feature value' => 'Crear un nuevo valor de la característica', + 'Create a new folder' => 'Crear una nueva carpeta', + 'Create a new language' => 'Crear un nuevo lenguaje', + 'Create a new mailing template' => 'Crear una nueva plantilla de correo electrónico', + 'Create a new product' => 'Crear un nuevo producto', + 'Create a new product template' => 'Crear una nueva plantilla de producto', + 'Create a new profile' => 'Crear un nuevo perfil', + 'Create a new sale' => 'Crear una nueva venta', + 'Create a new shipping zone' => 'Crear una nueva zona de envío', + 'Create a new state' => 'Crear un nuevo estado', + 'Create a new tax' => 'Crear un nuevo impuesto', + 'Create a new tax rule' => 'Crear una nueva regla de impuesto', + 'Create a new variable' => 'Crear una nueva variable', + 'Create combinations' => 'Crear combinaciones', + 'Create coupon' => 'Crear cupón', + 'Create this address' => 'Crear esta dirección', + 'Create this attribute' => 'Crear este atributo', + 'Create this brand' => 'Crear esta marca', + 'Create this category' => 'Crear esta categoría', + 'Create this combination' => 'Crear esta combinación', + 'Create this content' => 'Crear este contenido', + 'Create this country' => 'Crear este país', + 'Create this currency' => 'Crear esta moneda', + 'Create this customer' => 'Crear este cliente', + 'Create this feature' => 'Crear esta característica', + 'Create this folder' => 'Crear esta carpeta', + 'Create this hook' => 'Crear Hook', + 'Create this hooks' => 'Crear estos Hooks', + 'Create this language' => 'Crear este idioma', + 'Create this mailing template' => 'Crear esta plantilla de correo electrónico', + 'Create this product' => 'Crear este producto', + 'Create this product template' => 'Crear esta plantilla de producto', + 'Create this sale' => 'Crear esta venta', + 'Create this shipping zone' => 'Crear esta zona de envío', + 'Create this state' => 'Crear este estado', + 'Create this value' => 'Crear este valor', + 'Create this variable' => 'Crear esta variable', + 'Currencies' => 'Monedas', + 'Currency name' => 'Nombre de la moneda', + 'Currency rate' => 'Tasa de cambio', + 'Currency symbol' => 'Símbolo de la moneda', + 'Current product template' => 'Plantilla actual del producto', + 'Current quantity' => 'Cantidad actual', + 'Customer' => 'Cliente', + 'Customer information' => 'Datos del cliente', + 'Customer informations' => 'Datos del cliente', + 'Customer is' => 'El cliente es', + 'Customers' => 'Clientes', + 'Customers list' => 'Listado de clientes', + 'Cutomer Name' => 'Nombre del cliente', + 'Date & Hour' => 'Fecha y hora', + 'Date of last order' => 'Fecha del último pedido', + 'Days before expiration' => 'Días antes del vencimiento', + 'Deactivate %title module' => 'Desactivar el módulo %title', + 'Deactivate hook' => 'Desactivar el Hook', + 'Deactivate this hooks' => 'Desactivar este Hook', + 'Decimal places' => 'Cantidad de decimales', + 'Default' => 'Por defecto', + 'Default address' => 'Dirección por defecto', + 'Define here this product\'s accessories' => 'Define aquí los accesorios de este producto', + 'Delete' => 'Borrar', + 'Delete a combination' => 'Eliminar una combinación', + 'Delete a module' => 'Eliminar un módulo', + 'Delete a variable' => 'Eliminar una variable', + 'Delete address' => 'Eliminar dirección', + 'Delete administrator' => 'Eliminar administrador', + 'Delete also module data' => 'Eliminar también los datos del módulo', + 'Delete an order' => 'Eliminar un pedido', + 'Delete api access' => 'Borrar acceso a API', + 'Delete attribute' => 'Eleminar atributo', + 'Delete attribute value' => 'Eliminar el valor del atributo', + 'Delete brand' => 'Borrar marca', + 'Delete category' => 'Eliminar categoría', + 'Delete content' => 'Eliminar contenido', + 'Delete country' => 'Eliminar país', + 'Delete coupon' => 'Borrar cupón', + 'Delete currency' => 'Eliminar moneda', + 'Delete customer' => 'Eliminar cliente', + 'Delete feature' => 'Eliminar característica', + 'Delete feature value' => 'Eliminar valor de característica', + 'Delete folder' => 'Eliminar carpeta', + 'Delete hook' => 'Eliminar el hook', + 'Delete language' => 'Eliminar idioma', + 'Delete mailing template' => 'Eliminar plantilla de correo electrónico', + 'Delete product' => 'Eliminar producto', + 'Delete profile' => 'Eliminar perfil', + 'Delete sale' => 'Borrar venta', + 'Delete selected countries' => 'Eliminar países seleccionados', + 'Delete shipping zone' => 'Eliminar zona de envío', + 'Delete state' => 'Borrar estado', + 'Delete tax' => 'Eliminar impuesto', + 'Delete tax rule' => 'Eliminar regla de impuesto', + 'Delete template' => 'Eliminar plantilla', + 'Delete this accessory' => 'Eliminar este accesorio', + 'Delete this administrator' => 'Eliminar este administrador', + 'Delete this api access' => 'Borrar este acceso a API', + 'Delete this attribute' => 'Eliminar este atributo', + 'Delete this brand' => 'Eliminar esta marca', + 'Delete this category and all its contents' => 'Eliminar esta categoría y todo su contenido', + 'Delete this combination' => 'Eliminar esta combinación', + 'Delete this condition' => 'Eliminar esta condición', + 'Delete this content' => 'Eliminar este contenido', + 'Delete this country' => 'Eliminar este país', + 'Delete this coupon' => 'Eliminar este cupón', + 'Delete this currency' => 'Eliminar esta moneda', + 'Delete this customer address' => 'Eliminar esta dirección de cliente', + 'Delete this customer and all his orders' => 'Eliminar este cliente y todos sus pedidos', + 'Delete this feature' => 'Eliminar esta característica', + 'Delete this folder' => 'Eliminar esta carpeta', + 'Delete this folder and all its contents' => 'Eliminar esta carpeta y todo su contenido', + 'Delete this hook' => 'Eliminar este hook', + 'Delete this language' => 'Eliminar este idioma', + 'Delete this mailing template' => 'Eliminar esta plantilla de correo electrónico', + 'Delete this module' => 'Eliminar este módulo', + 'Delete this product' => 'Eliminar este producto', + 'Delete this product attribute' => 'Eliminar este atributo del producto', + 'Delete this product feature' => 'Eliminar esta catacterística de producto', + 'Delete this product template' => 'Eliminar esta plantilla de producto', + 'Delete this profile' => 'Eliminar este perfil', + 'Delete this sale' => 'Eliminar esta venta', + 'Delete this shipping zone' => 'Eliminar esta zona de envío', + 'Delete this state' => 'Borrar este estado', + 'Delete this tax' => 'Eliminar este impuesto', + 'Delete this tax rule' => 'Eliminar esta regla de impuesto', + 'Delete this value' => 'Eliminar este valor', + 'Delete this variable' => 'Eliminar esta variable', + 'Delete this zone' => 'Eliminar esta zona', + 'Delivery' => 'Envío', + 'Delivery address' => 'Dirección de entrega', + 'Delivery module' => 'Módulo de entrega', + 'Delivery modules' => 'Módulos de entrega', + 'Description' => 'Descripción', + 'Destinations' => 'Destinos', + 'Developer mode' => 'Modo desarrollador', + 'Disabled' => 'Desactivado', + 'Discount' => 'Descuento', + 'Discount amount' => 'Importe del descuento', + 'Discount percentage' => 'Porcentaje de descuento', + 'Discover all our modules on Thelia Modules !' => 'Descubra todos nuestros módulos sobre Thelia Modules !', + 'Do not use a product template' => 'No utilizar una plantilla de producto', + 'Do this export' => 'Hacer esta exportación', + 'Do this import' => 'Hacer esta importación', + 'Do you really want to add this attribute to all product templates ?' => '¿Quieres añadir este atributo a todas las plantillas de producto?', + 'Do you really want to add this feature to all product templates ?' => '¿Quieres añadir esta característica a todas las plantillas de producto?', + 'Do you really want to cancel this order ?' => '¿Quieres cancelar este pedido?', + 'Do you really want to delete this address ?' => '¿Quieres eliminar esta dirección?', + 'Do you really want to delete this administrator ?' => '¿Quieres eliminar este administrador?', + 'Do you really want to delete this api access ?' => '¿Realmente desea eliminar este acceso a la API?', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => '¿Quieres eliminar este atributo? Se quitara de todas las plantillas del producto.', + 'Do you really want to delete this attribute value ?' => '¿Quieres eliminar este valor de atributo?', + 'Do you really want to delete this brand ?' => '¿Realmente desea eliminar esta marca?', + 'Do you really want to delete this category and all its content ?' => '¿Quieres eliminar esta categoría y todo su contenido?', + 'Do you really want to delete this combination ?' => '¿Quieres eliminar esta combinación?', + 'Do you really want to delete this condition ?' => '¿Quieres eliminar esta combinación ?', + 'Do you really want to delete this content ?' => '¿Quieres eliminar este contenido?', + 'Do you really want to delete this country ?' => '¿Quieres eliminar este país?', + 'Do you really want to delete this coupon ?' => '¿Quieres eliminar este cupón?', + 'Do you really want to delete this currency ?' => '¿Quieres eliminar esta moneda?', + 'Do you really want to delete this customer ?' => '¿Quieres eliminar a este cliente?', + 'Do you really want to delete this document ?' => '¿Estás seguro de que quieres eliminar este documento?', + 'Do you really want to delete this element ?' => '¿Quieres eliminar este elemento?', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => '¿Quieres eliminar esta característica? Se quitará de todas las plantillas del producto.', + 'Do you really want to delete this feature value ?' => '¿Quieres eliminar este valor de característica?', + 'Do you really want to delete this folder and all its content ?' => '¿Quieres eliminar esta carpeta y todo su contenido?', + 'Do you really want to delete this hook ?' => '¿Quieres eliminar este hook ?', + 'Do you really want to delete this image ?' => '¿En serio quieres borrar esta imagen?', + 'Do you really want to delete this language ?' => '¿Quieres eliminar este idioma?', + 'Do you really want to delete this mailing template ?' => '¿Quieres eliminar esta plantilla de correo electrónico?', + 'Do you really want to delete this module ?' => '¿Quieres eliminar este módulo?', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => '¿Quieres eliminar este producto y sus archivos?', + 'Do you really want to delete this profile ?' => '¿Quieres eliminar este perfil?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => '¿Realmente desea eliminar esta venta? Todos los productos relacionados ya no estarán a la venta', + 'Do you really want to delete this shipping zone ?' => '¿Realmente desea eliminar esta zona de envío?', + 'Do you really want to delete this state ?' => '¿Realmente deseas borrar este estado?', + 'Do you really want to delete this tax ?' => '¿Quieres eliminar este impuesto?', + 'Do you really want to delete this tax rule ?' => '¿Quieres eliminar esta regla de impuesto?', + 'Do you really want to delete this template ? It will be removed from all products.' => '¿Quieres eliminar esta plantilla? Se quitará de todos los productos.', + 'Do you really want to delete this variable ?' => '¿Quieres eliminar esta variable?', + 'Do you really want to remove the content from this folder ?' => '¿Quieres eliminar el contenido de esta carpeta?', + 'Do you really want to remove the product from this category ?' => '¿Quieres quitar el producto de esta categoría?', + 'Do you really want to remove this accessory from the product ?' => '¿Quieres eliminar este accesorio del producto?', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => '¿Quieres eliminar este atributo de todas las plantillas de producto? Perderás todas las relaciones de este atributo con todos los productos.', + 'Do you really want to remove this attribute from the template ?' => '¿Quieres quitar este atributo de la plantilla?', + 'Do you really want to remove this country from this shipping zone ?' => '¿Realmente desea eliminar este país de esta zona de envío?', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => '¿Quieres eliminar esta característica de todas las plantillas de producto? Perderás todas las relaciones de esta característica de todos los productos relacionados.', + 'Do you really want to remove this feature from the template ?' => '¿Quieres eliminar esta característica de la plantilla?', + 'Do you really want to remove this module from this hook ?' => '¿Realmente desea eliminar este módulo de hook?', + 'Do you really want to remove this related content ?' => '¿Quieres eliminar este contenido relacionado?', + 'Do you really want to remove this related content from the product ?' => '¿Quieres eliminar este contenido relacionado con el producto?', + 'Do you really want to remove this zone ?' => '¿Quieres eliminar esta zona?', + 'Do you really want to set this coupon available to everyone ?' => '¿Quieres activar este cupón para todo el mundo?', + 'Do you really want to use this address by default ?' => '¿Quieres utilizar esta dirección por defecto?', + 'Document informations' => 'Informaciones del documento', + 'Documents' => 'Documentos', + 'Download invoice as PDF' => 'Descargar factura en formato PDF', + 'Download purchase order as PDF' => 'Descargar pedidos de compra en formato PDF', + 'Drop files to upload' => 'Soltar archivos para cargar', + 'Drop tax here to create a tax group' => 'Soltar impuesto aquí para crear un grupo de impuesto', + 'Drop tax here to delete from group' => 'Soltar impuesto aquí para eliminar del grupo', + 'E-mail' => 'E-Mail', + 'E-mail template you want to translate' => 'Plantilla de correo electrónico que desea traducir', + 'E-mail templates' => 'Plantillas de correo electrónico', + 'EAN Code' => 'Código EAN', + 'Each group of taxes are applied from top to bottom.' => 'Cada grupo de impuestos son aplicados de arriba hacia abajo.', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotasa es un impuesto que añade un importe definido (a través de una característica de producto) al precio del producto.', + 'Edit' => 'Editar', + 'Edit Prices' => 'Editar precio', + 'Edit a country' => 'Editar un país', + 'Edit a currency' => 'Editar una moneda', + 'Edit a customer' => 'Editar un cliente', + 'Edit a customer address' => 'Editar una dirección de cliente', + 'Edit a document' => 'Editar un documento', + 'Edit a feature' => 'Editar una característica', + 'Edit a hook' => 'Editar un hook', + 'Edit a language' => 'Editar un idioma', + 'Edit a mailing template' => 'Editar una plantilla de correo electrónico', + 'Edit a module' => 'Editar un módulo', + 'Edit a module hook' => 'Editar un hook del módulo', + 'Edit a profile' => 'Editar un perfil', + 'Edit a shipping configuration' => 'Editar una configuración de envío', + 'Edit a shipping zone' => 'Editar una zona de envío', + 'Edit a state' => 'Edita un estado', + 'Edit a system variable' => 'Editar una variable de sistema', + 'Edit a tax' => 'Editar un impuesto', + 'Edit a tax rule' => 'Editar una regla de impuesto', + 'Edit a template' => 'Editar una plantilla', + 'Edit an attribute' => 'Editar un atributo', + 'Edit an image' => 'Editar una imagen', + 'Edit an order' => 'Editar un pedido', + 'Edit api access' => 'Editar acceso a la API', + 'Edit attribute "%name"' => 'Editar atributo "%name"', + 'Edit brand' => 'Editar Marca', + 'Edit brand %title' => 'Editar marca %title', + 'Edit category' => 'Editar categoría', + 'Edit category %title' => 'Editar categoría %title', + 'Edit content' => 'Editar contenido', + 'Edit content %title' => 'Editar contenido %title', + 'Edit country "%name"' => 'Editar países "%name"', + 'Edit currency "%name"' => 'Editar moneda "%name"', + 'Edit customer %firstname %lastname' => 'Editar cliente %firstname %lastname', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Editar cliente %firstname %lastname (Ref: ref %)', + 'Edit delivery address' => 'Editar la dirección de entrega', + 'Edit document "%name"' => 'Editar el documento "%name"', + 'Edit feature "%name"' => 'Editar función "%name"', + 'Edit folder' => 'Editar carpeta', + 'Edit folder %title' => 'Editar carpeta %title', + 'Edit hook "%name"' => 'Editar hook "%name"', + 'Edit image "%name"' => 'Editar imagen "%name"', + 'Edit information in %lng' => 'Editar información en %lng', + 'Edit invoice address' => 'Editar dirección de facturación', + 'Edit mailing template "%name"' => 'Editando plantilla de correo electrónico "%name"', + 'Edit next brand' => 'Edita la marca siguiente', + 'Edit next category' => 'Editar la siguiente categoría', + 'Edit next content' => 'Editar contenido siguiente', + 'Edit next customer' => 'Edita el cliente siguiente', + 'Edit next folder' => 'Editar carpeta siguiente', + 'Edit next order' => 'Edita el pedido siguiente', + 'Edit next product' => 'Editar producto de la siguiente', + 'Edit order address' => 'Editar la dirección de pedido', + 'Edit previous brand' => 'Edita la marca anterior', + 'Edit previous category' => 'Editar la categoría anterior', + 'Edit previous content' => 'Editar contenido anterior', + 'Edit previous customer' => 'Edita el cliente anterior', + 'Edit previous folder' => 'Editar carpeta anterior', + 'Edit previous order' => 'Edita el pedido anterior', + 'Edit previous product' => 'Editar producto anterior', + 'Edit prices in %curr' => 'Editar precios en %curr', + 'Edit product' => 'Editar productos', + 'Edit product %title' => 'Editar producto %title', + 'Edit state "%name"' => 'Edita el estado "%name"', + 'Edit template "%name"' => 'Editar plantilla "%name"', + 'Edit this address' => 'Editar esta dirección', + 'Edit this brand' => 'Editar esta marca', + 'Edit this category' => 'Editar esta categoría', + 'Edit this content' => 'Editar este contenido', + 'Edit this customer' => 'Editar este cliente', + 'Edit this delivery zone' => 'Editar esta zona de entrega', + 'Edit this folder' => 'Editar esta carpeta', + 'Edit this module' => 'Editar este módulo', + 'Edit this order' => 'Editar este pedido', + 'Edit this product' => 'Editar este producto', + 'Edit variable %name' => 'Editar la variable %name', + 'Editing %cat' => 'Editando %cat', + 'Editing %fold' => 'Edición %fold', + 'Editing %title' => 'Editando %title', + 'Editing attribute "%name"' => 'Editando atributo "%name"', + 'Editing brand "%title"' => 'Edición de marca "%title"', + 'Editing country "%name"' => 'Editando país "%name"', + 'Editing coupon "%title"' => 'Edición de cupón "%title"', + 'Editing currency "%name"' => 'Editando moneda "%name"', + 'Editing document "%name"' => 'Edición documento "%name"', + 'Editing feature "%name"' => 'Editando característica "%name"', + 'Editing hook "%name"' => 'Edición de Hook "%name"', + 'Editing hook for module "%name"' => 'Edición de Hook para el módulo "%name"', + 'Editing image "%name"' => 'Edición de imagen "%name"', + 'Editing mailing template "%name"' => 'Editando plantilla de correo electrónico "%name"', + 'Editing module' => 'Edición de módulo', + 'Editing profile' => 'Edición de perfil', + 'Editing profile \'%name\'' => 'Editar perfil \'%name\'', + 'Editing shipping configuration for module "%name"' => 'Editar configuración de envío para el módulo "%name"', + 'Editing shipping zone "%name"' => 'Editando zona de envío "%name"', + 'Editing state "%name"' => 'Editando el estado "%name"', + 'Editing tax' => 'Editando impuestos', + 'Editing tax rule' => 'Editando regla de impuesto', + 'Editing template "%name"' => 'Editar plantilla "%name"', + 'Editing variable "%name"' => 'Editando variable "%name"', + 'Email' => 'Correo electrónico', + 'Email address' => 'Dirección de correo electrónico', + 'Email addresses' => 'Direcciones de correo electrónico', + 'Email confirmation address' => 'Dirección de confirmación de correo electrónico', + 'Enable remote SMTP use : ' => 'Activar el uso de SMTP remoto: ', + 'Enable/Disable' => 'Activar/Desactivar', + 'Enabled' => 'Activado', + 'Encryption' => 'Cifrado', + 'Encryption :' => 'Cifrado:', + 'End Date' => 'Fecha fin', + 'Enter here all possible attribute values.' => 'Introduce aquí todos los valores de atributo posible.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Introduce aquí todos los valores posibles de la característica. Para obtener un texto libre en el formulario de producto, no añadas ningún valor.', + 'Enter here the attribute name in the default language (%language_name)' => 'Escribe aquí el nombre de atributo en el idioma predeterminado (%language_name)', + 'Enter here the category name in the default language (%title)' => 'Introduce aquí el nombre de categoría en el idioma por defecto (%title)', + 'Enter here the content name in the default language (%title)' => 'Introduce aquí el nombre de contenido en el idioma por defecto (%title)', + 'Enter here the currency name in the default language (%title)' => 'Introduce aquí el nombre de categoría en el idioma por defecto (%title)', + 'Enter here the feature name in the default language (%title)' => 'Introduce aquí el nombre de carpeta en el idioma por defecto (%title)', + 'Enter here the feature value as free text' => 'Introduce aquí el valor de la característica', + 'Enter here the folder name in the default language (%title)' => 'Introduce aquí el nombre de carpeta en el idioma por defecto (%title)', + 'Enter here the product name in the default language (%title)' => 'Introduce aquí el nombre de producto en el idioma por defecto (%title)', + 'Enter here the product price in %title' => 'Ingrese aquí el precio del producto en %title', + 'Enter here the product reference' => 'Introduce aquí la referencia de producto', + 'Enter here the product stock' => 'Introduzca aquí el stock del roducto', + 'Enter here the product tax price in %title' => 'Ingrese aquí el precio de impuestos de producto en %title', + 'Enter here the product weight, in Kilogrammes' => 'Introduce aquí el peso del producto, en kilogramos', + 'Enter here the template name in the default language (%title)' => 'Introduce aquí el nombre de carpeta en el idioma por defecto (%title)', + 'Enter here the value in the current edit language (%language_name)' => 'Introduzca aquí el valor en el lenguaje actual de la edición (%language_name)', + 'Enter here the value in the current edit language (%title)' => 'Introduzca aquí el valor en el lenguaje actual de la edición (%title)', + 'Enter here the value in the default language (%title)' => 'Introduzca aquí el valor en el idioma predeterminado (%title)', + 'Enter information in the default language (%title)' => 'Introducir información en el idioma por defecto (%title)', + 'Enter new accessory position' => 'Introduzca la posición accesorio nuevo', + 'Enter new attribute position' => 'Introduce la nueva posición de atributo', + 'Enter new brand position' => 'Introduzca la nueva posición de la marca', + 'Enter new category position' => 'Introduce la nueva posición de categoría', + 'Enter new content position' => 'Introduce la nueva posición del contenido', + 'Enter new currency position' => 'Introduce la nueva posición de la moneda', + 'Enter new export category position' => 'Introduzca la nueva posición de categoría de exportación', + 'Enter new export position' => 'Introduzca la nueva posición de exportación', + 'Enter new feature position' => 'Introduce la nueva posición de la característica', + 'Enter new folder position' => 'Introduce la nueva posición de la carpeta', + 'Enter new import category position' => 'Introduzca la nueva posición de categoría de importación', + 'Enter new import position' => 'Introduzca la nueva posición de importación', + 'Enter new module hook position' => 'Entrar en nuevo módulo hook', + 'Enter new module position' => 'Introduzca la nueva posición de módulo', + 'Enter new product position' => 'Introduce la nueva posición del producto', + 'Enter new value position' => 'Introduce la nueva posición del valor', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'Ingrese una o más direcciones IP V4 separados por ";". Deje en blanco para mostrar los registros de todas las direcciones IP', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'Introduzca uno o más nombres de archivo sin ruta de acceso separada por ";". Uso "!" antes de un nombre de archivo para excluirlo. Uso "*" para activar los registros de todos los archivos.', + 'Enter quantity' => 'Introduzca la cantidad', + 'Error' => 'Error', + 'Errors' => 'Errores', + 'Example :' => 'Ejemplo:', + 'Exchange rate' => 'Tipo de cambio', + 'Existing combinations will be deleted. Do you want to continue ?' => 'Se eliminarán las combinaciones existentes. ¿Quieres continuar?', + 'Expiration date' => 'Fecha de caducidad', + 'Expiration date * :' => 'Fecha de caducidad * :', + 'Expired' => 'Caducado', + 'Export' => 'Exportar', + 'Exports' => 'Exportaciones', + 'Failed to get converted prices. Please try again.' => 'Error al obtener precios convertidos. Por favor inténtalo de nuevo.', + 'Failed to get prices. Please try again.' => 'Error al obtener los precios. Por favor inténtalo de nuevo.', + 'Feature Name' => 'Nombre de la característica', + 'Feature information' => 'Información sobre la característica', + 'Feature title' => 'Título de la característica', + 'Feature value' => 'Valor de la catacterística', + 'Feature value for this product' => 'Valor de la característica para este producto', + 'Feature values' => 'Valores de la característica', + 'Features' => 'Características', + 'File' => 'Fichero', + 'File names' => 'Nombre archivo', + 'Filename' => 'Nombre archivo', + 'Filter' => 'Filtro', + 'Filter by hook name:' => 'Filtrar por nombre de hook:', + 'First Name' => 'Nombre', + 'First name' => 'Nombre', + 'Firstname' => 'Nombre', + 'Flush the Thelia internal cache' => 'Vaciar la caché interna Thelia', + 'Flush the assets cache directory' => 'Flush el directorio de caché de activos', + 'Flush the images and documents cache' => 'Vaciar la caché de imágenes y documentos', + 'Folder' => 'Carpeta', + 'Folder created on %date_create. Last modification: %date_change' => 'Carpeta creada en %date_create. Última modificación: %date_change', + 'Folder title' => 'Título de la carpeta', + 'Folders' => 'Carpetas', + 'Folders in %fold' => 'Carpetas en %fold', + 'For prices in %currency' => 'Precios en %currency', + 'Forgot your password ?' => '¿Olvidaste tu contraseña?', + 'Format: %fmt' => 'Formato: %fmt ', + 'Format: %fmt, e.g. %date' => 'Formato: %fmt, %date p. ej.', + 'Free shipping for methods :' => 'Envío gratuito para los métodos:', + 'Free shipping to countries :' => 'Envío gratis a los países:', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'IVA francés al 19,6% es un impuesto que añade un 19,6% de impuesto al precio del producto.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'El IVA francés 19,6% con ecotasa es la aplicación de la ecotasa (sobre el precio del producto) y luego la aplicación del impuesto 19,6% (sobre el precio del producto + el importe de la ecotasa).', + 'From' => 'De', + 'From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below.' => 'A partir de Thelia 2.3, tienes que agregar una dirección de correo a tu perfil de administrador. Por favor ingrésala a continuación.', + 'Front Office' => 'Front Office', + 'Front-office template you want to translate' => 'Plantilla de frontend-office que desea traducir', + 'Front-office templates' => 'Plantillas de front-office', + 'General' => 'General', + 'General configuration' => 'Configuración general', + 'General description' => 'Descripción general', + 'General tools' => 'Herramientas generales', + 'Generate new password' => 'Generar nueva contraseña', + 'Get more information about this module' => 'Obtener más información sobre este módulo', + 'Go to administration home' => 'Ir a la página de inicio de la administración', + 'Go to first page' => 'Ir a primera página', + 'Go to last page' => 'Ir a última página', + 'Go to next page' => 'Ir a página siguiente', + 'Go to previous page' => 'Ir a página anterior', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'Versión HTML de este mensaje', + 'Here, just drag and drog the available taxes in groups.' => 'Aquí, solamente arrastra y suelta los impuestos disponibles en grupos.', + 'Hide empty hook' => 'Ocultar el hook vacío', + 'Home' => 'Página de inicio', + 'Hook positions' => 'Posiciones de hook', + 'Hooks' => 'Hooks', + 'Host' => 'Hostname', + 'Host :' => 'Hostname:', + 'ID' => 'ID', + 'IP Addresses' => 'Direcciones IP', + 'ISO 4217 Code' => 'Código ISO 4217', + 'ISO 4217 code' => 'Código ISO 4217', + 'ISO 639 Code' => 'Código ISO 639', + 'ISO Code' => 'Código ISO', + 'If a translation is missing or incomplete :' => 'Si falta una traducción o esta incompleta:', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'En caso afirmativo, redirecciones a través de Redirect::exec() se mostrará como enlaces', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'Si cambias la plantilla, se restablecerán todos los precios y tienes que configurar otra vez.', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'Si quieres traducir componentes de Thelia: core, install, módulos por defecto o plantillas.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'Si su objetivo es sólo traducir el texto para su sitio web, utilice el modo de usuario.
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Parece que esta cadena contiene una variable de Smarty ($). Si es el caso, no se puede traducir correctamente.', + 'Image information' => 'Información de la imagen', + 'Image+file+not+found' => 'Imagen+archivo+no+encontrado', + 'Images' => 'Imágenes', + 'Import' => 'importar', + 'Import this file' => 'Importar este archivo', + 'Imports' => 'Importaciones', + 'Impossible to change active flag. Please contact your administrator or try later' => 'Imposible cambiar indicador activo. Por favor, contacte con su administrador o Inténtalo más tarde', + 'Impossible to change default country. Please contact your administrator or try later' => 'Es imposible cambiar el país por defecto. Por favor, contacta con tu administrador o intentalo más tarde', + 'Impossible to change default languages. Please contact your administrator or try later' => 'Es imposible cambiar el país por defecto. Por favor, contacta con tu administrador o intentalo más tarde', + 'Impossible to change official hook. Please contact your administrator or try later' => 'Imposible cambiar hook oficial. Por favor, contacte con su administrador o Inténtalo más tarde', + 'In a group, each taxes are applied independently on the incomming price (the price without tax for the first group).' => 'En un grupo, los impuestos son aplicados independientemente en el precio de entrada (el precio sin impuesto para el primer grupo).', + 'In order to manges your shop taxes you can manage' => 'Para poder gestionar los impuestos de tu tienda puedes gestionar', + 'In page' => 'En la página', + 'In pages:' => 'En las páginas:', + 'Inactive' => 'Inactivo', + 'Included countries' => 'Países incluidos', + 'Information on this hook' => 'Información sobre este hook', + 'Install !' => 'Instalar !', + 'Install or update a module' => 'Instalar o actualizar un módulo', + 'Invoice' => 'Factura', + 'Invoice and Delivery' => 'Factura y Entrega', + 'Invoice date' => 'Fecha factura', + 'Invoice informations' => 'Datos de factura', + 'Invoice reference' => 'Referencia de factura', + 'It\'s strongly recommended to use our translation platform' => 'Se recomienda usar nuestra plataforma de traducción', + 'Items to translate' => 'Artículos para traducir', + 'Keep attention that in translating you can override the resource translations.
    ' => 'Mantener atención que en la traducción se pueden reemplazar las traducciones de recurso.
    ', + 'Kg' => 'Kg', + 'Label' => 'Etiqueta', + 'Language name' => 'Nombre del idioma', + 'Language title' => 'Título del idioma', + 'Languages' => 'Idiomas', + 'Languages & URLs' => 'Idiomas & URLs', + 'Languages management' => 'Gestión de idiomas', + 'Last Name' => 'Apellidos', + 'Last name' => 'Apellido', + 'Last order amount' => 'El importe del último pedido', + 'Lastname' => 'Apellido', + 'Leave empty to keep current password' => 'Déjalo en blanco para mantener la contraseña actual', + 'Locale' => 'Configuración regional', + 'Log lines format' => 'Formato de registro de líneas', + 'Log lines header format. You may use the following variables: ' => 'Líneas de registro de formato de encabezado. Puede utilizar las siguientes variables: ', + 'Login' => '¡Iniciar sesión!', + 'Logout' => 'Cerrar sesión', + 'Long description :' => 'Descripción larga:', + 'Mailing system' => 'Sistema de correo electrónico', + 'Mailing templates' => 'Plantillas de correo electrónico', + 'Manage attributes included in this product template' => 'Administrar atributos incluidos en esta plantilla de producto', + 'Manage features included in this product template' => 'Administrar características de esta plantilla de producto', + 'Manage hooks' => 'Configurar los hooks', + 'Manage its hooks' => 'Administre archivos adjuntos de módulo', + 'Manage module rights' => 'Gestionar los permisos de módulo', + 'Manage modules' => 'Administrar módulos', + 'Manage modules attachements' => 'Administrar archivos adjuntos de módulos', + 'Manage resource rights' => 'Gestionar los permisos de recursos', + 'Manage taxes' => 'Gestionar impuestos', + 'Manage the tax rule taxes appliance order' => 'Gestionar las reglas de impuesto y el orden de ejecución de las mismas', + 'Maximum usage count :' => 'Número de usos restantes:', + 'Message created on %date_create. Last modification: %date_change' => 'Mensaje creado en %date_create. Última modificación: %date_change', + 'Message data' => 'Datos del mensaje', + 'Message level' => 'Nivel de mensaje', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'Mensajes que tienen un nivel mayor o igual que el nivel seleccionado se añadirá a los destinos de registro. ', + 'Minimum required Thelia version' => 'Requiere como mínimo la versión Thelia', + 'Module' => 'Módulo', + 'Module %mod: %error' => 'Módulo %mod: %error', + 'Module access rights' => 'Permisos de acceso del módulo', + 'Module code' => 'Código de módulo', + 'Module component' => 'Componente de módulo', + 'Module created on %date_create. Last modification: %date_change' => 'Módulo creado en %date_create. Última modificación: %date_change', + 'Module detailed information' => 'Módulo de información detallada', + 'Module file' => 'Archivo del módulo', + 'Module name' => 'Nombre del módulo', + 'Module type' => 'Tipo de módulo', + 'Module you want to translate' => 'Módulo que desea traducir', + 'Modules' => 'Módulos', + 'Modules attachments' => 'Adjuntos del módulo', + 'More information about ISO 4217' => 'Más información sobre ISO 4217', + 'More pages after' => 'Más páginas después', + 'More pages before' => 'Más páginas antes', + 'Name' => 'Nombre', + 'Namespace of main class' => 'Namespace de la clase principal', + 'New' => 'Nuevo', + 'New Configuration' => 'Nueva Configuración', + 'No' => 'No', + 'No Folders found' => 'Ninguna carpeta encontrada', + 'No administration profile defined yet. Click the + button to create one.' => 'Sin perfil de administración definido todavía. Haga clic en el botón + para crear uno.', + 'No area defined with this id' => 'Ninguna zona definida con este id', + 'No attributes.' => 'Sin atributos.', + 'No available content in this folder' => 'No hay contenido disponible en esta carpeta', + 'No available product in this category' => 'Ningún producto disponible en esta categoría', + 'No available value for this attribute' => 'Ningún valor disponible para este atributo', + 'No brand' => 'Ninguna marca', + 'No brand has been created yet. Click the + button to create one.' => 'Ninguna marca ha sido creada todavía. Haga clic en el botón + para crear uno.', + 'No categories found' => 'No se encontraron categorías', + 'No category found for "%term"' => 'No se encontró categoría para "%term"', + 'No config.' => 'No config.', + 'No content found for "%term"' => 'No se encontró contenido para "%term"', + 'No country' => 'No hay país', + 'No country has been created yet. Click the + button to create one.' => 'Ningún país ha sido creado aún. Pulsa (+) para crear uno.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'Actualmente no hay cupones. Utilice el botón de arriba para crear su primer cupón.', + 'No currency has been created yet. Click the + button to create one.' => 'Ninguna moneda ha sido creada todavía. Pulsa (+) para crear una.', + 'No customer found for "%term"' => 'No se encontró cliente para "%term"', + 'No description for this hook' => 'No hay descripción para este hook', + 'No document' => 'No nay documentos', + 'No email defined' => 'No hay un correo definido', + 'No filters' => 'No hay filtros', + 'No folder found for "%term"' => 'No hay carpetas para "%term"', + 'No folders found' => 'Ninguna carpeta encontrada', + 'No hooks has been created yet. Click the + button to create one.' => 'Hooks no ha sido creado todavía. Haga clic en el botón + para crear uno.', + 'No logo image' => 'Ninguna imagen de logotipo', + 'No mailing template has been created yet. Click the + button to create one.' => 'Ninguna plantilla de correo electrónico ha sido creada aún. Pulsa (+) para crear una.', + 'No module of this type was found.' => 'No se encontró ningún módulo de este tipo.', + 'No order found for "%term"' => 'No hay pedidos para "%term"', + 'No orders fo this customer.' => 'No hay pedidos para este cliente.', + 'No product attribute has been created yet. Click the + button to create one.' => 'Ningún atributo de producto ha sido creado aún. Pulsa (+) para crear uno.', + 'No product feature has been created yet. Click the + button to create one.' => 'Ninguna característica de producto ha sido creada aún. Pulsa (+) para crear una.', + 'No product found for "%term"' => 'No hay productos para "%term"', + 'No product template has been created yet. Click the + button to create one.' => 'Ninguna plantilla de producto ha sido creada aún. Pulsa (+) para crear una.', + 'No sale has been created yet. Click the + button to create one.' => 'No hay ninguna venta aún. Click en el botón + para crear una.', + 'No shipping zone attached to this module, click here to attach one' => 'Ninguna zona envío adjunta a este módulo, haga clic aquí para fijar una', + 'No shipping zone defined yet. Click the + button to create one.' => 'Ninguna zona de envío definida todavía. Haga clic en el botón + para crear uno.', + 'No state has been created yet. Click the + button to create one.' => 'No se ha creado algún estado. Cliquea el botón + para crear uno.', + 'No value has been created yet. Click the + button to create one.' => 'Ningún valor ha sido creado aún. Pulsa (+) para crear uno.', + 'None' => 'Ninguno', + 'None defined' => 'Ninguno definido', + 'N° ISO' => 'N° ISO', + 'OK' => 'OK', + 'Official' => 'Oficial', + 'Online' => 'En línea', + 'Oops! An Error Occurred' => '¡Uy! Se ha producido un error', + 'Or' => 'O', + 'Order %ref - ID %id' => 'Orden a %ref - ID %id', + 'Order details' => 'Detalles del pedido', + 'Order n°' => 'N° de pedido', + 'Order status:' => 'Estado del pedido:', + 'Ordered products' => 'Productos pedidos', + 'Orders' => 'Pedidos', + 'Originating file line number ' => 'Número de línea del archivo de origen ', + 'Originating file name' => 'Nombre del archivo de origen', + 'Originating function name ' => 'Origen nombre de la función ', + 'Other addresses' => 'Otras direcciones', + 'PDF template you want to translate' => 'Plantilla PDF que desea traducir', + 'PDF templates' => 'Plantillas PDF', + 'PDF | Invoice' => 'PDF | Factura', + 'PDF | Purchase order' => 'PDF | Orden de compra', + 'Page not found' => 'Página no encontrada', + 'Parameters' => 'Parámetros', + 'Parse template' => 'Analizar la plantilla', + 'Password' => 'Contraseña', + 'Password :' => 'Contraseña:', + 'Password changed' => 'Contraseña cambiada', + 'Payment information' => 'Información de pago', + 'Payment module' => 'Módulo de pago', + 'Payment modules' => 'Módulos de pago', + 'Percent Discount' => 'Descuento porcentaje', + 'Period' => 'Período', + 'Phone' => 'Teléfono', + 'Phone & Fax' => 'Teléfono & Fax', + 'Phone number' => 'Número de teléfono', + 'Please enter the date using the %fmt format' => 'Porfavor indique una fecha en formato %fmt', + 'Please retry' => 'Por favor vuelva a reintentar', + 'Please save this coupon first to define coupon conditions' => 'Por favor, guarde este cupón primero para definir condiciones de cupón', + 'Please select a condition' => 'Por favor, seleccione una condición', + 'Please select a coupon type' => 'Por favor selecciona un tipo de cupón', + 'Please select another condition' => 'Por favor, selecciona otra condición', + 'Please select at least one category.' => 'Por favor, selecciona al menos una categoría.', + 'Please select items to translate' => 'Por favor, selecciona artículos para traducir', + 'Please select one or more categories which contains some products' => 'Por favor, seleccione una o más categorías que contiene algunos productos', + 'Please select the B.O. template to translate' => 'Por favor, selecciona la plantilla de Back Office para traducir', + 'Please select the E-mail template to translate' => 'Por favor, selecciona la plantilla de correo electrónico para traducir', + 'Please select the F.O. template to translate' => 'Por favor, selecciona la plantilla de Front Office para traducir', + 'Please select the PDF template to translate' => 'Por favor, selecciona la plantilla de PDF para traducir', + 'Please select the module component' => 'Por favor, seleccione el componente del módulo', + 'Please select the module to translate' => 'Por favor selecciona el módulo para traducir', + 'Please select your editing mode :' => 'Por favor, seleccione el modo de edición:', + 'Please select...' => 'Seleccionar...', + 'Please wait, loading' => 'Por favor espera, cargando', + 'Please wait, loading products list' => 'Por favor espera, se está cargando la lista de productos', + 'Port' => 'Puerto', + 'Port :' => 'Puerto:', + 'Position' => 'Posición', + 'Postage' => 'Gastos de envío', + 'Postscriptum' => 'Posdata', + 'Preview' => 'Previsualización', + 'Preview HTML' => 'Vista Previa HTML', + 'Preview brand page' => 'Previsualizar la página de marca', + 'Preview category page' => 'Vista previa de la página de categoría', + 'Preview content page' => 'Previsualizar la página de contenido', + 'Preview folder page' => 'Vista previa de la pagina de carpeta', + 'Preview product page' => 'Vista previa de la página de producto', + 'Preview text' => 'Previsualización', + 'Price' => 'Precio', + 'Price (%currency)
    w/ taxes' => 'Precio (%currency)
    con impuestos', + 'Price (%currency)
    w/o taxes' => 'Precio (%currency)
    sin impuestos', + 'Price excl. taxes' => 'Precio impuestos excluidos', + 'Price incl. taxes' => 'Precio IVA incluido', + 'Pricing' => 'Fijación de precios', + 'Product' => 'Producto', + 'Product Attributes' => 'Atributos del producto', + 'Product EAN Code' => 'Código EAN del producto', + 'Product Features' => 'Características del producto', + 'Product accessories' => 'Accesorios del producto', + 'Product attribute selection' => 'Selección de atributos del producto', + 'Product attributes' => 'Atributos del producto', + 'Product catalog configuration' => 'Configuración del catálogo de producto', + 'Product created on %date_create. Last modification: %date_change' => 'Producto creado en %date_create. Última modificación: %date_change', + 'Product features' => 'Características del producto', + 'Product price' => 'Precio del producto', + 'Product price including taxes' => 'Precio del producto con impuestos', + 'Product stock' => 'Stock de producto', + 'Product tax price' => 'Impuestos del producto', + 'Product templates' => 'Plantillas de producto', + 'Product title' => 'Título del producto', + 'Product weight' => 'Peso del producto', + 'Product\'s attributes included in this sale operation' => 'Atributos del producto incluidos en esta operación', + 'Products' => 'Productos', + 'Products are :' => 'Los productos son :', + 'Products in %cat' => 'Productos en %cat', + 'Products selection' => 'Selección de productos', + 'Profil' => 'Perfil', + 'Profile' => 'Perfil', + 'Profile code' => 'Código de perfil', + 'Profile created on %date_create. Last modification: %date_change' => 'Perfil creado el %date_create. Última modificación: %date_change', + 'Profiles' => 'Perfiles', + 'Promotion' => 'Promoción', + 'Provides free shipping' => 'Envío gratuito', + 'Published by OpenStudio' => 'Publicado por OpenStudio', + 'Purpose' => 'Propósito', + 'Put module in hook' => 'Conecta el módulo', + 'Quantity' => 'Cantidad', + 'Quickly create combinations using the combination builder' => 'Crear combinaciones rápidamente mediante el generador de combinación', + 'Rate' => 'Tipo de cambio', + 'Read module documentation' => 'Lee la documentación del producto', + 'Read the documentation of this module' => 'Lee la documentación de este módulo', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'Redefine el texto globalmente. Cada texto será traducido con la traducción proporcionada, excepto si hay una traducción para este recurso.', + 'Redefine the text only for this resource.' => 'Redefine el texto sólo para este recurso.', + 'Reference' => 'Referencia', + 'Registration date' => 'Fecha de registro', + 'Related content' => 'Contenido relacionado', + 'Remove a module from a hook' => 'Remueve el módulo de una conexión', + 'Remove an accessory' => 'Remueve un accesorio', + 'Remove associated folder' => 'Eliminar carpeta asociada', + 'Remove attribute' => 'Remueve el atributo', + 'Remove country' => 'Eliminar país', + 'Remove feature' => 'Eliminar característica', + 'Remove from all product templates' => 'Eliminar de todas las plantillas de producto', + 'Remove from category' => 'Remueve de la categoría', + 'Remove from selected categories' => 'Remueve de las categorías seleccionadas', + 'Remove related content' => 'Eliminar contenido relacionado', + 'Remove selected values' => 'Eliminar valores seleccionados', + 'Remove the product from this category' => 'Eliminar el producto de esta categoría', + 'Remove this attribute from all product templates' => 'Eliminar este atributo de todas las plantillas de producto', + 'Remove this feature from all product templates' => 'Eliminar esta característica de todas las plantillas de producto', + 'Remove zone' => 'Eliminar zona', + 'Request a new password' => 'Solicitar una nueva contraseña', + 'Required modules' => 'Módulos requeridos', + 'Reset' => 'Restablecer', + 'Reset sale status for all products' => 'Restablecer estado de venta para todos los productos', + 'Resource' => 'Recurso', + 'Resource access rights' => 'Accesos permitidos del recurso', + 'Resources' => 'Recursos', + 'Rights' => 'Derechos', + 'SEO' => 'SEO', + 'Sale' => 'Venta', + 'Sale configuration' => 'Configuración de venta', + 'Sale created on %date_create. Last modification: %date_change' => 'Venta creada el %date_create. Última modificación: %date_change', + 'Sale operation description' => 'Descripción de operación de venta', + 'Sale operation features' => 'Características de la operación de venta', + 'Sale price (%currency)
    w/ taxes' => 'Precio de venta (%currency)
    con impuestos', + 'Sale price (%currency)
    w/o taxes' => 'Precio de venta (%currency)
    sin impuestos', + 'Sale price incl. taxes' => 'Precio de venta incluyendo impuestos', + 'Sales management' => 'Administración de ventas', + 'Save' => 'Guardar', + 'Save and close' => 'Guardar y cerrar', + 'Save chages' => 'Guardar cambios', + 'Save changes' => 'Guardar cambios', + 'Save tax rule taxes' => 'Guardar los impuestos de la regla de impuesto', + 'Save this address' => 'Guardar esta dirección', + 'Save this condition' => 'Guardar esta condición', + 'Search' => 'Buscar', + 'Search a module' => 'Buscar un módulo', + 'Search for \'%term\'' => 'Búsqueda de \'%term\'', + 'Search on Thelia Modules' => 'Buscar en Thelia Modules', + 'Secure key' => 'Clave de seguridad', + 'Select' => 'Selecciona', + 'Select a category and click (+) to add it to the additional category list' => 'Selecciona una categoría y cliquea (+) para agregarlo a la lista adicional de categorías', + 'Select a category to get its products' => 'Selecciona una categoría par obtener sus productos', + 'Select a category...' => 'Selecciona una categoría...', + 'Select a configuration' => 'Selecciona una configuración', + 'Select a content and click (+) to add it to this category' => 'Selecciona un contenido y pulsa (+) para añadirlo a esta categoría', + 'Select a content and click (+) to add it to this product' => 'Selecciona un contenido y cliquea (+) para agregarlo a este producto', + 'Select a feature and click (+) to add it to this template' => 'Selecciona una característica y cliquea (+) para agregarlo a esta plantilla', + 'Select a feature...' => 'Selecciona una característica...', + 'Select a folder and click (+) to add it to the additional folder list' => 'Selecciona una carpeta y pulsa (+) para añadirlo a la lista de carpetas adicionales', + 'Select a folder content...' => 'Selecciona una carpeta de contenido...', + 'Select a folder to get its content' => 'Selecciona una carpeta para conseguir su contenido', + 'Select a folder...' => 'Selecciona una carpeta...', + 'Select a product and click (+) to add it as an accessory' => 'Selecciona un producto y cliquea (+) para agregarlo como un accesorio', + 'Select a product...' => 'Selecciona un producto...', + 'Select a tax tule' => 'Selecciona una regla de impuesto', + 'Select a template' => 'Seleccionar una plantilla', + 'Select a value click (+) to add it to the combination' => 'Selecciona un valor y pulsa (+) para añadirlo a la combinación', + 'Select an attribute and click (+) to add it to this template' => 'Selecciona un atributo y cliquea (+) para agregarlo a esta plantilla', + 'Select an attribute and click (+) to view available values' => 'Selecciona un atributo y pulsa (+) para ver los valores disponibles', + 'Select an attribute value...' => 'Selecciona un valor de atributo...', + 'Select an attribute...' => 'Selecciona un atributo...', + 'Select attribute :' => 'Selecciona un atributo :', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'Selecciona los valores de atributo para combinar. Puedes rellenar un valor por defecto para algunos de los campos de las combinaciones generadas.', + 'Select here a template for this product' => 'Seleccione una plantilla para este producto', + 'Select here the tax applicable to this product' => 'Selecciona aquí el impuesto aplicable a este producto', + 'Select offered product :' => 'Selecciona un producto a ofrecer :', + 'Select offrered product category :' => 'Selecciona la categoría del producto a ofrecer :', + 'Select or deselect all products' => 'Alterna la selección de todos los productos', + 'Select product category :' => 'Selecciona la categoría del producto :', + 'Select the attributes values of "%title" that should be included in this sale operation.' => 'Selecciona los valores para los atributos de "%title" que deberían incluirse en esta venta.', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Selecciona los productos incluidos en esta venta. Puedes limitar tu selección a algunos atributos de producto únicamente, si se requiere.', + 'Selected categories' => 'Categorías elegidas', + 'Send' => 'Enviar', + 'Send a mail to this customer' => 'Enviar un mail a este cliente', + 'Send files' => 'Enviar archivos', + 'Sequential number of log line' => 'Número sequencial del registro', + 'Set as default tax rule' => 'Definir como regla de impuesto por defecto', + 'Sets the separator for the decimal point' => 'Coloca el separador para el punto decimal', + 'Sets the thousands separator.' => 'Color el separador para miles.', + 'Shipping configuration' => 'Configuración de envío', + 'Shipping configuration of delivery module "%title"' => 'La configuración de envío del módulo de entrega "%title"', + 'Shipping zone' => 'Zona de envío', + 'Shipping zone "%title"' => 'Zona de envío "%title"', + 'Shipping zones' => 'Zonas de envío', + 'Shipping zones for this country' => 'Zonas de envío para este país', + 'Shipping zones for this module' => 'Zonas de envío para este módulo', + 'Shipping zones management' => 'Administración de zonas de envío', + 'Short description' => 'Descripción corta', + 'Short description :' => 'Descripcion corta :', + 'Show logs' => 'Mostrar logs', + 'So, each configuration is a list of taxes applied to a list of countries/states.' => 'Así, cada configuración es una lista de impuestos aplicados a una lista de países/estados.', + 'Some of your translations are not saved. Continue anyway ?' => 'Algunas de tus traducciones no están guardadas. ¿ Continuar ?', + 'Sorry, attribute ID=%id was not found.' => 'El atributo ID=%id no se encuentra, disculpe.', + 'Sorry, country ID=%id was not found.' => 'El país ID=%id no se encuentra, disculpe.', + 'Sorry, currency ID=%id was not found.' => 'La divisa ID=%id no se encuentra, disculpe.', + 'Sorry, customer ID=%id was not found.' => 'El cliente ID=%id no se encuentra, disculpe.', + 'Sorry, document ID=%id was not found.' => 'El documento ID=%id no se encuentra, disculpe.', + 'Sorry, feature ID=%id was not found.' => 'La característica ID=%id no se encuentra, disculpe.', + 'Sorry, hook ID=%id was not found.' => 'Lo sentimos, la conexión ID=%iid no se encontró.', + 'Sorry, image ID=%id was not found.' => 'La imagen ID=%id no se encuentra, disculpe.', + 'Sorry, message ID=%id was not found.' => 'El mensaje ID=%id no se encuentra, disculpe.', + 'Sorry, module hook ID=%id was not found.' => 'El módulo ID=%id no se encuentra, disculpe.', + 'Sorry, state ID=%id was not found.' => 'Lo sentimos, el estado ID=%id no se encontró.', + 'Sorry, template ID=%id was not found.' => 'La plantilla ID=%id no se encuentra, disculpe.', + 'Sorry, variable ID=%id was not found.' => 'La variable ID=%id no se encuentra, disculpe.', + 'Source IP' => 'IP de origen', + 'Source IP :' => 'IP de origen:', + 'Stability' => 'Estabilidad', + 'Start Date' => 'Fecha de inicio', + 'State' => 'Estado', + 'States' => 'Estados', + 'States / Provinces' => 'Estados / Provincias', + 'States/provinces assigned to this country' => 'Estados / Provincias asignados a este país', + 'Status' => 'Estado', + 'Stock' => 'Existencias', + 'Store' => 'Tienda', + 'Store address' => 'Dirección de la tienda', + 'Store configuration' => 'Configuración de la tienda', + 'Street address' => 'Calle', + 'Subtitle' => 'Subtítulo', + 'Superadministrator' => 'Superadministrador', + 'Supported locales' => 'Idiomas permitidos', + 'Symbol' => 'Símbolo', + 'System Logs' => 'Registros de Sistema', + 'System Logs configuration' => 'Configuración de los Registros de Sistema', + 'System logs' => 'Logs del sistema', + 'System parameters' => 'Parámetros de sistema', + 'System variables' => 'Variables de sistema', + 'Tags' => 'Etiquetas', + 'Tax' => 'Impuestos', + 'Tax created on %date_create. Last modification: %date_change' => 'Impuesto creado en %date_create. Última modificación: %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => 'Regla de impuesto creada en %date_create. Última modificación: %date_change', + 'Tax rules' => 'Reglas de Impuestos e Impuesto', + 'Tax rules are combination of different taxes.' => 'Las reglas de impuesto son la combinación de distintos impuestos.', + 'Taxed total' => 'Total impuesto', + 'Taxes' => 'Impuestos', + 'Taxes configuration' => 'Configuración de impuestos', + 'Taxes define the amount of money which is added to a bought product.' => 'Los impuestos definen la cantidad agregada al precio del producto.', + 'Taxes rules' => 'Reglas de impuestos', + 'Template name' => 'Nombre de la plantilla', + 'Template title' => 'Título de la plantilla', + 'Template type' => 'Tipo de plantilla', + 'Templates' => 'Plantillas', + 'Test your configuration' => 'Prueba tu configuración', + 'Text version of this message' => 'Versión sólo texto de este mensaje', + 'That way, Thelia community will benefit of your translations' => 'De esa manera, la comunidad de Thelia se beneficiará de tus traducciones', + 'The default pricing is used when no combination is defined.' => 'El precio predeterminado se usa cuando no hay combinación definida.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'Los destinos procesan registros a mostrarles, guardarles o enviarles. Puedes seleccionar y configurar 0, 1 o más destinos a continuación.', + 'The detailed description.' => 'La descripción detallada.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'El directorio local/i18n no existe o no cuenta con permisos de escritura. Por favor arregla antes esta situación.', + 'The following error message has been found: %msg' => 'El siguiente mensaje de error se ha encontrado: %msg', + 'The hooks have been updated successfuly !' => '¡Las conexiones se han actualizado!', + 'The outcomming price is the sum of the incomming one and the sum of taxes.' => 'El precio de salida es la suma del precio de entrada y la suma de los impuestos.', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'La página que has solicitado tiene un problema. Por favor contacta al desarrollador del módulo si estabas usando uno, o siéntete libre de proporcionar al equipo de Thelia retroalimentación en github %url.', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'La página que solicitaste no se encontró. Por favor revisa la dirección (Url) e intenta nuevamente.', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'El tipo de cambio basado en el Euro (Precio en Euro * tipo de cambio = precio en esta moneda)', + 'The selected categories :' => 'Las categorías seleccionadas:', + 'The selected customer :' => 'El cliente seleccionado :', + 'The selected products :' => 'Los productos seleccionados :', + 'The server returned a "404 Not Found"' => 'El server dijo "404 Not Found"', + 'The syntax used is identical to the PHP date() function' => 'La sintaxis utilizada es idéntica a la función date() de PHP', + 'Thelia Back Office' => 'Panel de administración de Thelia', + 'Thelia Installation' => 'Thelia » Instalación', + 'Thelia Installation Wizard' => ' Asistente de instalación de Thelia', + 'Thelia Languages' => 'Idiomas de Thelia', + 'Thelia Mailing System' => 'Sistema de correo electrónico de Thelia', + 'Thelia Mailing Templates' => 'Plantillas de correo electrónico de Thelia', + 'Thelia Product Attributes' => 'Atributos del producto de Thelia', + 'Thelia Product Features' => 'Características de producto de Thelia', + 'Thelia Product Templates' => 'Plantillas de producto de Thelia', + 'Thelia Shipping configuration' => 'Configuración de envío de Thelia', + 'Thelia Shipping zones' => 'Zonas de envío de Thelia', + 'Thelia System Variables' => 'Variables de sistema de Thelia', + 'Thelia caches flushing' => 'Limpiando la caché de Thelia', + 'Thelia contributions' => 'Aportaciones de Thelia', + 'Thelia core' => 'Núcleo de Thelia', + 'Thelia mailing templates' => 'Plantillas de correo electrónico de Thelia', + 'Thelia product attributes' => 'Atributos del producto de Thelia', + 'Thelia product features' => 'Características de producto de Thelia', + 'Thelia product templates' => 'Plantillas de producto de Thelia', + 'Thelia support forum' => 'Foro de soporte de Thelia', + 'Thelia system variables' => 'Variables de sistema de Thelia', + 'There are no shipping zones attached to this module.' => 'No hay zonas de envío adjuntas a este módulo.', + 'There is 2 kind of translations :' => 'Hay 2 tipos de traducciones :', + 'There is currently no active module here.' => 'No hay un módulo activo.', + 'There is currently no available attributes.' => 'Momentáneamente, ninguno de los atributos están disponibles', + 'There is currently no available features.' => 'Momentáneamente, ninguna de las características están disponibles', + 'There is no documents attached to this %type.' => 'No hay ningún documento adjunto a este %type.', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'No hay archivos presentes que puedan ser asociados a tu producto. ¡Sólo los documentos que no son visibles pueden ser seleccionados!', + 'There is no images attached to this %type.' => 'No hay ninguna imagen adjunta a este %type.', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Este administrador esta vinculado con uno o varios administradores. Por favor, editarlos o eliminalos antes de eliminar este administrador.', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'Hay administradores vinculados a este perfil. Por favor, editalos o eliminalos antes de eliminar este perfil.', + 'This category contains no contents' => 'Esta categoría no contiene ningún contenido', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Esta categoría no contiene ningún producto. Para añadir un nuevo producto,pulsa (+).', + 'This category has no sub-categories.' => 'Esta categoría no tiene subcategorías.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Esta categoría no tiene subcategorías. Para crear una nueva, pulsa (+).', + 'This country is not included in any shipping zone' => 'Este país no está incluido en ninguna zona de envío', + 'This customer has not defined any delivery address' => 'Este cliente no ha definido ninguna dirección de entrega', + 'This customer has orders, and can\'t be deleted.' => 'Este cliente tiene pedidos y no pueden ser borrados.', + 'This delivery module handles all shipping zones.' => 'Este módulo de entrega gestiona todas las zonas de envío.', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'Esta carpeta no contiene ningún contenido. Para añadir un nuevo contenido, pulsa (+).', + 'This folder has no sub-folders.' => 'Esta carpeta no tiene subcarpetas.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'Esta carpeta no tiene subcarpetas. Para crear una nueva, pulsa (+).', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'Esto no representa un problema mientras no actualices estos recursos (Thelia, módulos, plantilla).
    ', + 'This is the code entered by your customers to use this coupon' => 'Este es el código que ingresaron tus clientes para usar este cupón', + 'This mailing template could not be changed.' => 'Esta plantilla de correo no puede ser cambiada.', + 'This module cannot be started, some files are probably missing.' => 'Este módulo no puede ser iniciado, probablemente falten algunos archivos.', + 'This outcomming price is then passed to the next group as its incomming price, etc...' => 'El precio de salida es luego pasado al siguiente grupo como su precio de entrada y así sucesivamente…', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'Esta página te permite traducir cada recurso de tu sitio : Thelia, módulos y plantilla.
    ', + 'This product contains no accessories' => 'Este producto no contiene accesorios', + 'This product contains no contents' => 'Este producto no tiene contenidos', + 'This product doesn\'t belong to any additional category.' => 'Este producto no pertenece a ninguna categoría adicional.', + 'This product doesn\'t belong to any additional folder.' => 'Este producto no pertenece a ninguna carpeta adicional.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'Este producto no tiene combinación. Se usa el precio predeterminado. Clic aquí para crear una nueva combinación.', + 'This product template does not contains any features' => 'La plantilla de este producto no contiene ningunas características', + 'This shipping zone does not contains any country.' => 'La zona de envío no contiene ningún país.', + 'This template contains no attributes' => 'Esta plantilla no contiene atributos', + 'This template contains no features' => 'Esta plantilla no contiene características', + 'This variable could not be changed.' => 'Esta variable no puede ser cambiada.', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'Esto restablecerá el estado de venta de todos los productos y deshabilitará todas las ventas activas. ¿ Realmente deseas continuar ?', + 'Timeout' => 'Timeout', + 'Timeout :' => 'Timeout:', + 'Title' => 'Título', + 'Title * :' => 'Título * :', + 'To' => 'Para', + 'To create a new content, select an existing folder, or create a new one.' => 'Para crear un nuevo contenido, selecciona una carpeta existente, o crea una nueva.', + 'To create a new product, select an existing category, or create a new one.' => 'Para crear un nuevo producto selecciona una categoría existente, o crea una nueva.', + 'To remove a value from the combination, select it and click "remove"' => 'Para eliminar un valor de la combinación, selecciónalo y pulsa "eliminar"', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'Para usar características o atributos para este producto, por favor selecciona una plantilla de producto. Puedes definir plantillas d producto en la sección de configuración de la administración.', + 'Toggle select all' => 'Alternar la selección de todo', + 'Tools' => 'Herramientas', + 'Top level' => 'Nivel superior', + 'Top level Contents' => 'Contenidos de nivel superior', + 'Top level Products' => 'Productos del nivel superior', + 'Top level categories' => 'Categorías de nivel superior', + 'Top level folders' => 'Carpetas de nivel superior', + 'Total' => 'Total', + 'Total including discount' => 'Total con descuento', + 'Total without discount' => 'Total sin descuento', + 'Transaction' => 'Transacción', + 'Transaction reference' => 'Referencia de la transacción', + 'Translation' => 'Traducción', + 'Translations' => 'Traducción', + 'Type:' => 'Tipo:', + 'Unit taxed price' => 'Precio unitario IVA incluido', + 'Unit. price' => 'Precio unitario', + 'Unlimited' => 'Ilimitado', + 'Unlimited number of uses' => 'Uso ilimitado', + 'Unspecified' => 'Sin especificar', + 'Unsupported field type \'%type\' in form-field.html' => 'No hay soporte para el tipo de campo \'%type\' en form-field.html', + 'Update' => 'Actualizar', + 'Update URL' => 'Actualizar URL', + 'Update an administrator' => 'Actualiza un administrador', + 'Update coupon' => 'Actualizar un cupón', + 'Update password' => 'Actualizar contraseña', + 'Update rates' => 'Actualizar las tasas', + 'Update tax rule taxes' => 'Actualizar los impuestos de las reglas de impuesto', + 'Update this image' => 'Actualizar esta imagen', + 'Usage count' => 'Usos restantes', + 'Usages left' => 'Usos restantes', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'Utiliza Ctrl + clic para seleccionar (o de-seleccionar) más de un valor', + 'Use Ctrl+click to select (or deselect) more that one category' => 'Utiliza Ctrl + clic para seleccionar (o de-seleccionar) más de una categoría', + 'Use Ctrl+click to select (or deselect) more that one item' => 'Utiliza Ctrl + clic para seleccionar (o de-seleccionar) más de un elemento', + 'Use Ctrl+click to select (or deselect) more that one product' => 'Utiliza Ctrl + clic para seleccionar (o de-seleccionar) más de un producto', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'Utiliza Ctrl + clic para seleccionar (o de-seleccionar) más de un método de entrega', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Pulsa Ctrl+click para seleccionar más de un valor. También puedes borrar los valores seleccionados.', + 'Use HTML message defined below' => 'Usa el mensaje HTML definido a continuación', + 'Use Text message defined below' => 'Uso el mensaje de Texto definido a continuación', + 'Use address by default' => 'Utilizar la dirección por defecto', + 'Use an other config.' => 'Usar otra configuración.', + 'Use default layout' => 'Usa la distribución predeterminada', + 'Use this address by default' => 'Utilizar esta dirección por defecto', + 'Use this config.' => 'Usa esta configuración.', + 'User mode' => 'Mode de usuario', + 'Username' => 'Nombre de usuario', + 'Username :' => 'Nombre de usuario:', + 'Username or e-mail address' => 'Usuario o dirección de correo', + 'Using a domain or subdomain for each language' => 'Utilizando un dominio o subdominio para cada idioma', + 'Valid on special offers' => 'Válido en ofertas especiales', + 'Value' => 'Valor', + 'Variable created on %date_create. Last modification: %date_change' => 'Variable creada en %date_create. Última modificación: %date_change', + 'Variable name' => 'Nombre de la variable', + 'Variable purpose' => 'Objetivo de la variable', + 'Variable value' => 'Valor de la variable', + 'Variables to inject' => 'Variables a inyectar', + 'Version %ver' => 'Versión %ver', + 'View' => 'Ver', + 'View invoice PDF' => 'Ver PDF de la factura', + 'View only missing translations.' => 'Mostrar solamente las traducciones faltantes.', + 'View purchase order as PDF' => 'Mostrar orden de compra como PDF', + 'View shop' => 'Ver tienda', + 'View site' => 'Ver sitio', + 'View this page in %langname' => 'Ver esta página en %langname', + 'View this product in a new page' => 'Ver este producto en una nueva página', + 'Virtual product' => 'Producto virtual', + 'Visibility' => 'Visibilidad', + 'Visible' => 'Visible', + 'Visible in front' => 'Visible al frente', + 'Warning' => 'Alerta', + 'Web site' => 'Sitio web', + 'Weight' => 'Peso', + 'Weight
    (Kg)' => 'Peso< br />(Kg)', + 'Welcome' => 'Bienvenido', + 'Welcome to Thelia administration !' => 'Bienvenido a la administración de Thelia !', + 'Yes' => 'Sí', + 'You can attach here some content to this category' => 'Puedes adjuntar aquí algún contenido a esta categoría', + 'You can attach here some content to this product' => 'Aquí puedes adjuntar algo de contenido a este producto', + 'You can attach this product to more categories in the details tab.' => 'Puedes adjuntar este producto a más categorías en la pestaña detalles.', + 'You can change attributes and their positions in the attributes configuration page.' => 'Puedes cambiar atributos y sus posiciones en la página de configuración de atributos.', + 'You can change feature and their positions in the features configuration page.' => 'Puedes cambiar características y sus posiciones en la página de configuración de características.', + 'You can change template attributes and their positions in the template configuration page.' => 'Puedes cambiar los atributos de la plantilla y sus posiciones en la página de configuración de la plantilla.', + 'You can change templates features and their positions in the template configuration page.' => 'Puedes cambiar las características de la plantilla y sus posiciones en la página de configuración de la plantilla.', + 'You can change the default category (%title) in the "General" tab.' => 'Puedes cambiar la categoría predeterminada (%title) en la ficha "General".', + 'You can change the default folder (%title) in the "General" tab.' => 'Puedes cambiar la carpeta por defecto (%title) en la pestaña "General".', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'Aquí puedes definir un rango específico de precio para cada una de las divisas de la tienda, como un porcentaje o una cantidad constante, dependiendo en el tipo derango seleccionado.', + 'You can\'t delete this administrator' => 'No puedes eliminar este administrador', + 'You can\'t delete this profile' => 'No puedes eliminar este perfil', + 'You can\'t do exports, you don\'t have any serializer that handles this.' => 'No puedes exportar, no tienes ningún serializador que maneje esto.', + 'You don\'t have any export' => 'No tienes elementos exportados', + 'You don\'t have any import' => 'No tienes ninguna importación', + 'You have no orders for the moment.' => 'No tienes pedidos por el momento.', + 'You have no registred customers for the moment.' => 'No tienes clientes registrados por el momento.', + 'You may also quickly create combinations from products attributes using the Combination Builder.' => 'También puedes crear rápidamente combinaciones desde los atributos de los productos usando el Constructor Combinaciones.', + 'Your current IP address is %ip' => 'Tu IP es %ip', + 'Your email' => 'Tu correo', + 'Your module should be packaged in a zip file.' => 'Tu módulo debería ser empacado en un archivo zip.', + 'Your search is too short' => 'Tu búsqueda es demasiado corta', + 'Your template define new hooks' => 'Tu plantilla incorpora nuevas conexiones', + 'Your template does not support this hooks' => 'Tu plantilla no admite estas conexiones', + 'Your template is clean. No missing hooks and no new hooks.' => 'Tu plantilla está limpia. No hay faltan conexiones y no hay nuevas conexiones.', + 'Zip code' => 'Código postal', + 'Zone name' => 'Nombre de zona', + 'activate' => 'activar', + 'activate %title module' => 'activa el módulo %title', + 'activate hook' => 'activar conexión', + 'activation' => 'activación', + 'all' => 'todo', + 'all states' => 'todos los estados', + 'all states/provinces' => 'todos los estados / provincias', + 'and' => 'y', + 'caption' => 'texto', + 'classic modules' => 'módulos clásicos', + 'code' => 'Código', + 'company' => 'empresa', + 'country has an other configuration' => 'el país tiene otra configuración', + 'country has no configuration' => 'el país no tiene configuración', + 'country has the current configuration' => 'el país tiene la configuración actual', + 'customer ref' => 'Referencia de cliente', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'fecha en formato yyyy-mm-dd', + 'deactivate' => 'desactivar', + 'deactivated' => 'desactivado', + 'deactivation' => 'desactivación', + 'delete document' => 'borra documento', + 'delete image' => 'borra imagen', + 'download' => 'descarga', + 'eg: . or ,' => 'eg: . o ,', + 'email' => 'correo electrónico', + 'en_US' => 'es_ES', + 'filter country' => 'filtrar país', + 'firstname & lastname' => 'Nombre y apellido', + 'hour in hh:mm:ss format' => 'hora en formato hh:mm:ss', + 'last order' => 'último pedido', + 'long description' => 'descripción larga', + 'none' => 'ninguno', + 'ok' => 'de acuerdo', + 'on' => 'en', + 'or' => 'o', + 'order amount' => 'Importe del pedido', + 'orders for this customer' => 'pedidos para este cliente', + 'pdf' => 'pdf', + 'permanent discount' => 'descuento permanente (en porcentaje)', + 'profile' => 'perfil', + 'ref.:' => 'ref.:', + 'reverse' => 'reverso', + 'short description' => 'descripción corta', + 'tax rules' => 'reglas de impuesto', + 'taxes' => 'impuestos', + 'title' => 'Título', + 'tracking reference' => 'Referencia de seguimiento', + 'version' => 'Versión', + 'warning' => 'aviso', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'Puedes combinar los impuestos en las reglas de impuesto y elegir si se aplican uno tras otro o al mismo tiempo: permite aplicar impuestos sobre un precio ya gravado o no.', +]; diff --git a/templates/backOffice/default/I18n/fa_IR.php b/templates/backOffice/default/I18n/fa_IR.php new file mode 100644 index 00000000..cbcdb6be --- /dev/null +++ b/templates/backOffice/default/I18n/fa_IR.php @@ -0,0 +1,1222 @@ + ' (پیش فرض)', + '%count more...' => '%count بیشتر...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => 'تعداد، %count عدد موقعیت جغرافیایی به این ماژول متصل شده است، که عبارتند از: %zones. برای تغییر دادنشان اینجا را کلیک کنید.', + '(edit)' => '(ویرایش)', + 'Check the list of ISO 639-1 codes' => 'برای یافتن کد نویسه‌ی زبان مورد نظر خود لیست کد نویسه‌های تحت استاندارد ISO 69-1 را چک کنید', + '0 combinations' => 'ترکیب 0', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'سیستم امکان بازیابی تمامی فیلدهای ترجمه را ندارد. با توجه به تنظیمات پی اچ پی بر روی سرور، فرم ترجمه نمی تواند حاوی بیش از %current_max_input_vars فیلد ورودی باشد، در صورتی که حداقل به required_max_input_vars % مورد نیاز است. لطفا مقدار متغییر max_input_vars در تنظیمات پی اچ پی تغییر دهید.', + 'Congratulations, all text is now translated !' => 'تبریک, تمامی متون در حال حاضر ترجمه شده‌اند!', + 'Developer : to change the translations of the resource' => 'توسعه دهنده: برای ویرایش ترجمه منابع', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'هیچ متنی یرای ترجمه یافت نشد. احتمالا طبیعی است. اگر نه که، لطفا مطمئن شوید که در قالب اسمارتی از تابع "intl" یا از متد Translator::trans() در فایل php استفاده می‌کنید.', + 'User : to redefine the translations for your website' => 'کاربر: برای تعریف مجدد ترجمه‌ها برای سایتتان', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'توجه: نرخ ارز برا حداقل یک واحد پول یافت نشد: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'هشدار برخی از کشورهای شما جز هیچ یک از مناطق تحت پوشش برای ارسال و تحویل کالا نیستند:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'هشدار، برخی از مناطق تحت پوشش سیستم حمل و نقلی شما به هیچ ماژول تحویلی متصل نشده اند:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'شما می توانید بیش از یک پوشه به محتوا وصل کنید. پوشه های اضافی برای این محتوا را انتخاب کنید.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'شما می توانید بیش از یک دسته به محصول وصل کنید. دسته های دیگر این محصول را انتخاب کنید.', + 'API configuration' => 'تنظیمات API', + 'API list access' => 'API لیست دسترسی', + 'API users' => 'API کاربران', + 'Accessory title' => 'عنوان لوازم جانبی', + 'Action' => 'عمل', + 'Actions' => 'عملیات', + 'Activate this log destination' => 'فعال کردن مقصد این لاگ', + 'Active' => 'فعال', + 'Add' => 'ﺍﻓﺰﻭﺩﻥ', + 'Add a condition' => 'اضافه کردن یک شرط', + 'Add a module to a hook' => 'اضافه کردن ماژول به قلاب', + 'Add a new Customer' => 'اضافه کردن مشتری جدید', + 'Add a new address' => 'افزودن آدرس جدید', + 'Add a new brand' => 'اضافه کردن یک نام تجاری جدید (برند)', + 'Add a new category' => 'اضافه کردن یک دسته بندی جدید', + 'Add a new combination' => 'اضافه کردن ترکیب جدید', + 'Add a new content' => 'اضافه کردن محتوای جدید', + 'Add a new country' => 'افزودن کشور', + 'Add a new currency' => 'افزودن ارز', + 'Add a new folder' => 'افزودن پوشه', + 'Add a new hook' => 'اضافه کردن یک قلاب جدید', + 'Add a new language' => 'افزودن زبان', + 'Add a new mailing template' => 'اضافه کردن یک قالب جدید ایمیل', + 'Add a new module in a hook' => 'افزودن یک ماژول جدید به یک قلاب', + 'Add a new module to this hook' => 'اضافه کردن ماژول جدید به این قلاب', + 'Add a new product' => 'افزودن محصول', + 'Add a new product attribute' => 'اضافه کردن یک خصوصیت (attr) جدید به کالا', + 'Add a new product feature' => 'اضافه کردن یک ویژگی (feature) جدید به کالا', + 'Add a new product template' => 'اضافه کردن یک قالب جدید کالا', + 'Add a new sale' => 'افزودن یک حراج جدید', + 'Add a new shipping zone' => 'اضافه کردن یک منطقه تحویل و ارسال جدید', + 'Add a new variable' => 'اضافه کردن یک متغیر جدید', + 'Add document to your product.' => 'سند را به محصول خود اضافه کنید.', + 'Add selected countries' => 'اضافه کردن کشورهای انتخاب شده', + 'Add tax to this group' => 'افزودن مقدار مالیاتی به این گروه', + 'Add this attribute to all product templates' => 'افزودن این خصوصیت به تمام قالب‌های محصول', + 'Add this feature to all product templates' => 'اضافه کردن این ویژگی به تمام قالب‌های محصول', + 'Add to all product templates' => 'اضافه کردن به تمام قالب‌های محصول', + 'Add to selected categories' => 'اضافه کردن به دسته‌های انتخاب شده', + 'Additional Folders' => 'پوشه‌های اضافی', + 'Additional address' => 'آدرس اضافی', + 'Additional categories' => 'دسته بندی اضافی', + 'Address' => 'نشانی', + 'Administration logs' => 'لاگ ادمین', + 'Administration profiles' => 'پروفایل ادمین', + 'Administrators' => 'ادمین', + 'Advanced configuration' => 'پیکربندی پیشرفته', + 'Advanced configuration and tools' => 'تنظیمات و ابزارهای پیشرفته', + 'All' => 'همه', + 'All orders' => 'همه سفارش ها', + 'Amount' => 'مقدار', + 'Amount, e.g. 12.50' => 'مقدار؛ به عنوان مثال 12.50', + 'An error occured' => 'خطایی رخ داده است', + 'An unexpected error occured' => 'یک خطای غیر منتظره رخ داده است', + 'An unknow error happend' => 'یک خطای نامشخص رخ داده', + 'An unknown error occured, please try again.' => 'یک خطای ناشناخته رخ داده است، لطفا دوباره سعی کنید.', + 'And' => 'و', + 'Api' => 'API', + 'Api key' => 'کلید API', + 'Applies to attribute values :' => 'افزودن به مقادیر خصوصیت:', + 'Applies to products :' => 'افزودن به محصولات:', + 'Applies to products in categories :' => 'افزودن به محصولات در دسته بندی:', + 'Apply' => 'اعمال', + 'Assigned modules' => 'ماژول های اختصاص داده شده', + 'Associate documents' => 'اسناد مرتبط', + 'Associate downloadable file' => 'فایل قابل دریافت وابسته', + 'Associate files to your combinations' => 'فایل‌های وابسته به ترکیبات شما', + 'Associate images' => 'تصاویر مرتبط', + 'Associated' => 'وابسته شده', + 'Associations' => 'وابستگی‌ها', + 'Attribute' => 'خصوصيت', + 'Attribute %title' => 'خصوصيت %title', + 'Attribute Combinations' => 'خصوصیت ترکیب‌ها', + 'Attribute Name' => 'نام خصوصیت', + 'Attribute information' => 'اطلاعات خصوصيت', + 'Attribute title' => 'عنوان خصوصيت', + 'Attribute values' => 'مقادیر خصوصيت', + 'Attributes' => 'خصوصیت‌ها', + 'Attributes & Features' => 'خصوصيت & ویژگی‌ها', + 'Auth Mode' => 'حالت احراض هویت', + 'Auth Mode :' => 'حالت احراض هویت :', + 'Author' => 'نويسنده', + 'Available product categories' => 'دسته بندی محصولات موجود', + 'Back' => 'بازگشت', + 'Back Office' => 'بخش مديريت', + 'Back-office home' => 'صفحه اصلی پشتیبانی فنی', + 'Back-office template you want to translate' => 'قالب بخش پشتیبانی فنی که شما می‌خواهید ترجمه کنید', + 'Back-office templates' => 'قالب پشتیبانی فنی', + 'Back-office users' => 'کاربرهای پشتیبانی فنی', + 'Best taxed price' => 'بهترین قیمت مشمول مالیات', + 'Block' => 'مسدود کردن', + 'Block :' => 'مسدود کردن:', + 'Brand created on %date_create. Last modification: %date_change' => 'نام تجاری ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Brands' => 'برندها', + 'Browse files' => 'انتخاب فایل', + 'Browse this category' => 'گشتن این دسته بندی', + 'Browse this folder' => 'گشتن این پوشه', + 'By module' => 'توسط ماژول', + 'By module:' => 'توسط ماژول:', + 'By status' => 'با وضعیت', + 'By type' => 'توسط نوع', + 'Can\'t load documents, please refresh this page.' => 'لطفا این صفحه را رِفرش کنید، سند لود نمی‌شود.', + 'Can\'t load images, please refresh this page.' => 'لطفا این صفحه را رِفرش کنید، تصاویر لود نمی‌شوند.', + 'Can\'t reorder documents, please refresh this page.' => 'لطفا این صفحه را رِفرش کنید، امکان مرتب سازی سندها وجود ندارد.', + 'Can\'t reorder images, please refresh this page.' => 'لطفا این صفحه را رِفرش کنید، امکان مرتب سازی تصاویر وجود ندارد.', + 'Cancel' => 'لغو', + 'Cancel changes and revert to original value' => 'تغییرات را لفو کن و مقادیر قبلی را بازگردان', + 'Cancel this order' => 'لغو این سفارش', + 'Cart - Prices in %currency' => 'سبد خرید - قیمت در %currency', + 'Catalog' => 'کاتالوگ', + 'Categories' => 'دسته بندی‌ها', + 'Categories in %cat' => 'دسته‌ها در %cat', + 'Category' => 'دسته‌بندی', + 'Category created on %date_create. Last modification: %date_change' => 'دسته ایجاد شده در تاریخ %date_create. آخرين تغییر: %date_change', + 'Category title' => 'عنوان دسته', + 'Cellphone' => 'تلفن همراه', + 'Cellular phone' => 'تلفن همراه', + 'Cellular phone number' => 'شماره تلفن همراه', + 'Change sale configuration' => 'تغییر تنظیمات حراج', + 'Change this administrator' => 'این مدیر را تغییر دهید', + 'Change this api access' => 'تغییر این دسترسی به API', + 'Change this attribute' => 'تغییر این خصوصیت', + 'Change this brand' => 'تغییر این نام تجاری', + 'Change this condition' => 'تغییر این شرط', + 'Change this country' => 'تغییر کشور', + 'Change this coupon' => 'تغییر این کوپن', + 'Change this currency' => 'تغییر این ارز', + 'Change this feature' => 'تغییر این ویژگی', + 'Change this hook' => 'تغییر این قلاب', + 'Change this language' => 'تغییر این زبان', + 'Change this mailing template' => 'تغییر این قالب پستی', + 'Change this product attribute' => 'تغییر این خصوصیت محصول', + 'Change this product feature' => 'تغییر این ویژگی محصول', + 'Change this product template' => 'تغییر این قالب محصول', + 'Change this profile' => 'تغییر این پروفایل', + 'Change this sale' => 'تغییر این حراج', + 'Change this shipping zone' => 'تغییر این منطقه حمل و نقل', + 'Change this tax' => 'تغییر این مالیات', + 'Change this tax rule' => 'تغییر این قانون مالیات', + 'Change this template' => 'تغییر این فالب', + 'Change this variable' => 'تغییر این متغییر', + 'Chapo' => 'چاپوو', + 'Check sale activation' => 'بررسی وضعیت حراج', + 'Check the support of hooks.' => 'بررسی پشتیبانی از قلاب‌ها.', + 'Check this box if you want to add this attributes to all product templates' => 'اگر می‌خواهید این خصوصیات را به تمامی قالب‌های محصول اضافه کنید، این قسمت را تیک بزنید', + 'Check this box if you want to add this features to all product templates' => 'اگر می‌خواهید این ویژگی را به تمامی قالب‌های محصول اضافه کنید، این قسمت را تیک بزنید', + 'Choose a country' => 'انتخاب کشور', + 'City' => 'شهر', + 'Classic modules' => 'ماژول‌های کلاسیک', + 'Click to view' => 'برای مشاهده کلیک کنید', + 'Click to view details.' => 'برای مشاهده جزئیات کلیک کنید.', + 'Clone' => 'کپی', + 'Clone product' => 'کپی محصول', + 'Close' => 'بستن', + 'Close administation session' => 'بستن وضعییت مدیر', + 'Code' => 'کد', + 'Code:' => 'کد:', + 'Combinable with other promotions' => 'نرکیب با سایر تبلیغات', + 'Combination EAN Code' => 'ترکیب با کد EAN', + 'Combination builder' => 'ترکیب ساز', + 'Combination reference' => 'مرجع ترکیب', + 'Company' => 'شرکت', + 'Condition category :' => 'شرایط دسته:', + 'Condition description' => 'توضیحات شرط', + 'Configuration' => 'پیکربندی', + 'Configuration mailing system' => 'پیکربندی سیستم پستی', + 'Configure' => 'پیکربندی', + 'Configure this module' => 'پیکربندی این ماژول', + 'Confirm' => 'تایید', + 'Confirm changes' => 'تایید تغییرات', + 'Confirmation' => 'تایید', + 'Content' => 'محتوا', + 'Content title' => 'عنوان محتوا', + 'Contents in %fold' => 'مطالب %fold', + 'Copy all missing translations.' => 'کپی تمامی ترجمه‌های جا افتاده.', + 'Copy all translations.' => 'کپی تمامی ترجمه‌ها.', + 'Copy source text in input field' => 'کپی کردن متن منبع در فیلد ورودی', + 'Countries' => 'كشور‌ها', + 'Countries assigned to this zone' => 'کشورهای اختصاص داده شده به این منطقه جغرافیای', + 'Country' => 'كشور', + 'Coupon' => 'کوپن', + 'Coupon code' => 'کد تخفیف', + 'Coupon code * :' => 'کد کوپن *:', + 'Coupon conditions' => 'شرایط کوپن', + 'Coupon type * :' => 'نوع کوپن *:', + 'Coupons' => 'کوپن‌ها', + 'Create' => 'ایجاد', + 'Create a customer address' => 'ایجاد یک آدرس مشتری', + 'Create a new API access' => 'ایجاد یک دسترسی API', + 'Create a new Hook' => 'ایجاد قلاب جدید', + 'Create a new administrator' => 'ایجاد مدیر جدید', + 'Create a new attribute' => 'ایجاد خصوصیت جدید', + 'Create a new attribute value' => 'ایجاد یک مقدار جدید برای خصوصیت', + 'Create a new brand' => 'ایجاد یک نام تجاری جدید', + 'Create a new category' => 'ایجاد دسته‎ی جدید', + 'Create a new combination' => 'ایجاد ترکیب جدید', + 'Create a new content' => 'ایجاد محتوای جدید', + 'Create a new country' => 'ایجاد یک کشور جدید', + 'Create a new coupon' => 'ایجاد کوپن جدید', + 'Create a new currency' => 'ایجاد واحد پولی جدید', + 'Create a new customer' => 'ایجاد یک مشتری جدید', + 'Create a new feature' => 'ایجاد یک ویژگی جدید', + 'Create a new feature value' => 'ایجاد یک مقدار جدید ویژگی', + 'Create a new folder' => 'ایجاد پوشه جدید', + 'Create a new language' => 'ایجاد زبان جدید', + 'Create a new mailing template' => 'ایجاد یک قالب جدید ایمیلی', + 'Create a new product' => 'ایجاد کالای جدید', + 'Create a new product template' => 'ایجاد قالب جدید محصول', + 'Create a new profile' => 'ایجاد پروفایل جدید', + 'Create a new sale' => 'ایجاد حراج جدید', + 'Create a new shipping zone' => 'ایجاد یک منطقه جدید حمل و نقل', + 'Create a new tax' => 'ایجاد یک صورت مالیات جدید', + 'Create a new tax rule' => 'ایجاد یک نرخ جدید مالیاتی', + 'Create a new variable' => 'ایجاد یک متغیر جدید', + 'Create combinations' => 'ایجاد ترکیب‌ها', + 'Create coupon' => 'ایجاد کوپن', + 'Create this address' => 'ایجاد این آدرس', + 'Create this attribute' => 'ایجاد این خصوصیت', + 'Create this brand' => 'ایجاد این نام تجاری', + 'Create this category' => 'ایجاد این دسته', + 'Create this combination' => 'ایجاد این ترکیب', + 'Create this content' => 'ایجاد این محتوا', + 'Create this country' => 'ایجاد این کشور', + 'Create this currency' => 'ایجاد این واحد پولی', + 'Create this customer' => 'ایجاد این مشتری', + 'Create this feature' => 'ایجاد این ویژگی', + 'Create this folder' => 'ایجاد این پوشه', + 'Create this hook' => 'ایجاد این قلاب', + 'Create this hooks' => 'ایجاد این قلاب‌ها', + 'Create this language' => 'ایجاد این زبان', + 'Create this mailing template' => 'ایجاد این قالب ایمیلی', + 'Create this product' => 'ایجاد این محصول', + 'Create this product template' => 'ایجاد این قالب محصول', + 'Create this sale' => 'ایجاد این حراج', + 'Create this shipping zone' => 'ایجاد این منطقه حمل و نقل', + 'Create this value' => 'ایجاد این مقدار', + 'Create this variable' => 'ایجاد این متغیر', + 'Currencies' => 'ارزها', + 'Currency name' => 'نام واحد پولی', + 'Currency rate' => 'نرخ‌‌‌‌‌‌ واحد پولی', + 'Currency symbol' => 'نماد واحد پولی', + 'Current product template' => 'قالب محصول فعلی', + 'Current quantity' => 'تعداد جاری', + 'Customer' => 'مشتری', + 'Customer information' => 'اطلاعات مشتری', + 'Customer informations' => 'اطلاعات مشتری', + 'Customer is' => 'مشتری هست', + 'Customers' => 'مشتریان', + 'Customers list' => 'لیست مشتریان', + 'Cutomer Name' => 'نام مشتری', + 'Date & Hour' => 'تاریخ و ساعت', + 'Date of last order' => 'تاریخ آخرین سفارش', + 'Days before expiration' => 'روز مانده به انقضا', + 'Deactivate %title module' => 'غیر فعال کردن ماژول %title', + 'Deactivate hook' => 'غیر فعال کردن قلاب', + 'Deactivate this hooks' => 'غیر فعال کردن این قلاب‌ها', + 'Decimal places' => 'محل اعشار', + 'Default' => 'پیش‎فرض', + 'Default address' => 'نشانی پستی پیش‌فرض', + 'Define here this product\'s accessories' => 'لوازم جانبی این محصول را در اینجا تعریف کنید', + 'Delete' => 'پاک کردن', + 'Delete a combination' => 'حذف ترکیب', + 'Delete a module' => 'حذف ماژول', + 'Delete a variable' => 'حذف متغیر', + 'Delete address' => 'حذف آدرس', + 'Delete administrator' => 'حذف مدیر', + 'Delete also module data' => 'داده‌های ماژول را نیز حذف کن', + 'Delete an order' => 'حذف سفارش', + 'Delete api access' => 'حذف دسترسی به API', + 'Delete attribute' => 'حذف خصوصیت', + 'Delete attribute value' => 'حذف مقدار خصوصیت', + 'Delete brand' => 'حذف نام تجاری', + 'Delete category' => 'حذف دسته بندی', + 'Delete content' => 'حذف مطلب', + 'Delete country' => 'حذف كشور', + 'Delete coupon' => 'حذف کوپن', + 'Delete currency' => 'حذف واحد پولی', + 'Delete customer' => 'حذف مشتری', + 'Delete feature' => 'حذف ویژگی', + 'Delete feature value' => 'حذف مقدار ویژگی', + 'Delete folder' => 'حذف پوشه', + 'Delete hook' => 'حذف قلاب', + 'Delete language' => 'حذف زبان', + 'Delete mailing template' => 'حذف قالب ایمیلی', + 'Delete product' => 'حذف محصول', + 'Delete profile' => 'حذف پروفایل', + 'Delete sale' => 'حذف حراج', + 'Delete selected countries' => 'حذف کشورهای انتخاب شده', + 'Delete shipping zone' => 'حذف منطقه ارسال و تحویل', + 'Delete tax' => 'حذف مالیات', + 'Delete tax rule' => 'حذف نرخ مالیات', + 'Delete template' => 'حذف قالب', + 'Delete this accessory' => 'حذف این لوازم جانبی', + 'Delete this administrator' => 'حذف این مدیر', + 'Delete this api access' => 'حذف این دسترسی API', + 'Delete this attribute' => 'حذف این ویژگی', + 'Delete this brand' => 'حذف این نام تجاری', + 'Delete this category and all its contents' => 'حدف این دسته و تمامی محتویات آن', + 'Delete this combination' => 'حذف این ترکیب', + 'Delete this condition' => 'حذف این شرط', + 'Delete this content' => 'حذف این محتوا', + 'Delete this country' => 'حذف این کشور', + 'Delete this coupon' => 'حذف این کوپن', + 'Delete this currency' => 'حذف این واحد پولی', + 'Delete this customer address' => 'حذف این آدرس مشتری', + 'Delete this customer and all his orders' => 'حدف این مشتریان و کلیه سفارشات آن', + 'Delete this feature' => 'حدف این ویژگی', + 'Delete this folder' => 'پاک کردن این پوشه', + 'Delete this folder and all its contents' => 'حذف این پوشه و تمام محتویات آن', + 'Delete this hook' => 'حدف این قلاب', + 'Delete this language' => 'حذف این زبان', + 'Delete this mailing template' => 'حذف این قالب ایمیلی', + 'Delete this module' => 'حذف این ماژول', + 'Delete this product' => 'حذف این محصول', + 'Delete this product attribute' => 'حذف این خصوصیت محصول', + 'Delete this product feature' => 'حذف این ویژگی محصول', + 'Delete this product template' => 'حذف این قالب محصول', + 'Delete this profile' => 'حذف این پروفایل', + 'Delete this sale' => 'حذف این حراج', + 'Delete this shipping zone' => 'حذف این منطقه حمل و نقل', + 'Delete this tax' => 'حذف این مالیات', + 'Delete this tax rule' => 'حذف این نرخ مالیات', + 'Delete this value' => 'حذف این مقدار', + 'Delete this variable' => 'حذف این متغیر', + 'Delete this zone' => 'حذف این منطقه جغرافیایی', + 'Delivery' => 'تحویل', + 'Delivery address' => 'آدرس تحویل', + 'Delivery module' => 'ماژول تحویل', + 'Delivery modules' => 'ماژول‌های تحویل', + 'Description' => 'توضيحات', + 'Destinations' => 'مقصدها', + 'Developer mode' => 'حالت توسعه دهنده', + 'Disabled' => 'غیرفعال شده', + 'Discount' => 'تخفیف', + 'Discount amount' => 'مبلغ تخفیف', + 'Discount percentage' => 'درصد تخفیف', + 'Discover all our modules on Thelia Modules !' => 'تمامی ماژول‌ها را می‌توانید در اینجا پیدا کنید!', + 'Do not use a product template' => 'از قالب محصول استفاده نکن', + 'Do this export' => 'عمل برون ریزی را انجام بده', + 'Do this import' => 'عمل درون ریزی را انجام بده', + 'Do you really want to add this attribute to all product templates ?' => 'شما واقعا می خواهید این خصوصیت را به تمام قالب‌های محصول اضافه کنید؟ ', + 'Do you really want to add this feature to all product templates ?' => 'شما واقعا می خواهید این خصوصیت را به تمام قالب‌های محصول اضافه کنید؟', + 'Do you really want to cancel this order ?' => 'آیا مطمئنید که می خواهید این سفارش را لغو کنید؟', + 'Do you really want to delete this address ?' => 'آیا برای پاک کردن این آدرس اطمینان دارید؟', + 'Do you really want to delete this administrator ?' => 'آیا مطمئنید که می خواهید این کاربر مدیر را حذف کنید؟', + 'Do you really want to delete this api access ?' => 'آیا مطمئنید که می خواهید این دسترسی به API را حذف کنید؟', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'آیا مطمئنید که می خواهید این خصوصیت حذف کنید؟ از تمامی قالب‌های محصول حذف خواهد شد.', + 'Do you really want to delete this attribute value ?' => 'آیا مطمئنید که می خواهید این مقدار خصوصیت حذف کنید؟', + 'Do you really want to delete this brand ?' => 'آیا مطمئنید که می خواهید این برند تجاری را حذف کنید؟', + 'Do you really want to delete this category and all its content ?' => 'آیا مطمئنید که می خواهید این دسته بندی را به همراه تمام محتوایش حذف کنید؟', + 'Do you really want to delete this combination ?' => 'آیا مطمئنید که می خواهید این ترکیب را حذف کنید؟', + 'Do you really want to delete this condition ?' => 'آیا مطمئنید که می خواهید این شرط را حذف کنید؟', + 'Do you really want to delete this content ?' => 'آیا مطمئنید که می خواهید این محتوا را حذف کنید؟', + 'Do you really want to delete this country ?' => 'آیا مطمئنید که می خواهید این کشور را حذف کنید؟', + 'Do you really want to delete this coupon ?' => 'آیا مطمئنید که می خواهید این کوپن را حذف کنید؟', + 'Do you really want to delete this currency ?' => 'آیا مطمئنید که می خواهید این واحد پولی را حذف کنید؟', + 'Do you really want to delete this customer ?' => 'آیا مطمئنید که می خواهید این مشتری را حذف کنید؟', + 'Do you really want to delete this document ?' => 'آیا مطمئنید که می خواهید این سند را حذف کنید؟', + 'Do you really want to delete this element ?' => 'آیا مطمئنید که می خواهید این عنصر را حذف کنید؟', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'آیا مطمئنید که می خواهید این ویژگی را حذف کنید؟ از تمامی قالب‌های محصول حذف خواهد شد.', + 'Do you really want to delete this feature value ?' => 'آیا مطمئنید که می خواهید این مقدار ویژگی را حذف کنید؟', + 'Do you really want to delete this folder and all its content ?' => 'آیا مطمئنید که می خواهید این پوشه را به همراه تمامی محتوای آن حذف کنید؟', + 'Do you really want to delete this hook ?' => 'آیا مطمئنید که می خواهید این قلاب را حذف کنید؟', + 'Do you really want to delete this image ?' => 'آیا مطمئنید که می خواهید این تصویر را حذف کنید؟', + 'Do you really want to delete this language ?' => 'آیا مطمئنید که می خواهید این زبان را حذف کنید؟', + 'Do you really want to delete this mailing template ?' => 'آیا مطمئنید که می خواهید این قالب ایمیلی را حذف کنید؟', + 'Do you really want to delete this module ?' => 'آیا مطمئنید که می خواهید این ماژول را حذف کنید؟', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => 'آیا مطمئنید که می خواهید این محصول را به همراه تمامی اجزاییش (تصاویر، سندها) را حذف کنید؟
    این کار برگشت ناپذیره.', + 'Do you really want to delete this profile ?' => 'آیا مطمئنید که می خواهید این پروفایل را حذف کنید؟', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'آیا مطمئنید که می‌خواهید این حراج را حذف کنید؟ تمامی محصولات مرتبط به آن دیگر در قسمت فروش نخواهند آمد', + 'Do you really want to delete this shipping zone ?' => 'آیا مطمئنید که می خواهید این منطقه حمل و نقلی را حذف کنید؟', + 'Do you really want to delete this tax ?' => 'آیا مطمئنید که می خواهید این نرخ مالیاتی را حذف کنید؟', + 'Do you really want to delete this tax rule ?' => 'آیا مطمئنید که می خواهید این نرخ مالیاتی را حذف کنید؟', + 'Do you really want to delete this template ? It will be removed from all products.' => 'آیا مطمئنید که می خواهید این قالب را حذف کنید؟ آن از تمامی محصولات حدف خواهد شد.', + 'Do you really want to delete this variable ?' => 'آیا مطمئنید که می خواهید این متغییر را حذف کنید؟', + 'Do you really want to remove the content from this folder ?' => 'آیا مطمئنید که می خواهید محتوای این فولدر را حذف کنید؟', + 'Do you really want to remove the product from this category ?' => 'آیا مطمئنید که می‌خواهید کالا را از این دسته حذف کنید؟', + 'Do you really want to remove this accessory from the product ?' => 'آیا مطمئنید که می‌خواهید این ملحقات را از محصول حذف کنید؟', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => 'آیا مطمئنید که می‌خواهید این خصوصیت را از تمام قالب‌های محصول حذف کنید؟ شما تمامی داده‌های مربوط به این خصوصیت در محصولات دیگر را نیز از دست خواهید داد.', + 'Do you really want to remove this attribute from the template ?' => 'آیا مطمئنید که می‌خواهید این خصوصیت را از قالب حذف کنید؟', + 'Do you really want to remove this country from this shipping zone ?' => 'آیا مطمئنید که می‌خواهید این کشور را از منطقه حمل و نقلی حذف کنید؟', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => 'آیا مطمئنید که می‌خواهید این ویژگی را از تمام قالب‌های محصول حذف کنید؟ شما تمامی داده‌های مربوط به این ویژگی را در محصولات دیگر را نیز از دست خواهید داد.', + 'Do you really want to remove this feature from the template ?' => 'آیا مطمئنید که می‌خواهید این ویژگی را از قالب حذف کنید؟', + 'Do you really want to remove this module from this hook ?' => 'آیا مطمئنید که می‌خواهید این ماژول را از این قلاب حذف کنید؟', + 'Do you really want to remove this related content ?' => 'آیا مطمئنید که می‌خواهید این مطالب مرتبط را حذف کنید؟', + 'Do you really want to remove this related content from the product ?' => 'آیا مطمئنید که می‌خواهید این مطالب مرتبط را از محصول حذف کنید؟', + 'Do you really want to remove this zone ?' => 'آیا مطمئنید که می‌خواهید این منطقه جغرافیایی را حذف کنید؟', + 'Do you really want to set this coupon available to everyone ?' => 'آیا مطمئنید که می‌خواهید هر کسی اجازه دسترسی به این کوپن را داشته باشد؟', + 'Do you really want to use this address by default ?' => 'آیا مطمئنید که می‌خواهید از این آدرس به صورت پیش فرض استفاده کنید؟', + 'Document informations' => 'سند اطلاعات', + 'Documents' => 'اسناد و مدارک', + 'Download invoice as PDF' => 'دریافت فاکتور به صورت فایل PDF', + 'Download purchase order as PDF' => 'دریافت رسید خرید به صورت فایل PDF', + 'Drop files to upload' => 'انتخاب فایل‌ها برای آپلود', + 'Drop tax here to create a tax group' => 'انتخاب کردن نرخ‌های مالیاتی اینجا برای ایجاد یک گروه مالیاتی جدید', + 'Drop tax here to delete from group' => 'انتخاب کردن نرخ‌های مالیاتی اینجا برای حذف از یک گروه', + 'E-mail' => 'ایمیل', + 'E-mail template you want to translate' => 'قالب ایمیلی که می‌خواهید ترجمه کنید', + 'E-mail templates' => 'قالب‌های ایمیل', + 'EAN Code' => 'بارکد', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax which adds an amount defined by a product feature to the product price.', + 'Edit' => 'ويرايش', + 'Edit Prices' => 'ویرایش قیمت', + 'Edit a country' => 'ویرایش یک کشور', + 'Edit a currency' => 'ویرایش ارز', + 'Edit a customer' => 'ویرایش مشتری', + 'Edit a customer address' => 'ویرایش آدرس مشتری', + 'Edit a document' => 'ویرایش سند', + 'Edit a feature' => 'ویرایش ویژگی', + 'Edit a hook' => 'ویرایش قلاب', + 'Edit a language' => 'ویرایش زبان', + 'Edit a mailing template' => 'ویرایش قالب ایمیلی', + 'Edit a module' => 'ویرایش ماژول', + 'Edit a module hook' => 'ویرایش یک ماژول قلاب', + 'Edit a profile' => 'ویرایش پروفایل', + 'Edit a shipping configuration' => 'ویرایش تنظیمات حمل و نقل', + 'Edit a shipping zone' => 'ویرایش منطقه حمل و نقل', + 'Edit a system variable' => 'ویرایش یک متغیر سیستمی', + 'Edit a tax' => 'ویرایش مالیات', + 'Edit a tax rule' => 'ویرایش یک نرخ مالیات', + 'Edit a template' => 'ویرایش قالب', + 'Edit an attribute' => 'ویرایش یک خصوصیت', + 'Edit an image' => 'ویرایش تصویر', + 'Edit an order' => 'ویرایش سفارش', + 'Edit api access' => 'ویرایش یک دسترسی API', + 'Edit attribute "%name"' => 'ویرایش خصوصیت "%name"', + 'Edit brand' => 'ویرایش نام تجاری', + 'Edit brand %title' => 'ویرایش نام تجاری %title', + 'Edit category' => 'ویرایش دسته', + 'Edit category %title' => 'ویرایش دسته %title', + 'Edit content' => 'ویرایش محتوا', + 'Edit content %title' => 'ویرایش محتوای %title', + 'Edit country "%name"' => 'ویرایش کشور "%name"', + 'Edit currency "%name"' => 'ویرایش واحد پولی "%name"', + 'Edit customer %firstname %lastname' => 'ویرایش مشتری %firstname %lastname', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'ویرایش مشتری %lastname %firstname (مرجع: %ref)', + 'Edit delivery address' => 'ویرایش آدرس تحویل', + 'Edit document "%name"' => 'ویرایش سند "%name"', + 'Edit feature "%name"' => 'ویرایش ویژگی "%name"', + 'Edit folder' => 'ويرايش پوشه', + 'Edit folder %title' => 'ویرایش پوشه‌ی %title', + 'Edit hook "%name"' => 'ویرایش قلاب "%name"', + 'Edit image "%name"' => 'ویرایش تصویر "%name"', + 'Edit information in %lng' => 'ویرایش اطلاعات در %lng', + 'Edit invoice address' => 'ویرایش آدرس صورت حساب', + 'Edit mailing template "%name"' => 'ویرایش قالب ایمیلی "%name"', + 'Edit next category' => 'ویرایش دسته‌ی بعدی', + 'Edit next content' => 'ویرایش مطلب بعدی', + 'Edit next folder' => 'ویرایش پوشه بعدی', + 'Edit next product' => 'ویرایش محصول بعدی', + 'Edit order address' => 'ویرایش نشانی سفارش', + 'Edit previous category' => 'ویرایش دسته قبلی', + 'Edit previous content' => 'ویرایش محتوای قبلی', + 'Edit previous folder' => 'ویرایش پوشه قبلی', + 'Edit previous product' => 'ویرایش محصول قبلی', + 'Edit prices in %curr' => 'ویرایش قیمت‌ها در %curr', + 'Edit product' => 'ویرایش کالا', + 'Edit product %title' => 'ویرایش محصولِ %title', + 'Edit template "%name"' => 'ویرایش قالب "%name"', + 'Edit this address' => 'ویرایش این آدرس', + 'Edit this brand' => 'ویرایش این نام تجاری', + 'Edit this category' => 'ویرایش این دسته', + 'Edit this content' => 'ویرایش این مطلب', + 'Edit this customer' => 'ویرایش این مشتری', + 'Edit this delivery zone' => 'ویرایش این منطقه تحویل', + 'Edit this folder' => 'ویرایش این پوشه', + 'Edit this module' => 'ویرایش این ماژول', + 'Edit this order' => 'ویرایش این سفارش', + 'Edit this product' => 'ویرایش این محصول', + 'Edit variable %name' => 'ویرایش متغیر %name', + 'Editing %cat' => 'ویرایش %cat', + 'Editing %fold' => 'ویرایش %fold', + 'Editing %title' => 'ویرایش %title', + 'Editing attribute "%name"' => 'ویرایش خصوصیت "%name"', + 'Editing brand "%title"' => 'ویرایش نام تجاری "%title"', + 'Editing country "%name"' => 'ویرایش کشور "%name"', + 'Editing coupon "%title"' => 'ویرایش کوپن "%title"', + 'Editing currency "%name"' => 'ویرایش ارز "%name"', + 'Editing document "%name"' => 'ویرایش سند "%name"', + 'Editing feature "%name"' => 'ویرایش ویژگی "%name"', + 'Editing hook "%name"' => 'ویرایش قلاب "%name"', + 'Editing hook for module "%name"' => 'ویرایش قلابِ ماژولِ "%name"', + 'Editing image "%name"' => 'ویرایش تصویر "%name"', + 'Editing mailing template "%name"' => 'ویرایش قالب ایمیلی "%name"', + 'Editing module' => 'ویرایش ماژول', + 'Editing profile' => 'ویرایش پروفایل', + 'Editing profile \'%name\'' => 'ویرایش پروفایل \'%name\'', + 'Editing shipping configuration for module "%name"' => 'ویرایش تنظیمات حمل و نقل برای ماژول "%name"', + 'Editing shipping zone "%name"' => 'ویرایش منطقه حمل و نقل "%name"', + 'Editing tax' => 'ویرایش مالیات', + 'Editing tax rule' => 'ویرایش نرخ مالیات', + 'Editing template "%name"' => 'ویرایش قالب "%name"', + 'Editing variable "%name"' => 'ویرایش متغیر "%name"', + 'Email' => 'ایمیل', + 'Email address' => 'نشانی ایمیل', + 'Email addresses' => 'آدرس ایمیل‌ها', + 'Email confirmation address' => 'آدرس تاییدیه‌ی ایمیل', + 'Enable remote SMTP use : ' => 'فعال سازی استفاده از پروتکل SMPT:', + 'Enable/Disable' => 'فعال/غیر فعال', + 'Enabled' => 'فعال کردن', + 'Encryption' => 'رمزگذاری', + 'Encryption :' => 'رمزگذاری:', + 'End Date' => 'تاریخ پایان', + 'Enter here all possible attribute values.' => 'تمامی مقادیر ممکن برای خصوصیت‌ها را اینجا وارد کنید.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'تمامی مقادیر ممکن برای ویژگی‌ها را اینجا وارد کنید. برای اینکه متنی در فرم محصول نمایش داده نشود، مقدار آن را خالی رها کنید.', + 'Enter here the attribute name in the default language (%language_name)' => 'عنوان خصوصیت را بر اساس زبان پیش فرض (%language_name)، اینجا وارد کنید', + 'Enter here the category name in the default language (%title)' => 'عنوان دسته را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the content name in the default language (%title)' => 'عنوان محتوا را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the currency name in the default language (%title)' => 'عنوان واحد ارز را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the feature name in the default language (%title)' => 'عنوان ویژگی را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the feature value as free text' => 'مقدار ویژگی را به صورت یک متن ساده، اینجا وارد کنید', + 'Enter here the folder name in the default language (%title)' => 'عنوان پوشه را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the product name in the default language (%title)' => 'عنوان محصول را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the product price in %title' => 'اینجا قیمت محصول در %title را وارد کنید', + 'Enter here the product reference' => 'مرجع محصول را اینجا وارد کنید', + 'Enter here the product stock' => 'موجودی محصول را وارد کنید', + 'Enter here the product tax price in %title' => 'اینجا قسمت مالیات خورده‌ی محصول در %title را وارد کنید', + 'Enter here the product weight, in Kilogrammes' => 'وزن محصول را به کیلوگرم در اینجا وارد کنید', + 'Enter here the template name in the default language (%title)' => 'عنوان قالب را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter here the value in the current edit language (%language_name)' => 'مقدار را بر اساس زبان (%language_name) در حال ویرایش، اینجا وارد کنید', + 'Enter here the value in the current edit language (%title)' => 'مقدار را بر اساس زبان (%title) در حال ویرایش اینجا وارد کنید', + 'Enter here the value in the default language (%title)' => 'مقدار را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter information in the default language (%title)' => 'اطلاعات را بر اساس زبان پیش فرض (%title)، اینجا وارد کنید', + 'Enter new accessory position' => 'موقعیت ملحقات جدید را وارد کنید', + 'Enter new attribute position' => 'موقعیت خصوصیت جدید را وارد کنید', + 'Enter new brand position' => 'موقعیت نام تجاری جدید را وارد کنید', + 'Enter new category position' => 'موقعیت دسته بندی جدید را وارد کنید', + 'Enter new content position' => 'موقعیت محتوای جدید را وارد کنید', + 'Enter new currency position' => 'موقعیت واحد پولی جدید را وارد کنید', + 'Enter new export category position' => 'موقعیت دسته‌ی برون ریزی جدید را وارد کنید', + 'Enter new export position' => 'موقعیت برون ریزی جدید را وارد کنید', + 'Enter new feature position' => 'موقعیت ویژگی جدید را وارد کنید', + 'Enter new folder position' => 'موقعیت پوشه جدید را وارد کنید', + 'Enter new import category position' => 'موقعیت دسته‌ی درون ریزی شده‌ی جدید را وارد کنید', + 'Enter new import position' => 'موقعیت درون ریزی شده‌ی جدید را وارد کنید', + 'Enter new module hook position' => 'موقعیت ماژول قلاب جدید را وارد کنید', + 'Enter new module position' => 'موقعیت ماژول جدید را وارد کنید', + 'Enter new product position' => 'موقعیت محصول جدید را وارد کنید', + 'Enter new value position' => 'موقعیت مقدار جدید را وارد کنید', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'یک یا چند آی پی ورژن ۴ را می‌توانید وارد کنید. از نشانه‌ی «;» می‌توانید برای جدا کردن آی پی ها استفاده کنید. در صوردتی که فیلد را خالی رها کنید، لاگ تمامی آی پی ها نمایش داده خواهد شد', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'می‌توانید یک یا چند نام فایل را بدون مسیر دایرکتوریشان وارد کنید. از نشانه‌ی «;» می‌توانید برای جدا کردن آنها استفاده کنید. از نشانه‌ی «!» برای مستثنی کردن و از نشانه‌ی «*» هم برای فعال کردن نمایش لاگ برای تمامی فایل‌ها می‌توانید استفاده کنید.', + 'Enter quantity' => 'تعداد را وارد کنید', + 'Error' => 'خطا', + 'Errors' => 'خطاها', + 'Example :' => 'مثال:', + 'Exchange rate' => 'نرخ تبدیل', + 'Existing combinations will be deleted. Do you want to continue ?' => 'ترکیب موجود حذف خواهد شد. آیا مایلید ادامه دهید؟', + 'Expiration date' => 'تاریخ انقضا', + 'Expiration date * :' => 'تاریخ انقضا *:', + 'Expired' => 'منقضی شده', + 'Export' => 'خروجی گرفتن', + 'Exports' => 'خروجی‌ها', + 'Failed to get converted prices. Please try again.' => 'تبدیل قیمت‌ها با موفقیت انجام نشد. لطفا دوباره سعی کنید.', + 'Failed to get prices. Please try again.' => 'قیمت دریافت نشد. لطفا دوباره سعی کنید.', + 'Feature Name' => 'نام ویژگی', + 'Feature information' => 'اطلاعات ویژگی', + 'Feature title' => 'عنوان ویژگی', + 'Feature value' => 'مقدار ویژگی', + 'Feature value for this product' => 'مقدار ویژگی برای این محصول', + 'Feature values' => 'مقدارهای ویژگی', + 'Features' => 'ویژگی‌ها', + 'File' => 'فایل', + 'File names' => 'نام فایل', + 'Filename' => 'نام فایل', + 'Filter by hook name:' => 'فیلتر بر اساس نام قلاب:', + 'First Name' => 'نام', + 'First name' => 'نام', + 'Firstname' => 'نام', + 'Flush the Thelia internal cache' => 'تخلیه‌ی کش داخلی فروشگاه', + 'Flush the assets cache directory' => 'تخلیه‌ی دایرکتوری کش assetها', + 'Flush the images and documents cache' => 'تخلیه‌ی کش تصاویر و سندها', + 'Folder' => 'پوشه', + 'Folder created on %date_create. Last modification: %date_change' => 'پوشه ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Folder title' => 'عنوان پوشه', + 'Folders' => 'پوشه‌ها', + 'Folders in %fold' => 'پوشه‌ها در %fold', + 'For prices in %currency' => 'قیمت در %currency', + 'Format: %fmt' => 'فرمت: %fmt ', + 'Format: %fmt, e.g. %date' => 'فرمت: %fmt مانند %date', + 'Free shipping for methods :' => 'حمل و نقل رایگان برای روش:', + 'Free shipping to countries :' => 'حمل و نقل رایگان به کشورهای:', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'نرخ مالیات بر ارزش افزوده اجناس در فرانسه برای هر کالایی 20 درصد است که آن به قیمت محصول افزوده می‌شود.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => ' French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'From' => 'از', + 'Front Office' => 'بخش فروشگاهی', + 'Front-office template you want to translate' => 'قالب پنل پشتیبانی فنی که می‌خواهید ترجمه کنید', + 'Front-office templates' => 'قالب پنل پشتیبانی فنی', + 'General' => 'عمومی', + 'General configuration' => 'پیکربندی عمومی', + 'General description' => 'شرح کلی', + 'General tools' => 'ابزارهای عمومی', + 'Get more information about this module' => 'دریافت اطلاعات بیشتر در مورد این ماژول', + 'Go to administration home' => 'برو به صفحه اصلی پنل مدیریت', + 'Go to first page' => 'برو به صفحه اول', + 'Go to last page' => 'برو به آخرین صفحه', + 'Go to next page' => 'برو به صفحه بعدی', + 'Go to previous page' => 'برو به صفحه قبلی', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'نسخه HTML این پیام', + 'Hide empty hook' => 'پنهان کردن قلاب خالی', + 'Home' => 'خانه', + 'Hook positions' => 'موقعیت‌های قلاب', + 'Hooks' => 'قلاب‌ها', + 'Host' => 'میزبان', + 'Host :' => 'میزبان:', + 'ID' => 'ID', + 'IP Addresses' => 'آدرسBهای IP', + 'ISO 4217 Code' => 'کد ISO 4217', + 'ISO 4217 code' => 'کد ISO 4217', + 'ISO 639 Code' => 'کد ISO 639', + 'ISO Code' => 'کد ISO', + 'If a translation is missing or incomplete :' => 'اگر ترجمه از بین رفته یا ناقص است:', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'اگر بله، ری‌دایرکشن‌ها از طریق متد Redirect::exec() به عنوان لینک نمایش داده می‌شوند', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'در صورت تغییر قالب، تمامی قیمت‌ها از نو مقدار دهی می‌شوند و شما باید آن‌ها را دوباره تنظیم کنید.', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'اگر می‌خواهید اجزای هسته‌ی فروشگاه را ترجمه کنید، این‌ها هستند: core، install، default modules و default templates.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'اگر هدف شما از ترجمه متون، تنها ترجمه برای سایت خودتان است، لطفا از حالت user mode استفاده کنید.
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'به نظر می‌آید این رشته متنی دارای متغییرهای اسمارتی ($) است. در این صورت، اون نمی‌تونه درست ترجمه بشه.', + 'Image information' => 'اطلاعات تصویر', + 'Image+file+not+found' => 'فایل+تصویر+موجود+نیست', + 'Images' => 'تصاویر', + 'Import' => 'درون ریزی', + 'Import this file' => 'درون ریزی این پرونده', + 'Imports' => 'درون ریزی‌ها', + 'Impossible to change active flag. Please contact your administrator or try later' => 'امکان تغییر پرچم فعال وجود ندارد. لطفا با مدیر خود تماس بگیرید یا دوباره امتحان کنید', + 'Impossible to change default country. Please contact your administrator or try later' => 'امکان تغییر کشور پیش فرض وجود ندارد. لطفا با مدیر خود تماس بگیرید یا دوباره امتحان کنید', + 'Impossible to change default languages. Please contact your administrator or try later' => 'امکان تغییر زبان پیش فرض وجود ندارد. لطفا با مدیر خود تماس بگیرید یا دوباره امتحان کنید', + 'Impossible to change official hook. Please contact your administrator or try later' => 'امکان تغییر قلاب پیش فرض وجود ندارد. لطفا با مدیر خود تماس بگیرید یا دوباره امتحان کنید', + 'In order to manges your shop taxes you can manage' => 'به منظور مدیریت مالیات فروشگاه خود، شما می‌توانید مدیریت کنید', + 'In page' => 'در صفحه', + 'In pages:' => 'در صفحه‌های:', + 'Inactive' => 'غیرفعال', + 'Included countries' => 'کشورهای مشمول', + 'Information on this hook' => 'اطلاعات موجود در این قلاب', + 'Install !' => 'نصب!', + 'Install or update a module' => 'نصب یا به روز رسانی ماژول', + 'Invoice' => 'فاکتور', + 'Invoice and Delivery' => 'فاکتور و تحویل', + 'Invoice date' => 'تاریخ فاکتور', + 'Invoice informations' => 'اطلاعات فاکتور', + 'Invoice reference' => 'مرجع فاکتور', + 'It\'s strongly recommended to use our translation platform' => 'به شدت توصیه می‌کنیم تا از پلتفرم ترجمه‌ی ما استفاده کنید', + 'Items to translate' => 'موارد ترجمه', + 'Keep attention that in translating you can override the resource translations.
    ' => 'دقت داشته باشید که ترجمه شما می‌توانید ترجمه‌های منبع را بازنویسی کنید.
    ', + 'Kg' => 'کیلوگرم', + 'Label' => 'برچسب', + 'Language name' => 'نام زبان', + 'Language title' => 'عنوان زبان', + 'Languages' => 'زبان‌‌‌‌‌‌ها', + 'Languages & URLs' => 'زبان و URLها', + 'Languages management' => 'مدیریت زبان', + 'Last Name' => 'نام خانوادگی', + 'Last name' => 'نام خانوادگی', + 'Last order amount' => 'مقدار آخرین سفارش', + 'Lastname' => 'نام خانوادگی', + 'Leave empty to keep current password' => 'فیلد را خالی رها کنید تا رمز عبور جاری شما در نظر گرفته شود', + 'Locale' => 'محلی', + 'Log lines format' => 'شکل‌بندی خطوط لاگ', + 'Log lines header format. You may use the following variables: ' => 'فرمت هدر خط‌های لاگ. شما می توانید از متغیرهای زیر استفاده کنید: ', + 'Login' => 'ورود', + 'Logout' => 'خروج', + 'Long description :' => 'شرح کامل:', + 'Mailing system' => 'سیستم ایمیلی', + 'Mailing templates' => 'قالب‌های ایمیلی', + 'Manage attributes included in this product template' => 'مدیریت خصوصیت‌های موجود در این قالب محصول', + 'Manage features included in this product template' => 'مدیریت ویژگی‌های موجود در این قالب محصول', + 'Manage hooks' => 'مدیریت قلاب‌ها', + 'Manage its hooks' => 'مدیریت ماژول ضمیمه‌ها', + 'Manage module rights' => 'مدیریت ماژول حقوق', + 'Manage modules' => 'مدیریت ماژول‌ها', + 'Manage modules attachements' => 'مدیریت ماژول‌های ضمیمه‌ها', + 'Manage resource rights' => 'مدیریت منابع حقوق', + 'Manage taxes' => 'مدیریت مالیات‌ها', + 'Manage the tax rule taxes appliance order' => 'مدیریت نرخ‌های مالیاتی فرم‌های سفارش', + 'Maximum usage count :' => 'تعداد استفاده شده‌ها:', + 'Message created on %date_create. Last modification: %date_change' => 'پیام ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Message data' => 'داده‌های پیام', + 'Message level' => 'سطح پیام', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'پیام هایی که دارای سطح بزرگتر یا برابر با سطح انتخاب شده هستند، به لاگ مقصدها اضافه خواهند شد. ', + 'Minimum required Thelia version' => 'حداقل نسخه‌ی تلیایی مورد نیاز', + 'Module' => 'ماژول', + 'Module %mod: %error' => 'ماژول %mod: %error', + 'Module access rights' => 'ماژول قوانین دسترسی', + 'Module code' => 'ماژول کد', + 'Module component' => 'ماژول کامپوننت', + 'Module created on %date_create. Last modification: %date_change' => 'ماژول ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Module detailed information' => 'ماژول اطلاعات دقیق', + 'Module file' => 'فایل ماژول', + 'Module name' => 'نام ماژول', + 'Module type' => 'نوع ماژول', + 'Module you want to translate' => 'ماژولی که شما می خواهید ترجمه کنید', + 'Modules' => 'ماژول‌ها', + 'Modules attachments' => 'پیوست‌های ماژول‌ها', + 'More information about ISO 4217' => 'اطلاعات بیشتر در مورد ISO 4217', + 'More pages after' => 'صفحات بیشتر بعدی', + 'More pages before' => 'صفحات بیشتر قبل', + 'Name' => 'نام', + 'Namespace of main class' => 'Namespace کلاس اصلی', + 'New' => 'جديد', + 'No' => 'خیر', + 'No Folders found' => 'هیچ پوشه‌ای پیدا نشد', + 'No administration profile defined yet. Click the + button to create one.' => 'هیچ پروفایل مدیریتی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No area defined with this id' => 'هیچ ناحیه‌ای تعریف نشده است با این شناسه', + 'No attributes.' => 'بدون خصوصیت‌.', + 'No available content in this folder' => 'هیچ محتوایی در این پوشه نیست', + 'No available product in this category' => 'هیچ محصولی در این دسته نیست', + 'No available value for this attribute' => 'هیچ مقداری در این خصوصیت وارد نشده', + 'No brand' => 'بدون نام تجاری', + 'No brand has been created yet. Click the + button to create one.' => 'هیچ نام تجاری تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No categories found' => 'دسته بندی یافت می‌نشد', + 'No country has been created yet. Click the + button to create one.' => 'هیچ کشوری تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'هیچ کوپنی تا به حال ایجاد نشده است. برای ایجاد اولین کوپن خود بر روی دکمه‌ی (+) کلیک کنید.', + 'No currency has been created yet. Click the + button to create one.' => 'هیچ واحد پولی در حال حاضر ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No description for this hook' => 'هیچ توصیفی برای این قلاب وجود ندارد', + 'No document' => 'هیچ سندی نیست', + 'No folders found' => 'هیچ پوشه‌ای پیدا نشد', + 'No hooks has been created yet. Click the + button to create one.' => 'هیچ قلابی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No logo image' => 'تصویر لوگویی موجود نیست', + 'No mailing template has been created yet. Click the + button to create one.' => 'هیچ فالب ایمیلی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No module of this type was found.' => 'ماژولی تحت این نوع پیدا نشد.', + 'No orders fo this customer.' => 'این مشتری هیچ سفارشی ندارد.', + 'No product attribute has been created yet. Click the + button to create one.' => 'هیچ خصوصیت محصولی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No product feature has been created yet. Click the + button to create one.' => 'هیچ ویژگی محصولی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No product template has been created yet. Click the + button to create one.' => 'هیچ قالب محصولی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No sale has been created yet. Click the + button to create one.' => 'هیچ حراجی تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No shipping zone attached to this module, click here to attach one' => 'هیچ منطقه‌ی حمل و نقلی ای تا به حال ایجاد نشده است. برای اضافه کردن یکی اینجا کلیک کنید', + 'No shipping zone defined yet. Click the + button to create one.' => 'هیچ منطقه حمل و نقلی ای تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'No value has been created yet. Click the + button to create one.' => 'هیچ مقداری تا به حال ایجاد نشده است. برای ایجاد یکی، بر روی دکمه‌ی + کلیک کنید.', + 'None' => 'هیچکدام', + 'None defined' => 'تعریف نشده', + 'N° ISO' => 'N° ISO', + 'OK' => 'تایید', + 'Official' => 'رسمی', + 'Online' => 'آنلاین', + 'Oops! An Error Occurred' => 'اوه! خطایی رخ داده', + 'Or' => 'یا', + 'Order %ref - ID %id' => 'سفارش %ref - شناسه %id', + 'Order details' => 'جزییات سفارش', + 'Order n°' => 'سفارش n°', + 'Order status:' => 'وضعیت سفارش:', + 'Ordered products' => 'محصولات سفارش داده شده', + 'Orders' => 'سفارش', + 'Originating file line number ' => 'شماره خط فایل آغازین ', + 'Originating file name' => 'نام فایل آغازین', + 'Originating function name ' => 'نام تابع آغازین ', + 'Other addresses' => 'آدرس‌های دیگر', + 'PDF template you want to translate' => 'قالب PDF ای که می‌خواهید ترجمه کنید', + 'PDF templates' => 'قالب PDF', + 'PDF | Invoice' => 'PDF | فاکتور', + 'PDF | Purchase order' => 'PDF | سفارش خرید', + 'Page not found' => 'صفحه پیدا نشد', + 'Parameters' => 'پارامترها', + 'Parse template' => 'پارسر قالب', + 'Password' => 'رمز عبور', + 'Password :' => 'رمز عبور:', + 'Payment information' => 'اطلاعات پرداخت', + 'Payment module' => 'ماژول پرداخت', + 'Payment modules' => 'ماژول‌های پرداخت', + 'Percent Discount' => 'درصد تخفیف', + 'Period' => 'دوره', + 'Phone' => 'تلفن ثابت', + 'Phone & Fax' => 'تلفن و فکس', + 'Phone number' => 'شماره تلفن', + 'Please enter the date using the %fmt format' => 'ممنون برای مشخص کردن فرمت برای تاریخ %fmt', + 'Please retry' => 'لطفا دوباره سعی کنید', + 'Please save this coupon first to define coupon conditions' => 'لطفا برای تعریف شروط کوپن، ابتدا کوپن را ذخیره کنید', + 'Please select a condition' => 'لطفا شرایط را انتخاب کنید', + 'Please select a coupon type' => 'لطفا نوع کوپن را انتخاب کنید', + 'Please select another condition' => 'لطفا شرط دیگری انتخاب کنید', + 'Please select at least one category.' => 'لطفا حداقل یک دسته را انتخاب کنید.', + 'Please select items to translate' => 'لطفا موارد را برای ترجمه انتخاب کنید', + 'Please select one or more categories which contains some products' => 'لطفا یک یا چند دسته بندی که شامل برخی از محصولات هستند را انتخاب کنید', + 'Please select the B.O. template to translate' => 'لطفا قالب B.O برای ترجمه انتخاب کنید', + 'Please select the E-mail template to translate' => 'لطفا قالب ایمیل را برای ترجمه انتخاب کنید', + 'Please select the F.O. template to translate' => 'لطفا قالب F.O برای ترجمه انتخاب کنید', + 'Please select the PDF template to translate' => 'لطفا قالب PDF را برای ترجمه انتخاب کنید', + 'Please select the module component' => 'لطفا ماژول کامپوننت را انتخاب کنید', + 'Please select the module to translate' => 'لطفا ماژول را برای ترجمه انتخاب کنید', + 'Please select your editing mode :' => 'شما حالت ویرایش را انتخاب کنید:', + 'Please select...' => 'لطفا انتخاب کنید...', + 'Please wait, loading' => 'لطفاً صبر کنید، در حال بارگذاری', + 'Please wait, loading products list' => 'لطفا صبر کنید، لیست محصولات در حال بارگذاری است', + 'Port' => 'درگاه', + 'Port :' => 'درگاه:', + 'Position' => 'موقعیت', + 'Postage' => 'هزینه پست', + 'Postscriptum' => 'Postscriptum', + 'Preview' => 'پیش نمایش', + 'Preview HTML' => 'پیش نمایش HTML', + 'Preview category page' => 'پیش نمایش صفحه‌ی دسته', + 'Preview folder page' => 'پیش نمایش صفحه‌ی پوشه', + 'Preview product page' => 'پیش نمایش صفحه‌ی محصول', + 'Preview text' => 'متن پیش نمایش', + 'Price' => 'قیمت', + 'Price (%currency)
    w/ taxes' => 'قیمت (%currency)
    w/ مالیات‌ها', + 'Price (%currency)
    w/o taxes' => 'قیمت (%currency)
    w/o مالیات‌ها', + 'Price excl. taxes' => 'قیمت بدون مالیات', + 'Price incl. taxes' => 'قیمت شامل مالیات', + 'Pricing' => 'قیمت گذاری', + 'Product' => 'محصول', + 'Product Attributes' => 'مشخصه‌های محصول', + 'Product EAN Code' => 'بارکد محصول', + 'Product Features' => 'ویژگی‌های محصول', + 'Product accessories' => 'ملحقات محصول', + 'Product attribute selection' => 'انتخاب خصوصیات محصول', + 'Product attributes' => 'مشخصه‌های محصول', + 'Product catalog configuration' => 'پیکربندی کاتالوگ محصول', + 'Product created on %date_create. Last modification: %date_change' => 'محصول ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Product features' => 'ویژگی‌های محصول', + 'Product price' => 'قیمت محصول', + 'Product price including taxes' => 'قیمت محصول با مالیات', + 'Product stock' => 'موجودی محصول', + 'Product tax price' => 'میزان مالیات محصول', + 'Product templates' => 'قالب‌های محصول', + 'Product title' => 'عنوان کالا', + 'Product weight' => 'وزن محصول', + 'Product\'s attributes included in this sale operation' => 'خصوصیت های محصول در این عملیات حراج وارد شدن', + 'Products' => 'محصولات', + 'Products are :' => 'محصولات عبارتند از:', + 'Products in %cat' => 'محصولات %cat', + 'Products selection' => 'انتخاب محصولات', + 'Profil' => 'پروفایل', + 'Profile' => 'پروفایل', + 'Profile code' => 'کد پروفایل', + 'Profile created on %date_create. Last modification: %date_change' => 'پروفایل ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Profiles' => 'پروفایل‌ها', + 'Promotion' => 'پروموشن', + 'Provides free shipping' => 'فراهم کردن حمل و نقل رایگان', + 'Published by OpenStudio' => 'منتشر شده توسط OpenStudio', + 'Purpose' => 'هدف', + 'Put module in hook' => 'ماژول را در قلاب قرار دهید', + 'Quantity' => 'تعداد', + 'Quickly create combinations using the combination builder' => 'ایجاد سریع ترکیب‌ها با استفاده از ترکیب ساز', + 'Rate' => 'نرخ', + 'Read module documentation' => 'خواندن مستندات ماژول', + 'Read the documentation of this module' => 'خواندن مستندات این ماژول', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'متن را به صورت سراسرس بازتعریف کنید. تمامی متونی که توسط این مترجم ترجمه شده است، به غیر از آن ترجمه‌هایی که از منبع هستند.', + 'Redefine the text only for this resource.' => 'تعریف دوباره متن، تنها برای این منبع.', + 'Reference' => 'مرجع', + 'Registration date' => 'تاریخ عضویت', + 'Related content' => 'مطالب مرتبط', + 'Remove a module from a hook' => 'حذف یک ماژول از قلاب', + 'Remove an accessory' => 'حدف ملحقات', + 'Remove associated folder' => 'حذف پوشه مربوط', + 'Remove attribute' => 'حذف خصوصیت', + 'Remove country' => 'حذف کشور', + 'Remove feature' => 'حذف ویژگی', + 'Remove from all product templates' => 'حذف از تمام قالب‌های محصول', + 'Remove from category' => 'حذف از دسته بندی', + 'Remove from selected categories' => 'حذف از دسته‌های انتخاب شده', + 'Remove related content' => 'حذف مطالب مرتبط', + 'Remove selected values' => 'حذف مقادیر انتخاب شده', + 'Remove the product from this category' => 'حذف محصولی از این دسته بندی', + 'Remove this attribute from all product templates' => 'حدف این خصوصیت از تمامی قالب‌های محصول', + 'Remove this feature from all product templates' => 'حدف این ویژگی از تمامی قالب‌های محصول', + 'Remove zone' => 'حذف منطقه جغرافیایی', + 'Required modules' => 'ماژول‌های مورد نیاز', + 'Reset sale status for all products' => 'تنظیم مجدد وضعیت حراج برای تمام محصولات', + 'Resource' => 'منبع', + 'Resource access rights' => 'منابع حقوق دسترسی', + 'Resources' => 'منابع', + 'Rights' => 'حقوق', + 'SEO' => 'سئو', + 'Sale' => 'حراج', + 'Sale configuration' => 'پیکربندی حراج', + 'Sale created on %date_create. Last modification: %date_change' => 'حراج ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Sale operation description' => 'شرح عملیات حراج', + 'Sale operation features' => 'ویژگی‌های عملیات فروش', + 'Sale price (%currency)
    w/ taxes' => 'مالیات قیمت حراج (%currency)
    w/', + 'Sale price (%currency)
    w/o taxes' => 'مالیات قیمت حراج (%currency)
    w/o', + 'Sale price incl. taxes' => 'قیمت حراج شامل مالیات است', + 'Sales management' => 'مدیریت حراج', + 'Save' => 'ذخيره', + 'Save and close' => 'ذخیره و بستن', + 'Save chages' => 'ذخیره تغییرات', + 'Save changes' => 'ذخیره تغییرات', + 'Save this address' => 'ذخیره‌ی این آدرس', + 'Save this condition' => 'ذخیره‌ی این شرط', + 'Search' => 'جستجو', + 'Search a module' => 'جستجوی یک ماژول', + 'Search for \'%term\'' => 'جستجو برای \'%term\'', + 'Search on Thelia Modules' => 'جستجو در ماژول‌های تلیا', + 'Secure key' => 'کلید امن', + 'Select' => 'انتخاب', + 'Select a category and click (+) to add it to the additional category list' => 'یک دسته بندی را انتخاب کنید و بر روی دکمه (+) برای اضافه کردن آن به لیست دسته بندی‌ها کلیک کنید', + 'Select a category to get its products' => 'برای رسیدن به محصولات یک دسته‌بندی، یکی را انتخاب کنید', + 'Select a category...' => 'انتخاب یک دسته‌بندی...', + 'Select a content and click (+) to add it to this category' => 'یک محتوا را انتخاب کنید و برای اضافه کردن آن به این دسته بندی بر روی دکمه (+) کلیک کنید', + 'Select a content and click (+) to add it to this product' => 'یک محتوا را انتخاب کنید و برای اضافه کردن آن به این محصول بر روی دکمه (+) کلیک کنید', + 'Select a feature and click (+) to add it to this template' => 'یک ویژگی را انتخاب کنید و برای اضافه کردن آن به این قالب بر روی دکمه (+) کلیک کنید', + 'Select a feature...' => 'انتخاب یک ویژگی...', + 'Select a folder and click (+) to add it to the additional folder list' => 'یک پوشه را انتخاب کنید و برای اضافه کردن آن به لیست پوشه اضافی بر روی دکمه (+) کلیک کنید', + 'Select a folder content...' => 'یک پوشه‌ی محتوا انتخاب کنید...', + 'Select a folder to get its content' => 'یک فولدر را برای دریافت محتوای آن انتخاب کنید', + 'Select a folder...' => 'یک پوشه را انتخاب کن...', + 'Select a product and click (+) to add it as an accessory' => 'یک محصول را انتخاب کنید و برای اضافه کردن آن به ملحقات بر روی دکمه (+) کلیک کنید', + 'Select a product...' => 'انتخاب یک محصول...', + 'Select a tax tule' => 'انتخاب یک قاعده‌ی مالیات', + 'Select a template' => 'انتخاب قالب', + 'Select a value click (+) to add it to the combination' => 'یک مقدار را انتخاب کنید و برای اضافه کردن آن به ترکیب بر روی دکمه (+) کلیک کنید', + 'Select an attribute and click (+) to add it to this template' => 'یک خصوصیت را انتخاب کنید و برای اضافه کردن آن به قالب بر روی دکمه (+) کلیک کنید', + 'Select an attribute and click (+) to view available values' => 'یک خصوصیت را انتخاب کنید و برای دیدن مقادیر موجودش بر روی دکمه (+) کلیک کنید', + 'Select an attribute value...' => 'انتخاب یک مقدار خصوصیت...', + 'Select an attribute...' => 'انتخاب یک خصوصیت...', + 'Select attribute :' => 'انتخاب خصوصیت:', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'مقادیر خصوصیت ترکیب را انتخاب کنید. شما می توانید برای بعضی از فیلدهایی که ترکیب‌ها ایجاد کرده‌اند مقدار پیش فرض تعیین کنید.', + 'Select here a template for this product' => 'انتخاب قالب برای این محصول', + 'Select here the tax applicable to this product' => 'از اینجا مالیات مربوط به این محصول را انتخاب کنید', + 'Select offered product :' => 'انتخاب محصول‌های پیشنهاد داده شده:', + 'Select offrered product category :' => 'انتخاب دسته‌ی محصول‌های پیشنهاد داده شده:', + 'Select or deselect all products' => 'انتخاب یا عدم انتخاب تمامی محصولات', + 'Select product category :' => 'انتخاب دسته‌ی محصول:', + 'Select the attributes values of "%title" that should be included in this sale operation.' => 'مقدار خصوصیت "%title" که باید در عملیات حراج دخیل باشد انتخاب کنید.', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'محصولاتی را که در عملیات حراج دخیل هستند انتخاب کنید. در صورت نیاز می‌توانید انتخاب‌های خود را به خصوصیت بعضی از محصولات فقط محدود کنید.', + 'Selected categories' => 'دسته‌بندی‌های انتخاب شده', + 'Send' => 'ارسال', + 'Send a mail to this customer' => 'ارسال ایمیل به این مشتری', + 'Send files' => 'ارسال فایل‌ها', + 'Sequential number of log line' => 'اعداد ترتیبی از خطوط لاگ فایل', + 'Set as default tax rule' => 'مشخص کردن به عنوان نرخ مالیات پیش فرض', + 'Sets the separator for the decimal point' => 'جداکننده‌ی مقدار اعشاری را مشخص کنید', + 'Sets the thousands separator.' => 'جداکننده‌ی هزارگان را مشخص کنید.', + 'Shipping configuration' => 'پیکربندی حمل و نقل', + 'Shipping configuration of delivery module "%title"' => 'پیکربندی حمل و نقل ماژول تحویل "%title"', + 'Shipping zone' => 'ناحیه حمل و نقل', + 'Shipping zone "%title"' => 'ناحیه حمل و نقل "%title"', + 'Shipping zones' => 'مناطق حمل و نقل', + 'Shipping zones for this country' => 'مناطق حمل و نقل برای این کشور', + 'Shipping zones for this module' => 'مناطق حمل و نقل برای این ماژول', + 'Shipping zones management' => 'مدیریت مناطق حمل و نقل', + 'Short description' => 'توضیحات کوتاه', + 'Short description :' => 'توضیحات کوتاه:', + 'Show logs' => 'نمایش لاگ', + 'Some of your translations are not saved. Continue anyway ?' => 'برخی از ترجمه های شما ذخیره نشده‌اند. به هر حال ادامه می دهید؟', + 'Something goes wrong, please try again' => 'چیزی اشتباه شده است، لطفا دوباره سعی کنید', + 'Something goes wrong, please try again.' => 'چیزی اشتباه شده است، لطفا دوباره سعی کنید.', + 'Sorry, attribute ID=%id was not found.' => 'با عرض پوزش، خصوصیت ID = %id پیدا شد.', + 'Sorry, country ID=%id was not found.' => 'با عرض پوزش، کشور ID = %id پیدا شد.', + 'Sorry, currency ID=%id was not found.' => 'با عرض پوزش، واحد ارز ID = %id پیدا شد.', + 'Sorry, customer ID=%id was not found.' => 'با عرض پوزش، ID = %id پیدا نشد.', + 'Sorry, document ID=%id was not found.' => 'با عرض پوزش، سند ID = %id پیدا نشد.', + 'Sorry, feature ID=%id was not found.' => 'با عرض پوزش، ویژگی ID = %id پیدا نشد.', + 'Sorry, hook ID=%id was not found.' => 'با عرض پوزش، قلاب ID = %id پیدا نشد.', + 'Sorry, image ID=%id was not found.' => 'با عرض پوزش، تصویر ID = %id پیدا نشد.', + 'Sorry, message ID=%id was not found.' => 'با عرض پوزش، پیام ID = %id پیدا نشد.', + 'Sorry, module hook ID=%id was not found.' => 'با عرض پوزش، ماژول قلاب ID = %id پیدا نشد.', + 'Sorry, template ID=%id was not found.' => 'با عرض پوزش، قالب ID = %id پیدا نشد.', + 'Sorry, variable ID=%id was not found.' => 'با عرض پوزش، متغیر ID = %id پیدا نشد.', + 'Source IP' => 'منبع IP', + 'Source IP :' => 'منبع IP:', + 'Stability' => 'ثبات', + 'Start Date' => 'تاریخ شروع', + 'Status' => 'وضعیت', + 'Stock' => 'موجودی', + 'Store' => 'فروشگاه', + 'Store address' => 'نشانی فروشگاه', + 'Store configuration' => 'پیکربندی فروشگاه', + 'Street address' => 'آدرس خیابان', + 'Subtitle' => 'زیرنویس', + 'Superadministrator' => 'مدیر کل', + 'Supported locales' => 'مناطق تحت پوشش', + 'Symbol' => 'نماد', + 'System Logs' => 'لاگ‌های سیستم', + 'System Logs configuration' => 'پیکربندی لاگ‌های سیستم', + 'System logs' => 'لاگ‌های سیستم', + 'System parameters' => 'پارامترهای سیستم', + 'System variables' => 'متغیرهای سیستم', + 'Tags' => 'برچسب‌ها', + 'Tax' => 'مالیات', + 'Tax created on %date_create. Last modification: %date_change' => 'مالیات ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => 'نرخ مالیات ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Tax rules' => 'قوانین مالیاتی و مالیات‌ها', + 'Tax rules are combination of different taxes.' => 'قوانین مالیاتی ترکیبی از یک یا چند نرخ مالیاتی هستند.', + 'Taxed total' => 'مجموع (با مالیات)', + 'Taxes' => 'ماليات‌ها', + 'Taxes define the amount of money which is added to a bought product.' => 'مقدار مالیات تعیین شده به قیمت محصولات اضافه شده است.', + 'Taxes rules' => 'قوانین مالیاتی', + 'Template name' => 'نام قالب', + 'Template title' => 'عنوان قالب', + 'Template type' => 'نوع قالب', + 'Templates' => 'قالب‌ها', + 'Test your configuration' => 'تست پیکربندی شما', + 'Text version of this message' => 'نسخه‌ی متنی این پيام', + 'That way, Thelia community will benefit of your translations' => 'به این ترتیب، جامعه تلیا از ترجمه های شما بهره‌مند خواهد شد', + 'The default pricing is used when no combination is defined.' => 'وقتی هیچ ترکیبی تعریف نشده باشد، قیمت گذاری پیش فرض استفاده خواهد شد.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'مقاصد لاگ‌ها را برای نمایش، ذخیره سازی و فرستادن پردازش می‌کند. شما می‌توانید صفر، یکی یا چندتا از مقاصد زیر را برای پیکربندی انتخاب کنید.', + 'The detailed description.' => 'توضیحات مفصل.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'پوشه‌ی local/I18n یا وجود ندارد، یا قابل نوشتن نیست. لطفا اول این مشکل را حل کنید.', + 'The following error message has been found: %msg' => 'پیام خطای زیر یافت شده: % msg', + 'The hooks have been updated successfuly !' => 'قلاب با موفقیت به روز شده است!', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'صفحه مورد درخواست شما دارای مشکلی است. لطفا اگر از ماژولی استفاده می‌کنید با توسعه دهنده‌ی آن تماس بگیرید، در غیر این صورت می‌توانید به راجتی در مخزن گیت‌هاب تلیا برای تیم ما یک بازخورد بگذارید: %url.', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'صفحه مورد درخواست شما یافت نشد. لطفا آدرس صفحه را بررسی کنید و دوباره امتحان کنید.', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'The rate from Euro (Price in Euro * rate = Price in this currency)', + 'The selected categories :' => 'دسته‌های انتخاب شده:', + 'The selected countries :' => 'کشورهای انتخاب شده:', + 'The selected customer :' => 'مشتری انتخاب شده:', + 'The selected products :' => 'محصولات انتخاب شده:', + 'The server returned a "404 Not Found"' => 'سرور یک خطای «404» باز گردانده است (یعنی چیزی پیدا نکرده)', + 'The syntax used is identical to the PHP date() function' => 'The syntax used is identical to the PHP date() function', + 'Thelia Back Office' => 'پنل پشتیبانی فنی فروشگاه', + 'Thelia Installation' => 'نصب فروشگاه', + 'Thelia Languages' => 'زیان فروشگاه', + 'Thelia Mailing System' => 'سیستم ایمیلی فروشگاه', + 'Thelia Mailing Templates' => 'قالب‌های ایمیلی فروشگاه', + 'Thelia Product Attributes' => 'خصوصیات محصول فروشگاه', + 'Thelia Product Features' => 'ویژگی‌های محصول فروشگاه', + 'Thelia Product Templates' => 'قالب‌های محصول فروشگاه', + 'Thelia Shipping configuration' => 'پیکربندی واحد حمل و نقل فروشگاه', + 'Thelia Shipping zones' => 'مناطق حمل و نقلی فروشگاه', + 'Thelia System Variables' => 'متغیرهای سیستم فروشگاه', + 'Thelia caches flushing' => 'تخلیه‌یه کش‌های فروشگاه', + 'Thelia contributions' => 'مشارکت کنندگان تلیا', + 'Thelia core' => 'هسته فروشگاه', + 'Thelia mailing templates' => 'قالب‌های ایمیلی فروشگاه', + 'Thelia product attributes' => 'خصوصیات محصول فروشگاه', + 'Thelia product features' => 'ویژگی‌های محصول فروشگاه', + 'Thelia product templates' => 'قالب‌های محصول فروشگاه', + 'Thelia support forum' => 'انجمن پشتیبانی تلیا', + 'Thelia system variables' => 'متغیرهای سیستم فروشگاه', + 'There are no shipping zones attached to this module.' => 'هیچ ناحیه‌یه حمل و نقلی ای که به این ماژول الصاق شده باشد، پیدا نشد.', + 'There is 2 kind of translations :' => '2 نوع ترجمه وجود دارد:', + 'There is currently no active module here.' => 'در حال حاضر هیچ ماژول فعالی اینجا وجود ندارد.', + 'There is currently no available attributes.' => 'در حال حاضر، هیچ یک از خصوصیت‌ها در دسترس نیستند', + 'There is currently no available features.' => 'در حال حاضر، هیچ یک از ویژگی‌ها در دسترس نیستند', + 'There is no documents attached to this %type.' => 'هیچ سندی به این %type الصاق نشده است.', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'هیچ فایل نمایشی وجود ندارد که بتوان آن را به محصول شما ربط داد. تنها سندهایی که نمی‌توان مشاهده کرد انتخاب شده اند!', + 'There is no images attached to this %type.' => 'هیچ تصویری به این %type الصاق نشده است.', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'آنها برخی از مدیریت‌ها هستند که به این مدیریت وصل شده اند. لطفا آنها را قبل از اینکه این مدیریت حذف شود، حذف یا ویرایش کنید.', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'آنها برخی از مدیریت‌ها به این پروفایل وصل هستند. لطفا آنها را قبل از اینکه این پروفایل حذف شود، حذف یا ویرایش کنید.', + 'This category contains no contents' => 'این دسته شامل هیچ محتوایی نیست', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'دسته دارای هیچ محصولی نیست. برای اضافه کردن یک محصول، بر روی دکمه‌ی + بالایی کلیک کنید.', + 'This category has no sub-categories.' => 'این دسته، هیچ زیر دسته‌ای ندارد.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'این دسته، هیچ زیر دسته‌ای ندارد. برای ساختن یکی بر روی دکمه + بالایی کلیک کنید.', + 'This country is not included in any shipping zone' => 'این کشور به هیچ ناحیه حمل و نقلی اضافه نشده است', + 'This customer has not defined any delivery address' => 'مشتری هیچ آدرسی پستی ای برای تحویل گرفتن محصول تعریف نکرده است', + 'This customer has orders, and can\'t be deleted.' => 'این مشتری سفارش دارد و نمی‌توان حدفش کرد.', + 'This delivery module handles all shipping zones.' => 'این ماژول تحویل کالا، تمامی مناطق حمل و نقلی را پوشش می‌دهد.', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'این پوشه هیچ محتوایی ندارد. برای افزودن محتوای جدید روی دکمه + کلیک نمائید.', + 'This folder has no sub-folders.' => 'این پوشه هیچ زیر پوشه‌ای ندارد.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'این پوشه هیچ زیر پوشه‌ای ندارد. برای ساختن یکی، بر روی دکمه + بالا کلیک کنید.', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'تا وقتی که این منابع (تلیا، ماژول، قالب) را آپدیت نکنید این مشکلی پیش نخواهد آمد.
    ', + 'This is the code entered by your customers to use this coupon' => 'این کد توسط مشتری برای استفاده از این کوپن وارد شده است', + 'This mailing template could not be changed.' => 'این قالب ایمیلی امکان تغییر ندارد.', + 'This module cannot be started, some files are probably missing.' => 'این ماژول راه اندازی نمی‌شود، برخی از فایل‌ها احیاناً مشکل دارند.', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'این صفحه به شما این امکان را می‌دهد تا هر کدام از این قسمت‌ها از فروشگاه خود را ترجمه کنید: هسته، ماژول و قالب.
    ', + 'This product contains no accessories' => 'این محصول هیچ ملحقاتی ندارد', + 'This product contains no contents' => 'این محصول شامل هیچ محتوایی نیست', + 'This product doesn\'t belong to any additional category.' => 'این محصول به هیچ دسته‌ی دیگری تعلق ندارد.', + 'This product doesn\'t belong to any additional folder.' => 'این پوشه به هیچ پوشه‌ی دیگری تعلق ندارد.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'این محصول هیچ ترکیب ندارد. قیمت پیش فرض برایش در نظر گرفته شده است. برای ایجاد یک ترکیب جدید اینجا کلیک کنید.', + 'This product template does not contains any features' => 'این قالب محصول شامل هیچ ویژگی نیست', + 'This shipping zone does not contains any country.' => 'این ناحیه‌ی حمل و نقلی شامل هیچ کشوری نیست.', + 'This template contains no attributes' => 'این قالب شامل هیچ خصوصیتی نیست', + 'This template contains no features' => 'این قالب شامل هیچ ویژگی نیست', + 'This variable could not be changed.' => 'این متغیر را نمی‌توانید تغییر دهید.', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'این عمل منجر به تنظیم مجدد وضعیت حراج تمامی محصولات و غیرفعال شدن تمامی حراج‌های فعال خواهد شد. آیا مطمئنید که می‌خواهید این کار را ادامه دهید؟', + 'Timeout' => 'زمان پایان', + 'Timeout :' => 'زمان پایان:', + 'Title' => 'عنوان', + 'Title * :' => 'عنوان * :', + 'To' => 'به', + 'To create a new content, select an existing folder, or create a new one.' => 'برای ایجاد محتوای جدید، یکی از پوشه‌های موجود را انتخاب کنید، یا یکی جدید درست کنید.', + 'To create a new product, select an existing category, or create a new one.' => 'برای ایجاد محصول جدید، یکی از دسته بندی‌های موجود را انتخاب کنید، یا یکی جدید درست کنید.', + 'To remove a value from the combination, select it and click "remove"' => 'برای حدف یک مقدار از ترکیب، آن را انتخاب کنید و بر روی دکمه‌ی «حذف» کیلک کنید.', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'برای استفاده از ویژگی‌ها و خصوصیت در این محصول، لطفا قالب محصول را انتخاب کنید. شما می‌توانید قالب‌های محصولات را در قسمت پیکربندی بخش مدیریت تعریف کنید.', + 'Toggle select all' => 'تغییر وضعیت انتخابی همه آیتم‌ها', + 'Tools' => 'ابزارها', + 'Top level' => 'سطح بالا', + 'Top level Contents' => 'مطالب سطح بالا', + 'Top level Products' => 'محصولات سطح بالا', + 'Top level categories' => 'دسته‌بندی‌های سطح بالا', + 'Top level folders' => 'پوشه‌های سطح بالا', + 'Total' => 'مجموع', + 'Total including discount' => 'مجموع با احتساب تخفیف', + 'Total without discount' => 'مجموع بدون احتساب تخفیف', + 'Transaction reference' => 'مرجع تراکنش', + 'Translation' => 'ترجمه', + 'Translations' => 'ترجمه', + 'Type:' => 'نوع:', + 'Unit taxed price' => 'قیمت واحد مالیات خورده', + 'Unit. price' => 'قیمت واحد', + 'Unlimited' => 'نامحدود', + 'Unlimited number of uses' => 'تعداد نامحدودی استفاده', + 'Unspecified' => 'مشخص نشده', + 'Unsupported field type \'%type\' in form-field.html' => 'نوع فیلد \'%type\' در فایل form-field.html پشتیبانی نمی‌شود', + 'Update' => 'بروزرسانی', + 'Update URL' => 'به روز رسانی URL', + 'Update an administrator' => 'به روز رسانی مدیر', + 'Update coupon' => 'به روز رسانی کوپن', + 'Update rates' => 'به روز رسانی نرخ', + 'Update tax rule taxes' => 'به روز رسانی نرخ مالیاتی مالیات‌ها', + 'Update this image' => 'به روز رسانی این تصویر', + 'Usage count' => 'تعداد باقیمانده', + 'Usages left' => 'تعداد باقیمانده', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک مقدار خصوصیت استفاده کنید', + 'Use Ctrl+click to select (or deselect) more that one category' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک دسته استفاده کنید', + 'Use Ctrl+click to select (or deselect) more that one country' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک مقدار کشور استفاده کنید ', + 'Use Ctrl+click to select (or deselect) more that one item' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک مورد استفاده کنید', + 'Use Ctrl+click to select (or deselect) more that one product' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک مقدار محصول استفاده کنید ', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک روش تحویل دادن استفاده کنید ', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'از کلیدهای ترکیبی Ctrl+click برای انتخاب یا عدم انتخاب بیشتر از یک مقدار استفاده کنید. شما همچنین می‌تواند مقادیر انتخاب شده را پاک کنید.', + 'Use HTML message defined below' => 'از پیام HTML ایه تعریف شده در زیر استفاده کنید', + 'Use Text message defined below' => 'از پیام متنی تعریف شده در زیر استفاد کنید', + 'Use address by default' => 'استفاده از آدرس پیش فرض', + 'Use default layout' => 'استفاده از لایه‌ی پیش فرض', + 'Use this address by default' => 'از این آدرس به عنوان پیش فرض استفاده کن', + 'User mode' => 'حالت کاربر', + 'Username' => 'نام کاربری', + 'Username :' => 'نام کاربری :', + 'Using a domain or subdomain for each language' => 'استفاده کردن از یک دامین یا ساب دامین برای هر زبان', + 'Valid on special offers' => 'معتبر در پیشنهادهای ویژه', + 'Validity start date' => 'تاریخ شروع اعتبار', + 'Value' => 'مقدار', + 'Variable created on %date_create. Last modification: %date_change' => 'متغیر ایجاد شده در %date_create. آخرين تغییر: %date_change', + 'Variable name' => 'نام متغیر', + 'Variable purpose' => 'هدف متغیر', + 'Variable value' => 'مقدار متغیر', + 'Variables to inject' => 'متغیرهایی برای تزریق', + 'Version %ver' => 'نسخهٔ %ver', + 'View' => 'مشاهده', + 'View invoice PDF' => 'مشاهده‌ی PDf فاکتور', + 'View only missing translations.' => 'دیدن تنها ترجمه‌های گم شده.', + 'View purchase order as PDF' => 'مشاهده سفارش خرید به صورت PDF', + 'View shop' => 'مشاهده فروشگاه', + 'View site' => 'مشاهده سایت', + 'View this product in a new page' => 'مشاهده این محصولات در صفحه جدید', + 'Virtual product' => 'محصول مجازی', + 'Visibility' => 'قابلیت مشاهده', + 'Warning' => 'هشدار', + 'Web site' => 'وب سایت', + 'Weight' => 'وزن', + 'Weight
    (Kg)' => 'وزن
    (کیلوگرم)', + 'Welcome' => 'خوش آمدید', + 'Welcome to Thelia administration !' => 'به بخش پشتیبانی فنی فروشگاه خوش آمدید!', + 'Yes' => 'بله', + 'You can attach here some content to this category' => 'شما اینجا می توانید برخی از مطالب را به این دسته اضافه کنید', + 'You can attach here some content to this product' => 'شما اینجا می توانید برخی از مطالب را به این محصول اضافه کنید', + 'You can attach this product to more categories in the details tab.' => 'شما می‌توانید ان محصول را در تب جزییات به دسته‌های بیشتری اضافه کنید.', + 'You can change attributes and their positions in the attributes configuration page.' => 'شما می‌توانید خصوصیات و جایگاه آن‌ها را در صفحه‌ی پیکربندی خصوصیات تغییر دهید.', + 'You can change feature and their positions in the features configuration page.' => 'شما می‌توانید ویژگی‌ها و جایگاه آن‌ها را در صفحه‌ی پیکربندی ویژگی‌ها تغییر دهید.', + 'You can change template attributes and their positions in the template configuration page.' => 'شما می‌توانید قالب خصوصیات و جایگاه آن‌ها را در صفحه‌ی پیکربندی قالب‌ها تغییر دهید.', + 'You can change templates features and their positions in the template configuration page.' => 'شما می‌توانید قالب ویژگی‌ها و جایگاه آن‌ها را در صفحه‌ی پیکربندی قالب‌ها تغییر دهید.', + 'You can change the default category (%title) in the "General" tab.' => 'شما می‌توانید دسته بندی پیش فرض (%title) را در تب «عمومی» تغییر دهید.', + 'You can change the default folder (%title) in the "General" tab.' => 'شما می‌توانید پوشه پیش فرض (%title) را در تب «عمومی» تغییر دهید.', + 'You can\'t delete this administrator' => 'شما نمی‌توانید این مدیر را حذف کنید', + 'You can\'t delete this profile' => 'شما نمی‌توانید این حساب کاربری را پاک کنید', + 'You don\'t have any export' => 'شما هیچ خروجی‌ای ندارید', + 'You don\'t have any import' => 'شما هیچ ورودی‌ای ندارید', + 'You have no orders for the moment.' => 'شما هیچ سفارشی در حال حاضر ندارید.', + 'You have no registred customers for the moment.' => 'شما هیچ مشتری ثبت شده‌ای در حال حاضر ندارید.', + 'Your current IP address is %ip' => 'آی پی کنونی شما %ip است', + 'Your email' => 'ايميل شما', + 'Your module should be packaged in a zip file.' => 'ماژول شما باید در یک فایل زیپ قرار گرفته باشد.', + 'Your search is too short' => 'جستجوی شما بیش از حد کوتاه است', + 'Your template define new hooks' => 'قالب شما قلاب جدیدی را تعریف کرده است', + 'Your template does not support this hooks' => 'قالب شما از این قلاب پشتیبانی نمی‌کند', + 'Your template is clean. No missing hooks and no new hooks.' => 'قالب شما تمیز است. هیچ قلابی گم نشده و هیچ قلاب جدیدی نیز وجود ندارد.', + 'Zip code' => 'کد پستی', + 'Zone name' => 'نام منطقه', + 'activate' => 'فعال کردن', + 'activate %title module' => 'فعال کردن ماژول %title', + 'activate hook' => 'فعال کردن قلاب', + 'activation' => 'فعال سازی', + 'all' => 'همه', + 'and' => 'و', + 'caption' => 'شرح', + 'classic modules' => 'ماژول‌های کلاسیک', + 'code' => 'کد', + 'company' => 'شرکت', + 'customer ref' => 'کد مشتری', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'تاریخ در قالب yyyy-mm-dd', + 'deactivate' => 'غیر فعال', + 'deactivated' => 'غیر فعال شد', + 'deactivation' => 'غیرفعال کردن', + 'delete document' => 'پاک کردن مستند', + 'delete image' => 'پاک کردن تصویر', + 'download' => 'دانلود', + 'eg: . or ,' => 'بطور مثال: . یا ،', + 'email' => 'ایمیل', + 'en_US' => 'en_US', + 'firstname & lastname' => 'نام و نام خانوادگی', + 'hour in hh:mm:ss format' => 'ساعت در قالب hh:mm:ss', + 'last order' => 'آخرین سفارش', + 'long description' => 'شرح کامل', + 'none' => 'هیچ کدام', + 'ok' => 'تایید', + 'on' => 'در', + 'or' => 'یا', + 'order amount' => 'مقدار سفارش', + 'orders for this customer' => 'سفارش‌های این مشتری', + 'pdf' => 'pdf', + 'permanent discount' => 'تخفیف دائمی (به درصد)', + 'profile' => 'پروفایل', + 'ref.:' => 'ref.:', + 'reverse' => 'معکوس', + 'short description' => 'توضیحات کوتاه', + 'tax rules' => 'قوانین مالیاتی', + 'taxes' => 'مالیات', + 'title' => 'عنوان', + 'tracking reference' => 'ردیابی مرجع', + 'version' => 'نسخه', + 'warning' => 'هشدار', +]; diff --git a/templates/backOffice/default/I18n/fr_FR.php b/templates/backOffice/default/I18n/fr_FR.php new file mode 100644 index 00000000..d595baf5 --- /dev/null +++ b/templates/backOffice/default/I18n/fr_FR.php @@ -0,0 +1,1304 @@ + '(défaut)', + '%count more...' => '%count de plus...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count zone(s) de livraison sont couvertes par ce module: %zones. Cliquez ici pour modifier', + '(according to a country the taxes applied could be different)' => '(selon un pays, les taxes appliquées peuvent être différentes)', + '(edit)' => '(modification)', + 'Check the list of ISO 639-1 codes' => 'Liste des codes ISO 639-1', + '0 combinations' => '0 combinaisons', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Limitation système bloquante ! Votre configuration PHP limite le nombre de champs d\'une forme HTML à %current_max_input_vars champs. Au moins %required_max_input_vars champs sont nécessaires pour effectuer les traductions. Merci de modifier en conséquence la variable max_input_vars de votre configuration PHP. Vous pouvez aussi modifier les fichiers de traduction à la main.', + 'Congratulations, all text is now translated !' => 'Félicitations, tous les textes ont été traduits !', + 'Developer : to change the translations of the resource' => 'Développeur : changer les traductions de la ressource', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Aucun texte à traduire. C\'est probablement normal. Si ce n\'est pas le cas vérifiez que vous utilisez bien la fonction Smarty "intl" ou bien le translator Translator::trans dans un fichier php', + 'User : to redefine the translations for your website' => 'Utilisateur : redéfinir les traductions pour votre site Web', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Attention, le taux de change d\'au moins une devise n\'a pas été trouvé: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Attention, certains des pays ne sont inclus dans aucune zone de livraison', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Attention, les zones de livraison suivantes ne sont associées à aucun module:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Un contenu peut être rattaché à plusieurs dossiers. Sélectionnez ici les dossiers dans lesquels ce contenu apparaîtra', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Un produit peut être associé à plusieurs rubriques. Sélectionner les rubrique pour lesquels le produit sera associé', + 'API configuration' => 'Configuration de l\'API', + 'API list access' => 'Liste des accès à l\'API', + 'API users' => 'Utilisateurs de l\'API', + 'Accessory title' => 'Titre de l\'accessoire', + 'Action' => 'Action', + 'Actions' => 'Actions', + 'Activate this log destination' => 'Activer cette destination', + 'Active' => 'Actif', + 'Add' => 'Ajouter', + 'Add a condition' => 'Ajouter une condition', + 'Add a module to a hook' => 'Ajouter un module à un point d\'accroche', + 'Add a new Customer' => 'Ajouter un client', + 'Add a new address' => 'Ajouter une nouvelle adresse', + 'Add a new brand' => 'Ajouter une nouvelle marque', + 'Add a new category' => 'Ajouter une catégorie', + 'Add a new combination' => 'Ajouter une nouvelle combinaison', + 'Add a new content' => 'Ajouter un nouveau contenu', + 'Add a new country' => 'Ajouter un nouveau pays', + 'Add a new currency' => 'Ajouter une nouvelle devise', + 'Add a new folder' => 'Ajouter un nouveau dossier', + 'Add a new hook' => 'Ajouter un nouveau point d\'accroche', + 'Add a new language' => 'Ajouter une nouvelle langue', + 'Add a new mailing template' => 'Ajouter un nouveau template de mailing', + 'Add a new module in a hook' => 'Ajouter un nouveau module dans un point d\'accroche', + 'Add a new module to this hook' => 'Ajouter un module dans ce point d\'accroche', + 'Add a new product' => 'Ajouter un nouveau produit', + 'Add a new product attribute' => 'Ajouter une nouvelle déclinaison produit', + 'Add a new product feature' => 'Ajouter une nouvelle caractéristique produit', + 'Add a new product template' => 'Ajouter un nouveau gabarit de produit', + 'Add a new sale' => 'Ajouter une nouvelle promotion', + 'Add a new shipping zone' => 'Ajouter une nouvelle zone de livraison', + 'Add a new state' => 'Ajouter un nouvel état', + 'Add a new variable' => 'Ajouter une nouvelle variable', + 'Add document to your product.' => 'Ajouter des documents à votre produit.', + 'Add selected countries' => 'Ajouter les pays sélectionnés', + 'Add tax to this group' => 'Ajouter une taxe à ce groupe', + 'Add this attribute to all product templates' => 'Ajouter cette déclinaison à tous les gabarits de produit', + 'Add this feature to all product templates' => 'Ajouter cette caractéristique à tous les gabarits de produit', + 'Add to all product templates' => 'Ajouter à tous les gabarits de produit', + 'Add to selected categories' => 'Ajouter aux catégories sélectionnées', + 'Additional Folders' => 'Dossiers associés', + 'Additional address' => 'Adresse complémentaire', + 'Additional categories' => 'Rubriques supplémentaires', + 'Address' => 'Adresse', + 'Administration logs' => 'Gestion des logs', + 'Administration profiles' => 'Profils d\'administration', + 'Administrators' => 'Administrateurs', + 'Advanced configuration' => 'Configuration avancée', + 'Advanced configuration and tools' => 'Outils et configuration avancés', + 'Afficher ce profil' => 'Afficher ce profil', + 'All' => 'Tout', + 'All States' => 'Tous les états', + 'All orders' => 'Toutes les commandes', + 'Amount' => 'Montant', + 'Amount, e.g. 12.50' => 'Montant, par ex. 12.50', + 'An email containing instructions to create a new password was sent to your email address. If you don\'t receive this email, please try again.' => 'Un email contenant les instructions pour créer un nouveau mot de passe a été envoyé à votre adresse e-mail. Si vous ne recevez pas cet email, veuillez recommencer.', + 'An error occured' => 'Une erreur est survenue', + 'An invalid token was provided, your password cannot be changed. Please try again, and be sure to use the exact URL which is in the e-mail sent to you.' => 'Un jeton non valide a été fourni, votre mot de passe ne peut pas être modifié. S\'il vous plaît essayer de nouveau et n\'oubliez pas d\'utiliser l\'URL exacte qui se trouve dans l\'email qui vous a été envoyé.', + 'An unexpected error occured' => 'Une erreur est survenue', + 'An unknow error happend' => 'Une erreur inconnue est survenue', + 'An unknown error occured, please try again.' => 'Une erreur non gérée a été rencontré, veuillez essayer à nouveau.', + 'And' => 'Et', + 'Api' => 'API', + 'Api key' => 'clé d\'API', + 'Applies to attribute values :' => 'Pour les valeurs de déclinaison :', + 'Applies to products :' => 'Pour les produits', + 'Applies to products in categories :' => 'Pour les produits des catégories :', + 'Apply' => 'Appliquer', + 'Assigned modules' => 'Modules associés', + 'Associate documents' => 'Documents associés', + 'Associate downloadable file' => 'Associer un fichier téléchargeable', + 'Associate files to your combinations' => 'Associer des documents à vos combinaisons', + 'Associate images' => 'Images associées', + 'Associated' => 'Associé', + 'Associations' => 'Associations', + 'Attribute' => 'Déclinaison', + 'Attribute %title' => 'Déclinaison %title', + 'Attribute Combinations' => 'Combinaison de déclinaisons', + 'Attribute Name' => 'Nom de la déclinaison', + 'Attribute information' => 'Information sur la déclinaison', + 'Attribute title' => 'Titre de la déclinaison', + 'Attribute values' => 'Valeurs de la déclinaison', + 'Attributes' => 'Attributs', + 'Attributes & Features' => 'Attributs & caractéristiques', + 'Auth Mode' => 'Mode d\'authentification', + 'Auth Mode :' => 'Mode d\'authentification :', + 'Author' => 'Auteur', + 'Available product categories' => 'Catégories disponibles', + 'Available taxes' => 'Taxes disponibles', + 'Back' => 'Retour', + 'Back Office' => 'Back Office', + 'Back-office home' => 'Accueil administration', + 'Back-office template you want to translate' => 'Template back-office à traduire', + 'Back-office templates' => 'Templates Back-office', + 'Back-office users' => 'Utilisateur du B.O', + 'Best taxed price' => 'Meilleur prix TTC', + 'Block' => 'Bloc', + 'Block :' => 'Bloc :', + 'Brand created on %date_create. Last modification: %date_change' => 'Marque créée le %date_create. Dernière modification: %date_change', + 'Brands' => 'Marques', + 'Browse files' => 'Parcourir les fichiers', + 'Browse this category' => 'Parcourir cette catégorie', + 'Browse this folder' => 'Parcourir ce dossier', + 'By module' => 'Par module', + 'By module:' => 'Par module :', + 'By status' => 'Par statut', + 'By type' => 'Par type', + 'Can\'t load documents, please refresh this page.' => 'Impossible de charger les documents. Rechargez la page', + 'Can\'t load images, please refresh this page.' => 'Impossible de charger l\'image. Rechargez la page', + 'Can\'t reorder documents, please refresh this page.' => 'Impossible de trier les documents. Rechargez la page', + 'Can\'t reorder images, please refresh this page.' => 'Impossible de trier les images. Rechargez la page', + 'Cancel' => 'Annuler', + 'Cancel changes and revert to original value' => 'Annuler les modifications et revenir à la version antérieure', + 'Cancel this order' => 'Annuler cette commande', + 'Cart - Prices in %currency' => 'Panier - prix en %currency', + 'Catalog' => 'Catalogue', + 'Categories' => 'Rubriques', + 'Categories in %cat' => 'Rubrique dans %cat', + 'Category' => 'Catégorie', + 'Category created on %date_create. Last modification: %date_change' => 'Rubrique créée le %date_create. Dernière modification le %date_change', + 'Category title' => 'Titre de la rubrique', + 'Cellphone' => 'Numéro de portable', + 'Cellular phone' => 'Téléphone portable', + 'Cellular phone number' => 'Numéro de portable', + 'Change sale configuration' => 'Configurer la promotion', + 'Change this administrator' => 'Modifier cet administrateur', + 'Change this api access' => 'modifier l\'accès à l\'API', + 'Change this attribute' => 'Modifier cette déclinaison', + 'Change this brand' => 'Modifier cette marque', + 'Change this condition' => 'Modifier cette condition', + 'Change this country' => 'Modifier ce pays', + 'Change this coupon' => 'Modifier ce code promo', + 'Change this currency' => 'Modifier cette devise', + 'Change this feature' => 'Modifier cette caractéristique', + 'Change this hook' => 'Modifier ce point d\'accroche', + 'Change this language' => 'Modifier cette langue', + 'Change this mailing template' => 'Modifier ce template de mailing', + 'Change this product attribute' => 'Modifier cette déclinaison produit', + 'Change this product feature' => 'Modifier cette caractéristique produit', + 'Change this product template' => 'Modifier ce gabarit de produit', + 'Change this profile' => 'Changer ce profil', + 'Change this sale' => 'Modifier cette promotion', + 'Change this shipping zone' => 'Modifier cette zone de livraison', + 'Change this state' => 'Modifier cet État', + 'Change this tax' => 'Modifier cette taxe', + 'Change this tax rule' => 'Modifier cette règle de taxe', + 'Change this template' => 'Modifier ce gabarit', + 'Change this variable' => 'Modifier cette variable', + 'Chapo' => 'Chapeau', + 'Check sale activation' => 'Contrôler l\'activation', + 'Check the support of hooks.' => 'Vérifier le support des points d\'accroche', + 'Check this box if you want to add this attributes to all product templates' => 'Cochez cette case si vous voulez ajouter cette déclinaison à tous les gabarits de produits', + 'Check this box if you want to add this features to all product templates' => 'Cochez cette case si voulez ajouter cette caractéristique à tous les gabarits de produit.', + 'Choose a configuration' => 'Choisir une configuration', + 'Choose a country' => 'Choisissez un pays', + 'City' => 'Ville', + 'Classic modules' => 'Modules classic', + 'Click to view' => 'Détails', + 'Click to view details.' => 'Cliquer ici pour plus de détails.', + 'Clone' => 'Cloner', + 'Clone product' => 'Cloner le produit', + 'Close' => 'Fermer', + 'Close administation session' => 'Quitter l\'interface d\'administration', + 'Code' => 'Code', + 'Code:' => 'Code :', + 'Combinable with other promotions' => 'Cumulable avec d\'autres promotions', + 'Combination EAN Code' => 'Combinaison de code EAN', + 'Combination builder' => 'Générateur de combinaison', + 'Combination reference' => 'Référence de la combinaison', + 'Company' => 'Entreprise', + 'Condition category :' => 'Catégorie de condition', + 'Condition description' => 'Type de condition', + 'Configuration' => 'Configuration', + 'Configuration mailing system' => 'Configuration du système de mailing', + 'Configure' => 'Configurer', + 'Configure this module' => 'Configuration', + 'Confirm' => 'Confirmer', + 'Confirm changes' => 'Valider les modifications', + 'Confirmation' => 'Confirmation', + 'Congratulations, your password was successfully changed. You can now login.' => 'Félicitations, votre mot de passe a été changé avec succès. Vous pouvez maintenant vous connecter.', + 'Content' => 'Contenu', + 'Content title' => 'Titre du contenu', + 'Contents in %fold' => 'Contenus dans %fold', + 'Copy all missing translations.' => 'Copier toutes les traductions manquantes', + 'Copy all translations.' => 'Copier toutes les traductions', + 'Copy source text in input field' => 'Copier la source dans le champs de traduction', + 'Countries' => 'Pays', + 'Countries assigned to this zone' => 'Pays inclus dans cette zone', + 'Countries/states configuration' => 'Configuration des pays / états', + 'Countries/states deleted of this configuration' => 'Pays/états supprimés de cette configuration', + 'Countries/states that will use this configuration' => 'Pays/états qui utiliseront cette configuration', + 'Country' => 'Pays', + 'Coupon' => 'Code promo', + 'Coupon code' => 'Code promo', + 'Coupon code * :' => 'Code promo * :', + 'Coupon conditions' => 'Conditions d\'utilisation', + 'Coupon type * :' => 'Type de promotion * :', + 'Coupons' => 'Codes promo', + 'Create' => 'Créer', + 'Create a customer address' => 'Créer une adresse', + 'Create a new API access' => 'Créer un nouveau compte d\'accès à l\'API', + 'Create a new Hook' => 'Créer un nouveau point d\'accroche', + 'Create a new administrator' => 'Créer un nouvel administrateur', + 'Create a new attribute' => 'Créer une nouvelle déclinaison', + 'Create a new attribute value' => 'Créer une nouvelle valeur de déclinaison', + 'Create a new brand' => 'Ajouter une nouvelle marque', + 'Create a new category' => 'Créer une nouvelle rubrique', + 'Create a new combination' => 'Créer une nouvelle combinaison', + 'Create a new content' => 'Créer un nouveau contenu', + 'Create a new country' => 'Créer un nouveau pays', + 'Create a new coupon' => 'Créer un nouveau code promo', + 'Create a new currency' => 'Créer une nouvelle devise', + 'Create a new customer' => 'Ajouter un nouveau client', + 'Create a new feature' => 'Créer une nouvelle caractéristique', + 'Create a new feature value' => 'Créer une nouvelle valeur de caractéristique', + 'Create a new folder' => 'Créer un nouveau dossier', + 'Create a new language' => 'Créer une nouvelle langue', + 'Create a new mailing template' => 'Créer un nouveau template de mailing', + 'Create a new product' => 'Créer un nouveau produit', + 'Create a new product template' => 'Créer un nouveau gabarit de produit', + 'Create a new profile' => 'Créer un nouveau profil', + 'Create a new sale' => 'Créer une nouvelle promotion', + 'Create a new shipping zone' => 'Créer une nouvelle zone de livraison', + 'Create a new state' => 'Créer un nouvel État', + 'Create a new tax' => 'Créer une nouvelle taxe', + 'Create a new tax rule' => 'Créer une nouvelle règle de taxe', + 'Create a new variable' => 'Créer une nouvelle variable', + 'Create combinations' => 'Créer des combinaisons', + 'Create coupon' => 'Créer un code promo', + 'Create this address' => 'Créer cette adresse', + 'Create this attribute' => 'Créer cette déclinaison', + 'Create this brand' => 'Ajouter cette marque', + 'Create this category' => 'Créer cette rubrique', + 'Create this combination' => 'Créer cette combinaison', + 'Create this content' => 'Créer ce contenu', + 'Create this country' => 'Créer ce pays', + 'Create this currency' => 'Créer cette devise', + 'Create this customer' => 'Ajouter ce client', + 'Create this feature' => 'Créer cette caractéristique', + 'Create this folder' => 'Créer ce dossier', + 'Create this hook' => 'Créer ce point d\'accroche', + 'Create this hooks' => 'Créer ces points d\'accroche', + 'Create this language' => 'Créer cette langue', + 'Create this mailing template' => 'Créer ce template de mailing', + 'Create this product' => 'Créer ce produit', + 'Create this product template' => 'Créer ce gabarit de produit', + 'Create this sale' => 'Créer cette promotion', + 'Create this shipping zone' => 'Créer cette zone de livraison', + 'Create this state' => 'Créer cet État', + 'Create this value' => 'Créer cette valeur', + 'Create this variable' => 'Ajouter cette variable', + 'Currencies' => 'Devises', + 'Currency name' => 'Nom de la devise', + 'Currency rate' => 'Taux de la devise', + 'Currency symbol' => 'Symbole de la devise', + 'Current product template' => 'Gabarit de produit actuel', + 'Current quantity' => 'Quantité actuelle', + 'Customer' => 'Client', + 'Customer information' => 'Informations client', + 'Customer informations' => 'Informations client', + 'Customer is' => 'Le client', + 'Customers' => 'Clients', + 'Customers list' => 'Liste des clients', + 'Cutomer Name' => 'Nom du client', + 'Date & Hour' => 'Date et heure', + 'Date of last order' => 'Date de la dernière commande', + 'Days before expiration' => 'Jours restants avant expiration', + 'Deactivate %title module' => 'Désactiver le module %title', + 'Deactivate hook' => 'Désactiver le point d\'accroche', + 'Deactivate this hooks' => 'Désactiver ces points d\'accroche', + 'Decimal places' => 'Nombre de chiffres après la virgule', + 'Default' => 'Défaut', + 'Default address' => 'Adresse par défaut', + 'Define here this product\'s accessories' => 'Choisir ici les accessoires pour ce produit', + 'Delete' => 'Supprimer', + 'Delete a combination' => 'Supprimer une combinaison', + 'Delete a module' => 'Supprimer un module', + 'Delete a variable' => 'Supprimer une variable', + 'Delete address' => 'Supprimer cette adresse', + 'Delete administrator' => 'Supprimer un administrateur', + 'Delete also module data' => 'Supprimer aussi les données de ce module', + 'Delete an order' => 'Supprimer une commande', + 'Delete api access' => 'Supprimer cet accès à l\'API', + 'Delete attribute' => 'Supprimer cette déclinaison', + 'Delete attribute value' => 'Supprimer une valeur de déclinaison', + 'Delete brand' => 'Supprimer cette marque', + 'Delete category' => 'Supprimer cette rubrique', + 'Delete content' => 'Supprimer le contenu', + 'Delete country' => 'Supprimer le pays', + 'Delete coupon' => 'Supprimer le coupon', + 'Delete currency' => 'Supprimer cette devise', + 'Delete customer' => 'Supprimer ce client', + 'Delete feature' => 'Supprimer cette caractéristique', + 'Delete feature value' => 'Supprimer la valeur de la caractéristique', + 'Delete folder' => 'Supprimer ce dossier', + 'Delete hook' => 'Supprimer le point d\'accroche', + 'Delete language' => 'Supprimer cette langue', + 'Delete mailing template' => 'Supprimer ce template de mailing', + 'Delete product' => 'Supprimer ce produit', + 'Delete profile' => 'Supprimer le profil', + 'Delete sale' => 'Supprimer cette promotion', + 'Delete selected countries' => 'Supprimer les pays sélectionnés', + 'Delete shipping zone' => 'Supprimer une zone de livraison', + 'Delete state' => 'Supprimer l\'État', + 'Delete tax' => 'Supprimer la taxe', + 'Delete tax rule' => 'Supprimer cette règle de taxe', + 'Delete template' => 'Supprimer ce gabarit de produit', + 'Delete this accessory' => 'Supprimer cet accessoire', + 'Delete this administrator' => 'Supprimer cet administrateur', + 'Delete this api access' => 'Supprimer cet accès à l\'API', + 'Delete this attribute' => 'Supprimer cette déclinaison', + 'Delete this brand' => 'Supprimer cette marque', + 'Delete this category and all its contents' => 'Supprimer cette rubrique et tout ce qu\'elle contient ?', + 'Delete this combination' => 'Supprimer cette combinaison', + 'Delete this condition' => 'Supprimer cette condition', + 'Delete this content' => 'Supprimer ce contenu', + 'Delete this country' => 'Supprimer ce pays', + 'Delete this coupon' => 'Supprimer le coupon', + 'Delete this currency' => 'Supprimer cette devise', + 'Delete this customer address' => 'Supprimer cette adresse', + 'Delete this customer and all his orders' => 'Supprimer ce client et toutes ses commandes', + 'Delete this feature' => 'Supprimer cette caractéristique', + 'Delete this folder' => 'Supprimer ce dossier', + 'Delete this folder and all its contents' => 'Supprimer ce dossier et tout ses contenus', + 'Delete this hook' => 'Supprimer ce point d\'accroche', + 'Delete this language' => 'Supprimer cette langue', + 'Delete this mailing template' => 'Supprimer ce template de mailing', + 'Delete this module' => 'Supprimer ce module', + 'Delete this product' => 'Supprimer ce produit', + 'Delete this product attribute' => 'Supprimer cette déclinaison produit', + 'Delete this product feature' => 'Supprimer cette caractéristique produit', + 'Delete this product template' => 'Supprimer ce gabarit de produit', + 'Delete this profile' => 'Supprimer ce profil', + 'Delete this sale' => 'Supprimer cette promotion', + 'Delete this shipping zone' => 'Supprimer cette zone de livraison', + 'Delete this state' => 'Supprimer cet État', + 'Delete this tax' => 'Supprimer cette taxe', + 'Delete this tax rule' => 'Supprimer cette règle de taxe', + 'Delete this value' => 'Supprimer cette valeur', + 'Delete this variable' => 'Supprimer cette variable', + 'Delete this zone' => 'Supprimer cette zone', + 'Delivery' => 'Bon de livraison', + 'Delivery address' => 'Adresse de livraison', + 'Delivery module' => 'Module de livraison', + 'Delivery modules' => 'Modules de livraison', + 'Description' => 'Description', + 'Destinations' => 'Destinations', + 'Developer mode' => 'Mode développeur', + 'Disabled' => 'Désactivé', + 'Discount' => 'Remise', + 'Discount amount' => 'Montant de réduction', + 'Discount percentage' => 'Pourcentage de remise', + 'Discover all our modules on Thelia Modules !' => 'Découvrez tous nos modules sur Thelia Modules !', + 'Do not use a product template' => 'Ne pas utiliser de gabarit', + 'Do this export' => 'Exporter', + 'Do this import' => 'Importer', + 'Do you really want to add this attribute to all product templates ?' => 'Voulez-vous vraiment ajouter cette déclinaison de tous les gabarits de produit ?', + 'Do you really want to add this feature to all product templates ?' => 'Voulez-vous vraiment ajouter cette caractéristique à tous les gabarits de produit ?', + 'Do you really want to cancel this order ?' => 'Voulez-vous vraiment supprimer cette commande ?', + 'Do you really want to delete this address ?' => 'Voulez-vous vraiment supprimer cette adresse ?', + 'Do you really want to delete this administrator ?' => 'Confirmez-vous la suppression de cet administrateur ?', + 'Do you really want to delete this api access ?' => 'êtes-vous sur de vouloir supprimer cet accès à l\'API', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'Voulez-vous vraiment supprimer cette déclinaison ? Elle sera supprimée de tous les gabarits de produit.', + 'Do you really want to delete this attribute value ?' => 'Voulez-vous vraiment supprimer cette déclinaison ?', + 'Do you really want to delete this brand ?' => 'Confirmez-vous la suppression de cette marque ?', + 'Do you really want to delete this category and all its content ?' => 'Voulez-vous vraiment supprimer cette rubrique et tout ce qu\'elle contient ?', + 'Do you really want to delete this combination ?' => 'Voulez-vous vraiment supprimer cette combinaison ?', + 'Do you really want to delete this condition ?' => 'Supprimer cette condition ?', + 'Do you really want to delete this content ?' => 'Voulez-vous vraiment supprimer ce contenu ?', + 'Do you really want to delete this country ?' => 'Voulez-vous vraiment supprimer ce pays ?', + 'Do you really want to delete this coupon ?' => 'Voulez-vous vraiment supprimer ce coupon ?', + 'Do you really want to delete this currency ?' => 'Voulez-vous vraiment supprimer cette devise ?', + 'Do you really want to delete this customer ?' => 'Voulez-vous supprimer ce client ?', + 'Do you really want to delete this document ?' => 'Confirmez-vous la suppression de ce document ? ', + 'Do you really want to delete this element ?' => 'Voulez-vous vraiment supprimer cet élément ?', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'Voulez-vous vraiment supprimer cette caractéristique ? Elle sera supprimée de tous les gabarits de produit', + 'Do you really want to delete this feature value ?' => 'Voulez-vous vraiment supprimer cette valeur de caractéristique ?', + 'Do you really want to delete this folder and all its content ?' => 'Voulez-vous vraiment supprimer ce dossier et tous ses contenus ?', + 'Do you really want to delete this hook ?' => 'Etes-vous certain de vouloir supprimer ce point d\'accroche ?', + 'Do you really want to delete this image ?' => 'Confirmez-vous la suppression de cette image ?', + 'Do you really want to delete this language ?' => 'Voulez-vous vraiment supprimer cette langue ?', + 'Do you really want to delete this mailing template ?' => 'Voulez-vous vraiment supprimer ce template de mailing ?', + 'Do you really want to delete this module ?' => 'Voulez-vous vraiment supprimer ce module ?', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => 'Voulez-vous vraiment supprimer ce produit et tous ses composants (images, documents) ?
    Cette action ne pourra pas être annulée.', + 'Do you really want to delete this profile ?' => 'Voulez-vous vraiment supprimer ce profil ?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'Voulez-vous réellement supprimer cette promotion ? Tous les produits associés ne seront plus en promotion', + 'Do you really want to delete this shipping zone ?' => 'Confirmez vous la suppression de cette zone de livraison ?', + 'Do you really want to delete this state ?' => 'Voulez vous vraiment supprimer cet état ?', + 'Do you really want to delete this tax ?' => 'Voulez-vous vraiment supprimer cette taxe ?', + 'Do you really want to delete this tax rule ?' => 'Voulez-vous vraiment supprimer cette règle de taxe ?', + 'Do you really want to delete this template ? It will be removed from all products.' => 'Voulez-vous vraiment supprimer ce gabarit ? Il sera supprimé de tous les produits.', + 'Do you really want to delete this variable ?' => 'Voulez-vous vraiment supprimer cette variable ?', + 'Do you really want to remove the content from this folder ?' => 'Voulez-vous vraiment enlever le contenu de ce dossier ?', + 'Do you really want to remove the product from this category ?' => 'êtes-vous sur de vouloir enlever le produit de cette rubrique', + 'Do you really want to remove this accessory from the product ?' => 'êtes-vous sur de vouloir supprimer cet accessoire ?', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => 'Voulez-vous vraiment supprimer cette déclinaison de tous les gabarits de produits ? Vous allez perdre toutes les informations produit liées à cette déclinaison.', + 'Do you really want to remove this attribute from the template ?' => 'Etes-vous sur de vouloir retirer cette déclinaison de ce gabarit ?', + 'Do you really want to remove this country from this shipping zone ?' => 'Voulez-vous retirer ce pays de la zone de livraison ?', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => 'Voulez-vous vraiment enlever cette caractéristique de tous les gabarits de produit ? Vous allez perdre toutes les informations des produits liées à cette caractéristique.', + 'Do you really want to remove this feature from the template ?' => 'Voulez-vous vraiment supprimer cette caractéristique de ce gabarit ?', + 'Do you really want to remove this module from this hook ?' => 'Confirmez-vous la suppression de ce module du point d\'accroche ? ', + 'Do you really want to remove this related content ?' => 'Voulez-vous vraiment supprimer ce contenu lié ?', + 'Do you really want to remove this related content from the product ?' => 'êtes-vous sur de vouloir supprimer ce contenu associé ?', + 'Do you really want to remove this zone ?' => 'Voulez-vous vraiment supprimer cette zone ?', + 'Do you really want to set this coupon available to everyone ?' => 'êtes-vous sur de vouloir rendre ce code promo disponible à tout le monde ?', + 'Do you really want to use this address by default ?' => 'Voulez-vous vraiment utiliser cette adresse comme adresse par défaut ?', + 'Document informations' => 'Informations du document', + 'Documents' => 'Documents', + 'Download invoice as PDF' => 'Télécharger la facture au format PDF', + 'Download purchase order as PDF' => 'Télécharger le bon de commande au format PDF', + 'Drop files to upload' => 'Déposez des fichiers à envoyer', + 'Drop tax here to create a tax group' => 'Déposer une taxe ici afin de créer un groupe de taxe', + 'Drop tax here to delete from group' => 'Déposer une taxe ici afin de la supprimer du groupe', + 'E-mail' => 'E-mail', + 'E-mail template you want to translate' => 'Template e-mail à traduire', + 'E-mail templates' => 'Templates E-mail', + 'EAN Code' => 'Code EAN', + 'Each group of taxes are applied from top to bottom.' => 'Chaque groupe de taxes est appliqué de haut en bas.', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'L\'écotaxe est une taxe qui ajoute un montant défini (grâce à une caractéristique produit) au prix du produit.', + 'Edit' => 'Modifier', + 'Edit Prices' => 'Modifier les prix', + 'Edit a country' => 'Modifier un pays', + 'Edit a currency' => 'Modifier une devise', + 'Edit a customer' => 'Éditer un client', + 'Edit a customer address' => 'Modifier une adresse', + 'Edit a document' => 'Modifier un document', + 'Edit a feature' => 'Modifier une caractéristique', + 'Edit a hook' => 'Modifier un point d\'accroche', + 'Edit a language' => 'Modifier une langue', + 'Edit a mailing template' => 'Modifier un template de mailing', + 'Edit a module' => 'Modifier un module', + 'Edit a module hook' => 'Modifier un point d\'accroche de module', + 'Edit a profile' => 'Modifier le profil', + 'Edit a shipping configuration' => 'Modifier une configuration de livraison', + 'Edit a shipping zone' => 'Modifier la zone de livraison', + 'Edit a state' => 'Modifier un État', + 'Edit a system variable' => 'Modifier une variable système', + 'Edit a tax' => 'Modifier une taxe', + 'Edit a tax rule' => 'Modifier une règle de taxe', + 'Edit a template' => 'Modifier un gabarit', + 'Edit an attribute' => 'Modifier une déclinaison', + 'Edit an image' => 'Modifier une image', + 'Edit an order' => 'Editer une commande', + 'Edit api access' => 'modifier l\'accès à l\'API', + 'Edit attribute "%name"' => 'Modifier la déclinaison "%name"', + 'Edit brand' => 'Modifier un marque', + 'Edit brand %title' => 'Edition de la marque "%title"', + 'Edit category' => 'Editer la rubrique', + 'Edit category %title' => 'Modifier la rubrique %title', + 'Edit content' => 'Modifier le contenu', + 'Edit content %title' => 'Modifier le contenu %title', + 'Edit country "%name"' => 'Modifier le pays "%name"', + 'Edit currency "%name"' => 'Modifier la devise "%name"', + 'Edit customer %firstname %lastname' => 'Modification du client %firstname %lastname ', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Modification du client %firstname %lastname (Ref : %ref) ', + 'Edit delivery address' => 'Editer l\'adresse de livraison', + 'Edit document "%name"' => 'Modifier le document "%name"', + 'Edit feature "%name"' => 'Modifier la caractéristique "%name"', + 'Edit folder' => 'Modifier le dossier', + 'Edit folder %title' => 'Modifier le dossier %title', + 'Edit hook "%name"' => 'modifier le point d\'accroche "%name"', + 'Edit image "%name"' => 'Modifier l\'image "%name"', + 'Edit information in %lng' => 'Modifier les informations en %lng', + 'Edit invoice address' => 'Editer l\'adresse de facturation', + 'Edit mailing template "%name"' => 'Modifier le template de mail "%name"', + 'Edit next brand' => 'Modifier la marque suivante', + 'Edit next category' => 'Modifier la rubrique suivante', + 'Edit next content' => 'Modifier le contenu suivant', + 'Edit next customer' => 'Modifier le client suivant', + 'Edit next folder' => 'Modifier le dossier suivant', + 'Edit next order' => 'Modifier la commande suivante', + 'Edit next product' => 'Modifier le produit suivant', + 'Edit order address' => 'Editer l\'adresse de commande', + 'Edit previous brand' => 'Modifier la marque précédente', + 'Edit previous category' => 'Modifier la rubrique précédente', + 'Edit previous content' => 'Modifier le contenu précédent', + 'Edit previous customer' => 'Modifier le client précédent', + 'Edit previous folder' => 'Modifier le dossier précédent', + 'Edit previous order' => 'Modifier la commande précédente', + 'Edit previous product' => 'Modifier le produit précédent', + 'Edit prices in %curr' => 'Modifier les prix en %curr', + 'Edit product' => 'Modifier le produit', + 'Edit product %title' => 'Modifier le produit %title', + 'Edit state "%name"' => 'Modifier l\'État «%name »', + 'Edit template "%name"' => 'Modifier le gabarit "%name"', + 'Edit this address' => 'Editer cette adresse', + 'Edit this brand' => 'Modifier cette marque', + 'Edit this category' => 'Editer cette rubrique', + 'Edit this content' => 'Modifier ce contenu', + 'Edit this customer' => 'Modifier ce client', + 'Edit this delivery zone' => 'Modifier cette zone de livraison', + 'Edit this folder' => 'Modifier ce dossier', + 'Edit this module' => 'Modifier ce module', + 'Edit this order' => 'Editer cette commande', + 'Edit this product' => 'Modifier ce produit', + 'Edit variable %name' => 'Modifier la variable %name', + 'Editing %cat' => 'Edition de %cat', + 'Editing %fold' => 'Modification de %fold', + 'Editing %title' => 'En cours de modification de %title', + 'Editing attribute "%name"' => 'En cours de modification de la déclinaison "%name"', + 'Editing brand "%title"' => 'Edition de la marque "%title"', + 'Editing country "%name"' => 'En cours de modification du pays "%name"', + 'Editing coupon "%title"' => 'Edition du code promo "%title" ', + 'Editing currency "%name"' => 'En cours de modification de la devise "%name"', + 'Editing document "%name"' => 'Modification du document "%name"', + 'Editing feature "%name"' => 'En cours de modification de la caractéristique "%name"', + 'Editing hook "%name"' => 'Modification du point d\'accroche "%name"', + 'Editing hook for module "%name"' => 'Modification du point d\'accroche pour le module "%name"', + 'Editing image "%name"' => 'Modification de l\'image "%name"', + 'Editing mailing template "%name"' => 'En cours de modification du template de mailing "%name"', + 'Editing module' => 'Module en cours de modification', + 'Editing profile' => 'Modification du profil', + 'Editing profile \'%name\'' => 'Edition du profil \'%name\' ', + 'Editing shipping configuration for module "%name"' => 'Configuration des zones de livraison du module "%name"', + 'Editing shipping zone "%name"' => 'Modification de la zone de livraison "%name"', + 'Editing state "%name"' => 'Modification l\'État «%name »', + 'Editing tax' => 'En cours de modification de la taxe', + 'Editing tax rule' => 'En cours de modification de la règle de taxe', + 'Editing template "%name"' => 'Modification du gabarit "%name"', + 'Editing variable "%name"' => 'Modification de la variable "%name" ', + 'Email' => 'Email', + 'Email address' => 'Adresse e-mail', + 'Email addresses' => 'Adresses e-mail', + 'Email confirmation address' => 'Confirmation de l\'adresse email', + 'Enable remote SMTP use : ' => 'Activer l\'utilisation d\'un serveur SMTP distant:', + 'Enable/Disable' => 'Activer/Désactiver', + 'Enabled' => 'Activé', + 'Encryption' => 'Chiffrement', + 'Encryption :' => 'Chiffrement :', + 'End Date' => 'Date de fin', + 'Enter here all possible attribute values.' => 'Entrez ici toutes les valeurs de déclinaison possible.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Entrez ici toutes les caractéristiques possibles. Afin d\'avoir un texte libre dans le formulaire du produit, n\'ajoutez aucune valeur.', + 'Enter here the attribute name in the default language (%language_name)' => 'Entrez ici le nom de la déclinaison dans la langue par défaut (%language_name)', + 'Enter here the category name in the default language (%title)' => 'Entrer ici le nom de la rubrique dans la langue par défaut (%title)', + 'Enter here the content name in the default language (%title)' => 'Entrez ici le nom du contenu dans la langue par défaut (%title)', + 'Enter here the currency name in the default language (%title)' => 'Renseigner le nom de la devise dans la langue par défaut (%title)', + 'Enter here the feature name in the default language (%title)' => 'Renseigner le nom de la caractéristique dans la langue par défaut (%title)', + 'Enter here the feature value as free text' => 'Indiquez ici la valeur de la caractéristique', + 'Enter here the folder name in the default language (%title)' => 'Entrez ici le nom du dossier dans la langue par défaut (%title)', + 'Enter here the product name in the default language (%title)' => 'Entrez ici le nom du produit dans la langue par défaut (%title)', + 'Enter here the product price in %title' => 'Indiquez ici le prix HT en %title ', + 'Enter here the product reference' => 'Entrez ici la nouvelle référence produit', + 'Enter here the product stock' => 'Indiquez ici le stock du produit', + 'Enter here the product tax price in %title' => 'Indiquez ici le prix TTC en %title ', + 'Enter here the product weight, in Kilogrammes' => 'Entrez ici le poids du produit, en Kilogrammes', + 'Enter here the template name in the default language (%title)' => 'Renseignez le nom du gabarit dans la langue par défaut (%title)', + 'Enter here the value in the current edit language (%language_name)' => 'Renseignez la valeur dans la langue d\'édition actuelle (%language_name)', + 'Enter here the value in the current edit language (%title)' => 'Entrez la valeur dans la langue d\'édition courante (%title)', + 'Enter here the value in the default language (%title)' => 'Indiquez la valeur pour la langue par défaut (%title) ', + 'Enter information in the default language (%title)' => 'Entrez les informations dans la langue par défaut (%title) ', + 'Enter new accessory position' => 'Renseigner la nouvelle position pour cet accessoire', + 'Enter new attribute position' => 'Modifier la position de la déclinaison', + 'Enter new brand position' => 'Indiquez la position désirée', + 'Enter new category position' => 'Classement de la catégorie', + 'Enter new content position' => 'Modifier la position du contenu', + 'Enter new currency position' => 'Modifier la position de la devise', + 'Enter new export category position' => 'Renseigner la nouvelle position pour cet catégorie d\'export', + 'Enter new export position' => 'Renseigner la nouvelle position pour cet export', + 'Enter new feature position' => 'Modifier la position de la caractéristique', + 'Enter new folder position' => 'Modifier la position du dossier', + 'Enter new import category position' => 'Renseigner la nouvelle position pour cet catégorie d\'import', + 'Enter new import position' => 'Renseigner la nouvelle position pour cet import', + 'Enter new module hook position' => 'Saisir la nouvelle position du point d\'accroche du module', + 'Enter new module position' => 'Renseigner la nouvelle position pour ce module', + 'Enter new product position' => 'Classement du produit', + 'Enter new value position' => 'Entrez une nouvelle position', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'Entrer une ou plusieurs adresse IP (V4) séparés pas des ";". Laisser vide pour afficher les logs pour toutes les adresses IP', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'entrer un ou plusieurs nom de fichiers, séparés par des ";". Utiliser "!" avant le nom d\'un fichier pour l\'exclure. Utiliser "*" pour activer les logs sur tous les fichiers', + 'Enter quantity' => 'Entrez la quantité', + 'Error' => 'Erreur', + 'Errors' => 'Erreurs', + 'Example :' => 'Exemple :', + 'Exchange rate' => 'Taux de change', + 'Existing combinations will be deleted. Do you want to continue ?' => 'Les combinaisons existantes seront supprimées. Voulez-vous continuer ?', + 'Expiration date' => 'Date de fin de validité', + 'Expiration date * :' => 'Date d\'expiration * :', + 'Expired' => 'Expiré', + 'Export' => 'Export', + 'Exports' => 'Exports', + 'Failed to get converted prices. Please try again.' => 'Erreur lors de la récupération des prix convertis. Veuillez réessayer.', + 'Failed to get prices. Please try again.' => 'Erreur lors de la récupération des prix. Veuillez réessayer.', + 'Feature Name' => 'Nom de la caractéristique', + 'Feature information' => 'Informations sur la caractéristique', + 'Feature title' => 'Titre de la caractéristique', + 'Feature value' => 'Valeur de la caractéristique', + 'Feature value for this product' => 'Valeur de la caractéristique pour ce produit', + 'Feature values' => 'Valeurs de la caractéristique', + 'Features' => 'Caractéristiques', + 'File' => 'Fichier', + 'File names' => 'Nom du fichier', + 'Filename' => 'Nom du fichier', + 'Filter' => 'Filtrer', + 'Filter by hook name:' => 'Filtrer par nom de point d\'accroche:', + 'First Name' => 'Prénom', + 'First name' => 'Prénom', + 'Firstname' => 'Prénom', + 'Flush the Thelia internal cache' => 'Vider le cache interne de Thelia', + 'Flush the assets cache directory' => 'Vider le cache des assets web', + 'Flush the images and documents cache' => 'Vider le caches des images et documents', + 'Folder' => 'Dossier', + 'Folder created on %date_create. Last modification: %date_change' => 'Dossier créé le %date_create. Dernière modification le %date_change', + 'Folder title' => 'Titre du dossier', + 'Folders' => 'Dossiers', + 'Folders in %fold' => 'Dossier dans %fold', + 'For a tax rule, you can have multiple configurations, as only one tax rule is affected to a product.' => 'Pour une règle de taxes, vous pouvez avoir plusieurs configurations, car une seule règle peut être affectée à un produit.', + 'For prices in %currency' => 'Pour les prix en %currency', + 'Forgot your password ?' => 'Mot de passe oublié ?', + 'Format: %fmt' => 'Format: %fmt ', + 'Format: %fmt, e.g. %date' => 'Format: %fmt, ex. %date ', + 'Free shipping for methods :' => 'Livraison gratuite avec les modes de transport:', + 'Free shipping to countries :' => 'Livraison gratuite vers les pays', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'La TVA française de 20% est une taxe qui ajoute 20% au prix du produit.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'La TVA française de 20% avec écotaxe est l\'application de l\'écotaxe (sur le prix du produit) puis l\'application de la taxe de20% (sur le prix du produit + le montant écotaxe).', + 'From' => 'De', + 'From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below.' => 'Depuis Thelia 2,3, vous devez ajouter une adresse e-mail à votre profil d\'administrateur. Veuillez saisir votre adresse email ci-dessous.', + 'Front Office' => 'Front Office', + 'Front-office template you want to translate' => 'Template front-office à traduire', + 'Front-office templates' => 'Templates Front-office', + 'General' => 'Général', + 'General configuration' => 'Configuration générale', + 'General description' => 'Description générale', + 'General tools' => 'outils généraux', + 'Generate new password' => 'Générer le nouveau mot de passe', + 'Get more information about this module' => 'Voir plus d\'information sur ce module', + 'Go to administration home' => 'Aller à l\'accueil de l\'interface d\'administration', + 'Go to first page' => 'Aller à la première page', + 'Go to last page' => 'Aller à la dernière page', + 'Go to next page' => 'Aller à la page suivante', + 'Go to previous page' => 'Aller à la page précédente', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'Version HTML du message', + 'Here, just drag and drog the available taxes in groups.' => 'Ici, il suffit de glisser et déposer dans les groupes les taxes disponibles.', + 'Hide empty hook' => 'Ne pas afficher les points d\'accroche vides', + 'Home' => 'Accueil', + 'Hook positions' => 'Positions des points d\'accroche', + 'Hooks' => 'Points d\'accroche', + 'Host' => 'Nom de l\'hôte', + 'Host :' => 'Hôte :', + 'ID' => 'ID', + 'IP Addresses' => 'Adresse IP', + 'ISO 4217 Code' => 'Code ISO 4217', + 'ISO 4217 code' => 'Code ISO 4217', + 'ISO 639 Code' => 'Code ISO 639', + 'ISO Code' => 'Code ISO', + 'If a translation is missing or incomplete :' => 'Si une traduction est manquante ou incomplète :', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'Si oui, les redirections générés pas Redirect::exec seront affichés par des liens', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'En changeant de template, les prix vont être réinitialiser et vous devrez les reconfigurer', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'Si vous voulez traduire les composants essentiels de Thelia : son noyau, l\'installation, les modules ou les modèles par défaut.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'Si votre but est simplement de traduire votre site, veuillez utiliser le mode utilisateur.
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'La chaîne semble contient une variable smarty ($). Si c\'est le cas elle ne peut pas être traduite correctement', + 'Image information' => 'Information de l\'image', + 'Image+file+not+found' => 'Fichier+image+absent', + 'Images' => 'Images', + 'Import' => 'Import', + 'Import this file' => 'Importer ce fichier', + 'Imports' => 'Imports', + 'Impossible to change active flag. Please contact your administrator or try later' => 'Impossible de modifier la valeur actif du point d\'accroche. Contacter votre administrateur ou réessayer plus tard.', + 'Impossible to change default country. Please contact your administrator or try later' => 'Impossible de modifier le pays par défaut. Veuillez contacter votre administrateur ou réessayer plus tard', + 'Impossible to change default languages. Please contact your administrator or try later' => 'Impossible de modifier la langue par défaut. Veuillez contacter votre administrateur ou essayer plus tard', + 'Impossible to change official hook. Please contact your administrator or try later' => 'Impossible de changer un point d\'accroche officiel. Contactez votre administrateur ou ré-essayez ultérieurement.', + 'In a group, each taxes are applied independently on the incomming price (the price without tax for the first group).' => 'Dans un groupe, chaque taxe sera appliquée indépendamment sur le prix en entrée (le prix h.t. pour le premier groupe).', + 'In order to manges your shop taxes you can manage' => 'Pour pouvoir gérer les taxes de votre magasin vous pouvez gérer', + 'In page' => 'Dans la page', + 'In pages:' => 'Dans les pages : ', + 'Inactive' => 'Inactif', + 'Included countries' => 'Pays inclus', + 'Information on this hook' => 'Information sur ce point d\'accroche', + 'Install !' => 'Installer !', + 'Install or update a module' => 'Installer ou mettre à jour un module', + 'Invoice' => 'Facture', + 'Invoice and Delivery' => 'Livraison et facturation', + 'Invoice date' => 'Date de facturation', + 'Invoice informations' => 'Informations de facturation', + 'Invoice reference' => 'Facture ref', + 'It\'s strongly recommended to use our translation platform' => 'Il est vivement recommandé d\'utiliser notre plateforme de traduction', + 'Items to translate' => 'Elément à traduire', + 'Keep attention that in translating you can override the resource translations.
    ' => 'Attention ! en faisant la traduction vous pouvez écraser les traductions de ces ressources.
    ', + 'Kg' => 'Kg', + 'Label' => 'Libellé', + 'Language name' => 'Nom de la langue', + 'Language title' => 'Titre de la langue', + 'Languages' => 'Langues', + 'Languages & URLs' => 'Langues et URLs', + 'Languages management' => 'Gestion des langues', + 'Last Name' => 'Nom', + 'Last name' => 'Nom', + 'Last order amount' => 'Montant de la dernière commande', + 'Lastname' => 'Nom', + 'Leave empty to keep current password' => 'Laisser ce champ vide pour ne pas modifier le mot de passe', + 'Locale' => 'Paramètre régional', + 'Log lines format' => 'Format d\'une ligne de log', + 'Log lines header format. You may use the following variables: ' => 'Format d\'une ligne de log. Vous pouvez utiliser ces variables : ', + 'Login' => 'Connexion', + 'Logout' => 'Se déconnecter', + 'Long description :' => 'Description longue', + 'Mailing system' => 'Envoi des e-mails', + 'Mailing templates' => 'Template e-mail', + 'Manage attributes included in this product template' => 'Gestion des déclinaisons présentes dans ce gabarit de produit', + 'Manage features included in this product template' => 'Gestion des caractéristiques présentes dans ce gabarit de produit', + 'Manage hooks' => 'Gestion des points d\'accroche', + 'Manage its hooks' => 'Gérer les points d\'accroche de ce module', + 'Manage module rights' => 'Gestion des droits pour les modules', + 'Manage modules' => 'Gestion des modules', + 'Manage modules attachements' => 'Gérer les points d\'accroche des modules', + 'Manage resource rights' => 'Gestion de droits pour les ressources', + 'Manage taxes' => 'Gérer les taxes', + 'Manage the tax rule taxes appliance order' => 'Gérer les règles de taxe et leur ordre d\'application', + 'Maximum usage count :' => 'Nombre maximum d\'utilisations', + 'Message created on %date_create. Last modification: %date_change' => 'Message créé le %date_create. Dernière modification le %date_change', + 'Message data' => 'Données du message', + 'Message level' => 'Niveau de message', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'Les messages avec un niveau d\'erreur supérieur ou égal à celui sélectionné seront rajoutés dans les logs', + 'Minimum required Thelia version' => 'Version minimale de Thelia requise', + 'Module' => 'Module', + 'Module %mod: %error' => 'Module %mod: %error', + 'Module access rights' => 'Droits d\'accès pour les modules', + 'Module code' => 'Code du module', + 'Module component' => 'Composant du module', + 'Module created on %date_create. Last modification: %date_change' => 'Module crée le %date_create. Dernière modification le %date_change', + 'Module detailed information' => 'Informations détaillées sur le module', + 'Module file' => 'Fichier du module', + 'Module name' => 'Nom du module', + 'Module type' => 'Type de module', + 'Module you want to translate' => 'Module à traduire', + 'Modules' => 'Modules', + 'Modules attachments' => 'Points d\'accroche des modules', + 'More information about ISO 4217' => 'Plus d\'information à propos de l\'ISO 4217', + 'More pages after' => 'Pages suivantes', + 'More pages before' => 'Pages précédentes', + 'Name' => 'Nom', + 'Namespace of main class' => 'Espace de noms de la classe principale', + 'New' => 'Nouveau', + 'New Configuration' => 'Nouvelle Configuration', + 'No' => 'Non', + 'No Folders found' => 'Aucun dossier trouvé', + 'No administration profile defined yet. Click the + button to create one.' => 'Aucun profil d\'administration n\'a encore été créé. Cliquer le bouton + pour en ajouter un.', + 'No area defined with this id' => 'Pas de zone définie avec cette id', + 'No attributes.' => 'Aucun attribut.', + 'No available content in this folder' => 'Ce dossier n\'a pas de contenu', + 'No available product in this category' => 'Aucun produit disponible dans cette rubrique', + 'No available value for this attribute' => 'Aucune valeur disponible pour cette déclinaison', + 'No brand' => 'Aucune marque', + 'No brand has been created yet. Click the + button to create one.' => 'Aucune marque n\'a encore été créée. Cliquez le bouton + pour en ajouter une.', + 'No categories found' => 'Aucune rubrique trouvée', + 'No category found for "%term"' => 'Aucune catégorie trouvée pour "%term"', + 'No config.' => 'Aucune config.', + 'No content found for "%term"' => 'Aucun contenu trouvé pour "%term"', + 'No country' => 'Aucun pays', + 'No country has been created yet. Click the + button to create one.' => 'Aucun pays n\'a encore été créé. Cliquez sur le bouton + pour en créer un', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'Aucun code promotion n\'existe pour le moment. Utilisez le bouton (+) pour créer votre premier code promo.', + 'No currency has been created yet. Click the + button to create one.' => 'Aucune devise n\'a encore été crée. Cliquez sur le bouton + pour en créer une.', + 'No customer found for "%term"' => 'Aucun client trouvé pour «%term »', + 'No description for this hook' => 'Aucune description sur ce point d\'accroche', + 'No document' => 'Aucun document', + 'No email defined' => 'Aucun email défini', + 'No filters' => 'Aucun filtre', + 'No folder found for "%term"' => 'Aucun dossier trouvé pour «%term »', + 'No folders found' => 'Aucun dossier n\'a été trouvé.', + 'No hooks has been created yet. Click the + button to create one.' => 'Aucun point d\'accroche n\'a été encore créé. Cliquer sur le bouton + pour en créer un.', + 'No logo image' => 'Aucun logo', + 'No mailing template has been created yet. Click the + button to create one.' => 'Aucun template de mailing n\'a encore été créé. Cliquez sur le bouton + pour en ajouter un.', + 'No module of this type was found.' => 'Aucun module de ce type n\'a été trouvé', + 'No order found for "%term"' => 'Aucune commande trouvée pour «%term »', + 'No orders fo this customer.' => 'Ce client n\'a passé aucune commande.', + 'No product attribute has been created yet. Click the + button to create one.' => 'Aucune déclinaison produit n\'a encore été créée. Cliquez sur le bouton + pour en créer une.', + 'No product feature has been created yet. Click the + button to create one.' => 'Aucune caractéristique produit n\'a encore été ajoutée. Cliquez sur le bouton + pour en créer une.', + 'No product found for "%term"' => 'Aucun produit trouvé pour "%term"', + 'No product template has been created yet. Click the + button to create one.' => 'Aucun gabarit de produit n\'a encore été créé. Cliquez sur le bouton + pour en créer une.', + 'No sale has been created yet. Click the + button to create one.' => 'Aucune promotion n\'a encore été créée. Cliquez le bouton + pour en ajouter une.', + 'No shipping zone attached to this module, click here to attach one' => 'Aucune zone de livraison n\'est couverte par ce module, cliquez ici pour en attribuer une', + 'No shipping zone defined yet. Click the + button to create one.' => 'Aucune zone de livraison n\'a encore été créée. Cliquer le bouton + pour en ajouter une', + 'No state has been created yet. Click the + button to create one.' => 'Aucun état n\'a encore été créé. Cliquez sur le bouton + pour en créer un.', + 'No value has been created yet. Click the + button to create one.' => 'Aucune valeur n\'a encore été crée. Cliquez sur le bouton + pour en créer une.', + 'None' => 'Aucun', + 'None defined' => 'Non définie', + 'N° ISO' => 'N° ISO', + 'OK' => 'OK', + 'Official' => 'Officiel', + 'Online' => 'En ligne', + 'Oops! An Error Occurred' => 'Oops ! Une erreur est survenue', + 'Or' => 'Ou', + 'Order %ref - ID %id' => 'Commande %ref - ID %id ', + 'Order details' => 'Détail de la commande', + 'Order n°' => 'Commande n°', + 'Order status:' => 'Statut de la commande : ', + 'Ordered products' => 'Produits commandés', + 'Orders' => 'Commandes', + 'Originating file line number ' => 'Originaire de numéro de ligne de fichier ', + 'Originating file name' => 'Nom du fichier source', + 'Originating function name ' => 'Nom de la fonction origine ', + 'Other addresses' => 'Autres adresses', + 'PDF template you want to translate' => 'Template PDF à traduire', + 'PDF templates' => 'Templates PDF', + 'PDF | Invoice' => 'Facture PDF', + 'PDF | Purchase order' => 'Bon de commande PDF', + 'Page not found' => 'Page non trouvée', + 'Parameters' => 'Paramètres', + 'Parse template' => 'Analyser le template', + 'Password' => 'Mot de passe', + 'Password :' => 'Mot de passe : ', + 'Password changed' => 'Mot de passe modifié', + 'Payment information' => 'Informations de paiement', + 'Payment module' => 'Module de paiement', + 'Payment modules' => 'Modules de payment', + 'Percent Discount' => 'Pourcentage de remise', + 'Period' => 'Période', + 'Phone' => 'Téléphone', + 'Phone & Fax' => 'Téléphone & Fax', + 'Phone number' => 'Numéro de téléphone', + 'Please enter the date using the %fmt format' => 'Veuillez saisir la date en utilisant le format %fmt', + 'Please retry' => 'Merci de réessayer', + 'Please save this coupon first to define coupon conditions' => 'Enregistrez ce nouveau code promo pour définir les conditions d\'utilisation', + 'Please select a condition' => 'Choisissez une condition', + 'Please select a coupon type' => 'Merci d\'entrer le type de code', + 'Please select another condition' => 'Merci de sélectionner une autre condition', + 'Please select at least one category.' => 'Merci de choisir au moins une catégorie', + 'Please select items to translate' => 'Veuillez sélectionner un élément', + 'Please select one or more categories which contains some products' => 'Choisissez une ou plusieurs catégories de produits', + 'Please select the B.O. template to translate' => 'Sélectionnez le template back-office à traduire', + 'Please select the E-mail template to translate' => 'Sélectionnez le template de mail à traduire', + 'Please select the F.O. template to translate' => 'Sélectionnez le template front-office à traduire', + 'Please select the PDF template to translate' => 'Sélectionnez le template PDF à traduire', + 'Please select the module component' => 'Choisissez un composant du module', + 'Please select the module to translate' => 'Sélectionnez le module à traduire', + 'Please select your editing mode :' => 'Veuillez sélectionner le mode d\'édition :', + 'Please select...' => 'Merci de choisir...', + 'Please wait, loading' => 'Chargement, veuillez patienter', + 'Please wait, loading products list' => 'Veuillez patienter, chargement de la liste des produits', + 'Port' => 'Port', + 'Port :' => 'Port : ', + 'Position' => 'Position', + 'Postage' => 'Frais de livraison', + 'Postscriptum' => 'Post-scriptum', + 'Preview' => 'Prévisualisation', + 'Preview HTML' => 'Prévisualisation HTML', + 'Preview brand page' => 'Aperçu de la page marque', + 'Preview category page' => 'Aperçu de la page rubrique', + 'Preview content page' => 'Aperçu de la page contenu', + 'Preview folder page' => 'Aperçu de la page dossier', + 'Preview product page' => 'Aperçu de la page produit', + 'Preview text' => 'Prévisualisation du texte', + 'Price' => 'Prix', + 'Price (%currency)
    w/ taxes' => 'Prix (%currency)
    TTC', + 'Price (%currency)
    w/o taxes' => 'Prix (%currency)
    HT', + 'Price excl. taxes' => 'Prix taxes exclues', + 'Price incl. taxes' => 'Prix TTC', + 'Pricing' => 'Définition des prix', + 'Product' => 'Produit', + 'Product Attributes' => 'Déclinaisons du produit', + 'Product EAN Code' => 'Code EAN du produit', + 'Product Features' => 'Caractéristiques du produit', + 'Product accessories' => 'Accessoires', + 'Product attribute selection' => 'Sélection des déclinaisons', + 'Product attributes' => 'Déclinaisons produit', + 'Product catalog configuration' => 'Configuration du catalogue produit', + 'Product created on %date_create. Last modification: %date_change' => 'Produit créé le %date_create. Dernière modification le %date_change', + 'Product features' => 'Caractéristiques produit', + 'Product price' => 'Prix du produit', + 'Product price including taxes' => 'Prix du produit taxes incluses', + 'Product stock' => 'Stock du produit', + 'Product tax price' => 'Prix TTC', + 'Product templates' => 'Gabarits de produit', + 'Product title' => 'Titre du produit', + 'Product weight' => 'Poids du produit', + 'Product\'s attributes included in this sale operation' => 'Déclinaisons incluses dans cette promotion', + 'Products' => 'Produits', + 'Products are :' => 'Les produits sont :', + 'Products in %cat' => 'Produits dans %cat', + 'Products selection' => 'Choix des produits', + 'Profil' => 'Profil', + 'Profile' => 'Profil', + 'Profile code' => 'Code du profil', + 'Profile created on %date_create. Last modification: %date_change' => 'Profil crée le %date_create. Dernière modification le %date_change ', + 'Profiles' => 'Profils', + 'Promotion' => 'Promo', + 'Provides free shipping' => 'Offre le port', + 'Published by OpenStudio' => 'Développé par OpenStudio', + 'Purpose' => 'Objet', + 'Put module in hook' => 'Placer le module dans le point d\'accroche', + 'Quantity' => 'Quantité', + 'Quickly create combinations using the combination builder' => 'Créer rapidement une combinaison via le générateur de combinaison', + 'Rate' => 'Taux', + 'Read module documentation' => 'Lire la documentation du module', + 'Read the documentation of this module' => 'Lire la documentation de ce module', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'Redéfinir le texte globalement. Cette traduction sera alors utilisée partout, à part si une traduction existe pour une ressource.', + 'Redefine the text only for this resource.' => 'Redéfinir le texte seulement pour cette ressource.', + 'Reference' => 'Référence', + 'Registration date' => 'Date d\'enregistrement', + 'Related content' => 'Contenu associé', + 'Remove a module from a hook' => 'Supprimer un module d\'un point d\'accroche', + 'Remove an accessory' => 'Supprimer l\'accessoire', + 'Remove associated folder' => 'Enlever le dossier associé', + 'Remove attribute' => 'Supprimer la déclinaison', + 'Remove country' => 'Enlever ce pays', + 'Remove feature' => 'Enlever la caractéristique', + 'Remove from all product templates' => 'Enlever de tous les gabarits de produit', + 'Remove from category' => 'Supprimer de la rubrique', + 'Remove from selected categories' => 'Supprimer des catégories sélectionnées', + 'Remove related content' => 'Enlever les contenus liés', + 'Remove selected values' => 'Enlever les valeur sélectionnées', + 'Remove the product from this category' => 'Enlever ce produit de cette rubrique', + 'Remove this attribute from all product templates' => 'Enlever cette déclinaison de tous les gabarits de produit', + 'Remove this feature from all product templates' => 'Enlever cette caractéristique de tous les gabarits de produit', + 'Remove zone' => 'Supprimer la zone', + 'Request a new password' => 'Demander un nouveau mot de passe', + 'Required modules' => 'Modules requis', + 'Reset' => 'Remise à zéro', + 'Reset sale status for all products' => 'RAZ de toutes les promotions', + 'Resource' => 'Ressource', + 'Resource access rights' => 'Droits d\'accès pour les ressources', + 'Resources' => 'Ressources', + 'Rights' => 'Droits', + 'SEO' => 'SEO', + 'Sale' => 'En promo', + 'Sale configuration' => 'Configurer la promotion', + 'Sale created on %date_create. Last modification: %date_change' => 'Promotion créée le %date_create. Dernière modification: %date_change', + 'Sale operation description' => 'Description de la promotion', + 'Sale operation features' => 'Caractéristiques de la promotion', + 'Sale price (%currency)
    w/ taxes' => 'Prix promo (%currency)
    TTC', + 'Sale price (%currency)
    w/o taxes' => 'Prix promo (%currency)
    HT', + 'Sale price incl. taxes' => 'Prix promo TTC', + 'Sales management' => 'Gestion des promotions', + 'Save' => ' Enregistrer', + 'Save and close' => 'Enregistrer et fermer', + 'Save chages' => 'Enregistrer les modifications', + 'Save changes' => 'Enregistrer les modifications', + 'Save tax rule taxes' => 'Enregistrer la règle de taxes', + 'Save this address' => 'Sauvegarder cette adresse', + 'Save this condition' => 'Enregistrer cette condition', + 'Search' => 'Recherche', + 'Search a module' => 'Rechercher un module', + 'Search for \'%term\'' => 'Recherche de \'%term\'', + 'Search on Thelia Modules' => 'Rechercher sur Thelia Modules', + 'Secure key' => 'Clé d\'échange', + 'Select' => 'Sélectionner', + 'Select a category and click (+) to add it to the additional category list' => 'Sélectionner une rubrique et cliquez sur (+) pour la rajouter dans la liste des rubrique associées', + 'Select a category to get its products' => 'Sélectionner une rubrique pour avoir les produits qu\'elle contient', + 'Select a category...' => 'Sélectionner une rubrique...', + 'Select a configuration' => 'Sélectionnez une configuration', + 'Select a content and click (+) to add it to this category' => 'Sélectionnez un contenu et cliquez sur (+) pour l\'ajouter à cette rubrique', + 'Select a content and click (+) to add it to this product' => 'Sélectionner un contenu et cliquer sur (+) pour l\'associer au produit', + 'Select a feature and click (+) to add it to this template' => 'Choisissez une caractéristique et cliquez (+) pour l\'ajouter à ce gabarit', + 'Select a feature...' => 'Choisissez une caractéristique', + 'Select a folder and click (+) to add it to the additional folder list' => 'Sélectionnez un dossier et cliquez sur (+) afin de l\'ajouter à la liste des dossiers additionnels', + 'Select a folder content...' => 'Choisissez un dossier de contenu...', + 'Select a folder to get its content' => 'Choisissez un dossier de contenu pour lister ses contenus', + 'Select a folder...' => 'Choisissez un dossier de contenu...', + 'Select a product and click (+) to add it as an accessory' => 'Sélectionner un produit et cliquer sur (+) pour l\'ajouter en tant qu\'accessoire', + 'Select a product...' => 'Sélectionner un produit...', + 'Select a tax tule' => 'Sélectionnez une règle de taxes', + 'Select a template' => 'Choisissez un gabarit', + 'Select a value click (+) to add it to the combination' => 'Sélectionnez une valeur et cliquez sur (+) pour l\'ajouter à la combinaison', + 'Select an attribute and click (+) to add it to this template' => 'Sélectionner une déclinaison et cliquer sur (+) pour l\'ajouter à ce gabarit', + 'Select an attribute and click (+) to view available values' => 'Sélectionnez une déclinaison et cliquez sur (+) pour voir les valeurs disponibles', + 'Select an attribute value...' => 'Sélectionnez une valeur de déclinaison...', + 'Select an attribute...' => 'Sélectionnez une déclinaison...', + 'Select attribute :' => 'Choisissez une déclinaison', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'Sélectionnez les valeurs de déclinaison à combiner. Vous pouvez entrer une valeur par défaut pour certains champs des combinaisons générées.', + 'Select here a template for this product' => 'Choisissez un gabarit pour ce produit', + 'Select here the tax applicable to this product' => 'Sélectionnez ici la taxe applicable sur ce produit', + 'Select offered product :' => 'Produit offert :', + 'Select offrered product category :' => 'Catégorie du produit offert :', + 'Select or deselect all products' => 'Sélectionner ou dé-sélectionner tous les produits', + 'Select product category :' => 'Catégorie des produits :', + 'Select the attributes values of "%title" that should be included in this sale operation.' => 'Choisissez les attributs de "%title" qui doivent être incluent dans la promotion', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Choisissez les produits inclus dans cette promotion. Vous pouvez aussi limiter votre sélection à certaines déclinaisons si vous le souhaitez', + 'Selected categories' => 'Catégories sélectionnées', + 'Send' => 'Envoyer', + 'Send a mail to this customer' => 'Contacter ce client par mail', + 'Send files' => 'Envoyer des fichiers', + 'Sequential number of log line' => 'Numéro séquentiel de la ligne du journal de log', + 'Set as default tax rule' => 'Configurer en tant que règle par défaut', + 'Sets the separator for the decimal point' => 'séparateur décimal', + 'Sets the thousands separator.' => 'séparateur des milliers', + 'Shipping configuration' => 'Configuration du transport', + 'Shipping configuration of delivery module "%title"' => 'Configuration des zones de livraison du module "%title" ', + 'Shipping zone' => 'Zone de livraison', + 'Shipping zone "%title"' => 'Zone de livraison "%title"', + 'Shipping zones' => 'Zones de livraison', + 'Shipping zones for this country' => 'Zones de livraison pour ce pays', + 'Shipping zones for this module' => 'Zones de livraison associées à ce module', + 'Shipping zones management' => 'Zones de livraison', + 'Short description' => 'Description courte', + 'Short description :' => 'Description courte : ', + 'Show logs' => 'Voir les logs', + 'So, each configuration is a list of taxes applied to a list of countries/states.' => 'Chaque configuration est donc une liste des taxes appliquées à une liste de pays/États.', + 'Some of your translations are not saved. Continue anyway ?' => 'Certaines des traductions ne sont pas sauvegardées. Souhaitez-vous continuer ?', + 'Something goes wrong, please try again' => 'Une erreur s\'est produite, merci de ré-essayer.', + 'Something goes wrong, please try again.' => 'Une erreur s\'est produite, merci de ré-essayer.', + 'Sorry, attribute ID=%id was not found.' => 'Désolé, la déclinaison ID=%id n\'a pas été trouvée.', + 'Sorry, country ID=%id was not found.' => 'Désolé, le pays ID=%id n\'a pas été trouvé.', + 'Sorry, currency ID=%id was not found.' => 'Désolé, le devise ID=%id n\'a pas été trouvée.', + 'Sorry, customer ID=%id was not found.' => 'Désolé, le client ID=%id n\'a pas été trouvé', + 'Sorry, document ID=%id was not found.' => 'Désolé, le document ID=%id n\'a pas été trouvé.', + 'Sorry, feature ID=%id was not found.' => 'Désolé, la caractéristique ID=%id n\'a pas été trouvée.', + 'Sorry, hook ID=%id was not found.' => 'Désolé, le point d\'accroche ID=%id n\'a pas été trouvé.', + 'Sorry, image ID=%id was not found.' => 'Désolé, l\'image ID=%id n\'a pas été trouvée.', + 'Sorry, message ID=%id was not found.' => 'Désolé, le message ID=%id n\'a pas été trouvé.', + 'Sorry, module hook ID=%id was not found.' => 'Désolé, le point d\'accroche du module ID=%id n\'a pas été trouvé.', + 'Sorry, state ID=%id was not found.' => 'Désolé, l\'ID de l\'état =%id n\'a pas été trouvé.', + 'Sorry, template ID=%id was not found.' => 'Désolé, le gabarit ID=%id n\'a pas été trouvé.', + 'Sorry, variable ID=%id was not found.' => 'Désolé, la variable ID=%id n\'a pas été trouvée.', + 'Source IP' => 'IP source', + 'Source IP :' => 'IP source : ', + 'Stability' => 'Stabilité', + 'Start Date' => 'Date de début', + 'State' => 'État/région', + 'States' => 'États', + 'States / Provinces' => 'États / Provinces', + 'States/provinces assigned to this country' => 'États/provinces assignés à ce pays', + 'Status' => 'Etat', + 'Stock' => 'Stock', + 'Store' => 'Information boutique', + 'Store address' => 'Adresse de la boutique', + 'Store configuration' => 'Configuration de la boutique', + 'Street address' => 'Adresse', + 'Subtitle' => 'Sous-titre', + 'Superadministrator' => 'Super-administrateur', + 'Supported locales' => 'Langues supportées', + 'Symbol' => 'Symbole', + 'System Logs' => 'Gestion des logs', + 'System Logs configuration' => 'Configuration des logs', + 'System logs' => 'Journal des logs', + 'System parameters' => 'Paramètres système ', + 'System variables' => 'Gestion des variables', + 'Tags' => 'Catégories', + 'Tax' => 'Taxe', + 'Tax created on %date_create. Last modification: %date_change' => 'Taxe créée le %date_create. Dernière modification: %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => 'Règle de taxe créée le %date_create. Dernière modification le %date_change', + 'Tax rules' => 'Règles de taxes', + 'Tax rules are combination of different taxes.' => 'Les règles de taxe sont une combinaison de différentes taxes.', + 'Taxed total' => 'Montant total des taxes', + 'Taxes' => 'Taxes', + 'Taxes configuration' => 'Configuration des taxes', + 'Taxes define the amount of money which is added to a bought product.' => 'Les taxes correspondent au montant ajouté au prix HT d\'un produit acheté', + 'Taxes rules' => 'Règles de taxes', + 'Template name' => 'Nom du gabarit', + 'Template title' => 'Titre du gabarit', + 'Template type' => 'Type de template', + 'Templates' => 'Gabarits de produit', + 'Test your configuration' => 'Tester la configuration', + 'Text version of this message' => 'Version texte du message', + 'That way, Thelia community will benefit of your translations' => 'De cette façon, la communauté de Thelia bénéficiera de vos traductions', + 'The default pricing is used when no combination is defined.' => 'Le prix par défaut est utilisé lorsqu\'aucune combinaison n\'est utilisée.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'Les destinations permettent d\'afficher, stocker ou bien envoyer les logs. Vous pouvez en sélectionner zéro, un ou plusieurs dans la liste ci-dessous', + 'The detailed description.' => 'La description détaillée.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'Le dossier local/I18n n\'existe pas ou n\'est pas accessible en écriture. Veuillez corriger le problème.', + 'The following error message has been found: %msg' => 'Le message d\'erreur suivant a été trouvé : %msg', + 'The hooks have been updated successfuly !' => 'Les points d\'accroche ont été mise à jour !', + 'The outcomming price is the sum of the incomming one and the sum of taxes.' => 'Le prix sortant est la somme du prix entrant et de la somme des taxes appliquées.', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'La page demandé a rencontré un problème. Merci de contacter le développeur du module que vous êtes en train d\'utiliser ou bien d\'ouvrir une issue à l\'équipe de développement de Thelia sur Github : %url', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'La page désirée n\'existe pas. Merci de vérifier votre adresse et réessayer', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'Le taux à partir de l\'Euro (Prix en Euro * taux = Prix dans la devise)', + 'The selected categories :' => 'Dans les catégories sélectionnées :', + 'The selected countries :' => 'Les pays sélectionnés', + 'The selected customer :' => 'Les clients sélectionnés', + 'The selected products :' => 'Les produits sélectionnés', + 'The server returned a "404 Not Found"' => 'Le serveur a retourné une erreur "404 Not Found"', + 'The syntax used is identical to the PHP date() function' => 'La syntaxe utilisé est la même que la fonction date() de PHP', + 'Thelia Back Office' => 'Panel d\'administration de Thelia', + 'Thelia Installation' => 'Installation de Thelia', + 'Thelia Installation Wizard' => ' Assistant d\'installation de Thelia', + 'Thelia Languages' => 'Langue Thelia', + 'Thelia Mailing System' => 'Configuration des envois de mails', + 'Thelia Mailing Templates' => 'Template de Mailing Thelia', + 'Thelia Product Attributes' => 'Attributs produit Thelia', + 'Thelia Product Features' => 'Caractéristiques produit de Thelia', + 'Thelia Product Templates' => 'Gabarits produit Thelia', + 'Thelia Shipping configuration' => 'Configuration des livraisons Thelia', + 'Thelia Shipping zones' => 'Zone de livraison de Thelia', + 'Thelia System Variables' => 'Variables Thelia', + 'Thelia caches flushing' => 'Vidage des caches Thelia', + 'Thelia contributions' => 'Contributions de Thelia', + 'Thelia core' => 'Coeur de Thelia', + 'Thelia mailing templates' => 'Template de mailing Thelia', + 'Thelia product attributes' => 'Déclinaisons du produit Thelia', + 'Thelia product features' => 'Caractéristiques produit de Thelia', + 'Thelia product templates' => 'Gabarits de produit Thelia', + 'Thelia support forum' => 'Forum de Thelia', + 'Thelia system variables' => 'Variables Thelia', + 'There are no shipping zones attached to this module.' => 'Ce module de transport n\'est associé à aucune zone de livraison', + 'There is 2 kind of translations :' => 'Il existe 2 sortes de traductions :', + 'There is currently no active module here.' => 'Il n\'y a aucun module actif ici', + 'There is currently no available attributes.' => 'Aucune déclinaison n\'est disponible.', + 'There is currently no available features.' => 'Aucune caractéristique n\'est disponible.', + 'There is no documents attached to this %type.' => 'Il n\'y a aucun document lié à ce %type.', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'Il n\'y a aucun document à associer à ce produit. Seuls les documents non visibles peuvent être sélectionnés !', + 'There is no images attached to this %type.' => 'Il n\'y a pas d\'image liée à ce %type.', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Cet administrateur est lié avec un ou plusieurs autres administrateurs. Supprimez ou modifiez ces administrateurs d\'abord.', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'Il y a des administrateurs liés à ce profil. Veuillez les modifier/supprimer avant de supprimer ce profil.', + 'This category contains no contents' => 'Cette rubrique n\'a aucun contenu', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Cette rubrique n\'a aucun produit. Pour créer un nouveau produit, cliquer sur le bouton + ci-dessus. ', + 'This category has no sub-categories.' => 'Cette rubrique n\'a pas de sous-rubrique.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Cette rubrique n\'a pas de sous-rubrique. Pour en créer une nouvelle, cliquez sur le bouton + ci-dessus.', + 'This country is not included in any shipping zone' => 'Ce pays ne fait partie d\'aucune zone de livraison', + 'This customer has not defined any delivery address' => 'Ce client n\'a pas saisi aucune adresse de livraison', + 'This customer has orders, and can\'t be deleted.' => 'Ce client a effectué des commandes, et ne peut être supprimé.', + 'This delivery module handles all shipping zones.' => 'Ce module livre dans toutes les zones de livraison.', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'Ce dossier n\'a aucun contenu. Pour ajouter un nouveau contenu, cliquez sur le bouton + ci-dessus.', + 'This folder has no sub-folders.' => 'Ce dossier n\'a pas de sous-dossiers.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'Ce dossier n\'a pas de sous-dossiers. Afin de créer un nouveau, cliquez sur le bouton + ci-dessus.', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'Ce n\'est pas un problème tant que vous ne mettez pas à jour ces ressources (Thelia, module, template).
    ', + 'This is the code entered by your customers to use this coupon' => 'Il s\'agit du code qui sera saisi par vos clients', + 'This mailing template could not be changed.' => 'Le template de mailing ne peut pas être changé', + 'This module cannot be started, some files are probably missing.' => 'Ce module ne peut pas être démarré, il manque sans doute des fichiers.', + 'This outcomming price is then passed to the next group as its incomming price, etc...' => 'Ce prix sortant est ensuite transmis au groupe suivant comme prix entrant, etc ...', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'cette page vous permet de traduire les différentes ressources de votre site : Thelia, modules, templates.
    ', + 'This product contains no accessories' => 'Ce produit n\'a aucun accessoire', + 'This product contains no contents' => 'Ce produit n\'a aucun contenu associé', + 'This product doesn\'t belong to any additional category.' => 'Ce produit n\'est associé à aucune rubrique supplémentaire', + 'This product doesn\'t belong to any additional folder.' => 'Ce produit n\'appartient à aucun dossier additionnel.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'Ce produit n\'a pas de combinaison. Le prix par défaut est utilisé. Créer une nouvelle combinaison. ', + 'This product template does not contains any features' => 'Ce gabarit de produit ne comporte aucune caractéristique', + 'This shipping zone does not contains any country.' => 'Cette zone de livraison ne comporte aucun pays', + 'This template contains no attributes' => 'Ce gabarit n\'a pas de déclinaison', + 'This template contains no features' => 'Ce gabarit ne contient aucune caractéristique', + 'This variable could not be changed.' => 'Cette variable ne peut pas être modifié', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'Plus aucun de vos produits ne sera en promotion, et toutes vos promotions vont être désactivées. Voulez-vous continuer ?', + 'Timeout' => 'Délai d\'attente expiré', + 'Timeout :' => 'Délai d\'attente expiré : ', + 'Title' => 'Titre', + 'Title * :' => 'Titre * : ', + 'To' => 'A', + 'To create a new content, select an existing folder, or create a new one.' => 'Pour créer un nouveau contenu, sélectionnez un dossier existant ou créez en un nouveau', + 'To create a new product, select an existing category, or create a new one.' => 'Pour créer un nouveau produit, veuillez sélectionner une rubrique existante ou en créer une nouvelle', + 'To remove a value from the combination, select it and click "remove"' => 'Afin de supprimer une valeur de la combinaison, sélectionnez la et cliquez sur "Enlever"', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'Pour utiliser les déclinaisons et les caractéristiques sur ce produit, choisissez un template produit. Vous pouvez gérer les gabarits de produit dans la section configuration de l\'administration.', + 'Toggle select all' => 'Tout cocher/décocher', + 'Tools' => 'Outils', + 'Top level' => 'Niveau 1', + 'Top level Contents' => 'Contenus de niveau 1', + 'Top level Products' => 'Produits mis en avant', + 'Top level categories' => 'Rubriques de niveau 1', + 'Top level folders' => 'Dossiers de niveau 1', + 'Total' => 'Total', + 'Total including discount' => 'Total avec remise', + 'Total without discount' => 'Montant total hors remises', + 'Transaction' => 'Transaction', + 'Transaction reference' => 'Référence de la transaction', + 'Translation' => 'Traductions', + 'Translations' => 'Traductions', + 'Type:' => 'Type :', + 'Unit taxed price' => 'Prix unitaire TTC', + 'Unit. price' => 'Prix unitaire', + 'Unlimited' => 'Illimité', + 'Unlimited number of uses' => 'Nombre d\'utilisations illimité', + 'Unspecified' => 'Non mentionné', + 'Unsupported field type \'%type\' in form-field.html' => 'Le type de champ \'%type\' n\'est pas supporté par form-field.html ', + 'Update' => 'Mettre à jour', + 'Update URL' => 'URL de mise à jour', + 'Update an administrator' => 'Mettre à jour cet administrateur', + 'Update coupon' => 'Mettre à jour le code', + 'Update password' => 'Mettre à jour le mot de passe', + 'Update rates' => 'Mettre à jour les taux', + 'Update tax rule taxes' => 'Mettre à jour les taxes de la règle de taxe', + 'Update this image' => 'Modifier cette image', + 'Usage count' => 'Utilisations restantes', + 'Usages left' => 'Utilisations restantes', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'Ctrl+clic permet de sélectionner (ou dé-sélectionner) plusieurs valeurs de déclinaison.', + 'Use Ctrl+click to select (or deselect) more that one category' => 'Ctrl+Clic permet de sélectionner ou dé-sélectionner plus d\'une catégorie', + 'Use Ctrl+click to select (or deselect) more that one country' => 'Ctrl+Clic permet de sélectionner ou dé-sélectionner plus d\'un pays', + 'Use Ctrl+click to select (or deselect) more that one item' => 'Utilisez Ctrl+clic pour sélectionner (ou dé-sélectionner) plus d\'un élément', + 'Use Ctrl+click to select (or deselect) more that one product' => 'Ctrl+Clic permet de sélectionner ou dé-sélectionner plus d\'un produit', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'Ctrl+Clic permet de sélectionner ou dé-sélectionner plus d\'un mode de transport', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Utilisez Ctrl+clic pour choisir plus d\'une valeur. Vous pouvez aussi tout désélectionner.', + 'Use HTML message defined below' => 'Utiliser le message HTML définie ci-dessous', + 'Use Text message defined below' => 'Utiliser la version texte définie ci-dessous', + 'Use address by default' => 'Utiliser comme adresse par défaut', + 'Use an other config.' => 'Utiliser une autre config.', + 'Use default layout' => 'Utiliser le layout par défaut', + 'Use this address by default' => 'Utiliser cette adresse par défaut', + 'Use this config.' => 'Utilisez cette config.', + 'User mode' => 'Mode utilisateur', + 'Username' => 'Nom d\'utilisateur', + 'Username :' => 'Nom d\'utilisateur : ', + 'Username or e-mail address' => 'Nom d\'utilisateur ou votre adresse électronique', + 'Using a domain or subdomain for each language' => 'Utiliser un domaine ou un sous domaine pour chaque langue', + 'Valid on special offers' => 'S\'applique aux produits en promotion', + 'Validity start date' => 'Valable à partir de ', + 'Value' => 'Valeur', + 'Variable created on %date_create. Last modification: %date_change' => 'Variable créée le %date_create. Dernière modification: %date_change', + 'Variable name' => 'Nom de la variable', + 'Variable purpose' => 'Objet de la variable', + 'Variable value' => 'Valeur de la variable', + 'Variables to inject' => 'Variables à injecter', + 'Version %ver' => 'Version %ver', + 'View' => 'Voir', + 'View invoice PDF' => 'Afficher la facture PDF', + 'View only missing translations.' => 'Afficher uniquement les traductions manquantes', + 'View purchase order as PDF' => 'Afficher le bon de livraison PDF', + 'View shop' => 'Voir la boutique', + 'View site' => 'Voir le site', + 'View this page in %langname' => 'Voir cette page en %langname', + 'View this product in a new page' => 'Voir ce produit dans une nouvelle page', + 'Virtual product' => 'Produit virtuel', + 'Visibility' => 'Visibilité', + 'Visible' => 'Visible', + 'Visible in front' => 'Visible en front', + 'Warning' => 'Attention', + 'Web site' => 'Site Web', + 'Weight' => 'Poids', + 'Weight
    (Kg)' => 'Poids
    (Kg)', + 'Welcome' => 'Bienvenue', + 'Welcome to Thelia administration !' => 'Bienvenue sur l\'administration de Thelia !', + 'Yes' => 'Oui', + 'You can attach here some content to this category' => 'Vous pouvez lier ici des contenus à cette rubrique', + 'You can attach here some content to this product' => 'Vous pouvez associer des contenus avec ce produit', + 'You can attach this product to more categories in the details tab.' => 'Vous pouvez lier ce produit à plusieurs rubriques dans l\'onglet détail.', + 'You can change attributes and their positions in the attributes configuration page.' => 'Vous pouvez modifier les déclinaisons et leur position dans la gestion des déclinaisons.', + 'You can change feature and their positions in the features configuration page.' => 'Vous pouvez modifier les caractéristiques et leur position dans la gestion des caractéristiques.', + 'You can change template attributes and their positions in the template configuration page.' => 'Vous pouvez modifier les déclinaisons du gabarit et leur position dans la configuration des gabarits de produit. ', + 'You can change templates features and their positions in the template configuration page.' => 'Vous pouvez modifier les caractéristiques du gabarit et leur position dans la configuration des gabarits de produit.', + 'You can change the default category (%title) in the "General" tab.' => 'Vous pouvez changer la catégorie par défaut (%title) dans l\'onglet "Général"', + 'You can change the default folder (%title) in the "General" tab.' => 'Vous pouvez modifier le dossier par défaut (%title) dans l\'onglet "Général".', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'Vous pouvez définir ici une différence de prix spécifique à chacune des devise de votre boutique, en montant ou en pourcentage, suivant le type de remise choisi ci-dessus.', + 'You can\'t delete this administrator' => 'Vous ne pouvez pas supprimer cet administrateur', + 'You can\'t delete this profile' => 'Vous ne pouvez pas supprimer ce profil', + 'You can\'t do exports, you don\'t have any serializer that handles this.' => 'Cet export n\'est pas faisable, vous n\'avez aucun serializez pouvant le gérer.', + 'You don\'t have any export' => 'Vous n\'avez aucun export', + 'You don\'t have any import' => 'Vous n\'avez aucun import', + 'You have no orders for the moment.' => 'Aucune commande n\'a encore été passée.', + 'You have no registred customers for the moment.' => 'Vous n\'avez aucun client enregistré pour le moment.', + 'You may also quickly create combinations from products attributes using the Combination Builder.' => 'Vous pouvez aussi créer rapidement une série de combinaisons avec le gestionnaire de combinaisons.', + 'Your current IP address is %ip' => 'Votre adresse IP est %ip', + 'Your email' => 'Votre email', + 'Your module should be packaged in a zip file.' => 'Votre module doit être compressé dans un fichier Zip.', + 'Your search is too short' => 'Votre recherche est trop courte', + 'Your template define new hooks' => 'Votre template définie de nouveaux points d\'accroche', + 'Your template does not support this hooks' => 'Votre template ne supporte pas ces points d\'accroche', + 'Your template is clean. No missing hooks and no new hooks.' => 'Votre template est correct. Pas de point d\'accroche manquant ou de nouveaux points d\'accroche.', + 'Zip code' => 'Code postal', + 'Zone name' => 'Nom de la zone', + 'activate' => 'Activer', + 'activate %title module' => 'Activez le module %title', + 'activate hook' => 'Activer le point d\'accroche', + 'activation' => 'Activation', + 'all' => 'tous', + 'all states' => 'tous les États', + 'all states/provinces' => 'tous les États/provinces', + 'and' => 'et', + 'caption' => 'légende', + 'classic modules' => 'Modules classiques', + 'code' => 'code', + 'company' => 'entreprise', + 'country has an other configuration' => 'pays ayant une autre configuration', + 'country has no configuration' => 'pays n\'ayant aucune configuration', + 'country has the current configuration' => 'pays ayant la configuration actuelle', + 'customer ref' => 'référence client', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'date au format aaaa-mm-jj', + 'deactivate' => 'désactiver', + 'deactivated' => 'Désactivé', + 'deactivation' => 'désactivation', + 'delete document' => 'Supprimer l\'image', + 'delete image' => 'Supprimer l\'image', + 'download' => 'télécharger', + 'eg: . or ,' => 'Par exemple . ou ,', + 'email' => 'e-mail', + 'en_US' => 'en_US', + 'filter country' => 'filtre par pays', + 'firstname & lastname' => 'Prénom & nom', + 'hour in hh:mm:ss format' => 'heure au format hh:mm:ss', + 'last order' => 'Dernière commande', + 'long description' => 'description longue', + 'none' => 'aucun', + 'ok' => 'ok', + 'on' => 'sur', + 'or' => 'ou', + 'order amount' => 'Montant de la commande', + 'orders for this customer' => 'commandes pour ce client', + 'pdf' => 'pdf', + 'permanent discount' => 'Remise permanente (en pourcentage)', + 'profile' => 'Profil', + 'ref.:' => 'réf.:', + 'reverse' => 'inverser', + 'short description' => 'description court', + 'tax rules' => 'règles de taxe', + 'taxes' => 'taxes', + 'title' => 'titre', + 'tracking reference' => 'Numéro du colis', + 'version' => 'Version', + 'warning' => 'Attention', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'vous pouvez combiner des taxes en règles de taxe et choisir si elle sont appliquées l\'une après l\'autre ou en même temps: cela permet d\'appliquer des taxes sur un produit déjà taxé ou non.', +]; diff --git a/templates/backOffice/default/I18n/he_IL.php b/templates/backOffice/default/I18n/he_IL.php new file mode 100644 index 00000000..5a70af94 --- /dev/null +++ b/templates/backOffice/default/I18n/he_IL.php @@ -0,0 +1,8 @@ + 'פעיל', + 'An unknow error happend' => 'שגיאה לא ידועה אירעה', + 'Associate documents' => 'לשייך מסמכים', + 'Associate images' => 'לקשר תמונות', +]; diff --git a/templates/backOffice/default/I18n/hu_HU.php b/templates/backOffice/default/I18n/hu_HU.php new file mode 100644 index 00000000..f7d850c0 --- /dev/null +++ b/templates/backOffice/default/I18n/hu_HU.php @@ -0,0 +1,851 @@ + 'további %count', + '(edit)' => '(szerkesztés)', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Több csoporthoz is társíthatja az oldalt. Itt kiválaszthatja a társított csoportot.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'A terméket több kategóriához is kapcsolhatja. Válasszon alább további kategóriákat.', + 'API configuration' => 'API beállítás', + 'API users' => 'API-felhasználók', + 'Accessory title' => 'Kellék név', + 'Action' => 'Művelet', + 'Actions' => 'Műveletek', + 'Active' => 'Aktív', + 'Add' => 'Hozzáad', + 'Add a condition' => 'Feltétel hozzáadása', + 'Add a module to a hook' => 'Modul hozzáadása a Hook-hoz', + 'Add a new Customer' => 'Új ügyfél hozzáadása', + 'Add a new address' => 'Új cím hozzáadása', + 'Add a new brand' => 'Új márka hozzáadása', + 'Add a new category' => 'Új kategória hozzáadása', + 'Add a new combination' => 'Új variáció hozzáadása', + 'Add a new content' => 'Új tartalom hozzáadása', + 'Add a new country' => 'Új ország hozzáadása', + 'Add a new currency' => 'Új pénznem hozzáadása', + 'Add a new folder' => 'Új csoport hozzáadása', + 'Add a new hook' => 'Új Hook hozzáadása', + 'Add a new language' => 'Új nyelv hozzáadása', + 'Add a new mailing template' => 'Új levélsablon hozzáadása', + 'Add a new module in a hook' => 'Új modul hozzáadása a Hook-ban', + 'Add a new module to this hook' => 'Új modul hozzáadása ebben a Hook-ban', + 'Add a new product' => 'Új termék hozzáadása', + 'Add a new product attribute' => 'Új terméktulajdonság hozzáadása', + 'Add a new product feature' => 'Új termékjellemző hozzáadása', + 'Add a new product template' => 'Új terméksablon hozzáadása', + 'Add a new sale' => 'Új akciós kampány hozzáadása', + 'Add a new shipping zone' => 'Új szállítási zóna hozzáadása', + 'Add a new variable' => 'Új változó hozzáadása', + 'Add document to your product.' => 'Új dokumentum hozzáadása a termékhez.', + 'Add selected countries' => 'A kijelölt országok hozzáadása', + 'Add tax to this group' => 'Adónem hozzáadása a csoporthoz', + 'Add this attribute to all product templates' => 'A tulajdonság hozzáadása minden terméksablonhoz', + 'Add this feature to all product templates' => 'A jellemző hozzáadása minden terméksablonhoz', + 'Add to all product templates' => 'Hozzáadás minden terméksablonhoz', + 'Add to selected categories' => 'Hozzáadás a kiválasztott kategóriákhoz', + 'Additional Folders' => 'További csoportok', + 'Additional address' => 'Kiegészítő információk', + 'Additional categories' => 'További kategóriák', + 'Address' => 'Cím', + 'Administrators' => 'Adminisztrátorok', + 'Advanced configuration' => 'Speciális beállítások', + 'All' => 'Mind', + 'All orders' => 'Összes megrendelés', + 'Amount' => 'Összeg', + 'Amount, e.g. 12.50' => 'Összeg, pl. 12.50', + 'An error occured' => 'Hiba történt', + 'An unexpected error occured' => 'Nem várt hiba történt', + 'An unknow error happend' => 'Ismeretlen hiba történt', + 'An unknown error occured, please try again.' => 'Ismeretlen hiba történt, kérem próbálja meg újra', + 'And' => 'És', + 'Api' => 'API', + 'Api key' => 'API kulcs', + 'Applies to attribute values :' => 'Érvényes a kiválasztott tulajdonságokra:', + 'Applies to products :' => 'Érvényes a kiválasztott termékekre:', + 'Applies to products in categories :' => 'Érvényes a kiválasztott kategóriák termékeire:', + 'Apply' => 'Alkalmaz', + 'Assigned modules' => 'Beállított szállítási modulok', + 'Associate documents' => 'Dokumentumok társítása', + 'Associate images' => 'Képek társítása', + 'Associated' => 'Kapcsolódó', + 'Associations' => 'Kapcsolatok', + 'Attribute' => 'Tulajdonság', + 'Attribute %title' => '"%title" tulajdonság', + 'Attribute Combinations' => 'Termék variációk', + 'Attribute Name' => 'Tulajdonság neve', + 'Attribute information' => 'Tulajdonság információ', + 'Attribute title' => 'Tulajdonság név', + 'Attribute values' => 'A tulajdonság értékei', + 'Attributes' => 'Tulajdonságok', + 'Attributes & Features' => 'Tulajdonságok és Jellemzők', + 'Author' => 'Szerző', + 'Available product categories' => 'Elérhető termék kategóriák', + 'Back' => 'Vissza', + 'Back Office' => 'Adminisztrációs felület', + 'Back-office home' => 'Adminisztrációs kezdőlap', + 'Back-office users' => 'Adminisztrációs felület felhasználói', + 'Best taxed price' => 'Legalacsonyabb Bruttó ár', + 'Brand created on %date_create. Last modification: %date_change' => 'A kampány létrehozásának ideje: %date_create. Utolsó módosítás: %date_change', + 'Brands' => 'Márkák', + 'Browse files' => 'Tallózzon a gépén', + 'Browse this category' => 'Kategória megtekintése', + 'Browse this folder' => 'Csoport tallózása', + 'By module' => 'Modul szerint', + 'By module:' => 'Modul szerint:', + 'By status' => 'Státusz szerint', + 'By type' => 'Típus szerint', + 'Can\'t load documents, please refresh this page.' => 'Nem lehetséges a dokumentumok betöltése kérem frissítse az oldalt.', + 'Can\'t load images, please refresh this page.' => 'Nem lehetséges a képek betöltése, kérem frissítse az oldalt.', + 'Can\'t reorder documents, please refresh this page.' => 'Nem lehetséges a dokumentumok újrarendezése, kérem frissítse az oldalt.', + 'Can\'t reorder images, please refresh this page.' => 'Nem lehetséges a képek újrarendezése, kérem frissítse az oldalt.', + 'Cancel' => 'Mégsem', + 'Cancel this order' => 'Megrendelés elvetése', + 'Cart - Prices in %currency' => 'kosár - Árak %currency -ban', + 'Catalog' => 'Katalógus', + 'Categories' => 'Kategóriák', + 'Categories in %cat' => 'Kategóriák a "%cat" kategóriában', + 'Category' => 'Kategória', + 'Category created on %date_create. Last modification: %date_change' => 'A kategória létrehozva: %date_create. Utolsó módosítás: %date_change', + 'Category title' => 'Kategória nevek', + 'Cellphone' => 'Mobil telefonszám', + 'Cellular phone' => 'Mobil telefonszám', + 'Cellular phone number' => 'Mobil telefonszám', + 'Change sale configuration' => 'Kampány adatainak beállítása', + 'Change this administrator' => 'Adminisztrátor módosítása', + 'Change this attribute' => 'Tulajdonság módosítása', + 'Change this brand' => 'Márka módosítása', + 'Change this condition' => 'Feltétel módosítása', + 'Change this country' => 'Ország módosítása', + 'Change this coupon' => 'Kupon módosítása', + 'Change this currency' => 'Pénznem módosítása', + 'Change this feature' => 'Jellemző módosítása', + 'Change this language' => 'Nyelv módosítása', + 'Change this mailing template' => 'Levélsablon módosítása', + 'Change this product attribute' => 'Terméktulajdonság módosítása', + 'Change this product feature' => 'Termékjellemző módosítása', + 'Change this product template' => 'Terméksablon módosítása', + 'Change this profile' => 'Profil módosítása', + 'Change this sale' => 'Akció módosítása', + 'Change this shipping zone' => 'Szállítási zóna', + 'Change this tax' => 'Adó módosítása', + 'Change this tax rule' => 'Adószabály módosítása', + 'Change this template' => 'Levélsablon módosítása', + 'Change this variable' => 'Változó módosítása', + 'Check sale activation' => 'Kampányok bekapcsolása', + 'Check this box if you want to add this attributes to all product templates' => 'Válassza ki, ha hozzá szeretné adni a tulajdonságot az összes terméksablonhoz', + 'Check this box if you want to add this features to all product templates' => 'Válassza ki, ha hozzá szeretné adni a jellemzőt az összes terméksablonhoz', + 'Choose a country' => 'Válasszon országot', + 'City' => 'Város', + 'Click to view' => 'Kattintson a megtekintéshez', + 'Click to view details.' => 'Kattintson a részletek megtekintéséhez.', + 'Clone' => 'Klónozás', + 'Clone product' => 'Termék klónozása', + 'Close' => 'Bezár', + 'Close administation session' => 'Kilépés az adminisztrációs felületről', + 'Code' => 'Kód', + 'Code:' => 'Kód:', + 'Combinable with other promotions' => 'Más promóciókkal együtt használható', + 'Combination EAN Code' => 'Variáció EAN Code', + 'Combination builder' => 'Termék-variáció készítő', + 'Company' => 'Cég', + 'Condition category :' => 'Feltétel kategória:', + 'Condition description' => 'Feltétel leírás', + 'Configuration' => 'Beállítások', + 'Configure' => 'Testreszabás', + 'Configure this module' => 'Modulok beállítása', + 'Confirm' => 'Jóváhagy', + 'Confirm changes' => 'Változtatások megerősítése', + 'Confirmation' => 'Jóváhagyás', + 'Content' => 'Tartalom', + 'Content title' => 'Tartalom címe', + 'Countries' => 'Országok', + 'Countries assigned to this zone' => 'Ehhez a zónához rendelt országok', + 'Country' => 'Ország', + 'Coupon' => 'Kupon', + 'Coupon code' => 'Kupon kód', + 'Coupon code * :' => 'Kupon kód * :', + 'Coupon conditions' => 'Kupon feltételek', + 'Coupon type * :' => 'Kupon típus * :', + 'Coupons' => 'Kuponok', + 'Create' => 'Létrehozás', + 'Create a customer address' => 'Ügyfél cím létrehozása', + 'Create a new API access' => 'Új API hozzáférés létrehozása', + 'Create a new Hook' => 'Új Hook létrehozása', + 'Create a new administrator' => 'Új adminisztrátor létrehozása', + 'Create a new attribute' => 'Új tulajdonság létrehozása', + 'Create a new attribute value' => 'Új tulajdonság érték létrehozása', + 'Create a new brand' => 'Új márka létrehozása', + 'Create a new category' => 'Új kategória létrehozása', + 'Create a new combination' => 'Új variáció létrehozása', + 'Create a new content' => 'Új tartalom létrehozása', + 'Create a new country' => 'Új ország létrehozása', + 'Create a new coupon' => 'Új kupon létrehozása', + 'Create a new currency' => 'Új pénznem létrehozása', + 'Create a new customer' => 'Új ügyfél létrehozása', + 'Create a new feature' => 'Új jellemző létrehozása', + 'Create a new feature value' => 'Új jellemző érték létrehozása', + 'Create a new folder' => 'Új csoport létrehozása', + 'Create a new language' => 'Új nyelv létrehozása', + 'Create a new mailing template' => 'Új levélsablon létrehozása', + 'Create a new product' => 'Új termék létrehozása', + 'Create a new product template' => 'Új terméksablon létrehozása', + 'Create a new profile' => 'Új profil létrehozása', + 'Create a new sale' => 'Akciós kampány létrehozása', + 'Create a new shipping zone' => 'Új szállítási zóna létrehozása', + 'Create a new tax' => 'Új adó létrehozása', + 'Create a new tax rule' => 'Új adó szabály létrehozása', + 'Create a new variable' => 'Új változó létrehozása', + 'Create combinations' => 'Új variáció létrehozása', + 'Create coupon' => 'Új kupon létrehozása', + 'Create this address' => 'Cím létrehozása', + 'Create this attribute' => 'Tulajdonság létrehozása', + 'Create this brand' => 'Márka létrehozása', + 'Create this category' => 'Kategória létrehozása', + 'Create this combination' => 'Variáció létrehozása', + 'Create this content' => 'Tartalom létrehozása', + 'Create this country' => 'Ország létrehozása', + 'Create this currency' => 'Pénznem létrehozása', + 'Create this customer' => 'Ügyfél létrehozása', + 'Create this feature' => 'Jellemző létrehozása', + 'Create this folder' => 'Csoport létrehozása', + 'Create this hook' => 'Hook létrehozása', + 'Create this hooks' => 'Hooks létrehozása', + 'Create this language' => 'Nyelv létrehozása', + 'Create this mailing template' => 'Levélsablon létrehozása', + 'Create this product' => 'Termék létrehozása', + 'Create this product template' => 'Terméksablon létrehozása', + 'Create this sale' => 'Akciós kampány létrehozása', + 'Create this shipping zone' => 'Szállítási zóna létrehozása', + 'Create this value' => 'Érték létrehozása', + 'Create this variable' => 'Mező létrehozása', + 'Currencies' => 'Pénznemek', + 'Currency name' => 'Pénznem név', + 'Currency rate' => 'Pénznem arány', + 'Currency symbol' => 'Pénznem szimbólum', + 'Current product template' => 'Jelenlegi terméksablon', + 'Current quantity' => 'Jelenlegi mennyiség', + 'Customer' => 'Ügyfél', + 'Customer information' => 'Ügyfél adatok', + 'Customer informations' => 'Ügyfél adatok', + 'Customer is' => 'Az ügyfél', + 'Customers' => 'Ügyfelek', + 'Customers list' => 'Ügyfél lista', + 'Cutomer Name' => 'Név', + 'Date & Hour' => 'Dátum & Idő', + 'Date of last order' => 'Utolsó vásárlás időpontja', + 'Days before expiration' => 'Lejáratig hátralévő napok', + 'Deactivate %title module' => '%title modul kikapcsolása', + 'Deactivate hook' => 'Hook kikapcsolása', + 'Deactivate this hooks' => 'Ezen Hook kikapcsolása', + 'Decimal places' => 'Tizedesjegyek száma', + 'Default' => 'Elsődleges', + 'Default address' => 'Alapértelmezett cím', + 'Define here this product\'s accessories' => 'Itt kijelölheti a termékhez tartozó kellékeket, kiegészítőket', + 'Delete' => 'Törlés', + 'Delete a combination' => 'Variáció törlése', + 'Delete a module' => 'Modul törlése', + 'Delete a variable' => 'Változó törlése', + 'Delete address' => 'Cím törlése', + 'Delete administrator' => 'Adminisztrátor törlése', + 'Delete also module data' => 'Modul adatoknak is a törlése', + 'Delete an order' => 'Megrendelés törlése', + 'Delete api access' => 'Törölje az API-hozzáférés', + 'Delete attribute' => 'Tulajdonság törlése', + 'Delete attribute value' => 'Érték törlése', + 'Delete brand' => 'Márka törlése', + 'Delete category' => 'Kategória törlése', + 'Delete content' => 'Tartalom törlése', + 'Delete country' => 'Ország törlése', + 'Delete coupon' => 'Kupon törlése', + 'Delete currency' => 'Pénznem törlése', + 'Delete customer' => 'Ügyfél törlése', + 'Delete feature' => 'Jellemző törlése', + 'Delete feature value' => 'Érték törlése', + 'Delete folder' => 'Csoport törlése', + 'Delete hook' => 'Hook törlése', + 'Delete language' => 'Nyelv törlése', + 'Delete mailing template' => 'Levélsablon törlése', + 'Delete product' => 'Termék törlése', + 'Delete profile' => 'Profil törlése', + 'Delete sale' => 'Kampány törlése', + 'Delete selected countries' => 'Kijelölt országok törlése', + 'Delete shipping zone' => 'Szállítási zóna törlése', + 'Delete tax' => 'Adó törlése', + 'Delete tax rule' => 'Adószabály törlése', + 'Delete template' => 'Sablon törlése', + 'Delete this accessory' => 'Kellék törlése a listából', + 'Delete this administrator' => 'Adminisztrátor törlése', + 'Delete this api access' => 'Törölje az API-hozzáférés', + 'Delete this attribute' => 'Tulajdonság törlése', + 'Delete this brand' => 'Márka törlése', + 'Delete this category and all its contents' => 'A kategória és a teljes tartalmának törlése', + 'Delete this combination' => 'Variáció törlése', + 'Delete this condition' => 'Feltétel törlése', + 'Delete this content' => 'Tartalom törlése', + 'Delete this country' => 'Ország törlése', + 'Delete this coupon' => 'Kupon törlése', + 'Delete this currency' => 'Pénznem törlése', + 'Delete this customer address' => 'Ügyfél cím törlése', + 'Delete this customer and all his orders' => 'Ügyfél és a hozzá tartozó megrendelések törlése', + 'Delete this feature' => 'Jellemző törlése', + 'Delete this folder and all its contents' => 'A csoport és a teljes tartalmának törlése', + 'Delete this hook' => 'Hook törlése', + 'Delete this language' => 'Nyelv törlése', + 'Delete this mailing template' => 'Levélsablon törlése', + 'Delete this module' => 'Modul törlése', + 'Delete this product' => 'Termék törlése', + 'Delete this product attribute' => 'Terméktulajdonság törlése', + 'Delete this product feature' => 'Termékjellemző törlése', + 'Delete this product template' => 'Terméksablon törlése', + 'Delete this profile' => 'Profil törlése', + 'Delete this sale' => 'Akció törlése', + 'Delete this shipping zone' => 'Szállítási zóna törlése', + 'Delete this tax' => 'Adó törlése', + 'Delete this tax rule' => 'Adószabály törlése', + 'Delete this value' => 'Érték törlése', + 'Delete this variable' => 'Változó törlése', + 'Delete this zone' => 'Zóna törlése', + 'Delivery' => 'Szállítás', + 'Delivery address' => 'Szállítáci cím', + 'Delivery module' => 'Szállítási modul', + 'Delivery modules' => 'Szállítási modulok', + 'Description' => 'Leírás', + 'Developer mode' => 'Fejlesztői mód', + 'Discount' => 'Kedvezmény', + 'Discount amount' => 'Kedvezmény összege', + 'Discount percentage' => 'Kedvezmény százaléka', + 'Do not use a product template' => 'Ne használjon terméksablont', + 'Do you really want to add this attribute to all product templates ?' => 'Biztosan hozzáadja minden terméksablonhoz ez a tulajdonságot?', + 'Do you really want to add this feature to all product templates ?' => 'Biztosan hozzáadja minden terméksablonhoz ez a jellemzőt?', + 'Do you really want to cancel this order ?' => 'Biztosan elveti ezt a megrendelést?', + 'Do you really want to delete this address ?' => 'Valóban törölni akarja ezt a címet?', + 'Do you really want to delete this administrator ?' => 'Valóban törölni akarja ezt az Adminisztrátort?', + 'Do you really want to delete this api access ?' => 'Valóban törölni akarja ezt az API hozzáférést?', + 'Do you really want to delete this attribute value ?' => 'Biztosan törölni akarja ezt a tulajdonság értéket?', + 'Do you really want to delete this brand ?' => 'Valóban törölni akarja ezt a Márkát?', + 'Do you really want to delete this category and all its content ?' => 'Valóban törölni akarja ezt a kategóriát és a teljes tartalmát?', + 'Do you really want to delete this combination ?' => 'Biztosan törölni akarja ezt a variációt?', + 'Do you really want to delete this condition ?' => 'Valóban törölni szeretné ezt a feltételt?', + 'Do you really want to delete this content ?' => 'Valóban törölni akarja ezt a tartalmat?', + 'Do you really want to delete this country ?' => 'Valóban törölni akarja ezt az országot?', + 'Do you really want to delete this coupon ?' => 'Valóban törölni akarja ezt a kupont?', + 'Do you really want to delete this currency ?' => 'Valóban törölni akarja ezt a pénznemet?', + 'Do you really want to delete this customer ?' => 'Valóban törölni akarja ezt az ügyfelet?', + 'Do you really want to delete this document ?' => 'Valóban törölni akarja ezt a dokumentumot?', + 'Do you really want to delete this element ?' => 'Valóban törölni akarja ezt az elemet?', + 'Do you really want to delete this hook ?' => 'Valóban törölni akarja ezt a Hook-ot?', + 'Do you really want to delete this image ?' => 'Valóban törölni akarja ezt a képet?', + 'Do you really want to delete this language ?' => 'Valóban törölni akarja ezt a nyelvet?', + 'Do you really want to delete this mailing template ?' => 'Valóban törölni akarja ezt a levélsablont?', + 'Do you really want to delete this module ?' => 'Valóban törölni akarja ezt a modult?', + 'Do you really want to delete this profile ?' => 'Valóban törölni akarja ezt a profilt?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'Valóban törölni szeretné ezt a kampányt? Minden kapcsolódó termék akciója törlésre kerül', + 'Do you really want to delete this shipping zone ?' => 'Valóban törölni akarja ezt a szállítási zónát?', + 'Do you really want to delete this tax ?' => 'Valóban törölni akarja ezt az adókulcsot?', + 'Do you really want to delete this tax rule ?' => 'Valóban törölni akarja ezt az adószabályt?', + 'Do you really want to delete this template ? It will be removed from all products.' => 'Valóban törölni akarja ezt a terméksablont? Minden termékből eltávolításra kerül.', + 'Do you really want to delete this variable ?' => 'Valóban törölni akarja ezt a változót?', + 'Do you really want to remove the content from this folder ?' => 'Valóban el akarja távolítani?', + 'Do you really want to remove the product from this category ?' => 'Valóban el akarja távolítani a terméket ebből a kategóriából?', + 'Do you really want to remove this related content from the product ?' => 'Valóban meg akarja szüntetni a tartalmi oldal kapcsolatát ezzel a termékkel?', + 'Document informations' => 'Dokumentum adatai', + 'Documents' => 'Dokumentumok', + 'Download invoice as PDF' => 'Számla letöltése PDF formátumban', + 'Download purchase order as PDF' => 'Megrendelés adatainak letöltése PDF formátumban', + 'Drop files to upload' => 'Húzza a fileokat ide a feltöltéshez', + 'E-mail' => 'E-mail cím', + 'E-mail templates' => 'Email sablonok', + 'EAN Code' => 'EAN kód', + 'Edit' => 'Szerkesztés', + 'Edit Prices' => 'Árak szerkesztése', + 'Edit a country' => 'Ország szerkesztése', + 'Edit a currency' => 'Pénznem szerkesztése', + 'Edit a customer' => 'Ügyfél szerkesztése', + 'Edit a customer address' => 'Ügyfél cím szerkztése', + 'Edit a document' => 'Dokumentum szerkesztése', + 'Edit a feature' => 'Jellemző szerkesztése', + 'Edit a language' => 'Nyelv szerkesztése', + 'Edit a mailing template' => 'Levélsablon szerkesztése', + 'Edit a module' => 'Modul szerkesztése', + 'Edit a profile' => 'Profil szerkesztése', + 'Edit a shipping configuration' => 'Szállítási beállítás szerkesztése', + 'Edit a shipping zone' => 'Szállítási zóna szerkesztése', + 'Edit a system variable' => 'A rendszerváltozó szerkesztése', + 'Edit a tax' => 'Adó szerkesztése', + 'Edit a tax rule' => 'Adószabály szerkesztése', + 'Edit a template' => 'Sablon szerkesztése', + 'Edit an attribute' => 'Tulajdonság szerkesztése', + 'Edit an image' => 'Kép szerkesztése', + 'Edit an order' => 'Megrendelés szerkesztése', + 'Edit api access' => 'API hozzáférés szerkesztése', + 'Edit attribute "%name"' => 'Tulajdonság szerkesztése "%name"', + 'Edit brand' => 'Márka szerkesztése', + 'Edit brand %title' => '%title márka szerkesztése', + 'Edit category' => 'Kategória szerkesztése', + 'Edit category %title' => '%title kategória szerkesztése', + 'Edit content' => 'Tartalom szerkesztése', + 'Edit content %title' => 'Tartalom szerkesztése "%title"', + 'Edit country "%name"' => 'Ország szerkesztése "%name"', + 'Edit currency "%name"' => 'Pénznem szerkesztése "%name"', + 'Edit customer %firstname %lastname' => 'Ügyfél szerkesztése: %firstname %lastname', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Ügyfél szerkesztése: %firstname %lastname (Azon.: %ref)', + 'Edit delivery address' => 'Szállítási cím szerkesztése', + 'Edit document "%name"' => 'Dokumentum szerkesztése "%name"', + 'Edit feature "%name"' => '"%name" jellemző szerkesztése', + 'Edit folder' => 'Csoport szerkesztése', + 'Edit folder %title' => 'Csoport szerkesztése "%title"', + 'Edit image "%name"' => 'Kép szerkesztése "%name"', + 'Edit information in %lng' => 'Adatok szerkesztése %lng nyelven', + 'Edit invoice address' => 'Számlázási cím szerkesztése', + 'Edit mailing template "%name"' => 'Levélsablon szerkesztése "%name"', + 'Edit next category' => 'Következő kategória szerkesztése', + 'Edit next content' => 'Következő oldal szerkesztése', + 'Edit next folder' => 'Következő csoport szerkesztése', + 'Edit next product' => 'Következő termék szerkesztése', + 'Edit order address' => 'Megrendelési cím szerkesztése', + 'Edit previous category' => 'Előző kategória szerkesztése', + 'Edit previous content' => 'Előző oldal szerkesztése', + 'Edit previous folder' => 'Előző csoport szerkesztése', + 'Edit previous product' => 'Előző termék szerkesztése', + 'Edit prices in %curr' => 'Szerkessze az árakat %curr -ban', + 'Edit product' => 'Termék szerkesztése', + 'Edit product %title' => 'Termék szerkesztése %title', + 'Edit template "%name"' => '"%name" sablon szerkesztése', + 'Edit this address' => 'Cím szerkesztése', + 'Edit this brand' => 'Márka szerkesztése', + 'Edit this category' => 'Kategória szerkesztése', + 'Edit this content' => 'Tartalom szerkesztése', + 'Edit this customer' => 'Ügyfél szerkesztése', + 'Edit this delivery zone' => 'Szállítási zóna szerkesztése', + 'Edit this folder' => 'Csoport szerkesztése', + 'Edit this module' => 'Modul szerkesztése', + 'Edit this order' => 'Megrendelés szerkesztése', + 'Edit this product' => 'Termék szerkesztése', + 'Edit variable %name' => 'Változó szerkesztése %name', + 'Editing %cat' => '"%cat" szerkesztése', + 'Editing %fold' => '"%fold" szerkesztése', + 'Editing %title' => '"%title" szerkesztése', + 'Editing attribute "%name"' => '"%name" szerkesztése', + 'Editing brand "%title"' => '"%title" márka szerkesztése', + 'Editing country "%name"' => '"%name" ország szerkesztése', + 'Editing coupon "%title"' => '"%title" kupon szerkesztése', + 'Editing currency "%name"' => '"%name" pénznem szerkesztése', + 'Editing document "%name"' => '"%name" dokumentum szerkesztése', + 'Editing feature "%name"' => '"%name" jellemző szerkesztése', + 'Editing image "%name"' => 'Kép szerkesztése "%name"', + 'Editing mailing template "%name"' => '"%name" levélsablon szerkesztése', + 'Editing module' => 'Modul szerkesztése', + 'Editing profile' => 'Profil szerkesztése', + 'Editing profile \'%name\'' => '\'%name\' profil szerkesztése', + 'Editing shipping zone "%name"' => '"%name" szállítási zóna szerkesztése', + 'Editing tax' => 'Adó szerkesztése', + 'Editing tax rule' => 'Adószabály szerkesztése', + 'Editing template "%name"' => '"%name" sablon szerkesztése', + 'Editing variable "%name"' => '"%name" változó szerkesztése', + 'Email' => 'Email', + 'Email address' => 'Email cím', + 'Email addresses' => 'Email címek', + 'Email confirmation address' => 'Email cím megerősítése', + 'Enable/Disable' => 'Engedélyez/Kikapcsol', + 'Enabled' => 'Engedélyezve', + 'End Date' => 'Befejezés ideje', + 'Enter here all possible attribute values.' => 'Minden előforduló terméktulajdonság értéket adjon meg.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Minden lehetséges termékjellemzőt adjon hozzá. A szabadszavas termékleírást a termék adatlapján szerkesztheti.', + 'Enter here the attribute name in the default language (%language_name)' => 'Adja meg a tulajdonság nevét az alapértelmezett nyelven(%language_name)', + 'Enter here the category name in the default language (%title)' => 'Adja meg a kategória nevét az alapértelmezett nyelven(%title)', + 'Enter here the content name in the default language (%title)' => 'Adja meg a tartalom nevét az alapértelmezett nyelven(%title)', + 'Enter here the currency name in the default language (%title)' => 'Adja meg a nyelv nevét az alapértelmezett nyelven(%title)', + 'Enter here the feature name in the default language (%title)' => 'Adja meg a jellemző nevét az alapértelmezett nyelven(%title)', + 'Enter here the folder name in the default language (%title)' => 'Adja meg a csoport nevét az alapértelmezett nyelven(%title)', + 'Enter here the product name in the default language (%title)' => 'Adja meg a termék nevét az alapértelmezett nyelven(%title)', + 'Enter here the product weight, in Kilogrammes' => 'Adja meg a termék súlyát kilogrammban', + 'Enter here the template name in the default language (%title)' => 'Adja meg a sablon nevét az alapértelmezett nyelven (%title)', + 'Enter here the value in the current edit language (%language_name)' => 'Adja meg az értéket az alapértelmezett nyelven (%language_name)', + 'Enter new accessory position' => 'Adja meg az új pozíciót', + 'Enter new attribute position' => 'Adja meg az új pozíciót', + 'Enter new brand position' => 'Adja meg a márka új pozícióját', + 'Enter new category position' => 'Adja meg a kategória új pozícióját', + 'Enter new content position' => 'Adja meg a tartalom új pozícióját', + 'Enter new currency position' => 'Adja meg a pénznem új pozícióját', + 'Enter new export category position' => 'Adja meg az új pozíciót', + 'Enter new export position' => 'Adja meg az új pozíciót', + 'Enter new feature position' => 'Adja meg az új pozíciót', + 'Enter new folder position' => 'Adja meg az új pozíciót', + 'Enter new import category position' => 'Adja meg az új pozíciót', + 'Enter new import position' => 'Adja meg az új pozíciót', + 'Enter new module hook position' => 'Adja meg az új pozíciót', + 'Enter new module position' => 'Adja meg az új pozíciót', + 'Enter new product position' => 'Adja meg a termék új pozícióját', + 'Enter new value position' => 'Adja meg a változó új pozícióját', + 'Enter quantity' => 'Adjon meg értéket', + 'Error' => 'Hiba', + 'Exchange rate' => 'Váltási arány', + 'Existing combinations will be deleted. Do you want to continue ?' => 'A jelenleg létező variációk törlésre kerülnek. Mégis folytatja?', + 'Expiration date' => 'Lejárati dátum', + 'Expiration date * :' => 'Lejárati dátum * :', + 'Expired' => 'Lejárt', + 'Feature Name' => 'Jellemző neve', + 'Feature information' => 'Termékjellemző adatai', + 'Feature title' => 'Jellemző neve', + 'Feature value' => 'Jellemző értéke', + 'Feature value for this product' => 'Jellemző értéke ennél a terméknél', + 'Feature values' => 'Jellemző értékei', + 'Features' => 'Jellemzők', + 'First Name' => 'Keresztnév', + 'First name' => 'Vezetéknév', + 'Firstname' => 'Vezetéknév', + 'Folder created on %date_create. Last modification: %date_change' => 'A csoport létrehozva: %date_create. Utolsó módosítás: %date_change', + 'Folder title' => 'Csoport neve', + 'Folders' => 'Tartalom csoportok', + 'Folders in %fold' => 'Alcsoportok a "%fold" csoportban', + 'For prices in %currency' => 'érték %currency esetén', + 'Format: %fmt' => 'Formátum: %fmt ', + 'Free shipping for methods :' => 'Ingyenes szállításra érvényes módok :', + 'Free shipping to countries :' => 'Ingyenes szállítás érvényes :', + 'General' => 'Általános', + 'General configuration' => 'Általános beállítások', + 'General description' => 'Általános leírás', + 'General tools' => 'Általános eszközök', + 'HTML version of this message' => 'Az üzenet HTML változata', + 'Home' => 'Kezdőoldal', + 'IP Addresses' => 'IP Cím', + 'ISO 4217 Code' => 'ISO 4217 kód', + 'ISO 4217 code' => 'ISO 4217 kód', + 'ISO 639 Code' => 'ISO 639 kód', + 'ISO Code' => 'ISO kód', + 'Image information' => 'Kép tulajdonságai', + 'Images' => 'Képek', + 'Import' => 'Importálás', + 'Import this file' => 'A file importálása', + 'Included countries' => 'Beállított országok', + 'Install !' => 'Telepít !', + 'Invoice' => 'Számla', + 'Invoice and Delivery' => 'Számlázás és szállítás', + 'Invoice date' => 'Számla kelte', + 'Invoice informations' => 'Számlázási információk', + 'Invoice reference' => 'Számlaszám', + 'Language name' => 'Nyelv neve', + 'Language title' => 'Nyelv neve', + 'Languages' => 'Nyelvek', + 'Languages & URLs' => 'Nyelvek és azok URL-jei', + 'Languages management' => 'Nyelv beállítások', + 'Last Name' => 'Vezetéknév', + 'Last name' => 'Vezetéknév', + 'Last order amount' => 'Utolsó vásárlás értéke', + 'Lastname' => 'Vezetéknév', + 'Locale' => '"Locale" kód', + 'Login' => 'Belépés', + 'Logout' => 'Kilépés', + 'Long description :' => 'Hosszú leírás :', + 'Mailing templates' => 'Levélsablonok', + 'Manage attributes included in this product template' => 'A sablonban szereplő tulajdonságok beállítása', + 'Manage features included in this product template' => 'A sablonban szereplő jellemzők beállítása', + 'Manage taxes' => 'Adók kezelése', + 'Message created on %date_create. Last modification: %date_change' => 'A sablon létrehozásának ideje: %date_create. Utolsó módosítás: %date_change', + 'Message data' => 'Sablon adatai', + 'More information about ISO 4217' => 'Több információ a ISO 4217 kódról', + 'Name' => 'Név', + 'New' => 'Új', + 'No' => 'Nem', + 'No administration profile defined yet. Click the + button to create one.' => 'Nincs adminisztrációs profil létrehozva. Használja a + gombot a létrehozáshoz.', + 'No attributes.' => 'Nincs tulajdonság meghatározva', + 'No available product in this category' => 'Nincs elérhető termék ebben a kategóriában', + 'No brand' => 'Nincs márka', + 'No brand has been created yet. Click the + button to create one.' => 'Nincs márka létrehozva. Használja a + gombot a létrehozáshoz.', + 'No country has been created yet. Click the + button to create one.' => 'Nincs ország létrehozva. Használja a + gombot a létrehozáshoz.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'Nincs kupon létrehozva. Új kupon létrehozásához használja a (+) gombot.', + 'No currency has been created yet. Click the + button to create one.' => 'Nincs pénznem létrehozva. Használja a + gombot a létrehozáshoz.', + 'No mailing template has been created yet. Click the + button to create one.' => 'Nincs lavélsablon létrehozva. Használja a + gombot a létrehozáshoz.', + 'No product attribute has been created yet. Click the + button to create one.' => 'Nincs termék tulajdonság létrehozva. Használja a + gombot a létrehozáshoz.', + 'No product feature has been created yet. Click the + button to create one.' => 'Nincs termék jellemző létrehozva. Használja a + gombot a létrehozáshoz.', + 'No product template has been created yet. Click the + button to create one.' => 'Nincs sablon létrehozva. Használja a + gombot a létrehozáshoz.', + 'No sale has been created yet. Click the + button to create one.' => 'Nincs kampány létrehozva. Használja a + gombot a létrehozáshoz.', + 'No shipping zone attached to this module, click here to attach one' => 'Nincs szállítási zóna kapcsolva ehhez a modulhoz. Használja a + gombot a létrehozáshoz.', + 'No shipping zone defined yet. Click the + button to create one.' => 'Nincs szállítási zóna létrehozva. Használja a + gombot a létrehozáshoz.', + 'No value has been created yet. Click the + button to create one.' => 'Nincs érték létrehozva. Használja a + gombot a létrehozáshoz.', + 'None' => 'Nincs', + 'Or' => 'Vagy', + 'Order %ref - ID %id' => 'Megrendelés %ref - ID %id', + 'Order details' => 'A megrendelés adatai', + 'Order n°' => 'Megrendelés n°', + 'Order status:' => 'Megrendelés státusza:', + 'Ordered products' => 'Megrendelt termékek', + 'Orders' => 'Megrendelések', + 'Other addresses' => 'További címek', + 'PDF | Invoice' => 'PDF | Számla', + 'PDF | Purchase order' => 'PDF | Megrendelés', + 'Page not found' => 'Az oldal nem található', + 'Password' => 'Jelszó', + 'Password :' => 'Jelszó :', + 'Payment information' => 'Fizetési Információk', + 'Payment module' => 'Fizetési modul', + 'Payment modules' => 'Fizetési modulok', + 'Percent Discount' => 'Százalékos kedvezmény', + 'Period' => 'Időszak', + 'Phone' => 'Telefonszám', + 'Phone & Fax' => 'Telefon & Fax', + 'Phone number' => 'Telefonszám', + 'Please enter the date using the %fmt format' => 'Kérem az következő formátumba adja meg a dátumot: %fmt', + 'Please save this coupon first to define coupon conditions' => 'Kérem elősször mentse a kupon tulajdonságait, majd beállíthatja a használati feltételeket', + 'Please select a condition' => 'Kérem válasszon feltételt', + 'Please select a coupon type' => 'Kérem válasszson kupon típust', + 'Please select...' => 'Kérem válasszon...', + 'Position' => 'Pozíció', + 'Postage' => 'Szállítási költség', + 'Preview' => 'Előnézet', + 'Preview HTML' => 'HTML változat előnézete', + 'Preview category page' => 'Kategória oldal előnézete', + 'Preview folder page' => 'Előnézet', + 'Preview product page' => 'Termék oldal előnézete', + 'Preview text' => 'Szöveges változat előnézete', + 'Price' => 'Ár', + 'Price (%currency)
    w/ taxes' => 'Ár (%currency)
    (Bruttó)', + 'Price (%currency)
    w/o taxes' => 'Ár (%currency)
    (Nettó)', + 'Price excl. taxes' => 'Ár (Nettó)', + 'Price incl. taxes' => 'Ár (Bruttó)', + 'Product' => 'Termék', + 'Product Attributes' => 'Termék tulajdonságok', + 'Product EAN Code' => 'Termék EAN kód', + 'Product Features' => 'Termék jellemzők', + 'Product accessories' => 'Termék kellékei', + 'Product attributes' => 'Termék tulajdonságok', + 'Product catalog configuration' => 'Termékkatalógus beállítások', + 'Product features' => 'Termék jellemzők', + 'Product price' => 'Termék ár', + 'Product templates' => 'Terméksablonok', + 'Product title' => 'Termék név', + 'Product weight' => 'Termék súly', + 'Products' => 'Termékek', + 'Products are :' => 'A termékek :', + 'Products in %cat' => 'Termékek a "%cat" kategóriában', + 'Products selection' => 'Termékek választása', + 'Profil' => 'Felhasználói adatok', + 'Profile' => 'Felhasználói adatok', + 'Provides free shipping' => 'Ingyenes szállítást eredményez', + 'Quantity' => 'Mennyiség', + 'Quickly create combinations using the combination builder' => 'Tömegesen létrehozhatja a termék-variációkat ezzel a funkcióval', + 'Reference' => 'Azonosító', + 'Registration date' => 'Regisztráció ideje', + 'Related content' => 'Kapcsolódó tartalom', + 'Remove an accessory' => 'Kellék eltávolítása', + 'Remove associated folder' => 'Társított csoport törlése', + 'Remove attribute' => 'Tulajdonság törlése', + 'Remove country' => 'Ország törlése', + 'Remove feature' => 'Jellemző törlése', + 'Remove from all product templates' => 'Eltávolítás minden terméksablonból ', + 'Remove from category' => 'Eltávolítás a kategóriából', + 'Remove from selected categories' => 'Eltávolítás a kijeltölt kategóriából', + 'Remove related content' => 'Kapcsolódó tartalom eltávolítása', + 'Remove selected values' => 'Eltávolítás', + 'Remove this attribute from all product templates' => 'A tulajdonság eltávolítása minden terméksablonból', + 'Remove this feature from all product templates' => 'A jellemző eltávolítása minden terméksablonból', + 'Remove zone' => 'Zóna eltávolítása', + 'Reset sale status for all products' => 'Minden temék akciójának alphelyzetbe állítása', + 'Sale' => 'Akció', + 'Sale configuration' => 'Kampány beállításai', + 'Sale created on %date_create. Last modification: %date_change' => 'A kampány létrehozásának ideje: %date_create. Utolsó módosítás: %date_change', + 'Sale operation features' => 'Kampány működésének tulajdonságai', + 'Sale price (%currency)
    w/ taxes' => 'Akciós ár (%currency)
    (Bruttó)', + 'Sale price (%currency)
    w/o taxes' => 'Akciós ár (%currency)
    (Nettó)', + 'Sale price incl. taxes' => 'Akciós ár (Bruttó)', + 'Sales management' => 'Kampányok kezelése', + 'Save' => 'Mentés', + 'Save and close' => 'Mentés és bezár', + 'Save chages' => 'Változások mentése', + 'Save changes' => 'Változások mentése', + 'Save this address' => 'Cím mentése', + 'Save this condition' => 'Feltétel mentése', + 'Search' => 'Keresés', + 'Search a module' => 'Modul keresése', + 'Select' => 'Kijelölés', + 'Select a category and click (+) to add it to the additional category list' => 'Válasszon kategóriát majd kattintson a (+) ikonra a hozzáadáshoz', + 'Select a category to get its products' => 'Válasszon kategóriát, a termékei listázásához', + 'Select a category...' => 'Válasszon kategóriát...', + 'Select a content and click (+) to add it to this product' => 'Válasszon egy tartalmi oldalt és kattintson a (+) ikonra a kapcsolat létrehozásához', + 'Select a folder and click (+) to add it to the additional folder list' => 'Válasszon csoportot majd kattintson az (+) gombra a hozzáadáshoz', + 'Select a folder content...' => 'Válasszon tartalmi oldalt', + 'Select a folder to get its content' => 'Válasszon tartalom csoportot, hogy megtekinthesse annak tartalmát', + 'Select a folder...' => 'Válasszon tartalom csoportot', + 'Select a product and click (+) to add it as an accessory' => 'Válasszon terméket majd kattintson a (+) ikonra a kelléklistához adáshoz.', + 'Select a product...' => 'Válasszon terméket...', + 'Select a tax tule' => 'Válasszon szabályt', + 'Select a value click (+) to add it to the combination' => 'A (+) jelre kattintva hozzáadhatja az értéket a variációhoz.', + 'Select an attribute and click (+) to add it to this template' => 'Válasszon egy tulajdonságot és kattintson a (+) ikonra a hozzáadáshoz.', + 'Select an attribute and click (+) to view available values' => 'Válaszszon egy tulajdonságot az elérhető értékek megtekintéséhez.', + 'Select an attribute value...' => 'Válasszon tulajdonság értéket...', + 'Select an attribute...' => 'Válasszon tulajdonságot...', + 'Select attribute :' => 'Válasszon tulajdonságot :', + 'Select offered product :' => 'Válassza ki a felkínált terméket:', + 'Select offrered product category :' => 'A felkínált termék kategóriája:', + 'Select product category :' => 'Válasszon termékkategóriát:', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Válassza ki a kampányban résztvevő termékeket. Akár korlátozhatja a kiválasztást a termékek jellemzői alapján is.', + 'Selected categories' => 'Választott kategóriák', + 'Send' => 'Küldés', + 'Send a mail to this customer' => 'Levél küldése ennek az Ügyfélnek', + 'Set as default tax rule' => 'Belállítás alapértelmezettként', + 'Shipping configuration' => 'Szállítási beállítások', + 'Shipping zone' => 'Szállítási zónák', + 'Shipping zone "%title"' => '"%title" szállítási zóna', + 'Shipping zones' => 'Szállítási zónák', + 'Shipping zones for this country' => 'Szállítási zónák ehhez az országhoz', + 'Shipping zones management' => 'Szállítási zónák beállításai', + 'Short description' => 'Rövid leírás', + 'Short description :' => 'Rövid leírás :', + 'Show logs' => 'Naplók mutatása', + 'Something goes wrong, please try again' => 'Hiba történt, kérem próbálja meg újra', + 'Something goes wrong, please try again.' => 'Hiba történt, kérem próbálja meg újra.', + 'Sorry, attribute ID=%id was not found.' => 'Elnézést, a tulajdonság ID=%id nem található.', + 'Sorry, country ID=%id was not found.' => 'Elnézést, az ország ID=%id nem található.', + 'Sorry, currency ID=%id was not found.' => 'Elnézést, a pénznem ID=%id nem található.', + 'Sorry, customer ID=%id was not found.' => 'Elnézést, az ügyfél ID=%id nem található.', + 'Sorry, document ID=%id was not found.' => 'Elnézést, a dokumentum ID=%id nem található.', + 'Sorry, feature ID=%id was not found.' => 'Elnézést, a jellemző ID=%id nem található.', + 'Sorry, hook ID=%id was not found.' => 'Elnézést, a hook ID=%id nem található.', + 'Sorry, image ID=%id was not found.' => 'Elnézést, a kép ID=%id nem található.', + 'Sorry, message ID=%id was not found.' => 'Elnézést, az üzenet ID=%id nem található.', + 'Sorry, module hook ID=%id was not found.' => 'Elnézést, module hook ID=%id nem található.', + 'Sorry, template ID=%id was not found.' => 'Elnézést, a sablon ID=%id nem található.', + 'Sorry, variable ID=%id was not found.' => 'Elnézést, a változó ID=%id nem található.', + 'Start Date' => 'Indulás ideje', + 'Status' => 'Státusz', + 'Stock' => 'Raktár', + 'Store' => 'Bolt', + 'Store address' => 'Bolt cím', + 'Store configuration' => 'Bolt beállításai', + 'Street address' => 'Utca, házszám', + 'Symbol' => 'Pénznem szimbólum', + 'Tax' => 'Adó', + 'Tax created on %date_create. Last modification: %date_change' => 'Az adónem létrehozásának ideje: %date_create. Utolsó módosítás: %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => 'Az adószabály létrehozásának ideje %date_create. Utolsó módosítás: %date_change', + 'Tax rules' => 'Adók és adószabályok', + 'Taxed total' => 'Összesen (Bruttó)', + 'Taxes' => 'Adók', + 'Taxes rules' => 'Adószabályok', + 'Template name' => 'A sablon neve', + 'Test your configuration' => 'Tesztelje a beállításait', + 'Text version of this message' => 'Az üzenet Text változata', + 'The detailed description.' => 'Részletes leírás.', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'Az arány az Euro-hoz képest (Ár Euro-ban * arány = Árfolyam ebben apénznemben)', + 'The selected categories :' => 'A válaszott kategóriák :', + 'The selected countries :' => 'Kiválaszott országok:', + 'The selected customer :' => 'A választott ügyfelek :', + 'The selected products :' => 'A választott termékek :', + 'The server returned a "404 Not Found"' => 'A szerver válasza "404 Az oldal nem található"', + 'Thelia Back Office' => 'Nepmuveszi-bolt.hu Adminisztráció', + 'Thelia Mailing Templates' => 'Levélsablonok', + 'Thelia Product Attributes' => 'Terméktulajdonságok', + 'Thelia Product Features' => 'Termékjellemzők', + 'Thelia Product Templates' => 'Terméksablonok', + 'Thelia Shipping configuration' => 'Szállítási beállítások', + 'Thelia Shipping zones' => 'Szállítási zónák', + 'Thelia System Variables' => 'Rendszerváltozók', + 'Thelia mailing templates' => 'Levélsablonok', + 'Thelia product attributes' => 'Terméktulajdonságok', + 'Thelia product features' => 'Termékjellemzők', + 'Thelia product templates' => 'Terméksablonok', + 'There is currently no active module here.' => 'Nincs aktív modul', + 'There is currently no available attributes.' => 'Jelenleg nincs tulajdnság beállítva', + 'There is currently no available features.' => 'Jelenleg nincs jellemző beállítva', + 'There is no documents attached to this %type.' => 'Nincs dokumentum társítva.', + 'There is no images attached to this %type.' => 'Nincs kép társítva.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Ennek a kategóriának nincs alkategóriája. Alkategória létrehozásához használja a felső + gombot.', + 'This customer has not defined any delivery address' => 'Az ügyfélnek nincs szállítási címe meghatározva', + 'This customer has orders, and can\'t be deleted.' => 'Ennak az ügyfélnek van megrendelése, így nem törölhető.', + 'This folder has no sub-folders.' => 'Ennek a csoportnak nincsenek alcsoportjai.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'Ennek a csoportnak nincsenek alcsoportjai. Új csoport létrehozásához kattintson a (+) gombra.', + 'This is the code entered by your customers to use this coupon' => 'Az ügyfél ezt a kódot használhatja majd beváltásra', + 'This product contains no contents' => 'Nincs kapcsolódó tartalom', + 'This product doesn\'t belong to any additional category.' => 'A termék nincs további kategóriákhoz kapcsolva.', + 'This product doesn\'t belong to any additional folder.' => 'Ez a tartalom nincs további csoporthoz kapcsolva.', + 'This product template does not contains any features' => 'Ennek a terméknek nincsenek jellemzői beállítva', + 'This shipping zone does not contains any country.' => 'Ez a szállítási zóna nem tartalmaz országot.', + 'This template contains no attributes' => 'Ez a sablon nem tartalmaz tulajdonságot', + 'This template contains no features' => 'Ez a sablon nem tartalmaz jellemzőt', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'Ez a funkció minden termék akciós beállítását alapállapotba helyezi és kikapcsol minen jelenleg futó kampányt. Valóban szeretné folytatni?', + 'Timeout' => 'Időtúllépés', + 'Timeout :' => 'Időtúllépés :', + 'Title' => 'Név', + 'Title * :' => 'Név * :', + 'To create a new content, select an existing folder, or create a new one.' => 'Új tartalmi oldal létrehozásához, válasszon egy csoportot vagy hozzon létre egy újat.', + 'To create a new product, select an existing category, or create a new one.' => 'Termék létrehozásához válasszon egy kategóriát vagy hozzon létre egy újat.', + 'To remove a value from the combination, select it and click "remove"' => 'Bármilyen érték eltávolításához kattintson a sorra és válassza az "Eltávolítás" gombot.', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'A termék tulajdonságainak és jellemzőinek beállítsához válasszon terméksablont. Terméksablonokat a sablon beállítások adminisztrációjában hozhat létre.', + 'Tools' => 'Eszközök', + 'Top level' => 'Legfelső szint', + 'Top level categories' => 'Legfelső szintű kategóriák', + 'Top level folders' => 'Legfelső szintű tartalom csoportok', + 'Total' => 'Összesen', + 'Total including discount' => 'Összesen, kedvezményekkel', + 'Total without discount' => 'Összesen, kedvezmények nélkül', + 'Transaction reference' => 'Tranzakció azonosító', + 'Translation' => 'Fordítás', + 'Translations' => 'Fordítás', + 'Type:' => 'Típus:', + 'Unit taxed price' => 'Egységár (Bruttó)', + 'Unit. price' => 'Egységár', + 'Unlimited' => 'Korlátlan', + 'Unlimited number of uses' => 'Korlátlan számban használható', + 'Unspecified' => 'Nem meghatározott', + 'Unsupported field type \'%type\' in form-field.html' => 'Nem támogatott file formátum \'%type\' form-field.html-ban', + 'Update' => 'Frissít', + 'Update URL' => 'URL módosítása', + 'Update an administrator' => 'Adminisztrátor módosítása', + 'Update coupon' => 'Kupon módosítása', + 'Update rates' => 'Árfolyamok frissítése', + 'Update this image' => 'A kép tulajdonságainak módosítása', + 'Usage count' => 'Hátralévő használhatóság száma', + 'Usages left' => 'Hátralévő használhatóság száma', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'A Ctrl+Kattintás használatával egyszerre több választási lehetőséget jelölhet ki/szüntetheti meg a kijelölést', + 'Use Ctrl+click to select (or deselect) more that one category' => 'A Ctrl+Kattintás használatával egyszerre több választási lehetőséget jelölhet ki/szüntetheti meg a kijelölést', + 'Use Ctrl+click to select (or deselect) more that one country' => 'A Ctrl+Kattintás használatával egyszerre több választási lehetőséget jelölhet ki/szüntetheti meg a kijelölést', + 'Use Ctrl+click to select (or deselect) more that one item' => 'A Ctrl+Kattintás használatával egyszerre több választási lehetőséget jelölhet ki/szüntetheti meg a kijelölést', + 'Use Ctrl+click to select (or deselect) more that one product' => 'A Ctrl+Kattintás használatával egyszerre több választási lehetőséget jelölhet ki/szüntetheti meg a kijelölést', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'A Ctrl+Kattintás használatával egyszerre több választási lehetőséget jelölhet ki/szüntetheti meg a kijelölést', + 'Username' => 'Felhasználó', + 'Username :' => 'Felhasználó :', + 'Valid on special offers' => '"Különleges ajánlatokra" használható', + 'Validity start date' => 'Dátum megadása', + 'Value' => 'Érték', + 'Variables to inject' => 'Beillesztendő változók', + 'View invoice PDF' => 'Számla megtekintése PDF formátumban', + 'View purchase order as PDF' => 'A megrendelés adatainak megtekintése PDF formátumban', + 'View shop' => 'Bolt megtekintése', + 'Virtual product' => 'Virtuális termék', + 'Visibility' => 'Láthatóság', + 'Warning' => 'Figyelem', + 'Weight
    (Kg)' => 'Súly
    (Kg)', + 'Welcome to Thelia administration !' => 'Üdvözöljük az adminisztrációs felületen!', + 'Yes' => 'Igen', + 'You can attach here some content to this category' => 'Beállíthat kapcsolódó tartalmi oldalakat ehhez a kategóriához', + 'You can attach here some content to this product' => 'Beállíthat kapcsolódó tartalmat ahhez a termékhez.', + 'You can attach this product to more categories in the details tab.' => 'Több termékkategóriához is hozzárendelheti a terméket (Kapcsolatok fül alatt)', + 'You can change template attributes and their positions in the template configuration page.' => 'A termék tulajdonságokat és azok sorrendjét a terméksablon beállításainál módosíthatja.', + 'You can change templates features and their positions in the template configuration page.' => 'A termék jellemzőit és azok sorrendjét a terméksablon beállításainál módosíthatja.', + 'You can change the default category (%title) in the "General" tab.' => 'Az alapértelmezett (%title) kategóriát az "Általános" fül alatt módosíthatja.', + 'You can change the default folder (%title) in the "General" tab.' => 'Az alapértelmezett csoportot (%title) az "Általános leírás" fül alatt módosíthatja', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'Meghatározhatja a kedvezmény mértékét minden használatos pénznemben. A mérték fix összeg vagy százalék a kedvezmény típus függvényében.', + 'You can\'t delete this administrator' => 'Nem törölheti ezt az adminisztrátort', + 'You don\'t have any export' => 'Az export lista üres', + 'You don\'t have any import' => 'Az import lista üres', + 'Zip code' => 'Irányítószám', + 'Zone name' => 'Zóna neve', + 'activate' => 'aktivál', + 'all' => 'mind', + 'and' => 'és', + 'code' => 'kód', + 'company' => 'Cég', + 'last order' => 'utolsó megrendés', + 'long description' => 'Hosszú leírás', + 'none' => 'egyik sem', + 'or' => 'vagy', + 'order amount' => 'megrendelés értéke', + 'orders for this customer' => 'Ügyfél megrendelései', + 'permanent discount' => 'Állandó kedvezmény (százalékban)', + 'profile' => 'Profil', + 'reverse' => 'fordított', + 'short description' => 'rövid leírás', + 'tax rules' => 'adószabályok', + 'taxes' => 'adók', + 'title' => 'név', + 'tracking reference' => 'Nyomkövetési ref.', + 'version' => 'Verzió', +]; diff --git a/templates/backOffice/default/I18n/id_ID.php b/templates/backOffice/default/I18n/id_ID.php new file mode 100644 index 00000000..1dcc1c7c --- /dev/null +++ b/templates/backOffice/default/I18n/id_ID.php @@ -0,0 +1,121 @@ + ' (standar)', + '%count more...' => '%count lebih...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count zona pengiriman yang melekat pada modul ini: %zones. Klik di sini untuk mengubah', + '(according to a country the taxes applied could be different)' => '(pajak yang diterapkan dapat berbeda pada sebuah negara)', + '(edit)' => '(edit)', + 'Check the list of ISO 639-1 codes' => 'Cek daftar dari kode ISO 639-1', + '0 combinations' => '0 kombinasi', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Tidak dapat menerjemahkan semua. Berdasarkan konfigurasi PHP Anda, formulir tidak dapat diisi lebih dari %current_max_input_vars karakter, dan kurang dari %required_max_input_vars. Silahkan ubah max_input_vars pada konfigurasi PHP Anda untuk mengubah berkas translasi dengan tangan.', + 'Congratulations, all text is now translated !' => 'Selamat, Semua teks telah diterjemahkan!', + 'Developer : to change the translations of the resource' => 'Pengembang: untuk mengubah terjemahan dari sumber daya', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'tidak menemukan teks apapun untuk diterjemahkan. Ini biasanya normal. Jika tidak, Silahkan menggunakan fungsi Smarty\'s "intl" di template ini, atau metode Translator::trans() pada file PHP.', + 'User : to redefine the translations for your website' => 'Pengguna : untuk mendefinisikan ulang terjemahan di website Anda', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Peringatan, nilai tukar tidak ditemukan untuk setidaknya satu mata uang: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Peringatan, beberapa negara-negara Anda tidak disertakan dalam setiap zona pengiriman:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Peringatan, beberapa zona pengiriman Anda tidak tercantum di dalam modul pengiriman apapun:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Anda dapat mencantumkan lebih dari satu folder kedalam konten. Pilih folder tambahan di sini.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Anda dapat mencantumkan lebih dari satu kategori produk. Pilih kategori tambahan untuk produk ini di sini.', + 'API configuration' => 'Konfigurasi API', + 'API list access' => 'Daftar akses API', + 'API users' => 'Pengguna API', + 'Accessory title' => 'Judul aksesori', + 'Action' => 'Tindakan', + 'Actions' => 'Tindakan', + 'Activate this log destination' => 'Mengaktifkan catatan tujuan ini', + 'Active' => 'Aktif', + 'Add' => 'Tambah', + 'Add a condition' => 'Tambahkan kondisi', + 'Add a module to a hook' => 'Menambahkan modul ke hook', + 'Add a new Customer' => 'Tambah Konsumen baru', + 'Add a new address' => 'Tambah alamat baru', + 'Add a new brand' => 'Tambah merek baru', + 'Add a new category' => 'Tambah kategori baru', + 'Add a new combination' => 'Menambahkan kombinasi baru', + 'Add a new content' => 'Tambahkan konten baru', + 'Add a new country' => 'Tambah negara baru', + 'Add a new product feature' => 'Menambahkan fitur produk baru', + 'Add a new product template' => 'Tambahkan sebuah templat produk', + 'Add a new state' => 'Tambah propinsi baru', + 'Address' => 'Alamat', + 'All' => 'Semua', + 'All States' => 'Semua provinsi', + 'Amount' => 'Jumlah', + 'An email containing instructions to create a new password was sent to your email address. If you don\'t receive this email, please try again.' => 'Sebuah email yang berisi petunjuk untuk membuat sebuah kata sandi baru yang dikirim ke alamat email Anda. Jika Anda tidak menerima email ini, silakan coba lagi.', + 'An error occured' => 'Terjadi kesalahan', + 'An invalid token was provided, your password cannot be changed. Please try again, and be sure to use the exact URL which is in the e-mail sent to you.' => 'Token dipakai tidak valid, password Anda tidak dapat diubah. Silakan coba lagi, dan pastikan untuk menggunakan URL yang tepat yang di email yang dikirim ke Anda.', + 'An unknow error happend' => 'Terjadi kesalahan yang tidak diketahui', + 'Associate documents' => 'Mengasosiasikan dokumen', + 'Associate images' => 'Mengaitkan gambar', + 'Available taxes' => 'Pajak yang tersedia', + 'Back' => 'Kembali', + 'Back Office' => 'Back Office', + 'Brands' => 'Merek', + 'Category' => 'Kategori', + 'Cellphone' => 'Cellphone', + 'Change this state' => 'Ubah status ini', + 'Chapo' => 'Chapo', + 'Choose a configuration' => 'Memilih konfigurasi', + 'Congratulations, your password was successfully changed. You can now login.' => 'Selamat, kata sandi berhasil diubah. Anda sekarang dapat masuk.', + 'Content' => 'Konten', + 'Countries/states configuration' => 'Konfigurasi negara/provinsi', + 'Countries/states deleted of this configuration' => 'Negara/provinsi dihapus pada konfigurasi ini', + 'Countries/states that will use this configuration' => 'Negara/provinsi akan menggunakan konfigurasi ini', + 'Create a new state' => 'Membuat provinsi baru', + 'Create this state' => 'Buat provinsi ini', + 'Decimal places' => 'Jumlah desimal', + 'Delete state' => 'Hapus provinsi', + 'Delete this folder' => 'Hapus folder ini', + 'Delete this state' => 'Hapus provinsi ini', + 'Delivery' => 'Pengiriman', + 'Disabled' => 'Dinonaktifkan', + 'Do you really want to delete this state ?' => 'Apakah anda yakin ingin menghapus provinsi ini?', + 'Each group of taxes are applied from top to bottom.' => 'Setiap kelompok pajak diterapkan dari atas ke bawah.', + 'Edit a state' => 'Edit sebuah provinsi', + 'Edit next brand' => 'Edit merek berikutnya', + 'Edit next customer' => 'Edit pelanggan berikutnya', + 'Edit next order' => 'Edit pesanan berikutnya', + 'Edit previous brand' => 'Edit merek sebelumnya', + 'Edit previous customer' => 'Edit pelanggan sebelumnya', + 'Edit previous order' => 'Edit pesanan sebelumnya', + 'Edit state "%name"' => 'Edit provinsi "%name"', + 'Editing state "%name"' => 'Mengedit provinsi "%name"', + 'Enter here the product stock' => 'Masukkan di sini stok barang', + 'Errors' => 'Errors', + 'Filter' => 'Penyaring', + 'First Name' => 'Nama Depan', + 'Folder' => 'Folder', + 'For a tax rule, you can have multiple configurations, as only one tax rule is affected to a product.' => 'Untuk penngaturan pajak, Anda dapat memiliki beberapa konfigurasi, seperti pajak hanya satu aturan dipengaruhi sebuah produk.', + 'Forgot your password ?' => 'Lupa kata sandi Anda?', + 'From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below.' => 'Dari Thelia 2.3, Anda harus menambahkan alamat email ke profil administrator. Harap masukkan alamat email Anda di bawah ini.', + 'Front Office' => 'Front Office', + 'Generate new password' => 'Buat kata sandi baru', + 'Here, just drag and drog the available taxes in groups.' => 'Di sini, cukup pindah dan letakkan pajak yang tersedia ke dalam grup.', + 'Hooks' => 'Kaitan', + 'In a group, each taxes are applied independently on the incomming price (the price without tax for the first group).' => 'Dalam grup, setiap pajak yang diterapkan secara independen pada harga awal (harga tanpa pajak untuk kelompok pertama).', + 'Invoice' => 'Faktur', + 'Last Name' => 'Nama Belakang', + 'New Configuration' => 'Konfigurasi baru', + 'No category found for "%term"' => 'Kategori tidak ditemukan untuk "%term"', + 'No config.' => 'Tidak ada konfig.', + 'No content found for "%term"' => 'Konten tidak ditemukan untuk "%term"', + 'No country' => 'Tidak ada negara', + 'No customer found for "%term"' => 'Pelanggan tidak ditemukan untuk "%term"', + 'No email defined' => 'Tiada email terdefinisi', + 'No filters' => 'Tidak ada filter', + 'No folder found for "%term"' => 'Folder tidak ditemukan untuk "%term"', + 'No order found for "%term"' => 'Pesanan tidak ditemukan untuk "%term"', + 'No product found for "%term"' => 'Produk tidak ditemukan untuk "%term"', + 'No state has been created yet. Click the + button to create one.' => 'Belum ada provinsi dibuat. klik tombol + untuk membuat satu.', + 'None' => 'Tidak ada', + 'Password changed' => 'Kata sandi berubah', + 'Preview brand page' => 'Pratinjau halaman merek', + 'Product price including taxes' => 'Harga produk tidak termasuk pajak', + 'Weight' => 'Berat', + 'caption' => 'Keterangan', + 'email' => 'email', + 'pdf' => 'pdf', + 'permanent discount' => 'diskon tetap (dalam persen)', +]; diff --git a/templates/backOffice/default/I18n/it_IT.php b/templates/backOffice/default/I18n/it_IT.php new file mode 100644 index 00000000..d3ba0801 --- /dev/null +++ b/templates/backOffice/default/I18n/it_IT.php @@ -0,0 +1,1241 @@ + ' (predefinito)', + '%count more...' => '%count altro...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count zona(e) di spedizione sono collegate a questo modulo: %zones. Clicca qui per modificare', + '(edit)' => '(modifica)', + 'Check the list of ISO 639-1 codes' => ' Controllare l\'elenco dei codici ISO 639-1', + '0 combinations' => '0 combinazioni', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Non posso tradurre tutti i campi. In base alla tua configurazione PHP, i form non possono contenere piu di %current_max_input_vars campi di input, ma almeno %required_max_input_vars campi sono richiesti. Cambia il valore di max_input_vars nella tua configurazione PHP oppure modifica la traduzione manualmente.', + 'Congratulations, all text is now translated !' => 'Complimenti, tutto il testo è ora tradotto !', + 'Developer : to change the translations of the resource' => 'Sviluppatore : per cambiare le traduzione del sorgente', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Non e stato trovato alcun testo da tradurre. Probabilmente è normale. Se così non fosse, si prega di assicurarsi di utilizzare la funzione "intl" di Smarty sui template, o il metodo Translator::trans() nei file PHP.', + 'User : to redefine the translations for your website' => 'Utente : per ridefinire le traduzioni del tuo sito', + 'Warning, some of your countries are not included in any shipping zone:' => 'Attenzione, alcuni dei tuoi paesi non sono inlcusi in alcuna zona di spedizione:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Attenzione, alcune delle tue zone di spedizione non sono collegate a nessun modulo di consegna:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Un contenuto potrebbe essere associato a più di una cartella. Selezionare qui i cartelli aggiuntivi per questo contenuto.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Un prodotto potrebbe essere associato a più categorie. Selezionare le categorie aggiuntive per questo prodotto.', + 'API configuration' => 'Configurazione API', + 'API list access' => 'Lista accesso API', + 'API users' => 'utenti API', + 'Accessory title' => 'Titolo dell\'accessorio', + 'Action' => 'Azione', + 'Actions' => 'Azioni', + 'Activate this log destination' => 'Attivare questa destinazione del registro', + 'Active' => 'Attivo', + 'Add' => 'Aggiungere', + 'Add a condition' => 'Aggiungi condizione', + 'Add a module to a hook' => 'Aggiungi un modulo ad un hook', + 'Add a new Customer' => 'Aggiungere un nuovo cliente', + 'Add a new address' => 'Aggiungere un nuovo indirizzo', + 'Add a new brand' => 'Aggiungi nuovo brand', + 'Add a new category' => 'Aggiungere una nuova categoria', + 'Add a new combination' => 'Aggiungere una nuova combinazione', + 'Add a new content' => 'Aggiungere un nuovo contenuto', + 'Add a new country' => 'Aggiungere un nuovo paese', + 'Add a new currency' => 'Aggiungere una nuova valuta', + 'Add a new folder' => 'Aggiungere una nuova cartella', + 'Add a new hook' => 'Aggiungi un nuovo hook', + 'Add a new language' => 'Aggiungere una nuova lingua', + 'Add a new mailing template' => 'Aggiungere un nuovo modello di e-mail', + 'Add a new module in a hook' => 'Aggiungi un nuovo modulo in un hook', + 'Add a new module to this hook' => 'Aggiungi un nuovo modulo in questo hook', + 'Add a new product' => 'Aggiungere un nuovo prodotto', + 'Add a new product attribute' => 'Aggiungere un nuovo attributo di prodotto', + 'Add a new product feature' => 'Aggiungere una nuova caratteristica di prodotto', + 'Add a new product template' => 'Aggiungere un nuovo template per i prodotti', + 'Add a new sale' => 'Aggiungi una nuova vendita', + 'Add a new shipping zone' => 'Aggiungi una nuova zona di spedizione', + 'Add a new state' => 'Aggiungi un nuovo stato', + 'Add a new variable' => 'Aggiungere una nuova variabile', + 'Add document to your product.' => 'Aggiungi un documento al tuo prodotto.', + 'Add selected countries' => 'Aggiungi i paesi selezionati', + 'Add tax to this group' => 'Aggiungere una tasse a questo gruppo', + 'Add this attribute to all product templates' => 'Aggiungere questa declinazione a tutti i templates di prodotto', + 'Add this feature to all product templates' => 'Aggiungere questa caratteristica per tutti i templates di prodotto', + 'Add to all product templates' => 'Aggiungere a tutti i template che riguardano i prodotti', + 'Add to selected categories' => 'Aggiungi alle categorie selezionate', + 'Additional Folders' => 'Cartelle addizionale', + 'Additional address' => 'Indirizzo aggiuntivo', + 'Additional categories' => 'Ulteriori categorie', + 'Address' => 'Indirizzo', + 'Administration logs' => 'Registri di amministrazione', + 'Administration profiles' => 'Profili di amministrazione', + 'Administrators' => 'Amministratori', + 'Advanced configuration' => 'Configurazione avanzata', + 'Advanced configuration and tools' => 'Configurazione e strumenti avanzati', + 'All' => 'Tutto', + 'All States' => 'Tutti gli Stati', + 'All orders' => 'Tutti gli ordini', + 'Amount' => 'Importo', + 'Amount, e.g. 12.50' => 'Quantità, es. 12.50', + 'An error occured' => 'Si è verificato un errore', + 'An unexpected error occured' => 'SI è verificato un errore imprevisto', + 'An unknown error occured, please try again.' => 'Si è verificato un errore imprevisto, riprova.', + 'And' => 'E', + 'Api' => 'Api', + 'Api key' => 'Chiave api', + 'Applies to attribute values :' => 'Applicabile ai valori dell\'attributo :', + 'Applies to products :' => 'Applicabile ai prodotti :', + 'Applies to products in categories :' => 'Applicabile ai prodotti nelle categorie :', + 'Apply' => 'Applicare', + 'Assigned modules' => 'Moduli assegnati', + 'Associate downloadable file' => 'File scaricabili associati', + 'Associate files to your combinations' => 'Associa file alle tue combinazioni', + 'Associated' => 'Associati', + 'Associations' => 'Associazioni', + 'Attribute' => 'Declinazione', + 'Attribute %title' => 'Attributo %title', + 'Attribute Combinations' => 'Combinazioni di declinazione', + 'Attribute Name' => 'Nome della declinazione', + 'Attribute information' => 'Informazione sulla declinazione', + 'Attribute title' => 'Titolo della declinazione', + 'Attribute values' => 'Valori della declinazione', + 'Attributes' => 'Declinazioni', + 'Attributes & Features' => 'Declinazioni & caratteristiche', + 'Auth Mode' => 'Modalità Autenticazione', + 'Auth Mode :' => 'Modalità Autenticazione :', + 'Author' => 'Autore', + 'Available product categories' => 'Categorie del prodotto disponibili', + 'Available taxes' => 'Tasse disponibili', + 'Back' => 'Indietro', + 'Back-office home' => 'Home del back office', + 'Back-office template you want to translate' => 'Template del back-office che vuoi tradurre', + 'Back-office templates' => 'Template per il back-office', + 'Back-office users' => 'Utenti del back-office', + 'Best taxed price' => 'Miglior prezzo tassato', + 'Brand created on %date_create. Last modification: %date_change' => 'Brand creato il %date_create. Ultima modifica: %date_change', + 'Brands' => 'Brands', + 'Browse files' => ' Percorrere i file', + 'Browse this category' => 'Cerca in questa categoria', + 'Browse this folder' => 'Percorrere questa cartella', + 'By module' => 'Per modulo', + 'By module:' => 'Per modulo:', + 'By status' => 'Per stato', + 'By type' => 'Per tipo', + 'Can\'t load documents, please refresh this page.' => 'Non è possibile caricare i documenti, si prega di aggiornare questa pagina.', + 'Can\'t load images, please refresh this page.' => 'Non è possibile caricare le immagini, si prega di aggiornare questa pagina.', + 'Can\'t reorder documents, please refresh this page.' => 'Non è possibile riordinare i documenti, si prega di aggiornare questa pagina.', + 'Can\'t reorder images, please refresh this page.' => 'Non è possibile riordinare le immagini, si prega di aggiornare questa pagina.', + 'Cancel' => 'Annulla', + 'Cancel changes and revert to original value' => 'Cancellare le modifiche e tornare al valore originale', + 'Cancel this order' => 'Annullare questo ordine', + 'Cart - Prices in %currency' => 'Carrello - prezzi in %currency', + 'Catalog' => 'Catalogo', + 'Categories' => 'Categorie', + 'Categories in %cat' => 'Categorie in %cat', + 'Category' => 'Categoria', + 'Category created on %date_create. Last modification: %date_change' => 'Categoria creata il %date_create. Ultima modifica: %date_change', + 'Category title' => 'Titolo della categoria', + 'Cellphone' => 'Cellulare', + 'Cellular phone' => 'Telefono cellulare', + 'Cellular phone number' => 'Numero di telefono cellulare', + 'Change sale configuration' => 'Modifica configurazione di vendita', + 'Change this administrator' => 'Cambiare questo amministratore', + 'Change this api access' => 'Cambia questo accesso api', + 'Change this attribute' => 'Cambiare questo attributo', + 'Change this brand' => 'Cambia questo brand', + 'Change this condition' => 'Cambia condizione', + 'Change this country' => 'Cambiare questo paese', + 'Change this coupon' => 'Cambia questo coupon', + 'Change this currency' => 'Modificare questa valuta', + 'Change this feature' => 'Modificare questa caratteristica', + 'Change this hook' => 'Cambia questo hook', + 'Change this language' => 'Cambiare questa lingua', + 'Change this mailing template' => 'Modificare questo template di e-mail', + 'Change this product attribute' => 'Modificare questa declinazione', + 'Change this product feature' => 'Modificare questa caratteristica', + 'Change this product template' => 'Cambiare questo template di prodotto', + 'Change this profile' => 'Modificare il profilo', + 'Change this sale' => 'Cambia questa vendita', + 'Change this shipping zone' => 'Cambiare questa zona di spedizione', + 'Change this state' => 'Cambia questo stato', + 'Change this tax' => 'Modificare questa tassa', + 'Change this tax rule' => 'Cambiare questa regola fiscale', + 'Change this template' => 'Modificare questo template', + 'Change this variable' => 'Cambiare questa variabile', + 'Chapo' => 'Chapo', + 'Check sale activation' => 'Controlla l\'attivazione della vendita', + 'Check the support of hooks.' => 'Controlla il support agli hook.', + 'Check this box if you want to add this attributes to all product templates' => 'Attivare questa checkbox se desideri aggiungere questo attributo a tutti i template di prodotto', + 'Check this box if you want to add this features to all product templates' => 'Attivare questa checkbox se desideri aggiungere queste caratteristiche a tutti i template di prodotto', + 'Choose a configuration' => 'Scegliere una configurazione', + 'Choose a country' => 'Scegliere un paese', + 'City' => 'Città', + 'Classic modules' => 'Moduli classici', + 'Click to view' => 'Clicca per vedere', + 'Click to view details.' => 'Clicca per vedere i dettagli.', + 'Clone' => 'Clona', + 'Clone product' => 'Clona prodotto', + 'Close' => 'Chiudere', + 'Close administation session' => 'Chiudere questa sessione di amministrazione', + 'Code' => 'Codice', + 'Code:' => 'Codice:', + 'Combinable with other promotions' => 'Combinabile con altre promozioni', + 'Combination EAN Code' => 'Combinazione codice EAN', + 'Combination builder' => 'Generatore di combinazione', + 'Combination reference' => 'Riferimento di combinazione', + 'Company' => 'Azienda', + 'Condition category :' => 'Categoria condizione :', + 'Condition description' => 'Descrizione condizione', + 'Configuration' => 'Impostazioni', + 'Configuration mailing system' => 'Sistema di configurazione e-mail', + 'Configure' => 'Configurare', + 'Configure this module' => 'Configurare questo modulo', + 'Confirm' => 'Confermare', + 'Confirm changes' => 'Confermare le modifiche', + 'Confirmation' => 'Conferma', + 'Congratulations, your password was successfully changed. You can now login.' => 'Congratulazioni, la tua password è stata modificata. Ora è possibile effettuare il login.', + 'Content' => 'Contenuto', + 'Content title' => 'Contenuto del titolo', + 'Contents in %fold' => 'Contenuti in %fold', + 'Copy all missing translations.' => 'Copia tutte le traduzioni mancanti.', + 'Copy all translations.' => 'Copia tutte le traduzioni.', + 'Copy source text in input field' => 'Copiare il testo in campo di input', + 'Countries' => 'Paesi', + 'Countries assigned to this zone' => 'Paesi assegnati a questa zona', + 'Countries/states configuration' => 'Configurazione paesi/stati', + 'Country' => 'Paese', + 'Coupon' => 'Promozione', + 'Coupon code' => 'Codice promozionale', + 'Coupon code * :' => 'Codice coupon * :', + 'Coupon conditions' => 'Condizioni coupon', + 'Coupon type * :' => 'Tipo coupon * :', + 'Coupons' => 'Codici promozionali', + 'Create' => 'Creare', + 'Create a customer address' => 'Creare un indirizzo per il cliente', + 'Create a new API access' => 'Crea un nuovo accesso API', + 'Create a new Hook' => 'Crea un nuovo Hook', + 'Create a new administrator' => 'Creare un nuovo amministratore', + 'Create a new attribute' => 'Creare una nuova declinazione', + 'Create a new attribute value' => 'Creare un nuovo valore di declinazione', + 'Create a new brand' => 'Crea nuovo brand', + 'Create a new category' => 'Creare una nuova categoria', + 'Create a new combination' => 'Creare una nuova combinazione', + 'Create a new content' => 'Creare un nuovo contenuto', + 'Create a new country' => 'Creare un nuovo paese', + 'Create a new coupon' => 'Creare un nuovo codice promozionale', + 'Create a new currency' => 'Creare una nuova moneta', + 'Create a new customer' => 'Creare un nuovo cliente', + 'Create a new feature' => 'Creare una nuova caratteristica', + 'Create a new feature value' => 'Creare un nuovo valore di caratteristica', + 'Create a new folder' => 'Creare una nuova cartella', + 'Create a new language' => 'Creare un nuovo linguaggio', + 'Create a new mailing template' => 'Creare un nuovo template di e-mail', + 'Create a new product' => 'Creare un nuovo prodotto', + 'Create a new product template' => 'Creare un nuovo template per i prodotti', + 'Create a new profile' => 'Creare un nuovo profilo', + 'Create a new sale' => 'Crea una nuova vendita', + 'Create a new shipping zone' => 'Crea nuova zona di spedizione', + 'Create a new state' => 'Crea un nuovo stato', + 'Create a new tax' => 'Creare una nuova tassa', + 'Create a new tax rule' => 'Creare una nuova regola fiscale', + 'Create a new variable' => 'Creare una nuova variabile', + 'Create combinations' => 'Creare combinazioni', + 'Create coupon' => 'Creare un codice promozionale', + 'Create this address' => 'Creare questo indirizzo', + 'Create this attribute' => 'Creare questa declinazione', + 'Create this brand' => 'Crea brand', + 'Create this category' => 'Creare questa categoria', + 'Create this combination' => 'Creare questa combinazione', + 'Create this content' => 'Creare questo contenuto', + 'Create this country' => 'Creare questo paese', + 'Create this currency' => 'Creare questa valuta', + 'Create this customer' => 'Creare questo cliente', + 'Create this feature' => 'Creare questa caratteristica', + 'Create this folder' => 'Creare questa cartella', + 'Create this hook' => 'Crea questo hook', + 'Create this hooks' => 'Crea questo hooks', + 'Create this language' => 'Creare questa lingua', + 'Create this mailing template' => 'Creare questo template di email', + 'Create this product' => 'Creare questo prodotto', + 'Create this product template' => 'Creare il template del prodotto', + 'Create this sale' => 'Crea questa vendita', + 'Create this shipping zone' => 'Crea questa zona di spedizione', + 'Create this state' => 'Creare questo stato', + 'Create this value' => 'Creare questa moneta', + 'Create this variable' => 'Creare questa variabile', + 'Currencies' => 'Monete', + 'Currency name' => 'Nome della moneta', + 'Currency rate' => 'Tasso della moneta', + 'Currency symbol' => 'Simbolo della moneta', + 'Current product template' => 'Template corrente del prodotto', + 'Current quantity' => 'Quantità attuale', + 'Customer' => 'Cliente', + 'Customer information' => 'Informazioni del cliente', + 'Customer informations' => 'Informazioni del cliente', + 'Customer is' => 'Il cliente è', + 'Customers' => 'Clienti', + 'Customers list' => 'Elenco dei clienti', + 'Cutomer Name' => 'Nome del cliente', + 'Date & Hour' => 'Data e ore', + 'Date of last order' => 'Data dell\'ultimo ordine', + 'Days before expiration' => 'Giorni prima della scadenza', + 'Deactivate %title module' => 'Disattivare il modulo %title', + 'Deactivate hook' => 'Disattivare hook', + 'Deactivate this hooks' => 'Disattiva questo hooks', + 'Default' => 'Predefinito', + 'Default address' => 'Indirizzo predefinito', + 'Define here this product\'s accessories' => 'Definire qui gli accessori di questo prodotto', + 'Delete' => 'Cancellare', + 'Delete a combination' => 'Cancellare una combinazione', + 'Delete a module' => 'Cancellare un modulo', + 'Delete a variable' => 'Cancellare una variabile', + 'Delete address' => 'Rimuovere l\'indirizzo', + 'Delete administrator' => 'Rimuovere l\'amministratore', + 'Delete also module data' => 'Rimuovere anche i dati del modulo', + 'Delete an order' => 'Cancellare un ordine', + 'Delete api access' => 'Elimina accesso api', + 'Delete attribute' => 'Cancellare una declinazione', + 'Delete attribute value' => 'Eliminare il valore dell\'attributo', + 'Delete brand' => 'Elimina brand', + 'Delete category' => 'Cancellare la categoria', + 'Delete content' => 'Cancellare il contenuto', + 'Delete country' => 'Cancellare il paese', + 'Delete coupon' => 'Elimina coupon', + 'Delete currency' => 'Rimuovere la moneta', + 'Delete customer' => 'Cancellare il cliente', + 'Delete feature' => 'Eliminare la caratteristica', + 'Delete feature value' => 'Eliminare il valore della caratteristica', + 'Delete folder' => 'Cancellare la cartella', + 'Delete hook' => 'Elimina hook', + 'Delete language' => 'Cancellare la lingua', + 'Delete mailing template' => 'Cancellare il templare di e-mail', + 'Delete product' => 'Cancellare il prodotto', + 'Delete profile' => 'Cancellare il profilo', + 'Delete sale' => 'Elimina vendita', + 'Delete selected countries' => 'Elimina paesi selezionati', + 'Delete shipping zone' => 'Elimina zona di spedizione', + 'Delete state' => 'Elimina stato', + 'Delete tax' => 'Cancellare la tassa', + 'Delete tax rule' => 'Cancellare la regola fiscale', + 'Delete template' => 'Cancellare il template', + 'Delete this accessory' => 'Cancellare questo accessorio', + 'Delete this administrator' => 'Cancellare questo amministratore', + 'Delete this api access' => 'Elimina questo accesso api', + 'Delete this attribute' => 'Eliminare questo attributo', + 'Delete this brand' => 'Elimina questo brand', + 'Delete this category and all its contents' => 'Cancellare questa categoria e tutti i suoi contenuti', + 'Delete this combination' => 'Cancellare questa combinazione', + 'Delete this condition' => 'Elimina condizione', + 'Delete this content' => 'Cancellare questo contenuto', + 'Delete this country' => 'Cancellare questo paese', + 'Delete this coupon' => 'Elimina questo coupon', + 'Delete this currency' => 'Cancellare questa moneta', + 'Delete this customer address' => 'Cancella l\'indirizzo di questo cliente', + 'Delete this customer and all his orders' => 'Cancellare questo cliente e tutti i suoi ordini', + 'Delete this feature' => 'Eliminare questa caratteristica', + 'Delete this folder' => 'Eliminare questa cartella', + 'Delete this folder and all its contents' => 'Eliminare questa cartella e il relativo contenuto', + 'Delete this hook' => 'Elimina questo hook', + 'Delete this language' => 'Cancellare questa lingua', + 'Delete this mailing template' => 'Cancellare questo template di e-mail', + 'Delete this module' => 'Cancellare questo modulo', + 'Delete this product' => 'Cancellare questo prodotto', + 'Delete this product attribute' => 'Cancellare l\'attributo del prodotto', + 'Delete this product feature' => 'Eliminare questa caratteristica di prodotto', + 'Delete this product template' => 'Cancellare questo template di prodotto', + 'Delete this profile' => 'Cancellare questo profilo', + 'Delete this sale' => 'Elimina questa vendita', + 'Delete this shipping zone' => 'Elimina questa zona di spedizione', + 'Delete this state' => 'Elimina questo stato', + 'Delete this tax' => 'Cancellare questa tassa', + 'Delete this tax rule' => 'Cancellare questa regola fiscale', + 'Delete this value' => 'Eliminare questo valore', + 'Delete this variable' => 'Cancellare questa variabile', + 'Delete this zone' => 'Cancellare questa zona', + 'Delivery address' => 'Indirizzo di consegna', + 'Delivery module' => 'Modulo di consegna', + 'Delivery modules' => 'Moduli di consegna', + 'Description' => 'Descrizione', + 'Destinations' => 'Destinazione', + 'Developer mode' => 'Modalità sviluppatore', + 'Disabled' => 'Disattivato', + 'Discount' => 'Sconto', + 'Discount amount' => 'Quantità sconto', + 'Discount percentage' => 'Percentuale di sconto', + 'Discover all our modules on Thelia Modules !' => 'Scoprite tutti i nostri moduli Thelia Modules !', + 'Do not use a product template' => 'Non utilizzare un template di prodotto', + 'Do this export' => 'Fai questa esportazione', + 'Do this import' => 'Fai questa importazione', + 'Do you really want to add this attribute to all product templates ?' => 'Volete davvero aggiungere questa declinazione a tutti i template di prodotto ?', + 'Do you really want to add this feature to all product templates ?' => 'Volete davvero aggiungere questa caratteristica per tutti i template di prodotto ?', + 'Do you really want to cancel this order ?' => 'Volete cancellare questo ordine?', + 'Do you really want to delete this address ?' => 'Vuoi davvero cancellare questo indirizzo?', + 'Do you really want to delete this administrator ?' => 'Volete cancellare questo amministratore ?', + 'Do you really want to delete this api access ?' => 'Vuoi veramente eliminare questo accesso api ?', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'Volete davvero eliminare questo attributo? Verrà rimosso da tutti i template di prodotti.', + 'Do you really want to delete this attribute value ?' => 'Volete davvero eliminare questo valore di attributo?', + 'Do you really want to delete this brand ?' => 'Vuoi veramente eliminare questo brand ?', + 'Do you really want to delete this category and all its content ?' => 'Volete cancellare questa categoria e tutto il suo contenuto?', + 'Do you really want to delete this combination ?' => 'Volete davvero cancellare questa combinazione ?', + 'Do you really want to delete this condition ?' => 'Vuoi veramente eliminare questa condizione ?', + 'Do you really want to delete this content ?' => 'Volete davvero cancellare questo contenuto ?', + 'Do you really want to delete this country ?' => 'Volete davvero cancellare questo paese ?', + 'Do you really want to delete this coupon ?' => 'Vuoi veramente eliminare questo coupon ?', + 'Do you really want to delete this currency ?' => 'Volete davvero eliminare questa moneta ?', + 'Do you really want to delete this customer ?' => 'Volete davvero cancellare questo cliente?', + 'Do you really want to delete this document ?' => 'Vuoi veramente eliminare questo documento ?', + 'Do you really want to delete this element ?' => 'Volete davvero cancellare questo elemento ?', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'Volete davvero eliminare questo attributo? Verrà rimosso da tutti i template di prodotti.', + 'Do you really want to delete this feature value ?' => 'Volete davvero eliminare questo valore di caratteristica ?', + 'Do you really want to delete this folder and all its content ?' => 'Vuoi davvero eliminare questa cartella e tutto i suoi contenuti ?', + 'Do you really want to delete this hook ?' => 'Vuoi veramente eliminare questo hook ?', + 'Do you really want to delete this image ?' => 'Vuoi veramente eliminare questa immagine ?', + 'Do you really want to delete this language ?' => 'Vuoi davvero eliminare questa lingua?', + 'Do you really want to delete this mailing template ?' => 'Vuoi davvero eliminare questo template ?', + 'Do you really want to delete this module ?' => 'Volete davvero cancellare questo modulo ?', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => 'Volete davvero cancellare questo prodotto ?', + 'Do you really want to delete this profile ?' => 'Volete davvero cancellare questo profilo ?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'Vuoi veramente eliminare questa vendita ? Tutti i prodotti correlati non saranno più in vendita', + 'Do you really want to delete this shipping zone ?' => 'Vuoi veramente eliminare questa zona di spedizione ?', + 'Do you really want to delete this tax ?' => 'Vuoi davvero eliminare questa tassa?', + 'Do you really want to delete this tax rule ?' => 'Vuoi davvero eliminare questa regola fiscale?', + 'Do you really want to delete this template ? It will be removed from all products.' => 'Vuoi davvero eliminare questo template ? Verrà rimosso da tutti i prodotti.', + 'Do you really want to delete this variable ?' => 'Vuoi davvero eliminare questa variabile?', + 'Do you really want to remove the content from this folder ?' => 'Vuoi davvero rimuovere il contenuto dalla cartella ?', + 'Do you really want to remove the product from this category ?' => 'Vuoi davvero rimuovere il prodotto da questa categoria?', + 'Do you really want to remove this accessory from the product ?' => 'Volete davvero rimuovere questo accessorio dal prodotto ?', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => 'Volete davvero rimuovere questo attributo da tutti i template di prodotto ? Perderete tutti i dati correlati con i prodotti per questo attributo.', + 'Do you really want to remove this attribute from the template ?' => ' Volete davvero rimuovere questo attributo dal template ?', + 'Do you really want to remove this country from this shipping zone ?' => 'Vuoi veramente rimuovere questo paese da questa zona di spedizione ?', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => 'Volete davvero rimuovere questa caratteristica da tutti i template di prodotto? Perderete tutti i dati correlati per questa caratteristica di prodotto.', + 'Do you really want to remove this feature from the template ?' => ' Volete davvero rimuovere questa caratteristica dal template ?', + 'Do you really want to remove this module from this hook ?' => 'Vuoi veramente rimuovere questo modulo da questo hook?', + 'Do you really want to remove this related content ?' => 'Volete davvero rimuovere questo contenuto correlato ?', + 'Do you really want to remove this related content from the product ?' => 'Volete davvero rimuovere questo contenuto correlato con il prodotto ?', + 'Do you really want to remove this zone ?' => 'Vuoi rimuovere questa zona?', + 'Do you really want to set this coupon available to everyone ?' => 'Volete davvero rendere disponibile a tutti questo codice promozionale ?', + 'Do you really want to use this address by default ?' => 'Vuoi davvero utilizzare quest\' indirizzo comme predefinito ?', + 'Document informations' => 'Informazioni del documento', + 'Documents' => 'Documenti', + 'Download invoice as PDF' => 'Scaricare la fattura in formato PDF', + 'Download purchase order as PDF' => 'Scarica l\'ordine di acquisto in formato PDF', + 'Drop files to upload' => 'Rilasciare i file da caricare', + 'Drop tax here to create a tax group' => 'Mettere la tasse qui per creare un gruppo di tasse', + 'Drop tax here to delete from group' => 'Mettere la tasse qui per rimuoverla dal gruppo', + 'E-mail' => 'E-mail', + 'E-mail template you want to translate' => 'Template e-mail che vuoi tradurre', + 'E-mail templates' => 'Templates e-mail', + 'EAN Code' => 'Codice EAN', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotassa è una tassa che aggiunge un importo definito al prezzo del prodotto.', + 'Edit' => 'Modifica', + 'Edit Prices' => 'Modifica Prezzi', + 'Edit a country' => 'Modificare un paese', + 'Edit a currency' => 'Modificare una moneta', + 'Edit a customer' => 'Modificare un cliente', + 'Edit a customer address' => 'Modificare un indirizzo per un cliente', + 'Edit a document' => 'Modificare un documento', + 'Edit a feature' => 'Modificare una caratteristica', + 'Edit a hook' => 'Modifica un hook', + 'Edit a language' => 'Modificare una lingua', + 'Edit a mailing template' => 'Modificare un template di e-mail', + 'Edit a module' => 'Modificare un modulo', + 'Edit a module hook' => 'Modifica l\'hook del modulo', + 'Edit a profile' => 'Modificare un profilo', + 'Edit a shipping configuration' => 'Modificare una configurazione di spedizione', + 'Edit a shipping zone' => 'Modificare una zona di spedizione', + 'Edit a state' => 'Modificare uno stato', + 'Edit a system variable' => 'Modificare una variabile del sistema', + 'Edit a tax' => 'Modificare una tassa', + 'Edit a tax rule' => 'Modificare una regola fiscale', + 'Edit a template' => 'Modificare un template', + 'Edit an attribute' => 'Modificare un attributo', + 'Edit an image' => 'Modificare un\'immagine', + 'Edit an order' => 'Modificare un ordine', + 'Edit api access' => 'Modifica accesso api', + 'Edit attribute "%name"' => 'Modificare l\'attributo "%name."', + 'Edit brand' => 'Modifica brand', + 'Edit brand %title' => 'Modifica brand %title', + 'Edit category' => 'Modificare una categoria', + 'Edit category %title' => 'Modificare la categoria %title', + 'Edit content' => 'Modificare il contenuto', + 'Edit content %title' => 'Modificare il contenuto %title', + 'Edit country "%name"' => 'Modificare il paese "%name"', + 'Edit currency "%name"' => 'Modificare la moneta "%name"', + 'Edit customer %firstname %lastname' => 'Modificare il cliente %firstname %lastname', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Modifica il cliente %firstname %lastname (Rif : %ref)', + 'Edit delivery address' => 'Modificare l\'indirizzo di consegna', + 'Edit document "%name"' => 'Modificare il documento "%name"', + 'Edit feature "%name"' => 'Modificare la caratteristica "%name"', + 'Edit folder' => 'Modificare la cartella', + 'Edit folder %title' => 'Modificare la cartella %title', + 'Edit hook "%name"' => 'Modifica hook "%name"', + 'Edit image "%name"' => 'Modificare l\'immagine "%name"', + 'Edit information in %lng' => 'Modificare le informazioni in %lng', + 'Edit invoice address' => 'Modificare l\'indirizzo di fatturazione', + 'Edit mailing template "%name"' => 'Modificare il template di mailing "%name"', + 'Edit next category' => 'Modificare la categoria successiva', + 'Edit next content' => 'Modificare il contenuto successivo', + 'Edit next folder' => 'Modificare la cartella successiva', + 'Edit next product' => 'Modificare il prodotto successivo', + 'Edit order address' => 'Modifica gli altri indirizzi per i ordini', + 'Edit previous category' => 'Modificare la categoria precedente', + 'Edit previous content' => 'Modificare il contenuto precedente', + 'Edit previous folder' => 'Modificare la cartella precedente', + 'Edit previous product' => 'Modificare il prodotto precedente', + 'Edit prices in %curr' => 'Modificare i prezzi in %curr', + 'Edit product' => 'Modificare il prodotto', + 'Edit product %title' => 'Modificare il prodotto %title', + 'Edit state "%name"' => 'Modificare stato "%name"', + 'Edit template "%name"' => 'Modificare il template "%name"', + 'Edit this address' => 'Modificare questo indirizzo', + 'Edit this brand' => 'Modifica questo brand', + 'Edit this category' => 'Modificare questa categoria', + 'Edit this content' => 'Modificare questo contenuto', + 'Edit this customer' => 'Modificare questo cliente', + 'Edit this delivery zone' => 'Modifica questa zona di consegna', + 'Edit this folder' => 'Modificare questa cartella', + 'Edit this module' => 'Modificare questo modulo', + 'Edit this order' => 'Modificare questo ordine', + 'Edit this product' => 'Modificare questo prodotto', + 'Edit variable %name' => 'Modificare la variabile %name', + 'Editing %cat' => 'Modificare %cat', + 'Editing %fold' => 'Modificare %fold', + 'Editing %title' => 'Modificare %title', + 'Editing attribute "%name"' => 'Modificare l\'attributo "%name."', + 'Editing brand "%title"' => 'Stai modificando il brand "%title"', + 'Editing country "%name"' => 'Modificare il paese "%name"', + 'Editing coupon "%title"' => 'Modifica coupon', + 'Editing currency "%name"' => 'Modificare la moneta "%name"', + 'Editing document "%name"' => 'Modifica il documento "%name"', + 'Editing feature "%name"' => 'Modificare la caratteristica "%name"', + 'Editing hook "%name"' => 'Modificare hook "%name"', + 'Editing hook for module "%name"' => 'Modifica l\'hook del modulo "%name"', + 'Editing image "%name"' => 'Modificare l\'immagine "%name"', + 'Editing mailing template "%name"' => 'Modificare il template di mailing "%name"', + 'Editing module' => 'Modificare il modulo', + 'Editing profile' => 'Modificare il profilo', + 'Editing profile \'%name\'' => 'Modifica profilo \'%name\'', + 'Editing shipping configuration for module "%name"' => 'Modificazione della configurazione di spedizione per il modulo "%name"', + 'Editing shipping zone "%name"' => 'Modificare la zona di spedizione "%name"', + 'Editing state "%name"' => 'Modifica stato "%name"', + 'Editing tax' => 'Modificare la tassa', + 'Editing tax rule' => 'Modificare la regola fiscale', + 'Editing template "%name"' => 'Modificare il template "%name"', + 'Editing variable "%name"' => 'Modificare la variabile "%name"', + 'Email' => 'Email', + 'Email address' => 'Indirizzo email', + 'Email addresses' => 'Indirizzo email', + 'Email confirmation address' => 'Configurazione indirizzo email', + 'Enable remote SMTP use : ' => 'Attivare l\'utilizzo del SMTP: ', + 'Enable/Disable' => 'Attivare/Disattivare', + 'Enabled' => 'Abilitato', + 'Encryption' => 'Crittografia', + 'Encryption :' => 'Crittografia :', + 'End Date' => 'Fine Data', + 'Enter here all possible attribute values.' => 'Inserisci qui tutti i valori possibili per l\'attributo.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Inserisci qui tutti i valori possibili per la caratteristica. Per ottenere la possibilità di avere un testo libero per la caratteristica, non aggiungere alcun valore.', + 'Enter here the attribute name in the default language (%language_name)' => 'Inserisci qui il nome dell\'attributo nella lingua predefinita (%language_name)', + 'Enter here the category name in the default language (%title)' => 'Inserisci qui il nome della categoria nella lingua predefinita (%title)', + 'Enter here the content name in the default language (%title)' => 'Inserisci qui il nome del contenuto nella lingua predefinita (%title)', + 'Enter here the currency name in the default language (%title)' => 'Inserisci qui il nome della moneta nella lingua predefinita (%title)', + 'Enter here the feature name in the default language (%title)' => 'Inserisci qui il nome della caratteristica nella lingua predefinita (%title)', + 'Enter here the feature value as free text' => 'Inserire qui il valore della caratteristica come testo libero', + 'Enter here the folder name in the default language (%title)' => 'Inserisci qui il nome della cartella nella lingua predefinita (%title)', + 'Enter here the product name in the default language (%title)' => 'Inserisci qui il nome del prodotto nella lingua predefinita (%title)', + 'Enter here the product price in %title' => 'Inserisci qui il prezzo del prodotto in %title', + 'Enter here the product reference' => 'Inserisci qui il riferimento del prodotto', + 'Enter here the product stock' => 'Inserisci qui lo stock del prodotto', + 'Enter here the product tax price in %title' => 'Inserisci qui il prezzo tassato del prodotto in %title', + 'Enter here the product weight, in Kilogrammes' => 'Inserisci qui il peso del prodotto, in chilogrammi', + 'Enter here the template name in the default language (%title)' => 'Inserisci qui il nome del template nella lingua predefinita (%title)', + 'Enter here the value in the current edit language (%language_name)' => 'Inserire qui il valore nella lingua dell\'attuale modificazione (%language_name)', + 'Enter here the value in the current edit language (%title)' => 'Inserire qui il valore nella lingua di modifica corrente (%title)', + 'Enter here the value in the default language (%title)' => 'Inserisci qui il valore nella lingua di default (%title)', + 'Enter information in the default language (%title)' => 'Inserisci le informazioni nella ligua di default (%title)', + 'Enter new accessory position' => 'Inserire la nuova posizione del accessorio', + 'Enter new attribute position' => 'Inserire la nuova posizione dell\'attributo', + 'Enter new brand position' => 'Inserisci nuova posizione brand', + 'Enter new category position' => 'Inserire la nuova posizione della categoria', + 'Enter new content position' => 'Inserire la nuova posizione del contenuto', + 'Enter new currency position' => 'Inserire la nuova posizione della moneta', + 'Enter new export category position' => 'Inserisci una nuova posizione per la categoria dell\'esportazione', + 'Enter new export position' => 'Inserisci una nuova posizione', + 'Enter new feature position' => 'Inserire la nuova posizione della caratteristica', + 'Enter new folder position' => 'Inserire la nuova posizione della cartella', + 'Enter new import category position' => 'Inserisci nuova posizione della categoria di importo', + 'Enter new import position' => 'Inserisci nuova posizione dell\'importo', + 'Enter new module hook position' => 'Inserisci la nuova posizione dell\'hook del modulo', + 'Enter new module position' => 'Inserire la nuova posizione del modulo', + 'Enter new product position' => 'Inserire la nuova posizione del prodotto', + 'Enter new value position' => 'Inserire la nuova posizione del valore', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'Inserire una o più indirizzi IP V4 separati da ";\'. Lasciare vuoto per visualizzare i registri per tutti gli indirizzi IP', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'Inserire uno o più nomi di file senza percorso, separato da ";". Usare il simbolo "!" prima di un nome di file per escluderlo. Usare "*" per attivare i registri per tutti i file.', + 'Enter quantity' => 'Inserisci quantità', + 'Error' => 'Errore', + 'Errors' => 'Errori', + 'Example :' => 'Esempio :', + 'Exchange rate' => 'Tasso di cambio', + 'Existing combinations will be deleted. Do you want to continue ?' => 'Combinazioni esistenti verranno eliminati. Volete continuare?', + 'Expiration date' => 'Data di scadenza', + 'Expiration date * :' => 'Data di scadenza * :', + 'Expired' => 'Scaduto', + 'Export' => 'Esporta', + 'Exports' => 'Esportazioni', + 'Failed to get converted prices. Please try again.' => 'Non è riuscito a ottenere prezzi convertiti. Riprovare per favore.', + 'Failed to get prices. Please try again.' => 'Impossibile ottenere i prezzi. Riprovare per favore.', + 'Feature Name' => 'Nome della caratteristica', + 'Feature information' => 'Informazione sulla caratteristica', + 'Feature title' => 'Titolo della caratteristica', + 'Feature value' => 'Valore della caratteristica', + 'Feature value for this product' => ' Valore della caratteristica per questo prodotto', + 'Feature values' => 'Valori della caratteristica', + 'Features' => 'Caratteristiche', + 'File' => 'File', + 'File names' => 'Nomi dei file', + 'Filename' => 'Nome file', + 'Filter by hook name:' => 'Filtra per nome hook:', + 'First Name' => 'Nome', + 'First name' => 'Nome', + 'Firstname' => 'Nome', + 'Flush the Thelia internal cache' => 'Svuotare la cache interna di thelia', + 'Flush the assets cache directory' => 'Svuotare la cache della cartella degli asset', + 'Flush the images and documents cache' => 'Svuotare la cache delle immagini e dei documenti', + 'Folder' => 'Cartella', + 'Folder created on %date_create. Last modification: %date_change' => 'Cartella creata il %date_create. Ultima modifica: %date_change', + 'Folder title' => 'Titolo della cartella', + 'Folders' => 'Cartelle', + 'Folders in %fold' => 'Cartelle in %fold', + 'For prices in %currency' => 'Per i prezzi in %currency', + 'Format: %fmt' => 'Formato: %fmt', + 'Format: %fmt, e.g. %date' => 'Formato: %fmt, es. %date', + 'Free shipping for methods :' => 'Spedizione gratuita per i metodi :', + 'Free shipping to countries :' => 'Spedizione gratuita ai paesi', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'L\'IVA francese è una tassa che aggiunge una maggiorazione del 19,6% al prezzo del prodotto.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'L\'IVA francese di 19,6% con ecotassa è l\'applicazione dell\'ecotassa (sul prezzo del prodotto) quindi l\'applicazione della tassa 19,6% (sul prezzo del prodotto + la quantità dell\'ecotassa).', + 'From' => 'Da', + 'Front Office' => 'Front Office', + 'Front-office template you want to translate' => 'Template del front-office che vuoi tradurre', + 'Front-office templates' => 'Template per il front-office', + 'General' => 'Generale', + 'General configuration' => 'Configurazione generale', + 'General description' => 'Descrizione generale', + 'General tools' => 'Strumenti generali', + 'Generate new password' => 'Genera nuova password', + 'Get more information about this module' => 'Ottieni maggiori informazioni su questo modulo', + 'Go to administration home' => 'Andare nella home dell\'amministrazione', + 'Go to first page' => 'Vai alla prima pagina', + 'Go to last page' => 'Pagina precedente', + 'Go to next page' => 'Pagina successiva', + 'Go to previous page' => 'Vai alla pagina precedente', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'Versione HTML di questo messaggio', + 'Hide empty hook' => 'Nascondi l\'hook vuoto', + 'Home' => 'Home', + 'Hook positions' => 'Posizioni dell\'hook', + 'Host' => 'Host', + 'Host :' => 'Host :', + 'ID' => 'ID', + 'IP Addresses' => 'Indirizzi IP', + 'ISO 4217 Code' => 'Codice ISO 4217', + 'ISO 4217 code' => 'Codice ISO 4217', + 'ISO 639 Code' => 'Codice ISO 639', + 'ISO Code' => 'Codice ISO', + 'If a translation is missing or incomplete :' => 'Se una traduzione è incompleta o mancante:', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'Se sì, redirezioni tramite Redirect::exec() verranno visualizzati come link', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'Se cambi il template, tutti i prezzi verranno resettati e dovrai configurarli di nuovo.', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'Se vuoi tradurre i componenti del core di Thelia: core, installazzione,moduli di default e template.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'Se il tuo scopo è solo quello di tradurre testo per il tuo sito, per favore usa la modalità utente.
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Sembra che questa string contiene una variabile di Smarty ($). Se il caso, non può essere tradotta correttamente.', + 'Image information' => 'Informazioni sull\'immagine', + 'Image+file+not+found' => 'File+immagine+non+trovato', + 'Images' => 'Immagini', + 'Import' => 'Importa', + 'Import this file' => 'Importa file', + 'Imports' => 'Importazioni', + 'Impossible to change active flag. Please contact your administrator or try later' => 'Impossibile cambiare la bandiera attiva. Contatta l\'amministratore di sistema o prova più tardi', + 'Impossible to change default country. Please contact your administrator or try later' => 'è impossibile cambiare il paese predefinito. La pregiamo di contattare l\'amministratore o di riprovare più tardi', + 'Impossible to change default languages. Please contact your administrator or try later' => 'è impossibile cambiare le lingue predefinite. La pregiamo du contattare l\'amministratore o di riprovare più tardi', + 'Impossible to change official hook. Please contact your administrator or try later' => 'Impossibile cambiare l\'hook ufficiale. Contatta l\'amministratore di sistema o prova più tardi', + 'In order to manges your shop taxes you can manage' => 'Prima di gestire le tasse del negozio potete gestire', + 'In page' => 'Nella pagina', + 'In pages:' => 'Nelle pagine:', + 'Inactive' => 'Inattivo', + 'Included countries' => 'Includi paesi', + 'Information on this hook' => 'Informazioni su questo hook', + 'Install !' => 'Installa !', + 'Install or update a module' => 'Installa o aggiorna modulo', + 'Invoice and Delivery' => 'Fattura e consegna', + 'Invoice date' => 'Data della fattura', + 'Invoice informations' => 'Informazioni di fattura', + 'Invoice reference' => 'Riferimento della fattura', + 'It\'s strongly recommended to use our translation platform' => 'E\' largamente raccomandato di usare la nostra piattaforma per le traduzioni', + 'Items to translate' => 'Elementi da tradurre', + 'Keep attention that in translating you can override the resource translations.
    ' => 'Fai attenzione mentre traduci che puoi sovrascrivere la risorsa delle traduzioni.
    ', + 'Kg' => 'Kg', + 'Label' => 'Etichetta', + 'Language name' => 'Nome della lingua', + 'Language title' => 'Titolo della lingua', + 'Languages' => 'Lingue', + 'Languages & URLs' => 'Lingue & URLs', + 'Languages management' => 'Gestione delle lingue', + 'Last Name' => 'Cognome', + 'Last name' => 'Cognome', + 'Last order amount' => 'Ultimo importo dell\'ordine', + 'Lastname' => 'Cognome', + 'Leave empty to keep current password' => 'Lasciare vuoto per mantenere la password corrente', + 'Locale' => 'Lingua', + 'Log lines format' => 'Formato delle linee di log', + 'Log lines header format. You may use the following variables: ' => 'Log lines header format. Si possono utilizzare le seguenti variabili:', + 'Login' => 'Login', + 'Logout' => 'Disconnettersi', + 'Long description :' => 'Descrizione lunga :', + 'Mailing system' => 'Sistema di mailing', + 'Mailing templates' => 'Modelli di mailing', + 'Manage attributes included in this product template' => 'Gestisci gli attributi inclusi nel template di questo prodotto', + 'Manage features included in this product template' => 'Gestisci le caratteristiche incluse nel template di questo prodotto', + 'Manage hooks' => 'Gestisci hooks', + 'Manage its hooks' => 'Gestisci gli hook', + 'Manage module rights' => 'Gestire i diritti del modulo', + 'Manage modules' => 'Gestisci moduli', + 'Manage modules attachements' => 'Gestisci gli allegati dei moduli', + 'Manage resource rights' => 'Gestire i diritti delle risorse', + 'Manage taxes' => 'Gestire le tasse', + 'Manage the tax rule taxes appliance order' => 'Gestire l\'ordine delle regole delle tasse', + 'Maximum usage count :' => 'Contatore del massimo utilizzo :', + 'Message created on %date_create. Last modification: %date_change' => 'Messaggio creato il %date_create. Ultima modifica: %date_change', + 'Message data' => 'Dati del messaggio', + 'Message level' => 'Livello di messaggio', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'I messaggi che hanno un livello maggiore o uguale al livello selezionato verranno aggiunto alle destinazioni del registro. ', + 'Minimum required Thelia version' => 'Minima versione di Thelia richiesta', + 'Module' => 'Modulo', + 'Module %mod: %error' => 'Modulo %mod: %error', + 'Module access rights' => 'Diritti di accesso del modulo', + 'Module code' => 'Codice modulo', + 'Module component' => 'Componente del modulo', + 'Module created on %date_create. Last modification: %date_change' => 'Modulo creato il %date_create. Ultima modifica: %date_change', + 'Module detailed information' => 'Informazioni dettagliate modulo', + 'Module file' => 'File del modulo', + 'Module name' => 'Nome modulo', + 'Module type' => 'Tipo modulo', + 'Module you want to translate' => 'Modulo che vuoi tradurre', + 'Modules' => 'Moduli', + 'Modules attachments' => 'Allegati moduli', + 'More information about ISO 4217' => 'Ulteriori informazioni su ISO 4217', + 'More pages after' => 'Più pagine successive', + 'More pages before' => 'Più pagine precedenti', + 'Name' => 'Nome', + 'Namespace of main class' => 'Namespace della classe main', + 'New' => 'Nuovo', + 'New Configuration' => 'Nuova Configurazione', + 'No' => 'No', + 'No Folders found' => 'Nessun cartelle trovate', + 'No administration profile defined yet. Click the + button to create one.' => 'Nessun profilo amministrativo definito. Clicca il bottone + per crearne uno.', + 'No area defined with this id' => 'Nessuna zona definita con questo id', + 'No attributes.' => 'Non ci sono attributi.', + 'No available content in this folder' => 'Nessun contenuto disponibile in questa cartella', + 'No available product in this category' => 'Nessun prodotto disponibile in questa categoria', + 'No available value for this attribute' => 'Nessun valore disponibile per questo attributo', + 'No brand' => 'Nessun marchio', + 'No brand has been created yet. Click the + button to create one.' => 'Nessun brand è stato ancora creato. Clicca il bottone + per crearne uno.', + 'No categories found' => 'Nessuna categoria trovata', + 'No config.' => 'Nessuna configurazione.', + 'No country' => 'Nessun paese', + 'No country has been created yet. Click the + button to create one.' => 'Nessun paese è stato ancora creato. Clicca il pulsante + per crearne uno.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'Nessun coupon è al momento definito. Usa il bottone (+) qui sopra per creare il tuo primo coupon.', + 'No currency has been created yet. Click the + button to create one.' => 'Nessuna moneta è stata ancora creata. Clicca il pulsante + per crearne una.', + 'No description for this hook' => 'Nessuna descrizione per questo hook', + 'No document' => 'Nessun documento', + 'No email defined' => 'Nessun email definita', + 'No folders found' => 'Nessun cartelle trovate', + 'No hooks has been created yet. Click the + button to create one.' => 'Nessun hook è stato ancora creato. Clicca il bottone + per crearne uno.', + 'No logo image' => 'Nessuna immagine logo', + 'No mailing template has been created yet. Click the + button to create one.' => 'Nessun template di e-mail è stato ancora creato. Clicca il pulsante + per crearne uno.', + 'No module of this type was found.' => 'Nessun modulo di questo tipo è stato trovato.', + 'No orders fo this customer.' => 'Nessun ordine di questo cliente.', + 'No product attribute has been created yet. Click the + button to create one.' => 'Nessun attributo di prodotto è stato ancora creato. Clicca il pulsante + per crearne uno.', + 'No product feature has been created yet. Click the + button to create one.' => 'Nessuna caratteristica di prodotto è stata ancora creata. Clicca il pulsante + per crearne una.', + 'No product template has been created yet. Click the + button to create one.' => 'Nessun template di prodotto è stato ancora creato. Clicca il pulsante + per crearne uno.', + 'No sale has been created yet. Click the + button to create one.' => 'Nessuna vendita è stata creata. Clicca il bottone + per crearne una.', + 'No shipping zone attached to this module, click here to attach one' => 'Nessuna zona di spedizione collegata a questo modulo, clicca qui per collegarne una.', + 'No shipping zone defined yet. Click the + button to create one.' => 'Nessuna zona di spedizione definita. Clicca il bottone + per crearne uno.', + 'No value has been created yet. Click the + button to create one.' => 'Non è stato ancora creato alcun valore. Clicca il pulsante + per crearne uno.', + 'None defined' => 'Nessuno definito', + 'N° ISO' => 'N ° ISO', + 'OK' => 'OK', + 'Online' => 'Online', + 'Oops! An Error Occurred' => 'Caspita! Si è verificato un errore', + 'Or' => 'O', + 'Order %ref - ID %id' => 'Ordine %ref - ID %id', + 'Order details' => 'Dettagli dell\'ordine', + 'Order n°' => 'Ordine n°', + 'Order status:' => 'Stati dell\'ordine:', + 'Ordered products' => 'Prodotti ordinati', + 'Orders' => 'Ordini', + 'Originating file line number ' => 'Numero di riga del file di origine ', + 'Originating file name' => 'Nome del file di origine', + 'Originating function name ' => 'Nome della funzione originale ', + 'Other addresses' => 'Altri indirizzi', + 'PDF template you want to translate' => 'Template PDF che vuoi traddure', + 'PDF templates' => 'Template di PDF', + 'PDF | Invoice' => 'PDF | Fattura', + 'PDF | Purchase order' => 'PDF | Ordine di acquisto', + 'Page not found' => 'Pagina non trovata', + 'Parameters' => 'Impostazioni', + 'Parse template' => 'Analizza template', + 'Password' => 'Password', + 'Password :' => 'Password :', + 'Payment information' => 'Informazioni di pagamento', + 'Payment module' => 'Modulo di pagamento', + 'Payment modules' => 'Moduli di pagamento', + 'Percent Discount' => 'Percentuale sconto', + 'Period' => 'Periodo', + 'Phone' => 'Telefono', + 'Phone & Fax' => 'Telefono & Fax', + 'Phone number' => 'Numero di telefono', + 'Please enter the date using the %fmt format' => 'Inserisci la data usando il formato %fmt', + 'Please retry' => 'Riprovare per favore', + 'Please save this coupon first to define coupon conditions' => 'Salva prima il coupon per definire le condizioni', + 'Please select a condition' => 'Seleziona una condizione', + 'Please select a coupon type' => 'Si prega di selezionare un tipo di codice promozionale', + 'Please select another condition' => 'Si prega di selezionare un\'altra condizione', + 'Please select at least one category.' => 'Seleziona almeno una categoria.', + 'Please select items to translate' => 'Si prega di selezionare gli elementi da tradurre', + 'Please select one or more categories which contains some products' => 'Seleziona una o più categorie contenenti qualche prodotto', + 'Please select the B.O. template to translate' => 'Si prega di selezionare il template di B.O. per iniziare la sua traduzione. ', + 'Please select the E-mail template to translate' => 'Si prega di selezionare il template di posta elettronica per tradurlo', + 'Please select the F.O. template to translate' => 'Si prega di selezionare il template di F.O. per tradurlo', + 'Please select the PDF template to translate' => 'Si prega di selezionare il template di PDF da tradurlo', + 'Please select the module component' => 'Seleziona il componente del modulo', + 'Please select the module to translate' => 'Si prega di selezionare il modulo per tradurlo', + 'Please select your editing mode :' => 'Seleziona il tuo metodo di modifica', + 'Please select...' => 'Seleziona', + 'Please wait, loading' => 'Attendere prego, caricamento', + 'Please wait, loading products list' => 'Caricamento della lista prodotti in corso', + 'Port' => 'Spedizione', + 'Port :' => 'Spedizione :', + 'Position' => 'Posizione', + 'Postage' => 'Spese di spedizione', + 'Postscriptum' => 'Postscriptum', + 'Preview' => 'Previsualizzare', + 'Preview HTML' => 'Anteprima HTML', + 'Preview category page' => 'Vedere in anteprima la pagina della categoria', + 'Preview folder page' => 'Vedere in anteprima la pagina della cartella', + 'Preview product page' => 'Vedi in anteprima la pagina del prodotto', + 'Preview text' => 'Anteprima testo', + 'Price' => 'Prezzo', + 'Price (%currency)
    w/ taxes' => 'Price (%currency)
    con iva', + 'Price (%currency)
    w/o taxes' => 'Price (%currency)
    senza iva', + 'Price excl. taxes' => 'Prezzo tasse escl.', + 'Price incl. taxes' => 'Prezzo tasse incl.', + 'Pricing' => 'Prezzi', + 'Product' => 'Prodotto', + 'Product Attributes' => 'Attributi del prodotto', + 'Product EAN Code' => 'Codice EAN del prodotto', + 'Product Features' => 'Caratteristiche del prodotto', + 'Product accessories' => 'Accessori del prodotto', + 'Product attribute selection' => 'Selezione dell\'attributo del prodotto', + 'Product attributes' => 'Attributi del prodotto', + 'Product catalog configuration' => 'Configurazione del catalogo prodotto', + 'Product created on %date_create. Last modification: %date_change' => 'Prodotto creato il %date_create. Ultima modifica: %date_change', + 'Product features' => 'Caratteristiche del prodotto', + 'Product price' => 'Prezzo del prodotto', + 'Product price including taxes' => 'Prezzo del prodotto tasse incluse', + 'Product tax price' => 'Prezzo del prodotto tassato', + 'Product templates' => 'Modelli per i prodotti', + 'Product title' => 'Titolo del prodotto', + 'Product weight' => 'Peso del prodotto', + 'Product\'s attributes included in this sale operation' => 'Attributi del prodotto inclusi in questa operazione di vendita', + 'Products' => 'Prodotti', + 'Products are :' => 'I prodotti sono :', + 'Products in %cat' => 'Prodotti in %cat', + 'Products selection' => 'Selezione prodotti', + 'Profil' => 'Profilo', + 'Profile' => 'Profilo', + 'Profile code' => 'Codice del profilo', + 'Profile created on %date_create. Last modification: %date_change' => 'Profilo creato il %date_create. Ultima modifica: %date_change', + 'Profiles' => 'Profili', + 'Promotion' => 'Promozione', + 'Provides free shipping' => 'Fornire spedizione gratuita', + 'Published by OpenStudio' => 'Pubblicato da OpenStudio', + 'Purpose' => 'Scopo', + 'Put module in hook' => 'Metti il modulo nell\'hook', + 'Quantity' => 'Quantità', + 'Quickly create combinations using the combination builder' => 'Creare rapidamente delle combinazioni con il generatore integrato', + 'Rate' => 'Tasso', + 'Read module documentation' => 'Leggi la documentazione del modulo', + 'Read the documentation of this module' => 'Leggere la documentazione di questo modulo', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'Ridefinisci il testo globalmente. Tutti i testi saranno tradotti con questa traduzione, eccetto se c\'è una traduzione per questa risorsa.', + 'Redefine the text only for this resource.' => 'Ridefinisci il testo solo per questa risorsa.', + 'Reference' => 'Riferimento', + 'Registration date' => 'Data di registrazione', + 'Related content' => 'Contenuto correlato', + 'Remove a module from a hook' => 'Rimuovi un modulo da un hook', + 'Remove an accessory' => 'Rimuovere un accessorio', + 'Remove associated folder' => 'Rimuovere la cartella associata', + 'Remove attribute' => 'Rimuovere l\'attributo', + 'Remove country' => 'Rimuovere il paese', + 'Remove feature' => 'Rimuovere la caratteristica', + 'Remove from all product templates' => 'Rimuovere da tutti i template di prodotto', + 'Remove from category' => 'Rimuovere dalla categoria', + 'Remove from selected categories' => 'Rimuovi dalle categorie selezionate', + 'Remove related content' => 'Rimuovere il contenuto correlato', + 'Remove selected values' => 'Rimuovere i valori selezionati', + 'Remove the product from this category' => 'Rimuovere il prodotto da questa categoria', + 'Remove this attribute from all product templates' => 'Rimuovere l\'attributo da tutti i template di prodotto', + 'Remove this feature from all product templates' => 'Rimuovere questa caratteristica da tutti i template di prodotto', + 'Remove zone' => 'Rimuovere la zona', + 'Required modules' => 'Moduli richiesti', + 'Reset' => 'Reset', + 'Reset sale status for all products' => 'Resetta lo stato di vendita di tutti i prodotti', + 'Resource' => 'Risorsa', + 'Resource access rights' => 'Diritti di accesso della risorse', + 'Resources' => 'Risorse', + 'Rights' => 'Diritti', + 'SEO' => 'SEO', + 'Sale' => 'Sconto', + 'Sale configuration' => 'Configurazione di vendita', + 'Sale created on %date_create. Last modification: %date_change' => 'Vendita creata il %date_create. Ultima modifica: %date_change', + 'Sale operation description' => 'Descrizione dell\'operazione di vendita', + 'Sale operation features' => 'Caratteristiche dell\'operazione di vendita', + 'Sale price (%currency)
    w/ taxes' => 'Prezzo scontato (%currency)
    con iva', + 'Sale price (%currency)
    w/o taxes' => 'Prezzo scontato (%currency)
    senza iva', + 'Sale price incl. taxes' => 'Prezzo scontato IVA compresa', + 'Sales management' => 'Gestione vendite', + 'Save' => 'Salvare', + 'Save and close' => 'Salvare e chiudere', + 'Save chages' => 'Salvare le modifiche', + 'Save changes' => 'Salvare le modifiche', + 'Save this address' => 'Salvare questo indirizzo', + 'Save this condition' => 'Salvare questa condizione', + 'Search' => 'Ricerca', + 'Search a module' => 'Ricerca di un modulo', + 'Search for \'%term\'' => 'Cerca per \'%term\'', + 'Search on Thelia Modules' => 'Ricerca sui Thelia Modules', + 'Secure key' => 'Chiave di sicurezza', + 'Select' => 'Seleziona', + 'Select a category and click (+) to add it to the additional category list' => 'Selezionare una categoria e cliccare sul segno (+) per aggiungerla all\'elenco della categoria', + 'Select a category to get its products' => 'Seleziona una categoria per ottenere i suoi prodotti', + 'Select a category...' => 'Selezionare una categoria...', + 'Select a configuration' => 'Selezionare una configurazione', + 'Select a content and click (+) to add it to this category' => 'Selezionare un contenuto e fare clic su (+) per aggiungerlo a questa categoria', + 'Select a content and click (+) to add it to this product' => 'Selezionare un contenuto e fare clic sul segno (+) per aggiungerlo a questo prodotto', + 'Select a feature and click (+) to add it to this template' => 'Seleziona una caratteristica e clicca (+) per aggiungerla a questo template', + 'Select a feature...' => 'Seleziona una caratteristica...', + 'Select a folder and click (+) to add it to the additional folder list' => 'Selezionare una cartella e fare clic su (+) per aggiungerla all\'elenco delle cartelle aggiuntive', + 'Select a folder content...' => 'Selezionare una cartella...', + 'Select a folder to get its content' => 'Selezionare una cartella per ottenere il suo contenuto', + 'Select a folder...' => 'Selezionare una cartella...', + 'Select a product and click (+) to add it as an accessory' => 'Selezionare un prodotto e fare clic su (+) per aggiungerlo come accessorio', + 'Select a product...' => 'Selezionare un prodotto...', + 'Select a tax tule' => 'Selezionare una regola fiscale', + 'Select a value click (+) to add it to the combination' => 'Selezionare un valore et fare clic su (+) per aggiungerlo alla combinazione', + 'Select an attribute and click (+) to add it to this template' => 'Selezionare un attributo e fare clic su (+) per aggiungerlo al template', + 'Select an attribute and click (+) to view available values' => 'Selezionare un attributo e fare clic su (+) per visualizzare i valori disponibili', + 'Select an attribute value...' => 'Selezionare un valore di attributo...', + 'Select an attribute...' => 'Selezionare un attributo...', + 'Select attribute :' => 'Seleziona attributo :', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'Selezionare i valori del attributo per combinare. Si può immettere un valore predefinito per alcuni campi delle combinazioni generate.', + 'Select here the tax applicable to this product' => 'Selezionare qui la tassa applicabile a questo prodotto', + 'Select offered product :' => 'Seleziona prodotto offerto :', + 'Select offrered product category :' => 'Seleziona la categoria del prodotto offerto :', + 'Select or deselect all products' => 'Seleziona o deseleziona tutti i prodotti', + 'Select product category :' => 'Seleziona categoria prodotto :', + 'Select the attributes values of "%title" that should be included in this sale operation.' => 'Seleziona i valori degli attributi di "%title" che dovrebbero essere inclusi in questa operazione di vendita.', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Seleziona i prodotti inclusi in questa operazione di vendita. Puoi limitare la tua selezione a determinati attributi del prodotto, se richiesto.', + 'Selected categories' => 'Categorie selezionate', + 'Send' => 'Invia', + 'Send a mail to this customer' => 'Inviare una mail a questo cliente', + 'Send files' => 'Inviare files', + 'Sequential number of log line' => 'Numero sequenziale della linea del log', + 'Set as default tax rule' => 'Impostare come regola fiscale predefinita', + 'Sets the separator for the decimal point' => 'Impostare il separatore per i valori decimali', + 'Sets the thousands separator.' => 'Impostare il separatore per le migliaia.', + 'Shipping configuration' => 'Configurazione di spedizione', + 'Shipping configuration of delivery module "%title"' => 'Configurazione della spedizione del modulo per la consegna "%title"', + 'Shipping zone' => 'Zone di spedizione', + 'Shipping zone "%title"' => 'Zona di spedizione "%title"', + 'Shipping zones' => 'Zone di spedizione', + 'Shipping zones for this country' => 'Zone di spedizione per questo paese', + 'Shipping zones for this module' => 'Zone di spedizione per questo modulo', + 'Shipping zones management' => 'Gestione zone di spedizione', + 'Short description' => 'Breve descrizione', + 'Short description :' => 'Breve descrizione :', + 'Show logs' => 'Visualizzare i log', + 'Some of your translations are not saved. Continue anyway ?' => 'Alcune delle vostre traduzioni non vengono salvati. Continuare comunque ?', + 'Something goes wrong, please try again' => 'Qualcosa è andato storto, riprova', + 'Something goes wrong, please try again.' => 'Qualcosa è andato storto, riprova.', + 'Sorry, attribute ID=%id was not found.' => 'Siamo spiacenti, l\'attributo ID = %id non è stato trovato.', + 'Sorry, country ID=%id was not found.' => 'Ci dispiace, paese ID=%id non è stato trovato.', + 'Sorry, currency ID=%id was not found.' => 'Ci dispiace, la moneta ID=%id non è stata trovata.', + 'Sorry, customer ID=%id was not found.' => 'Ci dispiace, il cliente ID=%id non è stato trovato.', + 'Sorry, document ID=%id was not found.' => 'Ci dispiace, il documento ID=%id non è stato trovato.', + 'Sorry, feature ID=%id was not found.' => 'Ci dispiace, la caratteristica ID=%id non è stata trovata.', + 'Sorry, hook ID=%id was not found.' => 'Scusa, l\' hook ID=%id non è stato trovato.', + 'Sorry, image ID=%id was not found.' => 'Ci dispiace, l\'immagine ID=%id non è stata trovata.', + 'Sorry, message ID=%id was not found.' => 'Ci dispiace, il messaggio ID=%id non è stato trovato.', + 'Sorry, module hook ID=%id was not found.' => 'Siamo spiacenti, l\'hook del modulo con ID=%id non è stato trovato.', + 'Sorry, template ID=%id was not found.' => 'Ci dispiace, il template ID=%id non è stato trovato.', + 'Sorry, variable ID=%id was not found.' => 'Ci dispiace, la variabile ID=%id non è stata trovata.', + 'Source IP' => 'IP di origine', + 'Source IP :' => 'IP di origine :', + 'Stability' => 'Stabilità', + 'Start Date' => 'Inizio Data', + 'State' => 'Stato', + 'States' => 'Stati', + 'States / Provinces' => 'Stati / Province', + 'States/provinces assigned to this country' => 'Stati/province assegnate a questo paese', + 'Status' => 'Stato', + 'Stock' => 'Magazzino', + 'Store' => 'Negozio', + 'Store address' => 'Indirizzo del negozio', + 'Store configuration' => 'Configurazione del negozio', + 'Street address' => 'Indirizzo', + 'Subtitle' => 'Sottotitolo', + 'Superadministrator' => 'Superamministratore', + 'Supported locales' => 'Lingue supportate', + 'Symbol' => 'Simbolo', + 'System Logs' => 'Log di sistema', + 'System Logs configuration' => 'Configurazione dei log di sistema', + 'System logs' => 'Log di sistema', + 'System parameters' => 'Parametri del sistema', + 'System variables' => 'Variabili del sistema', + 'Tags' => 'Tags', + 'Tax' => 'Tassa', + 'Tax created on %date_create. Last modification: %date_change' => 'Tassa creata il %date_create. Ultima modifica: %date_create', + 'Tax rule created on %date_create. Last modification: %date_change' => 'Regola fiscale creata il %date_create. Ultima modifica: %date_change', + 'Tax rules' => 'Regole fiscale', + 'Tax rules are combination of different taxes.' => 'Regole fiscale sono combinazione di diverse tasse.', + 'Taxed total' => 'Totale tassato', + 'Taxes' => 'Tasse', + 'Taxes configuration' => 'Configurazione tasse', + 'Taxes define the amount of money which is added to a bought product.' => 'Tasse definiscono la quantità di denaro che viene aggiunto a un prodotto acquistato.', + 'Taxes rules' => 'Regole fiscale', + 'Template name' => 'Nome del template', + 'Template title' => 'Titolo del template', + 'Template type' => 'Tipo di template', + 'Templates' => 'Template', + 'Test your configuration' => 'Testa la tua configurazione', + 'Text version of this message' => 'Versione del testo di questo messaggio', + 'That way, Thelia community will benefit of your translations' => 'In quel modo, la comunità di Thelia beneficerà delle tue traduzioni', + 'The default pricing is used when no combination is defined.' => 'Il prezzo predefinito viene utilizzato quando non è definita nessuna combinazione.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'Le destinazioni dei log da visualizzare, memorizzare o inviare. È possibile selezionare e configurare zero, una o più destinazioni qui sotto.', + 'The detailed description.' => 'La descrizione dettagliata.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'Il percorso local/i18n non esiste o non è scrivibile. Per favore sistema il problema.', + 'The following error message has been found: %msg' => 'Il seguente messaggio d\'errore è stato trovato: %msg', + 'The hooks have been updated successfuly !' => 'Gli hook sono stati aggiornati con successo !', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'La pagina che hai richiesto ha un problema. Contatta lo sviluppatore del modulo se ne stavi usando uno, o sentiti libero di dare un feedback al team di Thelia su github: %url.', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'La pagina che avete richiesto non è stata trovata. La pregiamo di controllare l\'indirizzo della pagina e riprovare.', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'Il tasso del Euro (prezzo in Euro * tasso = prezzo in questa moneta)', + 'The selected categories :' => 'Categorie selezionate :', + 'The selected countries :' => 'Paesi selezionati :', + 'The selected customer :' => 'Cliente selezionato :', + 'The selected products :' => 'Prodotti selezionati :', + 'The server returned a "404 Not Found"' => 'Il server ha restituito un "404 Not Found"', + 'The syntax used is identical to the PHP date() function' => 'La sintassi utilizzata è identica alla funzione PHP date()', + 'Thelia Back Office' => 'Thelia Back Office', + 'Thelia Installation' => 'Installazione Thelia', + 'Thelia Installation Wizard' => ' Thelia installazione guidata', + 'Thelia Languages' => 'Lingue di Thelia', + 'Thelia Mailing System' => 'Sistema di Mailing Thelia', + 'Thelia Mailing Templates' => 'Thelia Mailing Templates', + 'Thelia Product Attributes' => 'Attributi di prodotto Thelia', + 'Thelia Product Features' => 'Caratteristiche del prodotto Thelia', + 'Thelia Product Templates' => 'Template dei prodotti Thelia', + 'Thelia Shipping configuration' => 'Configurazione delle spedizione', + 'Thelia Shipping zones' => 'Zone di spedizione di Thelia', + 'Thelia System Variables' => 'Variabili di sistema Thelia', + 'Thelia caches flushing' => 'Svuotare le cache di thelia', + 'Thelia contributions' => 'Contributi Thelia', + 'Thelia core' => 'Thelia core', + 'Thelia mailing templates' => 'Thelia mailing templates', + 'Thelia product attributes' => 'Attributi di prodotto Thelia', + 'Thelia product features' => 'Caratteristiche dei prodotti', + 'Thelia product templates' => 'Template dei prodotti', + 'Thelia support forum' => 'Forum di supporto Thelia ', + 'Thelia system variables' => 'Variabili di sistema Thelia', + 'There are no shipping zones attached to this module.' => 'Non ci sono zone di spediizone collegate a questo modulo.', + 'There is 2 kind of translations :' => 'Ci sono 2 tipi di traduzioni :', + 'There is currently no active module here.' => 'Al momento non è attivo nessun modulo qui.', + 'There is currently no available attributes.' => 'Non ci sono attributi disponibili al momento.', + 'There is currently no available features.' => 'Non c\'è nessuna caratteristica disponibile al momento.', + 'There is no documents attached to this %type.' => 'Non c\'è nessun documento associato a questo %type.', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'Non ci sono file da associare al tuo prodotto. Solo i documenti che non sono visibili possono essere selezionati !', + 'There is no images attached to this %type.' => 'Non c\'è nessuna immagine associata a questo %type.', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Ci sono qualche amministratore che sono collegati a questo amministratore. Per favore modificarli/rimuoverli prima di rimuovere questo amministratore.', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'Ci sono qualche amministratore che sono collegati a questo profilo. Per favore modificarli/rimuoverli prima di rimuovere questo profilo.', + 'This category contains no contents' => 'Questa categoria non contiene nessun contenuto', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Questa categoria non contiene alcun prodotto. Per aggiungere un nuovo prodotto, cliccare il pulsante + qui sopra.', + 'This category has no sub-categories.' => 'Questa categoria non ha nessun sotto-categorie.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Questa categoria non ha nessun sotto-categorie. Per crearne una nuovo, cliccare sul pulsante + qui sopra.', + 'This country is not included in any shipping zone' => 'Questo paese non è incluso in nessuna zona di spedizione', + 'This customer has not defined any delivery address' => 'Questo cliente non ha definito alcun indirizzo di consegna', + 'This delivery module handles all shipping zones.' => 'Questo modulo di consegna gestisce tutte le zone di spedizione', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'Questa cartella non contiene alcun contenuto. Per aggiungere un nuovo contenuto, cliccare il pulsante + qui sopra.', + 'This folder has no sub-folders.' => 'Questa cartella non a sottocartelle.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'Questa cartella non ha sottocartelle. Per crearne una nuovo, fare clic sul pulsante + qui sopra.', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'Questo non è un problema finchè non aggiorni queste risorse(Thelia, modulo, template).
    ', + 'This is the code entered by your customers to use this coupon' => 'Questo è il codice inserito dai clienti per usare il coupon', + 'This mailing template could not be changed.' => 'Questo template di e-mail non potrebbe essere cambiato.', + 'This module cannot be started, some files are probably missing.' => 'Questo modulo non può essere attivato, probabilmente mancano dei file.', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'Questa pagina consente di tradurre tutte le risorse del tou sito: Thelia, moduli, template.
    ', + 'This product contains no accessories' => 'Questo prodotto non contiene accessori', + 'This product contains no contents' => 'Questo prodotto non contiene nessun contenuto', + 'This product doesn\'t belong to any additional category.' => 'Questo prodotto non appartiene ad alcuna categoria supplementare.', + 'This product doesn\'t belong to any additional folder.' => 'Questo prodotto non appartiene ad alcuna cartella aggiuntiva.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'Questo prodotto non ha combinazioni. Il prezzo di default è usato. Clicca qui per creare una nuova combinazione.', + 'This product template does not contains any features' => 'Questo template di prodotto non contiene alcune caratteristiche', + 'This shipping zone does not contains any country.' => 'Questa zona di spedizione non contiene nessun paese.', + 'This template contains no attributes' => 'Questo template non contiene attributi', + 'This template contains no features' => 'Questo template non contiene caratteristiche', + 'This variable could not be changed.' => 'Questa variabile non potrebbe essere cambiata.', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'Questo resetterà lo stato di vendita di tutti i prodotti, e disattiverà tutte le vendite attive. Vuoi veramente continuare ?', + 'Timeout' => 'Timeout', + 'Timeout :' => 'Timeout :', + 'Title' => 'Titolo', + 'Title * :' => 'Titolo * :', + 'To' => 'A', + 'To create a new content, select an existing folder, or create a new one.' => 'Per creare un nuovo contenuto, selezionare una cartella esistente o crearne una nuova.', + 'To create a new product, select an existing category, or create a new one.' => 'Per creare un nuovo prodotto, selezionare una categoria esistente o crearne uno nuovo.', + 'To remove a value from the combination, select it and click "remove"' => 'Per rimuovere un valore dalla combinazione, selezionarlo e fare un clic su "Rimuovere"', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'Per usare caratterisctiche o attributi su questo prodotto, seleziona un template.Puoi definire i tuoi template nella sezione di configurazione nell\'amministrazione.', + 'Tools' => 'Strumenti', + 'Top level' => 'Livello superiore', + 'Top level Contents' => 'Contenuti di livello superiore', + 'Top level Products' => 'Prodotti di livello superiore', + 'Top level categories' => 'Categorie di livello superiore', + 'Top level folders' => 'Cartelle di livello superiore', + 'Total' => 'Totale', + 'Total including discount' => 'Totale sconto compreso', + 'Total without discount' => 'Totale senza sconto', + 'Transaction reference' => 'Riferimento di transazione', + 'Translation' => 'Traduzione', + 'Translations' => 'Traduzione', + 'Type:' => 'Tipo:', + 'Unit taxed price' => 'Prezzo unitario tassato', + 'Unit. price' => 'Prezzo unitario', + 'Unlimited' => 'Illimitato', + 'Unlimited number of uses' => 'Numero di utilizzi illimitato', + 'Unspecified' => 'Non specificato', + 'Unsupported field type \'%type\' in form-field.html' => 'Tipo di campo \'%type\' non supportato in form-field.html', + 'Update' => 'Aggiornamento', + 'Update URL' => 'Aggiorna URL', + 'Update an administrator' => 'Aggiornare un amministratore', + 'Update coupon' => 'Aggiornare un codice promozionale', + 'Update password' => 'Aggiorna password', + 'Update rates' => 'Aggiornare le tariffe', + 'Update tax rule taxes' => 'Aggiornare le regole fiscale', + 'Update this image' => 'Aggiornare questa immagine', + 'Usage count' => 'Utilizzi rimasti', + 'Usages left' => 'Utilizzi rimasti', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'Usa Ctrl+click per selezionare (o deselezionare) più di un valore di attributo', + 'Use Ctrl+click to select (or deselect) more that one category' => 'Usa Ctrl+click per selezionare (o deselezionare) più di una categoria', + 'Use Ctrl+click to select (or deselect) more that one country' => 'Usa Ctrl+click per selezionare (o deselezionare) più di un paese', + 'Use Ctrl+click to select (or deselect) more that one item' => 'Usa Ctrl+click per selezionare (o deselezionare) più di un elemento', + 'Use Ctrl+click to select (or deselect) more that one product' => 'Usa Ctrl+click per selezionare (o deselezionare) più di un prodotto', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'Usa Ctrl+click per selezionare (o deselezionare) più di un metodo di spedizione', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Utilizzare Ctrl + clic per selezionare più valori. Potete anche cancellare i valori selezionati.', + 'Use HTML message defined below' => 'Utilizzare il messaggio HTML definito di seguito', + 'Use Text message defined below' => 'Utilizzare il messaggio di testo definito qui sotto', + 'Use address by default' => 'Utilizzare l\'indirizzo come indirizzo predefinito', + 'Use an other config.' => 'Utilizzare un\'altra configurazione.', + 'Use default layout' => 'Utilizzare il layout predefinito', + 'Use this address by default' => 'Utilizzare questo indirizzo come indirizzo predefinito', + 'Use this config.' => 'Utilizzare questa configurazione.', + 'User mode' => 'Modalità utente', + 'Username' => 'Nome utente', + 'Username :' => 'Nome utente :', + 'Username or e-mail address' => 'Nome utente o indirizzo e-mail', + 'Using a domain or subdomain for each language' => 'Utilizzando un dominio o un sottodominio per ogni lingua', + 'Valid on special offers' => 'Validità sulle offerte speciali', + 'Validity start date' => 'Validità data di inizio', + 'Value' => 'Valore', + 'Variable created on %date_create. Last modification: %date_change' => 'Variabile creata il %date_create. Ultima modifica: %date_change', + 'Variable name' => 'Nome della variabile', + 'Variable purpose' => 'Scopo della variabile', + 'Variable value' => 'Valore della variabile', + 'Variables to inject' => 'Variabili da iniettare', + 'Version %ver' => 'Versione %ver', + 'View' => 'Vedere', + 'View invoice PDF' => 'Vedi fattura PDF', + 'View only missing translations.' => 'Mostra solo le traduzioni mancanti.', + 'View purchase order as PDF' => 'Vedi l\'ordine di acquisto in PDF', + 'View shop' => 'Vedi il negozio', + 'View site' => 'Visualizzare il sito', + 'View this page in %langname' => 'Visualizza questa pagina in %langname', + 'View this product in a new page' => 'Vedi prodotto in una nuova pagina', + 'Virtual product' => 'Prodotto virtuale', + 'Visibility' => 'Visibilità', + 'Visible' => 'Visibile', + 'Warning' => 'Attenzione', + 'Web site' => 'Sito web', + 'Weight' => 'Peso', + 'Weight
    (Kg)' => 'Peso
    (Kg)', + 'Welcome' => 'Benvenuto', + 'Welcome to Thelia administration !' => 'Benvenuti a Thelia amministrazione !', + 'Yes' => 'Sì', + 'You can attach here some content to this category' => 'Potete allegare qui alcuni contenuti a questa categoria', + 'You can attach here some content to this product' => 'È possibile allegare qui alcuni contenuti a questo prodotto', + 'You can attach this product to more categories in the details tab.' => 'È possibile collegare questo prodotto a più categorie nella scheda dettagli.', + 'You can change attributes and their positions in the attributes configuration page.' => 'Puoi cambiare gli attributi e la loro posizione nella pagina di configurazione degli attributi.', + 'You can change feature and their positions in the features configuration page.' => 'puoi cambiare le caratteristiche e la loro posizione nella pagina di configurazione delle caratteristiche.', + 'You can change template attributes and their positions in the template configuration page.' => 'Puoi cambiare gli attributi del template e la loro posizione nella pagina di configurazione del template.', + 'You can change templates features and their positions in the template configuration page.' => 'Puoi cambiare le caratteristiche dei template e la loro posizione nella pagina di configurazione dei template.', + 'You can change the default category (%title) in the "General" tab.' => 'È possibile modificare la categoria predefinita (%title) nella scheda "Generale".', + 'You can change the default folder (%title) in the "General" tab.' => 'È possibile modificare la cartella predefinita (%title) nella scheda "Generale".', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'Puoi definire qui una specifica differenza di prezzo delle valute del negozio, come percentuale o come valore fisso, in base al tipo di differenza selezionato.', + 'You can\'t delete this administrator' => 'Non è possibile eliminare questo amministratore', + 'You can\'t delete this profile' => 'Non è possibile eliminare questo profilo', + 'You can\'t do exports, you don\'t have any serializer that handles this.' => 'Non è possibile effettuare esportazioni, non hai alcun serializer per gestirle.', + 'You don\'t have any export' => 'Non hai nessuna esportazione', + 'You don\'t have any import' => 'Non hai nessun importo', + 'You have no orders for the moment.' => 'Non hai ordini al momento.', + 'You have no registred customers for the moment.' => 'Al momento non hai clienti iscritti.', + 'You may also quickly create combinations from products attributes using the Combination Builder.' => 'Puoi anche creare velocemente delle combinazioni dagli attributi dei prodotti usando il Combination Builder.', + 'Your current IP address is %ip' => 'Il vostro indirizzo IP è %ip', + 'Your email' => 'La tua email', + 'Your module should be packaged in a zip file.' => 'Il tuo modulo deve essere compresso in un file zip.', + 'Your search is too short' => 'La tua ricerca è troppo corta', + 'Your template define new hooks' => 'Il tuo template definisce nuovi hook', + 'Your template does not support this hooks' => 'Il tuo template non support questo hooks', + 'Your template is clean. No missing hooks and no new hooks.' => 'Il tuo template è pulito. Non manca nessun hook e non ci sono nuovi hook.', + 'Zip code' => 'Codice postale', + 'Zone name' => 'Nome zona', + 'activate' => 'attivare', + 'activate %title module' => 'attivare il modulo %title', + 'activate hook' => 'attivare hook', + 'activation' => 'attivazione', + 'all states' => 'tutti gli stati', + 'all states/provinces' => 'tutti gli stati/province', + 'and' => 'e', + 'classic modules' => 'moduli classici', + 'code' => 'codice', + 'company' => 'azienda', + 'country has an other configuration' => 'il paese ha un\'altra configurazione', + 'country has no configuration' => 'il paese non ha una configurazione', + 'country has the current configuration' => 'il paese ha la configurazione corrente', + 'customer ref' => 'rif cliente', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'Data nel formato aaaa-mm-gg', + 'deactivate' => 'disattivare', + 'deactivated' => 'Disattivato', + 'deactivation' => 'disattivazione', + 'delete document' => 'elimina documento', + 'delete image' => 'elimina immagine', + 'download' => 'scarica', + 'eg: . or ,' => 'es:.o ,', + 'en_US' => 'it_IT', + 'filter country' => 'filtro paese', + 'firstname & lastname' => 'nome e cognome', + 'hour in hh:mm:ss format' => 'ora nel formato hh:mm:ss', + 'last order' => 'ultimo ordine', + 'long description' => 'descrizione lunga', + 'none' => 'nessuno', + 'ok' => 'ok', + 'on' => 'on', + 'or' => 'o', + 'order amount' => 'quantità di ordine', + 'orders for this customer' => 'ordini per questo cliente', + 'profile' => 'profilo', + 'ref.:' => 'rif.:', + 'short description' => 'breve descrizione', + 'tax rules' => 'regole fiscale', + 'taxes' => 'tasse', + 'title' => 'titolo', + 'tracking reference' => 'riferimento di rilevamento', + 'version' => 'versione', + 'warning' => 'attenzione', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'è possibile combinare le imposte in regole fiscale e scegliere se sono applicati uno dopo l\'altro o allo stesso tempo: permette di applicare tasse su un prezzo già tassato o no.', +]; diff --git a/templates/backOffice/default/I18n/nl_NL.php b/templates/backOffice/default/I18n/nl_NL.php new file mode 100644 index 00000000..710d567f --- /dev/null +++ b/templates/backOffice/default/I18n/nl_NL.php @@ -0,0 +1,66 @@ + ' (standaard)', + '%count more...' => '%count meer...', + '(edit)' => '(aanpassen)', + '0 combinations' => '0 combinaties', + 'Congratulations, all text is now translated !' => 'Gefeliciteerd, alle tekst is nu vertaald!', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Geen tekst gevonden om te vertalen. Het is waarschijnlijk normaal. Als dat niet het geval is, controleer dan het gebruik van Smarty\'s "intl" functie in templates, of de Translator:: trans() methode in PHP bestanden.', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Waarschuwing, een wisselkoers werd niet gevonden voor ten minste één valuta: %list', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Waarschuwing: sommige verzendzones zijn niet aangesloten op een leveringsmodule:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Een inhoud kan worden gekoppeld aan meer dan één map. Selecteer hier de aanvullende mappen voor deze inhoud.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Een product kan worden gekoppeld aan meer dan één categorie. Selecteer hier de extra categorieën voor dit product.', + 'Accessory title' => 'Extra titel', + 'Action' => 'actie', + 'Actions' => 'Acties', + 'Activate this log destination' => 'Activeer deze log bestemming', + 'Add' => 'Toevoegen', + 'Add a condition' => 'Een voorwaarde toevoegen', + 'Add a new category' => 'Een nieuwe categorie toevoegen', + 'Add a new combination' => 'Voeg nieuwe combinatie toe', + 'Add a new content' => 'Nieuwe inhoud toevoegen', + 'Add a new country' => 'Nieuw land toevoegen', + 'Add a new currency' => 'Nieuwe valuta toevoegen', + 'Add a new folder' => 'Nieuwe map toevoegen', + 'Add a new language' => 'Een nieuwe taal toevoegen', + 'Add a new mailing template' => 'Een nieuwe mailing template toevoegen', + 'Add a new product' => 'Een nieuw product toevoegen', + 'Add a new product attribute' => 'Voeg een nieuw product-kenmerk toe', + 'Add a new product feature' => 'Toevoegen van een nieuwe functie van het product', + 'Add a new product template' => 'Een nieuwe sjabloon voor product toevoegen', + 'Add a new shipping zone' => 'Een nieuwe zone voor de verzending toevoegen', + 'Add a new variable' => 'Een nieuwe variabele toe te voegen', + 'Add tax to this group' => 'Belasting aan deze groep toevoegen', + 'Add to all product templates' => 'Voeg toe aan alle product templates', + 'Additional address' => 'Adres toevoeging', + 'An unknow error happend' => 'Er is een onbekende fout opgetreden', + 'Back Office' => 'Backoffice', + 'Cutomer Name' => 'Cutomer Name', + 'Delete this folder' => 'Map verwijderen', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.', + 'Enter here the product stock' => 'Vul de product voorraad in', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.', + 'In order to manges your shop taxes you can manage' => 'In order to manges your shop taxes you can manage', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rule taxes appliance order', + 'Maximum usage count :' => 'Maximum usage count :', + 'Product stock' => 'Product voorraad', + 'Save chages' => 'Save chages', + 'Save changes' => 'Save chages', + 'Select a template' => 'Selecteer een sjabloon', + 'Select here a template for this product' => 'Selecteer een sjabloon voor dit product', + 'Tax rules' => 'Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of different taxes.', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes define the amount of money which is added to a bought product.', + 'There is currently no available attributes.' => 'There is currently no available attributes.', + 'There is currently no available features.' => 'There is currently no available features.', + 'There is no documents attached to this %type.' => 'There is no documents attached to this %type.', + 'There is no images attached to this %type.' => 'There is no images attached to this %type.', + 'Usage count' => 'Usage count', + 'Usages left' => 'Usage count', + 'firstname & lastname' => 'firstname & lastname', + 'tracking reference' => 'tracking reference', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.', +]; diff --git a/templates/backOffice/default/I18n/pl_PL.php b/templates/backOffice/default/I18n/pl_PL.php new file mode 100644 index 00000000..030b52cd --- /dev/null +++ b/templates/backOffice/default/I18n/pl_PL.php @@ -0,0 +1,163 @@ + ' (domyślne)', + '%count more...' => '%count więcej...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count stref dostawy jest przypisanych do tego modułu: %zones. Kliknij tutaj, aby zmienić', + '(according to a country the taxes applied could be different)' => '(w zależności od kraju, zastosowane stawki podatkowe mogą się różnić)', + '(edit)' => '(edytuj)', + 'Check the list of ISO 639-1 codes' => ' Sprawdź listę kodów ISO 639-1', + '0 combinations' => ' 0 kombinacji', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Nie można przetłumaczyć wszystkich pól. Zgodnie z twoja konfiguracją PHP, formularz nie może zawierać więcej niż %current_max_input_vars pól do wprowadzania danych i mniej niż % required_max_input_vars. Zmień wartość max_input_vars w konfiguracji PHP.', + 'Congratulations, all text is now translated !' => 'Gratulacje, cały tekst jest przetłumaczony!', + 'Developer : to change the translations of the resource' => 'Developer : zmienić tłumaczenie zasobu', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Nie znaleziono żadnej frazy do przetłumaczenia. To prawdopodobnie normalne, jeśli nie - upewnij się, że używasz funkcji "intl" w szablonach lub funkcji Translator::trans() w plikach PHP.', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Ostrzeżenie nie znaleziono kursu waluty dla co najmniej jednej waluty: %list', + 'API configuration' => 'Konfiguracja interfejsu API', + 'API list access' => 'Listy dostępów do API', + 'API users' => 'Użytkownicy API', + 'Accessory title' => 'Tytuł akcesorii', + 'Action' => 'Akcja', + 'Actions' => 'Akcje', + 'Active' => 'Aktywny', + 'Add' => 'Dodaj', + 'Add a condition' => 'Dodaj warunek', + 'Add a module to a hook' => 'Dodać moduł do haka', + 'Add a new Customer' => 'Dodawanie nowego klienta', + 'Add a new address' => 'Dodaj nowy adres', + 'Add a new brand' => 'Dodaj nową markę', + 'Add a new category' => 'Dodaj nową kategorię', + 'Add a new combination' => 'Dodać nowe kombinację', + 'Add a new content' => 'Dodawanie nowych treści', + 'Add a new country' => 'Dodaj nowy kraj', + 'Add a new currency' => 'Dodawanie nowej waluty', + 'Add a new folder' => 'Dodać nowy folder', + 'Add a new hook' => 'Dodać nowy hak', + 'Add a new language' => 'Dodać nowy język', + 'Add a new mailing template' => 'Dodać nowy szablon korespondencji', + 'Add a new module in a hook' => 'Dodać nowy moduł w haku', + 'Add a new module to this hook' => 'Dodać nowy moduł do tego haka', + 'Add a new product' => 'Dodawanie nowego produktu', + 'Add a new product attribute' => 'Dodawanie nowego atrybutu produktu', + 'Add a new product feature' => 'Dodawanie nowych funkcji produktu', + 'Add a new product template' => 'Dodawanie nowego szablonu produktu', + 'Add a new sale' => 'Dodawanie nowej wyprzedaży', + 'Add a new shipping zone' => 'Dodawanie nowej strefy wysyłki', + 'Add a new variable' => 'Dodaj nową zmienną', + 'Add document to your product.' => 'Dodaj dokument do swojego produktu.', + 'Add selected countries' => 'Dodaj wybrane kraje', + 'Add tax to this group' => 'Dodaj podatek do tej grupy', + 'Add to selected categories' => 'Dodaj do wybranych kategorii', + 'Additional Folders' => 'Dodatkowe foldery', + 'Additional address' => 'Dodatkowy adres', + 'Additional categories' => 'Dodatkowe kategorie', + 'Administration logs' => 'Logi administracyjne', + 'Administration profiles' => 'Proifle administracyjne', + 'Administrators' => 'Administratorzy', + 'Advanced configuration' => 'Zaawansowana konfiguracja', + 'Advanced configuration and tools' => 'Zaawansowana konfiguracja i narzędzia', + 'Amount' => 'Kwota', + 'An error occured' => 'Wystąpił błąd', + 'An unknow error happend' => 'Wystąpił nieznany błąd', + 'Associate documents' => 'Powiązane dokumenty', + 'Associate downloadable file' => 'Powiąż plik do pobrania', + 'Associate files to your combinations' => 'Powiąż pliki do kombinacji', + 'Associate images' => 'Powiązane obrazy', + 'Associated' => 'Powiązane', + 'Associations' => 'Powiązania', + 'Attribute' => 'Atrybut', + 'Attribute %title' => 'Atrybut %title', + 'Attribute Combinations' => 'Kombinacje atrybutu', + 'Attribute Name' => 'Nazwa atrybutu', + 'Attribute information' => 'Informacje o atrybucie', + 'Attribute title' => 'Nazwa atrybutu', + 'Attribute values' => 'Wartości atrybutu', + 'Attributes' => 'Atrybuty', + 'Attributes & Features' => 'Atrybuty & i cechy', + 'Auth Mode' => 'Tryb autoryzacji', + 'Auth Mode :' => 'Tryb autoryzacji :', + 'Author' => 'Autor', + 'Available product categories' => 'Dostępne kategorie produktów', + 'Back' => 'Powrót', + 'Back Office' => 'Panel administracyjny', + 'Back-office home' => 'Zaplecze strona główna', + 'Back-office users' => 'Użytkownicy zaplecza', + 'Brand created on %date_create. Last modification: %date_change' => 'Marka utworzona %date_create. Ostatnia modyfikacja: %date_change', + 'Brands' => 'Marki', + 'Browse files' => 'Przeglądaj plików', + 'Browse this category' => 'Przeglądaj kategorię', + 'Browse this folder' => 'Przeglądaj ten folder', + 'Can\'t reorder documents, please refresh this page.' => 'Nie można zmienić kolejności dokumentów - prosimy odświeżyć stronę.', + 'Can\'t reorder images, please refresh this page.' => 'Nie można zmienić kolejności zdjęć - prosimy odświeżyć stronę.', + 'Cancel' => 'Anuluj', + 'Cancel changes and revert to original value' => 'Anuluj zmiany i przywróć pierwotną wartość', + 'Cancel this order' => 'Anuluj to zamówienie', + 'Cart - Prices in %currency' => 'Koszyk - ceny w %currency', + 'Catalog' => 'Katalog', + 'Categories' => 'Kategorie', + 'Categories in %cat' => 'Kategorie w %cat', + 'Category' => 'Kategoria', + 'Category created on %date_create. Last modification: %date_change' => 'Kategoria stworzona %date_create. Ostatnia modyfikacja: %date_change', + 'Category title' => 'Tytuł kategorii', + 'Cellphone' => 'Telefon komórkowy', + 'Cellular phone' => 'Telefon komórkowy', + 'Cellular phone number' => 'Telefon komórkowy', + 'Change sale configuration' => 'Zmień konfigurację wyprzedaży', + 'Change this administrator' => 'Edytuj administratora', + 'Change this api access' => 'Zmień dostęp do API', + 'Change this attribute' => 'Edytuj ten atrybut', + 'Change this brand' => 'Edytuj markę', + 'Change this condition' => 'Edytuj warunek', + 'Change this country' => 'Zmieniać ten kraj', + 'Change this coupon' => 'Zmień ten kupon', + 'Change this currency' => 'Edytuj walutę', + 'Change this feature' => 'Edytuj cechę', + 'Change this hook' => 'Edytuj kotwicę (hook)', + 'Change this language' => 'Edytuj język', + 'Choose a configuration' => 'Wybierz konfigurację', + 'Click to view' => 'Kliknij, aby zobaczyć', + 'Click to view details.' => 'Kliknij, aby zobaczyć szczegóły.', + 'Clone' => 'Sklonuj', + 'Clone product' => 'Sklonuj produkt', + 'Close' => 'Zamknij', + 'Close administation session' => 'Zakończ sesję administracyjną', + 'Code' => 'Kod', + 'Code:' => 'Kod:', + 'Combinable with other promotions' => 'Łączy się z innymi promocjami', + 'Combination EAN Code' => 'Kod EAN kombinacji', + 'Combination builder' => 'Generator kombinacji', + 'Combination reference' => 'Nr ref. kombinacji', + 'Company' => 'Firma', + 'Condition category :' => 'Kategoria warunku :', + 'Condition description' => 'Opis warunku', + 'Configuration' => 'Konfiguracja', + 'Content' => 'Zawartość', + 'Customers' => 'Klienci', + 'Customers list' => 'Lista klientów', + 'Decimal places' => 'Miejsca dziesiętne', + 'Delete this folder' => 'Usuń ten folder', + 'Delivery' => 'Dostawa', + 'Delivery address' => 'Adres dostawy', + 'Description' => 'Opis', + 'Disabled' => 'Nieaktywny', + 'Edit customer %firstname %lastname' => 'Edycja klienta %lastname %firstname', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Edycja klienta %lastname %firstname (Ref: % ref)', + 'Enter here the product stock' => 'Wprowadź ilość produktu na magazynie', + 'Errors' => 'Błędy', + 'First Name' => 'Imię', + 'Folder' => 'Katalog', + 'Front Office' => 'Front Office', + 'Invoice' => 'Faktura', + 'Last Name' => 'Nazwisko', + 'Last name' => 'Nazwisko', + 'Lastname' => 'Nazwisko', + 'Login' => 'Zaloguj się', + 'Name' => 'Nazwa', + 'None' => 'Żaden', + 'Password' => 'Hasło', + 'Product stock' => 'Stan produktu', + 'Search' => 'Szukaj', + 'Select a template' => 'Wybierz szablon', + 'Select here a template for this product' => 'Wybierz szablon dla tego produktu', + 'firstname & lastname' => 'imię i nazwisko', +]; diff --git a/templates/backOffice/default/I18n/pt_BR.php b/templates/backOffice/default/I18n/pt_BR.php new file mode 100644 index 00000000..bfee44e8 --- /dev/null +++ b/templates/backOffice/default/I18n/pt_BR.php @@ -0,0 +1,352 @@ + ' (padrão)', + '%count more...' => '%count mais...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count zona(s) de entrega vinculada(s) neste módulo: %zones. Clique aqui para alterar', + '(edit)' => '(editar)', + 'Check the list of ISO 639-1 codes' => ' Confira a lista de códigos do ISO-8859-1', + '0 combinations' => 'combinações de 0', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Não posso traduzir todos os campos. De acordo com sua configuração de PHP, formulários não contém mais do que %current_max_input_vars campos de entrada, mas ao menos required_max_input_vars % são necessários. Por favor, altere o valor de max_input_vars na sua configuração do PHP de mudança o arquivo de tradução à mão.', + 'Congratulations, all text is now translated !' => 'Parabéns, todo o texto é traduzido agora!', + 'Developer : to change the translations of the resource' => 'Desenvolvedor: mudar as traduções do recurso', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Não encontrado qualquer texto para traduzir. É provavelmente normal. Se não, por favor, certifique-se de usar a função "intl" do Smarty templates, ou o método trans():: Tradutor em arquivos PHP.', + 'User : to redefine the translations for your website' => 'Usuário: redefinir as traduções para o seu site', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Atenção, uma taxa de câmbio não foi encontrada para pelo menos uma moeda: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Aviso, alguns países não estão incluídos em nenhuma zona de entrega:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Atenção, algumas das suas zonas não estão ligados a qualquer módulo de entrega:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Um conteúdo pode ser anexado a mais de uma pasta. Selecione aqui as pastas adicionais para este conteúdo.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Um produto pode ser ligado a mais de uma categoria. Selecione aqui as categorias adicionais para este produto.', + 'API configuration' => 'API de configuração', + 'API list access' => 'API de lista de acesso', + 'API users' => 'API de usuários', + 'Accessory title' => 'Título do acessório', + 'Action' => 'Ação', + 'Actions' => 'Ações', + 'Activate this log destination' => 'Ativar este destino do log', + 'Active' => 'Ativo', + 'Add' => 'Adicionar', + 'Add a condition' => 'Adicionar uma condição', + 'Add a module to a hook' => 'Adicionar um módulo em um gancho', + 'Add a new Customer' => 'Adicionar um novo cliente', + 'Add a new address' => 'Adicionar um novo endereço', + 'Add a new brand' => 'Adicionar uma nova marca', + 'Add a new category' => 'Adicionar uma nova categoria', + 'Add a new combination' => 'Adicionar uma nova combinação', + 'Add a new content' => 'Adicionar um novo conteúdo', + 'Add a new country' => 'Adicionar um novo país', + 'Add a new currency' => 'Adicionar uma nova moeda', + 'Add a new folder' => 'Adicionar uma nova pasta', + 'Add a new hook' => 'Adicionar um novo gancho', + 'Add a new language' => 'Adicionar um novo idioma', + 'Add a new mailing template' => 'Adicionar um novo modelo de endereçamento', + 'Add a new module in a hook' => 'Adicionar um novo módulo em um gancho', + 'Add a new module to this hook' => 'Adicionar um novo módulo neste gancho', + 'Add a new product' => 'Adicionar um novo produto', + 'Add a new product attribute' => 'Adicionar novo atributo ao produto', + 'Add a new product feature' => 'Adicionar um novo recurso de produto', + 'Add a new product template' => 'Adicionar um novo modelo de produto', + 'Add a new sale' => 'Adicionar uma nova venda', + 'Add a new shipping zone' => 'Adicionar uma nova zona de transporte', + 'Add a new variable' => 'Adicionar uma nova variável', + 'Add document to your product.' => 'Adicionar documento para seu produto.', + 'Add selected countries' => 'Adicionar países selecionados', + 'Add tax to this group' => 'Adicionar imposto para este grupo', + 'Add this attribute to all product templates' => 'Adicionar esse atributo para todos os modelos de produto', + 'Add this feature to all product templates' => 'Adicionar esse recurso para todos os modelos de produto', + 'Add to all product templates' => 'Adicionar para todos os modelos de produto', + 'Add to selected categories' => 'Adicionar para categorias selecionadas', + 'Additional Folders' => 'Pastas adicionais', + 'Additional address' => 'Endereço adicional', + 'Additional categories' => 'Categorias adicionais', + 'Address' => 'Endereço', + 'Administration logs' => 'Logs de administração', + 'Administration profiles' => 'Perfis de administração', + 'Administrators' => 'Administradores', + 'Advanced configuration' => 'Configuração avançada', + 'Advanced configuration and tools' => 'Configuração avançada e ferramentas', + 'All' => 'Todos', + 'All orders' => 'Todos os pedidos', + 'Amount' => 'Quantidade', + 'Amount, e.g. 12.50' => 'Quantidade, ex. 12,50', + 'An error occured' => 'Ocorreu um erro', + 'An unexpected error occured' => 'Aconteceu um erro inesperado', + 'An unknow error happend' => 'Aconteceu um erro desconhecido', + 'An unknown error occured, please try again.' => 'Aconteceu um erro inesperado, por favor tente novamente.', + 'And' => 'E', + 'Api' => 'API', + 'Api key' => 'Chave da API', + 'Applies to attribute values :' => 'Aplica-se aos valores do atributo:', + 'Applies to products :' => 'Aplica-se aos produtos:', + 'Applies to products in categories :' => 'Aplica-se aos produtos na categoria:', + 'Apply' => 'Aplicar', + 'Assigned modules' => 'Módulos atribuídos', + 'Associate documents' => 'Associar documentos', + 'Associate downloadable file' => 'Arquivos de download associados', + 'Associate files to your combinations' => 'Associar arquivos para suas combinações', + 'Associate images' => 'Associar imagens', + 'Associated' => 'Associado', + 'Associations' => 'Associações', + 'Attribute' => 'Atributo', + 'Attribute %title' => 'Atributo %title', + 'Attribute Combinations' => 'Combinações de atributos', + 'Attribute Name' => 'Nome do atributo', + 'Attribute information' => 'Informação do atributo', + 'Attribute title' => 'Título o atributo', + 'Attribute values' => 'Valores do atributo', + 'Attributes' => 'Atributos', + 'Attributes & Features' => 'Atributos & Características', + 'Auth Mode' => 'Modo de autenticação', + 'Auth Mode :' => 'Modo de autenticação:', + 'Author' => 'Autor', + 'Available product categories' => 'Categorias de produtos disponíveis', + 'Back' => 'Voltar', + 'Back Office' => 'Área Administrativa', + 'Back-office home' => 'Página de administração', + 'Back-office template you want to translate' => 'Modelo da administração que você deseja traduzir', + 'Back-office templates' => 'Modelos da administração', + 'Back-office users' => 'Usuários da administração', + 'Best taxed price' => 'Melhor preço taxado', + 'Block' => 'Bloco', + 'Block :' => 'Bloco:', + 'Brand created on %date_create. Last modification: %date_change' => 'Marca criada em %date_create. Última modificação: %date_change', + 'Brands' => 'Marcas', + 'Browse files' => 'Procurar nos arquivos', + 'Browse this category' => 'Procurar nesta categoria', + 'Browse this folder' => 'Navegar nesta pasta', + 'By module' => 'Por módulo', + 'By module:' => 'Por módulo:', + 'By status' => 'Por estado', + 'By type' => 'Por tipo', + 'Can\'t load documents, please refresh this page.' => 'Não é possível carregar documentos, por favor atualize esta página.', + 'Can\'t load images, please refresh this page.' => 'Não é possível carregar imagens, por favor atualize este página.', + 'Can\'t reorder documents, please refresh this page.' => 'Não é possível reordenar os documentos, por favor atualize esta página.', + 'Can\'t reorder images, please refresh this page.' => 'Não é possível reordenar as imagens, por favor atualize esta página.', + 'Cancel' => 'Cancelar', + 'Cancel changes and revert to original value' => 'Cancelar as alterações e reverter para o valor original', + 'Cancel this order' => 'Cancelar este pedido', + 'Cart - Prices in %currency' => 'Carrinho - Preços em %currency', + 'Catalog' => 'Catálogo', + 'Categories' => 'Categorias', + 'Categories in %cat' => 'Categorias em %cat', + 'Category' => 'Categoria', + 'Category created on %date_create. Last modification: %date_change' => 'Categoria criada em %date_create. Última modificação: %date_change', + 'Category title' => 'Título da categoria', + 'Cellphone' => 'Telefone celular', + 'Cellular phone' => 'Telefone celular', + 'Cellular phone number' => 'Número do telefone celular', + 'Change sale configuration' => 'Alterar configuração de venda', + 'Change this administrator' => 'Alterar este administrador', + 'Change this api access' => 'Alterar este acesso de API', + 'Change this attribute' => 'Alterar este atributo', + 'Change this brand' => 'Alterar esta marca', + 'Change this condition' => 'Alterar esta condição', + 'Change this country' => 'Mudar esse país', + 'Change this coupon' => 'Alterar este cupom', + 'Change this currency' => 'Alterar esta moeda', + 'Change this feature' => 'Alterar esse recurso', + 'Change this hook' => 'Alterar este gancho', + 'Change this language' => 'Alterar este idioma', + 'Change this mailing template' => 'Alterar este modelo de correspondência', + 'Change this product attribute' => 'Alterar o atributo deste produto', + 'Change this product feature' => 'Alterar a característica deste produto', + 'Change this product template' => 'Alterar este modelo de produto', + 'Change this profile' => 'Alterar este perfil', + 'Change this sale' => 'Alterar esta venda', + 'Change this shipping zone' => 'Alterar esta zona de transporte', + 'Change this tax' => 'Alterar este imposto', + 'Change this tax rule' => 'Mudar as regras fiscais', + 'Change this template' => 'Alterar este modelo', + 'Change this variable' => 'Alterar essa variável', + 'Chapo' => 'Chapo', + 'Check sale activation' => 'Verificar a ativação de venda', + 'Check the support of hooks.' => 'Verificar o suporte a ganchos.', + 'Check this box if you want to add this attributes to all product templates' => 'Verifique esta caixa se você quiser pode adicionar este item a todos os modelos de produto', + 'Check this box if you want to add this features to all product templates' => 'Marque esta caixa se você quiser adicionar este recursos para todos os modelos de produto', + 'Choose a country' => 'Escolha um país', + 'City' => 'Cidade', + 'Classic modules' => 'Módulos clássicos', + 'Click to view' => 'Clique para ver', + 'Click to view details.' => 'Clique para ver mais detalhes.', + 'Clone' => 'Clonar', + 'Clone product' => 'Clonar Produto', + 'Close' => 'Fechar', + 'Close administation session' => 'Sessão de administração perto', + 'Code' => 'Código', + 'Code:' => 'Código:', + 'Combinable with other promotions' => 'Combinável com outras promoções', + 'Combination EAN Code' => 'Código EAN de combinação', + 'Combination builder' => 'Construtor de combinação', + 'Combination reference' => 'Referência de combinação', + 'Company' => 'Empresa', + 'Condition category :' => 'Categoria de condição:', + 'Condition description' => 'Descrição da condição', + 'Configuration' => 'Configuração', + 'Configuration mailing system' => 'Configuração sistema de correio', + 'Configure' => 'Configurar', + 'Configure this module' => 'Configurar este módulo', + 'Confirm' => 'Confirmar', + 'Confirm changes' => 'Confirme as alterações', + 'Confirmation' => 'Confirmação', + 'Content' => 'Conteúdo', + 'Content title' => 'Título conteúdo', + 'Contents in %fold' => 'Conteúdo em %fold', + 'Copy all missing translations.' => 'Copiar todas as traduções ausentes.', + 'Copy all translations.' => 'Copiar todas as traduções.', + 'Copy source text in input field' => 'Copiar texto de origem no campo de entrada', + 'Countries' => 'Países', + 'Countries assigned to this zone' => 'Países atribuídos a esta zona', + 'Country' => 'País', + 'Coupon' => 'Cupom', + 'Coupon code' => 'Código de cupom', + 'Coupon code * :' => 'Código do cupom *:', + 'Coupon conditions' => 'Condições de cupom', + 'Coupon type * :' => 'Tipo de cupom *:', + 'Coupons' => 'Cupões', + 'Create' => 'Criar', + 'Create a customer address' => 'Criar um endereço de cliente', + 'Create a new API access' => 'Criar uma nova API de acesso', + 'Create a new administrator' => 'Criar um novo administrador', + 'Create a new attribute' => 'Criar um novo atributo', + 'Create a new attribute value' => 'Crie um novo valor de atributo', + 'Create a new brand' => 'Criar uma nova marca', + 'Create a new category' => 'Criar uma nova categoria', + 'Create a new combination' => 'Criar uma nova combinação', + 'Create a new content' => 'Criar um novo conteúdo', + 'Create a new country' => 'Criar um novo país', + 'Create a new coupon' => 'Criar um novo cupom', + 'Create a new currency' => 'Criar nova moeda', + 'Create a new customer' => 'Criar um novo cliente', + 'Create a new feature' => 'Criar um novo recurso', + 'Create a new feature value' => 'Crie um novo valor de recurso', + 'Create a new folder' => 'Criar uma nova pasta', + 'Create coupon' => 'Criar cupom', + 'Create this content' => 'Criar este conteúdo', + 'Create this currency' => 'Criar esta moeda', + 'Create this customer' => 'Criar este cliente', + 'Create this folder' => 'Criar esta pasta', + 'Create this hook' => 'Criar este gancho', + 'Create this hooks' => 'Criar estes ganchos', + 'Create this language' => 'Criar essa linguagem', + 'Create this mailing template' => 'Criar este modelo de email', + 'Create this product' => 'Criar este produto', + 'Create this product template' => 'Criar este modelo de produto', + 'Create this sale' => 'Criar esta venda', + 'Create this shipping zone' => 'Criar essa zona de entrega', + 'Create this value' => 'Criar este valor', + 'Create this variable' => 'Criar esta variável', + 'Currencies' => 'Moedas', + 'Currency name' => 'Nome da moeda', + 'Currency rate' => 'Taxa de câmbio', + 'Currency symbol' => 'Símbolo da moeda', + 'Current product template' => 'Modelo atual do produto', + 'Current quantity' => 'Quantidade atual', + 'Customer' => 'Cliente', + 'Customer information' => 'Informação do cliente', + 'Customer informations' => 'Informação do cliente', + 'Customer is' => 'Cliente é', + 'Customers' => 'Clientes', + 'Customers list' => 'Lista de clientes', + 'Cutomer Name' => 'Cutomer Name', + 'Date & Hour' => 'Data & Hora', + 'Date of last order' => 'Date do último pedido', + 'Days before expiration' => 'Dias antes da expiração', + 'Deactivate %title module' => 'Desativar o módulo %title', + 'Deactivate hook' => 'Desativar o gancho', + 'Deactivate this hooks' => 'Desativar estes ganchos', + 'Decimal places' => 'Casas decimais', + 'Default' => 'Padrão', + 'Default address' => 'Endereço padrão', + 'Define here this product\'s accessories' => 'Definir aqui os acessórios deste produto', + 'Delete' => 'Apagar', + 'Delete a combination' => 'Apagar uma combinação', + 'Delete a module' => 'Apagar um módulo', + 'Delete a variable' => 'Apagar uma variável', + 'Delete address' => 'Apagar um endereço', + 'Delete administrator' => 'Apagar o administrador', + 'Delete also module data' => 'Apagar também os dados do módulo', + 'Delete an order' => 'Apagar um pedido', + 'Delete api access' => 'Apagar o acesso da API', + 'Delete attribute' => 'Apagar o atributo', + 'Delete attribute value' => 'Apagar o valor do atributo', + 'Delete brand' => 'Apagar uma marca', + 'Delete category' => 'Apagar uma categoria', + 'Delete content' => 'Apagar o conteúdo', + 'Delete country' => 'Apagar o país', + 'Delete coupon' => 'Apagar o cupom', + 'Delete currency' => 'Apagar a moeda', + 'Delete customer' => 'Apagar o cliente', + 'Delete folder' => 'Excluir pasta', + 'Delete product' => 'Excluir produto', + 'Delete profile' => 'Excluir perfil', + 'Delete sale' => 'Excluir venda', + 'Delete selected countries' => 'Excluir países selecionados', + 'Delete tax rule' => 'Excluir a regra fiscal', + 'Delete template' => 'Excluir o modelo', + 'Delete this folder' => 'Excluir esta pasta', + 'Delivery' => 'Entrega', + 'Delivery address' => 'Endereço de entrega', + 'Description' => 'Descrição', + 'Disabled' => 'Desativado', + 'Do you really want to delete this address ?' => 'Voce realmente deseja deletar esse endereço?', + 'Do you really want to delete this attribute value ?' => 'Você quer mesmo excluir este valor de atributo?', + 'E-mail templates' => 'Modelos de email', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.', + 'Edit' => 'Editar', + 'Edit previous category' => 'Editar Categoria anterior', + 'Edit this address' => 'Editar este endereço', + 'End Date' => 'Data de Término', + 'Enter here the product stock' => 'Digite aqui o estoque de produto', + 'Errors' => 'Erros', + 'Feature information' => 'Informações sobre recursos', + 'Features' => 'Funcionalidades', + 'File' => 'Arquivo', + 'File names' => 'Nomes de arquivo', + 'Filename' => 'Nome do arquivo', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'From' => 'De ', + 'Front Office' => 'Loja', + 'General' => 'Configurações gerais', + 'Home' => 'Página inicial', + 'Hooks' => 'Ganchos', + 'Host' => 'Servidor', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.', + 'In order to manges your shop taxes you can manage' => 'In order to manges your shop taxes you can manage', + 'Invoice' => 'Fatura', + 'Last Name' => 'Sobrenome', + 'Login' => 'Iniciar sessão', + 'Manage modules' => 'Gerenciar módulos', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rule taxes appliance order', + 'Maximum usage count :' => 'Maximum usage count :', + 'Name' => 'Nome', + 'Order details' => 'Detalhes do pedido', + 'Password' => 'Senha', + 'Position' => 'Posição', + 'Price' => 'Preço', + 'Product stock' => 'Estoque de produto', + 'Quantity' => 'Quantidade', + 'Save chages' => 'Save chages', + 'Save changes' => 'Save chages', + 'Search' => 'Procurar', + 'Select a template' => 'Selecione um modelo', + 'Select here a template for this product' => 'Selecione aqui um modelo para este produto', + 'Send' => 'Enviar', + 'Status' => 'Estado', + 'Tax rules' => 'Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of different taxes.', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes define the amount of money which is added to a bought product.', + 'There is currently no available attributes.' => 'There is currently no available attributes.', + 'There is currently no available features.' => 'There is currently no available features.', + 'There is no documents attached to this %type.' => 'There is no documents attached to this %type.', + 'There is no images attached to this %type.' => 'There is no images attached to this %type.', + 'Total' => 'Total', + 'Update' => 'Atualizar', + 'Usage count' => 'Usage count', + 'Usages left' => 'Usage count', + 'View' => 'Ver', + 'Warning' => 'Aviso', + 'firstname & lastname' => 'firstname & lastname', + 'tracking reference' => 'tracking reference', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.', +]; diff --git a/templates/backOffice/default/I18n/pt_PT.php b/templates/backOffice/default/I18n/pt_PT.php new file mode 100644 index 00000000..2958ad4b --- /dev/null +++ b/templates/backOffice/default/I18n/pt_PT.php @@ -0,0 +1,51 @@ + 'A content could be attached to more than one folder. Select here the additional folders for this content.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'A product could be attached to more than one category. Select here the additional categories for this product.', + 'Add' => 'Adicionar', + 'Add a new Customer' => 'Adicionar novo cliente', + 'Add a new address' => 'Adicionar nova morada', + 'Add a new category' => 'Adicionar nova categoria', + 'Add a new combination' => 'Adicionar nova combinação', + 'Add a new content' => 'Adicionar novo conteúdo', + 'Add a new country' => 'Adicionar novo País', + 'Add a new currency' => 'Adicionar nova moeda', + 'Add a new folder' => 'Adicionar nova pasta', + 'Add a new language' => 'Adicionar novo idioma', + 'Add a new product' => 'Adicionar novo produto', + 'Add a new product attribute' => 'Adicionar novo atributo ao produto', + 'Address' => 'Endereço', + 'Amount' => 'Quantidade', + 'An error occured' => 'An error occured', + 'Back' => 'Voltar', + 'Cancel' => 'Cancelar', + 'Categories' => 'Categorias', + 'Coupon code' => 'Código de cupão', + 'Create' => 'Criar', + 'Cutomer Name' => 'Cutomer Name', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'Home' => 'Página Inicial', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.', + 'In order to manges your shop taxes you can manage' => 'In order to manges your shop taxes you can manage', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rule taxes appliance order', + 'Maximum usage count :' => 'Maximum usage count :', + 'Name' => 'Nome', + 'Order details' => 'Detalhes da encomenda', + 'Save chages' => 'Save chages', + 'Save changes' => 'Save chages', + 'Tax rules' => 'Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of different taxes.', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes define the amount of money which is added to a bought product.', + 'There is currently no available attributes.' => 'There is currently no available attributes.', + 'There is currently no available features.' => 'There is currently no available features.', + 'There is no documents attached to this %type.' => 'There is no documents attached to this %type.', + 'There is no images attached to this %type.' => 'There is no images attached to this %type.', + 'Usage count' => 'Usage count', + 'Usages left' => 'Usage count', + 'firstname & lastname' => 'firstname & lastname', + 'tracking reference' => 'tracking reference', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.', +]; diff --git a/templates/backOffice/default/I18n/ru_RU.php b/templates/backOffice/default/I18n/ru_RU.php new file mode 100644 index 00000000..08408d58 --- /dev/null +++ b/templates/backOffice/default/I18n/ru_RU.php @@ -0,0 +1,231 @@ + ' (по умолчанию)', + '%count more...' => '%count еще...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count зоны доставки прикреплены к этому модулю: %zones. Нажмите здесь, чтобы изменить', + '(edit)' => '(изменить)', + 'Check the list of ISO 639-1 codes' => ' Проверьте список кодов ISO 639-1', + '0 combinations' => ' 0 комбинаций', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Не может перевести все поля. Согласно вашей конфигурации PHP, формы не содержит больше, чем %current_max_input_vars поля ввода, но по крайней мере требуется % required_max_input_vars . Пожалуйста измените значение max_input_vars в конфигурации PHP изменить файл перевода вручную.', + 'Congratulations, all text is now translated !' => 'Поздравляю, сейчас весь текст переведен!', + 'Developer : to change the translations of the resource' => 'Developer: чтобы изменить переводы ресурса', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Не найден текст для перевода. Вероятно, это нормально. Если нет, пожалуйста, не забудьте использовать в Smarty «intl» функции в шаблонах, или метод переводчика:: trans() в PHP файлов.', + 'User : to redefine the translations for your website' => 'Пользователь: пересмотреть переводы для вашего веб-сайта', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Предупреждение, обменный курс не был найден для по крайней мере одной валюты: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Предупреждение, некоторые из ваших стран не включены ни в одну зону доставки:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Предупреждение, некоторые из ваших зон доставок не прикреплены ни к одному модулю доставки:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Вы можете присоединить более одной папки к содержимому. Выберите дополнительные папки для данного содержимого.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Более чем одной категории можно прикрепить к продукту. Выберите дополнительные категории для этого продукта. Выберите дополнительные категории для этого продукта.', + 'API configuration' => 'конфигурация API', + 'API list access' => 'Список доступов к API ', + 'API users' => 'Пользователи API', + 'Accessory title' => 'Название аксессуара', + 'Action' => 'Действия', + 'Actions' => 'Действия', + 'Activate this log destination' => 'Активировать путь этого лога', + 'Active' => 'Активен', + 'Add' => 'Добавить', + 'Add a condition' => 'Добавить условие', + 'Add a module to a hook' => 'Добавление модуля в Hook', + 'Add a new Customer' => 'Добавить покупателя', + 'Add a new address' => 'Добавить новый адрес', + 'Add a new brand' => 'Добавить новый бренд', + 'Add a new category' => 'Добавить новую категорию', + 'Add a new combination' => 'Добавить новую комбинацию', + 'Add a new content' => 'Добавить новый материал', + 'Add a new country' => 'Добавить новую страну', + 'Add a new currency' => 'Добавить новую валюту', + 'Add a new folder' => 'Добавление новой папки', + 'Add a new hook' => 'Добавить новый hook', + 'Add a new language' => 'Добавить новый язык', + 'Add a new mailing template' => 'Добавить новый шаблон рассылки', + 'Add a new module in a hook' => 'Добавить новый модуль в hook', + 'Add a new module to this hook' => 'Добавить новый модуль в этот Hook', + 'Add a new product' => 'Добавить новый продукт', + 'Add a new product attribute' => 'Добавить новый атрибут продукта', + 'Add a new product feature' => 'Добавить новое свойство продукта', + 'Add a new product template' => 'Добавить новый шаблон продукта', + 'Add a new sale' => 'Добавить новую скидку', + 'Add a new shipping zone' => 'Добавить новую зону доставки', + 'Add a new variable' => 'Добавить новую переменную', + 'Add document to your product.' => 'Добавьте документ для вашего продукта.', + 'Add selected countries' => 'Добавить выбранные страны', + 'Add tax to this group' => 'Добавить налоги для этой группы', + 'Add this attribute to all product templates' => 'Добавить этот атрибут для всех шаблонов продукта', + 'Add this feature to all product templates' => 'Добавить это свойство для всех шаблонов продукта', + 'Add to all product templates' => 'Добавить ко всем шаблонам продуктов', + 'Add to selected categories' => 'Добавить к выбраннымкатегориям', + 'Additional Folders' => 'Дополнительные папки', + 'Additional address' => 'Дополнительный адрес', + 'Additional categories' => 'Дополнительные категории', + 'Address' => 'Адрес', + 'Administration logs' => 'Административные логи', + 'Administration profiles' => 'Управление профилями', + 'Administrators' => 'Администраторы', + 'Advanced configuration' => 'Расширенная конфигурация', + 'Advanced configuration and tools' => 'Расширенная конфигурация и инструменты', + 'All' => 'Bсе', + 'All orders' => 'Все заказы', + 'Amount' => 'Количество', + 'Amount, e.g. 12.50' => 'Сумма, например 12.50', + 'An error occured' => 'Произошла ошибка', + 'An unexpected error occured' => 'Произошла непредвиденная ошибка', + 'An unknow error happend' => 'Произошла неизвестная ошибка', + 'An unknown error occured, please try again.' => 'Произошла неизвестная ошибка, попробуйте еще раз.', + 'Api' => 'API', + 'Api key' => 'Ключ API', + 'Applies to attribute values :' => 'Применяется для значений атрибутов:', + 'Applies to products :' => 'Относится к продуктам:', + 'Applies to products in categories :' => 'Относится к продуктам в категориях:', + 'Apply' => 'Применить', + 'Assigned modules' => 'Назначенные модули', + 'Associate documents' => 'Связать документы', + 'Associate downloadable file' => 'Присоединить загружаемый файл', + 'Associate files to your combinations' => 'Присоединить файлы к вашей комбинации', + 'Associate images' => 'Связать изображения', + 'Associated' => 'Связанный', + 'Associations' => 'Взаимосвязи', + 'Attribute' => 'Атрибут', + 'Attribute %title' => 'Атрибут %title', + 'Attribute Combinations' => 'Атрибут Комбинаций', + 'Attribute Name' => 'Атрибут Имя', + 'Attribute information' => 'Сведения об атрибуте', + 'Attribute title' => 'Название атрибута', + 'Attribute values' => 'Значения атрибутов', + 'Attributes' => 'Атрибуты', + 'Attributes & Features' => 'Атрибуты и свойства', + 'Author' => 'Автор', + 'Available product categories' => 'Доступные категории продукта', + 'Back' => 'Назад', + 'Back Office' => 'Панель Управления', + 'Back-office home' => 'Главная страница админки', + 'Back-office template you want to translate' => 'Шаблон админки, который вы хотите перевести', + 'Back-office templates' => 'Шаблонки админки', + 'Back-office users' => 'Пользователи админки', + 'Best taxed price' => 'Лучшая налогооблагаемая цена', + 'Block' => 'Блок', + 'Block :' => 'Блок :', + 'Brand created on %date_create. Last modification: %date_change' => 'Бренд создан %date_create. Последнее обновление: %date_change', + 'Brands' => 'Бренды', + 'Browse files' => 'Просмотр файлов', + 'Browse this category' => 'Просмотр категории', + 'Browse this folder' => 'Просмотр папки', + 'By module' => 'По модулю', + 'By module:' => 'По модулю:', + 'By status' => 'По статусу', + 'By type' => 'По типу', + 'Can\'t load documents, please refresh this page.' => 'Не удается загрузить документы, пожалуйста обновите эту страницу.', + 'Can\'t load images, please refresh this page.' => 'Не удается загрузить изображения, пожалуйста обновите эту страницу.', + 'Can\'t reorder documents, please refresh this page.' => 'Нельзя изменить порядок документов, пожалуйста обновите эту страницу.', + 'Can\'t reorder images, please refresh this page.' => 'Нельзя изменить порядок изображений, пожалуйста обновите эту страницу.', + 'Cancel' => 'Отмена', + 'Cancel changes and revert to original value' => 'Отменить изменения и вернуться к исходному значению', + 'Cancel this order' => 'Отменить этот заказ', + 'Cart - Prices in %currency' => 'Корзина - цена %currency', + 'Catalog' => 'Каталог', + 'Categories' => 'Категории', + 'Categories in %cat' => 'Категории в %cat', + 'Category' => 'Категория', + 'Category created on %date_create. Last modification: %date_change' => 'Категория создана %date_create. Последнее обновление: %date_change', + 'Category title' => 'Название категории', + 'Cellphone' => 'Мобильный телефон', + 'Cellular phone' => 'Сотовый телефон', + 'Cellular phone number' => 'Номер сотового телефона', + 'Change sale configuration' => 'Изменить конфигурацию продажи', + 'Change this administrator' => 'Изменить администратора', + 'Change this api access' => 'Изменить доступ к API ', + 'Change this attribute' => 'Изменить этот атрибут', + 'Change this brand' => 'Измените этот бренд', + 'Change this condition' => 'Изменить это условие', + 'Change this country' => 'Изменить эту страну', + 'Change this coupon' => 'Изменить этот купон', + 'Change this currency' => 'Изменить эту валюту', + 'Change this feature' => 'Изменить эту функцию', + 'Change this hook' => 'Изменить этот Hook', + 'Change this language' => 'Изменить язык', + 'Change this mailing template' => 'Изменить этот шаблон рассылки', + 'Change this product attribute' => 'Изменить этот атрибут продукта', + 'Change this product feature' => 'Изменить эту функцию продукта', + 'Change this product template' => 'Изменить этот шаблон продукта', + 'Change this profile' => 'Изменить профиль', + 'Change this sale' => 'Изменить эту продажу', + 'Change this shipping zone' => 'Изменить эту зону доставки', + 'Change this tax' => 'Изменить этот налог', + 'Change this tax rule' => 'Изменить это правило налога', + 'Change this template' => 'Изменить этот шаблон', + 'Change this variable' => 'Измените эту переменную', + 'Check sale activation' => 'Проверить активацию продажи', + 'Check the support of hooks.' => 'Проверьте поддержку Hook.', + 'Check this box if you want to add this attributes to all product templates' => 'Установите этот флаu, если вы хотите добавить этот аттрибут ко всем шаблонам продукта', + 'Content' => 'Содержимое', + 'Coupon code' => 'Код купона', + 'Create' => 'Создать', + 'Create a new attribute value' => 'Создать новое значение атрибута', + 'Create a new brand' => 'Создать новый бренд', + 'Create a new category' => 'Создать новую категорию', + 'Create a new combination' => 'Создание новой комбинации', + 'Create a new content' => 'Создать новый контент', + 'Create a new country' => 'Создать новую страну', + 'Create a new coupon' => 'Создать новый купон', + 'Create a new currency' => 'Создать новую валюту', + 'Create a new customer' => 'Создать нового покупателя', + 'Create a new feature' => 'Создать новое свойство', + 'Create a new feature value' => 'Создать новое значение свойства', + 'Create a new folder' => 'Создать новую папку', + 'Create a new language' => 'Создать новый язык', + 'Create a new mailing template' => 'Создать новый шаблон рассылки', + 'Create a new product' => 'Создать новый продукт', + 'Create a new product template' => 'Создать новый шаблон продукта', + 'Create a new profile' => 'Создать новый профиль', + 'Create a new sale' => 'Создать новую распродажу', + 'Create a new shipping zone' => 'Создать новую зону доставки', + 'Create a new tax' => 'Создать новый налог', + 'Create a new tax rule' => 'Создать новое налоговое правило', + 'Create a new variable' => 'Создать новую переменную', + 'Create combinations' => 'Создание комбинаций', + 'Create coupon' => 'Создать купон', + 'Create this address' => 'Создать этот адрес', + 'Create this attribute' => 'Создать этот атрибут', + 'Create this brand' => 'Создать бренд', + 'Create this category' => 'Создать эту категорию', + 'Create this combination' => 'Создать эту комбинацию', + 'Create this content' => 'Создать этот контент', + 'Create this country' => 'Создать эту страну', + 'Create this currency' => 'Создать эту валюту', + 'Create this customer' => 'Создать этого покупателя', + 'Create this feature' => 'Создать это свойство', + 'Create this folder' => 'Создать эту папку', + 'Decimal places' => 'Десятичные знаки', + 'Delete this folder' => 'Удалить эту папку', + 'Delivery' => 'Доставка', + 'Delivery address' => 'Адрес доставки', + 'Description' => 'Описание', + 'Disabled' => 'Отключен', + 'Do you really want to delete this address ?' => 'Вы действительно хотите удалить этот адрес?', + 'Edit' => 'Редактировать', + 'Edit this address' => 'Изменить этот адрес', + 'Email address' => 'Адрес электронной почты', + 'Enter here the product stock' => 'Введите здесь запасы товара', + 'First Name' => 'Имя', + 'Home' => 'Главная', + 'Last Name' => 'Фамилия', + 'Login' => 'Вход', + 'Name' => 'Имя', + 'Order details' => 'Информация о заказе', + 'Password' => 'Пароль', + 'Position' => 'Позиция', + 'Price' => 'Цена', + 'Product price including taxes' => 'Цена продукта с учетом налогов', + 'Product stock' => 'Запасы товаров', + 'Quantity' => 'Количество', + 'Search' => 'Поиск', + 'Select a template' => 'Выберите шаблон', + 'Select here a template for this product' => 'Здесь выберите шаблон для этого товара', + 'Send' => 'Отправить', + 'Status' => 'Статус', + 'Total' => 'Итого', + 'Update' => 'Обновить', + 'View' => 'Посмотреть', + 'Warning' => 'Внимание', +]; diff --git a/templates/backOffice/default/I18n/sk_SK.php b/templates/backOffice/default/I18n/sk_SK.php new file mode 100644 index 00000000..841e7639 --- /dev/null +++ b/templates/backOffice/default/I18n/sk_SK.php @@ -0,0 +1,488 @@ + ' (predvolené)', + '%count more...' => '%count viac...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count dopravné zóny sú pripojené na tento modul: %zones. Pre zmenu kliknite sem', + '(according to a country the taxes applied could be different)' => '(vzhľadom na krajinu uplatňované dane môžu byť rôzne)', + '(edit)' => '(upraviť)', + 'Check the list of ISO 639-1 codes' => ' Pozrite sa na zoznam kódov ISO 639-1', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Upozornenie, výmenný kurz sa nenašiel pre aspoň jednu menu: %list', + 'API users' => 'API užívatelia', + 'Action' => 'Akcia', + 'Actions' => 'Akcie', + 'Active' => 'Aktívny', + 'Add a new Customer' => 'Pridať nového zákazníka', + 'Add a new address' => 'Pridať novú adresu', + 'Add a new brand' => 'Pridať novú značku', + 'Add a new category' => 'Pridať novú kategóriu', + 'Add a new combination' => 'Pridať novú kombináciu', + 'Add a new content' => 'Pridať nový obsah', + 'Add a new country' => 'Pridať novú krajinu', + 'Add a new currency' => 'Pridať novú menu', + 'Add a new folder' => 'Pridať nový priečinok', + 'Add a new language' => 'Pridať nový jazyk', + 'Add a new mailing template' => 'Vytvorenie novej e-mailovej šablóny', + 'Add a new product' => 'Pridať nový produkt', + 'Add a new product attribute' => 'Pridať novú vlastnosť produktu', + 'Add a new product template' => 'Vytvorenie novej produktovej šablóny', + 'Add a new sale' => 'Pridať nový výpredaj', + 'Add a new shipping zone' => 'Pridať novú zónu dodania', + 'Add a new state' => 'Pridať nový štát', + 'Add document to your product.' => 'Pridať dokument k produktu.', + 'Add selected countries' => 'Pridať vybrané krajiny', + 'Add tax to this group' => 'Pridať daň do tejto skupiny', + 'Add to all product templates' => 'Pridať šablóny pre všetky produkty', + 'Add to selected categories' => 'Pridať k vybraným kategóriám', + 'Additional Folders' => 'Ďalšie zložky', + 'Additional address' => 'Ďalšie adresy', + 'Additional categories' => 'Ďalšie kategórie', + 'Address' => 'Adresa', + 'Administration logs' => 'Administrácia', + 'Administration profiles' => 'Správa profilov', + 'Administrators' => 'Správcovia', + 'Advanced configuration' => 'Pokročilá konfigurácia', + 'Advanced configuration and tools' => 'Pokročilá konfigurácia a nástroje', + 'All' => 'Všetko', + 'All States' => 'Všetky štáty', + 'All orders' => 'Všetky objednávky', + 'Amount' => 'Množstvo', + 'Amount, e.g. 12.50' => 'Čiastka, napríklad 12,50', + 'An email containing instructions to create a new password was sent to your email address. If you don\'t receive this email, please try again.' => 'Na vašu emailovú adresu bol odoslaný e-mail obsahujúci pokyny na vytvorenie nového hesla. Ak ste vám e-mail nebol doručený, prosím kontaktujte nás.', + 'An error occured' => 'Nastala chyba', + 'An invalid token was provided, your password cannot be changed. Please try again, and be sure to use the exact URL which is in the e-mail sent to you.' => 'Neplatný zank bol zadaný, nie je možné zmeniť vaše heslo. Prosím skúste to znova a uistite sa, že používatevpresnú adresu URL, ktorá vám bola zaslaná e-mailom.', + 'An unexpected error occured' => 'Vyskytla sa neočakávaná chyba', + 'An unknow error happend' => 'Nastala neznáma chyba', + 'An unknown error occured, please try again.' => 'Vyskytla sa neznáma chyba, prosím skúste to znova.', + 'And' => 'A', + 'Api' => 'API', + 'Api key' => 'API kľúč', + 'Applies to attribute values :' => 'Platí pre hodnoty atribútov:', + 'Applies to products :' => 'Sa uplatňuje na výrobky:', + 'Applies to products in categories :' => 'Sa vzťahuje na výrobky v kategóriách:', + 'Apply' => 'Uplatňovať', + 'Assigned modules' => 'Priradené moduly', + 'Associate documents' => 'Pridružené dokumenty', + 'Associate downloadable file' => 'Pridružiť súbor na stiahnutie', + 'Associate files to your combinations' => 'Priraďovať súbory na vašim kombináciam', + 'Associate images' => 'Pridružené obrázky', + 'Associated' => 'Spojené', + 'Associations' => 'Priradenia', + 'Attribute' => 'Vlastnosť', + 'Attribute %title' => 'Atribút %title', + 'Attribute Combinations' => 'Kombinácie atribútov', + 'Attribute Name' => 'Názov atribútu', + 'Attribute information' => 'Atribút informácie', + 'Attribute title' => 'Názov atribútu', + 'Attribute values' => 'Hodnoty atribútov', + 'Attributes' => 'Vlastnosti', + 'Attributes & Features' => 'Vlastnosti & funkcie', + 'Auth Mode' => 'Režim overovateľa', + 'Auth Mode :' => 'Režim overovateľa:', + 'Author' => 'Autor', + 'Available product categories' => 'Produktové kategórie sú k dispozícií', + 'Available taxes' => 'Dostupné dane', + 'Back' => 'Späť', + 'Back Office' => 'Back-Office', + 'Brands' => 'Značky', + 'Can\'t reorder documents, please refresh this page.' => 'Nemôžete meniť poradie dokumentov, prosím, obnovte túto stránku.', + 'Can\'t reorder images, please refresh this page.' => 'Nie je možné zmeniť poradie obrázkov, prosím, obnovte túto stránku.', + 'Cancel' => 'Zrušiť', + 'Cancel changes and revert to original value' => 'Zrušiť zmeny a vrátiť sa na pôvodnú hodnotu', + 'Cancel this order' => 'Zruší túto objednávku', + 'Cart - Prices in %currency' => 'Nákupný košík - ceny v %currency', + 'Catalog' => 'Katalóg', + 'Categories' => 'Kategórie', + 'Categories in %cat' => 'Kategórie v %cat', + 'Category' => 'Kategória', + 'Category created on %date_create. Last modification: %date_change' => 'Kategórie vytvorené na %date_create. Posledná zmena: %date_change', + 'Category title' => 'Názov kategórie', + 'Cellphone' => 'Mobil', + 'Cellular phone' => 'Mobilný telefón', + 'Cellular phone number' => 'Číslo mobilného telefónu', + 'Change this api access' => 'Zmeniť prístup k tejto API', + 'Change this brand' => 'Zmeniť túto značku', + 'Change this condition' => 'Zmeniť tento stav', + 'Change this country' => 'Zmeniť krajinu', + 'Change this coupon' => 'Zmeniť tento kupón', + 'Change this currency' => 'Zmeniť menu', + 'Change this feature' => 'Zmeniť túto funkciu', + 'Change this language' => 'Zmeniť tento jazyk', + 'Change this mailing template' => 'Zmena e-mailovej šablóny', + 'Change this product attribute' => 'Zmena atribútov tohto výrobku', + 'Change this profile' => 'Zmeniť tento profil', + 'Change this sale' => 'Zmeniť tento predaj', + 'Change this shipping zone' => 'Zmeniť zónu doručenia', + 'Change this state' => 'Zmeniť stav', + 'Change this tax' => 'Zmena tejto dane', + 'Change this tax rule' => 'Zmeniť pravidlo dane', + 'Chapo' => 'Chapo', + 'Choose a configuration' => 'Vyberte konfiguráciu', + 'Choose a country' => 'Vyberte krajinu', + 'City' => 'Mesto', + 'Click to view' => 'Kliknite pre zobrazenie', + 'Click to view details.' => 'Kliknutím zobrazíte podrobnosti.', + 'Clone' => 'Klonovať', + 'Clone product' => 'Clonovať produkt', + 'Close' => 'Zavrieť', + 'Close administation session' => 'Zavrieť správu relácii', + 'Code' => 'Kód', + 'Code:' => 'Kód:', + 'Company' => 'Spoločnosť', + 'Configuration' => 'Konfigurácia', + 'Configuration mailing system' => 'Konfigurácia e-mailového systému', + 'Configure' => 'Konfigurovať', + 'Configure this module' => 'Konfigurácia tohto modulu', + 'Confirm' => 'Potvrďte', + 'Confirmation' => 'Potvrdenie', + 'Congratulations, your password was successfully changed. You can now login.' => 'Gratulujeme, vaše heslo bolo úspešne zmenené. Teraz sa môžete prihlásiť.', + 'Content' => 'Obsah', + 'Content title' => 'Obsah titulu', + 'Copy all missing translations.' => 'Kopírovať všetky chýbajúce preklady.', + 'Copy all translations.' => 'Kópie všetky preklady.', + 'Countries' => 'Krajiny', + 'Countries assigned to this zone' => 'Krajiny, ktoré sú priradené k tejto oblasti', + 'Countries/states configuration' => 'Krajíny/štáty konfigurácia', + 'Countries/states deleted of this configuration' => 'Krajín/štáty vymazané z tejto konfigurácie', + 'Countries/states that will use this configuration' => 'Krajín/štáty, ktoré budú používať tieto konfigurácie', + 'Country' => 'Krajina', + 'Coupon' => 'Kupón', + 'Coupon code' => 'Kód kupónu', + 'Coupon code * :' => 'Kód kupónu:', + 'Coupon conditions' => 'Kupón - podmienky', + 'Create' => 'Vytvoriť', + 'Create a new combination' => 'Vytvoriť novú kombináciu', + 'Create a new content' => 'Vytvoriť nový obsah', + 'Create a new country' => 'Vytvorenie novej krajiny', + 'Create a new coupon' => 'Vytvoriť nový kupón', + 'Create a new currency' => 'Vytvorenie novej meny', + 'Create a new customer' => 'Vytvorenie nového zákazníka', + 'Create a new feature' => 'Vytvoriť novú funkciu', + 'Create a new feature value' => 'Vytvorte novú hodnotu funkcie', + 'Create a new folder' => 'Vytvoriť nový priečinok', + 'Create a new language' => 'Vytvoriť nový jazyk', + 'Create a new mailing template' => 'Vytvorenie novej e-mailovej šablóny', + 'Create a new product' => 'Vytvoriť nový produkt', + 'Create a new product template' => 'Vytvorenie novej produktovej šablóny', + 'Create a new profile' => 'Vytvoriť nový profil', + 'Create a new sale' => 'Vytvoriť nový výpredaj', + 'Create a new shipping zone' => 'Vytvorte novú zónu dodania', + 'Create a new state' => 'Vytvoriť nový štát', + 'Create a new tax' => 'Vytvoriť novú daň', + 'Create a new tax rule' => 'Vytvoriť nové pravidlo na dane', + 'Create combinations' => 'Vytvorte kombinácie', + 'Create coupon' => 'Vytvoriť kupón', + 'Create this address' => 'Vytvoriť túto adresu', + 'Create this attribute' => 'Vytvorenie tohto atribútu', + 'Create this brand' => 'Vytvorenie tejto značky', + 'Create this category' => 'Vytvoriť kategóriu', + 'Create this combination' => 'Vytvorenie tejto kombinácie', + 'Create this content' => 'Vytvoriť obsah', + 'Create this country' => 'Vytvorenie tejto krajiny', + 'Create this currency' => 'Vytvorenie tejto meny', + 'Create this customer' => 'Vytvorenie tohto zákazníka', + 'Create this feature' => 'Vytvoriť túto funkciu', + 'Create this folder' => 'Vytvoriť tento priečinok', + 'Create this language' => 'Vytvorenie tohto jazyka', + 'Create this mailing template' => 'Vytvorenie e-mailovej šablóny', + 'Create this product' => 'Vytvoriť produkt', + 'Create this product template' => 'Vytvorte tento produkt šablóna', + 'Create this sale' => 'Vytvorenie tohto výpredaja', + 'Create this state' => 'Vytvorenie tohto štátu', + 'Currencies' => 'Meny', + 'Currency name' => 'Názov meny', + 'Customer' => 'Zákazník', + 'Customer information' => 'Informácie o zákazníkovi', + 'Customer informations' => 'Informácie o zákazníkovi', + 'Customer is' => 'Zákazník je', + 'Customers' => 'Zákazníci', + 'Customers list' => 'Zoznam zákazníkov', + 'Cutomer Name' => 'Meno zákazníka', + 'Date & Hour' => 'Dátum & hodinu', + 'Date of last order' => 'Dátum poslednej objednávky', + 'Decimal places' => 'Desatinné miesta', + 'Default' => 'Predvolené', + 'Delete' => 'Odstrániť', + 'Delete a module' => 'Odstrániť modul', + 'Delete address' => 'Odstrániť adresu', + 'Delete administrator' => 'Odstrániť správcu', + 'Delete also module data' => 'Odstrániť aj údaje modulu', + 'Delete an order' => 'Odstrániť objednávku', + 'Delete api access' => 'Odstrániť prístup k API', + 'Delete attribute' => 'Odstrániť atribút', + 'Delete attribute value' => 'Odstrániť hodnotu atribútu', + 'Delete brand' => 'Odstrániť značku', + 'Delete category' => 'Odstrániť kategóriu', + 'Delete content' => 'Odstrániť obsah', + 'Delete country' => 'Odstrániť krajinu', + 'Delete coupon' => 'Odstrániť kupón', + 'Delete currency' => 'Odstrániť menu', + 'Delete customer' => 'Odstrániť zákazníka', + 'Delete feature' => 'Odstrániť prvok', + 'Delete feature value' => 'Odstrániť hodnotu funkcie', + 'Delete folder' => 'Odstrániť priečinok', + 'Delete language' => 'Odstrániť jazyk', + 'Delete state' => 'Odstránenie štátu', + 'Delete tax' => 'Odstrániť daň', + 'Delete tax rule' => 'Odstrániť daňové pravidlo', + 'Delete template' => 'Odstrániť šablónu', + 'Delete this brand' => 'Odstrániť túto značku', + 'Delete this combination' => 'Odstrániť túto kombináciu', + 'Delete this condition' => 'Odstrániť túto podmienku', + 'Delete this content' => 'Odstrániť obsah', + 'Delete this country' => 'Odstránenie tejto krajiny', + 'Delete this coupon' => 'Odstrániť tento kupón', + 'Delete this folder' => 'Odstrániť tento priečinok', + 'Delete this state' => 'Odstrániť tento štát', + 'Delivery' => 'Doručenie', + 'Delivery address' => 'Adresa doručenia', + 'Description' => 'Popis', + 'Disabled' => 'Zakázané', + 'Do you really want to cancel this order ?' => 'Naozaj chcete zrušiť túto objednávku?', + 'Do you really want to delete this address ?' => 'Naozaj chcete vymazať túto adresu?', + 'Do you really want to delete this state ?' => 'Naozaj chcete odstrániť tento štát?', + 'Document informations' => 'Informácie o dokumente', + 'Documents' => 'Dokumenty', + 'Download invoice as PDF' => 'Faktúry na stiahnutie vo formáte PDF', + 'E-mail' => 'E-mail', + 'E-mail template you want to translate' => 'Šablóny e-mailu, ktorý chcete preložiť', + 'E-mail templates' => 'E-mailové šablóny', + 'Edit' => 'Upraviť', + 'Edit a state' => 'Upraviť štát', + 'Edit invoice address' => 'Upraviť fakturačnú adresu', + 'Edit next brand' => 'Upraviť ďalšie značky', + 'Edit next customer' => 'Upraviť ďalšieho zákazníka', + 'Edit next order' => 'Upraviť ďalšiu objednávku', + 'Edit previous brand' => 'Upraviť predchádzajúcu značku', + 'Edit previous customer' => 'Upraviť predchádzajúceho zákazníka', + 'Edit previous order' => 'Upraviť predchádzajúcu objednávku', + 'Edit state "%name"' => 'Upraviť štát "%name"', + 'Edit this address' => 'Upraviť túto adresu', + 'Edit this folder' => 'Upraviť tento priečinok', + 'Edit this module' => 'Upraviť tento modul', + 'Edit this order' => 'Upraviť túto objednávku', + 'Edit this product' => 'Upraviť tento produkt', + 'Editing %cat' => 'Úprava %cat', + 'Editing %fold' => 'Úprava %fold', + 'Editing %title' => 'Úprava %title', + 'Editing attribute "%name"' => 'Úprava atribút "%name"', + 'Editing brand "%title"' => 'Úprava značky "%title"', + 'Editing country "%name"' => 'Úprava krajiny "%name"', + 'Editing coupon "%title"' => 'Úprava kupónu "%title"', + 'Editing currency "%name"' => 'Úprava meny "%name"', + 'Editing document "%name"' => 'Úprava dokumentu "%name"', + 'Editing feature "%name"' => 'Úprava funkcie "%name"', + 'Editing image "%name"' => 'Úprava obrázok "%name"', + 'Editing mailing template "%name"' => 'Úprava e-mailových šablón "%name"', + 'Editing state "%name"' => 'Úprava štátu "%name"', + 'Enabled' => 'Povolené', + 'Encryption' => 'Šifrovanie', + 'Encryption :' => 'Šifrovanie:', + 'End Date' => 'Dátum ukončenia', + 'Enter here all possible attribute values.' => 'Tu zadáte všetky možné atribúty hodnoty.', + 'Enter here the product stock' => 'Tu zadajte zásobu pre produkt', + 'Errors' => 'Chyby', + 'Filter' => 'Filter', + 'First Name' => 'Meno', + 'Folder' => 'Priečinok', + 'Forgot your password ?' => 'Zabudli ste heslo?', + 'From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below.' => 'Z Thelia 2.3, musíte Pridať e-mailovú adresu do svojho profilu správcu. Zadajte e-mailovú adresu.', + 'Front Office' => 'Verejná časť obchodu', + 'Generate new password' => 'Vygenerovať nové heslo', + 'Here, just drag and drog the available taxes in groups.' => 'Tu stačí pretiahnúť a pustiť dostupné dane v skupinách.', + 'Home' => 'Úvod', + 'Invoice' => 'Faktúra', + 'Label' => 'Štítok', + 'Last Name' => 'Priezvisko', + 'Login' => 'Prihlásiť', + 'Name' => 'Názov', + 'New Configuration' => 'Nová konfigurácia', + 'No category found for "%term"' => 'Žiadna kategória nebola nájdená pre "%term"', + 'No config.' => 'Žiadny config.', + 'No content found for "%term"' => 'Žiadny obsah nebol nájdený pre "%term"', + 'No country' => 'Žiadna krajina', + 'No customer found for "%term"' => 'Žiadny zákazník nebol nájdený pre "%term"', + 'No email defined' => 'Žiadny definovaný e-mail', + 'No filters' => 'Žiadne filtre', + 'No folder found for "%term"' => 'Žiadny priečinok nebol nájdený pre "%term"', + 'No order found for "%term"' => 'Žiadna objednávka nebola nájdená pre "%term"', + 'No product found for "%term"' => 'Žiadny produkt nebol nájdený pre "%term"', + 'No state has been created yet. Click the + button to create one.' => 'Žiadny štát ešte nebol vytvorený. Pre vytvorenie kliknite na tlačidlo +.', + 'None' => 'Žiadne', + 'Order details' => 'Detaily objednávky', + 'Password' => 'Heslo', + 'Password changed' => 'Heslo zmenené', + 'Position' => 'Pozícia', + 'Preview brand page' => 'Pozrieť stránku značiek', + 'Preview content page' => 'Ukážka obsahu stránky', + 'Price' => 'Cena', + 'Product price including taxes' => 'Cena tovaru s daňou', + 'Product stock' => 'Zásoby produktov', + 'Quantity' => 'Množstvo', + 'Request a new password' => 'Požiadať o nové heslo', + 'Reset' => 'Obnoviť', + 'Save tax rule taxes' => 'Uložiť daňové pravidlá', + 'Search' => 'Hľadať', + 'Select a configuration' => 'Výber konfigurácie', + 'Select a template' => 'Vyberte šablónu', + 'Select here a template for this product' => 'Tu vyberiete šablónu pre tento produkt', + 'Send' => 'Odoslať', + 'State' => 'Štát', + 'States' => 'Štáty', + 'States / Provinces' => 'Štáty / kraje', + 'States/provinces assigned to this country' => 'Štáty/kraje prináležiace k tejto krajine', + 'Status' => 'Stav', + 'Stock' => 'Sklad', + 'Store' => 'Obchod', + 'Store address' => 'Adresa obchodu', + 'Street address' => 'Ulica', + 'Subtitle' => 'Podnadpis', + 'Superadministrator' => 'Superadministrátor', + 'Symbol' => 'Symbol', + 'System parameters' => 'Systémové parametre', + 'Tags' => 'Tagy', + 'Tax' => 'Daň', + 'Taxes' => 'Dane', + 'Taxes configuration' => 'Nastavenie daní', + 'That way, Thelia community will benefit of your translations' => 'Takže, Thelia spoločenstvo bude mať prospech z vašich prekladov', + 'The default pricing is used when no combination is defined.' => 'Predvolená cena sa používa, keď nie je definovaná žiadna kombinácia.', + 'The outcomming price is the sum of the incomming one and the sum of taxes.' => 'Konečná cena je suma ceny produktu a dane.', + 'Thelia Back Office' => 'Thelia Back Office', + 'Thelia Installation' => 'Thelia Inštalácia', + 'Thelia Installation Wizard' => ' Sprievodca inštaláciou Thelia', + 'Thelia Languages' => 'Thelia jazyky', + 'Thelia Mailing System' => 'Thelia e-mailový systém', + 'Thelia Product Attributes' => 'Atribúty produktu Thelia', + 'There is 2 kind of translations :' => 'Existujú 2 druhy prekladov:', + 'There is currently no available attributes.' => 'V súčasnej dobe žiadne atribúty sú k dispozícii', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'Táto stránka umožňuje preložiť každý zdroje na vašich webových stránkach: Thelia, moduly, šablóny.
    ', + 'This product contains no accessories' => 'Tento výrobok neobsahuje žiadne príslušenstvo', + 'This product contains no contents' => 'Tento výrobok neobsahuje žiaden obsah', + 'This product doesn\'t belong to any additional category.' => 'Tento produkt nepatrí k žiadnej ďalšie kategórie.', + 'This product doesn\'t belong to any additional folder.' => 'Tento produkt nepatrí žiadne ďalšie priečinky.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'Tento produkt nemá žiadne kombinácie. Použije sa predvolená cena. kliknite sem a vytvorte novú kombináciu.', + 'This shipping zone does not contains any country.' => 'Táto doručovacia zóna neobsahuje žiadne krajiny.', + 'This variable could not be changed.' => 'Táto premenná sa nemôže meniť.', + 'Timeout' => 'Časový limit', + 'Timeout :' => 'Časový limit:', + 'Title' => 'Oslovenie', + 'Title * :' => 'Oslovenie * :', + 'To' => 'Na', + 'To create a new content, select an existing folder, or create a new one.' => 'Ak chcete vytvoriť nový obsah, vyberte existujúci priečinok, alebo vytvorite nový priečinok.', + 'To create a new product, select an existing category, or create a new one.' => 'Vytvoriť nový produkt, vyberte existujúcu kategóriu alebo vytvorte novu kategóriu.', + 'To remove a value from the combination, select it and click "remove"' => 'Ak chcete odstrániť hodnotu z kombinácie, vyberte ju a kliknite na tlačidlo "odstrániť"', + 'Tools' => 'Nástroje', + 'Top level categories' => 'Obľúbené kategórie', + 'Top level folders' => 'Obľúbené priečinky', + 'Total' => 'Celkom', + 'Total including discount' => 'Celkom so zľavou', + 'Total without discount' => 'Celkom bez zľavy', + 'Transaction' => 'Transakcia', + 'Translation' => 'Preklad', + 'Translations' => 'Preklad', + 'Type:' => 'Typ:', + 'Unit taxed price' => 'Jednotková cena s daňou', + 'Unit. price' => 'Jednotková cena', + 'Unlimited' => 'Neobmedzené', + 'Unlimited number of uses' => 'Neobmedzený počet použití', + 'Unspecified' => 'Nešpecifikované', + 'Update' => 'Aktualizovať', + 'Update URL' => 'Aktualizácia adresy URL', + 'Update an administrator' => 'Aktualizujte správcu', + 'Update coupon' => 'Aktualizácia kupónu', + 'Update password' => 'Aktualizovať heslo', + 'Update rates' => 'Aktualizovať ceny', + 'Update tax rule taxes' => 'Aktualizovať daňové pravidlá', + 'Update this image' => 'Aktualizovať tento obrázok', + 'Use an other config.' => 'Použite iný config.', + 'Use this config.' => 'Použite tento config.', + 'User mode' => 'Uživateľský režim', + 'Username' => 'Užívateľské meno', + 'Username :' => 'Užívateľské meno:', + 'Username or e-mail address' => 'Užívateľské meno alebo e-mail', + 'Using a domain or subdomain for each language' => 'Používať doménu alebo subdoménu pre každý jazyk', + 'Valid on special offers' => 'Platné na špeciálne ponuky', + 'Value' => 'Hodnota', + 'View' => 'Náhľad', + 'View invoice PDF' => 'Zobraziť faktúru vo formáte PDF', + 'View only missing translations.' => 'Zobraziť iba chýbajúce preklady.', + 'View purchase order as PDF' => 'Zobraziť objednávky vo formáte PDF', + 'View shop' => 'Zobraziť obchod', + 'View site' => 'Zobraziť stránku', + 'View this page in %langname' => 'Zobraziť túto stránku v %langname', + 'View this product in a new page' => 'Zobraziť tento produkt na novej stránke', + 'Virtual product' => 'Virtuálny produkt', + 'Visibility' => 'Viditeľnosť', + 'Visible' => 'Viditeľné', + 'Visible in front' => 'Viditeľné v popredí', + 'Warning' => 'Upozornenie', + 'Web site' => 'Webová stránka', + 'Weight' => 'Hmotnosť', + 'Weight
    (Kg)' => 'Hmotnosť
    (Kg)', + 'Welcome' => 'Vitajte', + 'Welcome to Thelia administration !' => 'Vitajte na Thelia administratíva!', + 'Yes' => 'Áno', + 'You can attach here some content to this category' => 'Tu môžte pridať nejaký obsah ku kategórií', + 'You can attach here some content to this product' => 'Tu môžte pridať nejaký obsah ku produktu', + 'You can attach this product to more categories in the details tab.' => 'Tento produkt môžete pripojiť do viacerých kategórií na karte Podrobnosti.', + 'You can change attributes and their positions in the attributes configuration page.' => 'Môžete zmeniť atribúty a ich umiestnenie na stránke Nastavenia atribútov.', + 'You can change feature and their positions in the features configuration page.' => 'Môžete zmeniť funkcie a ich pozície na stránke konfigurácia vlastnosti konfigurácie.', + 'You can\'t delete this profile' => 'Nemôžete odstrániť tento profil', + 'You can\'t do exports, you don\'t have any serializer that handles this.' => 'Nemôžte urobiť export, nemáte potrebný prevodník, ktorý to zvladne.', + 'You have no orders for the moment.' => 'Momentálne nemáte žiadne objednávky.', + 'You have no registred customers for the moment.' => 'Momentálne nemáte žiadnych registrovaných zákazníkov.', + 'Your current IP address is %ip' => 'Vaša aktuálna IP adresa je %ip', + 'Your email' => 'Váš e-mail', + 'Your search is too short' => 'Názov hľadanej témy je príliš krátky', + 'Zip code' => 'PSČ', + 'Zone name' => 'Názov zóny', + 'activate' => 'aktivovať', + 'activate %title module' => 'aktivujte modul %title', + 'activation' => 'aktivácia', + 'all' => 'všetky', + 'all states' => 'všetky štáty', + 'all states/provinces' => 'všetky štáty/oblasti', + 'and' => 'a', + 'caption' => 'titulok', + 'classic modules' => 'klasické moduly', + 'code' => 'kód', + 'company' => 'spoločnosť', + 'country has an other configuration' => 'krajina má ďalšiu konfiguráciu', + 'country has no configuration' => 'krajina nemá ešte konfiguráciu', + 'country has the current configuration' => 'krajina má aktuálnu konfiguráciu', + 'customer ref' => 'ref zákazník', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'dátum vo formáte Rrrr-mm-dd', + 'deactivate' => 'deaktivovať', + 'deactivated' => 'deaktivovaný', + 'deactivation' => 'deaktivácia', + 'delete document' => 'odstrániť dokument', + 'delete image' => 'odstrániť obrázok', + 'download' => 'na stiahnutie', + 'eg: . or ,' => 'napr:. alebo,', + 'email' => 'e-mail', + 'en_US' => 'en_US', + 'filter country' => 'filter krajiny', + 'firstname & lastname' => 'meno & priezvisko', + 'hour in hh:mm:ss format' => 'hodiny v hh:mm:ss formáte', + 'last order' => 'posledná objednávka', + 'long description' => 'dlhý Popis', + 'none' => 'žiadny', + 'ok' => 'ok', + 'on' => 'na', + 'or' => 'alebo', + 'order amount' => 'objednané množstvo', + 'orders for this customer' => 'objednávky pre tohto zákazníka', + 'pdf' => 'pdf', + 'permanent discount' => 'trvalé zľavy (v percentách)', + 'profile' => 'Profil', + 'ref.:' => 'ref.:', + 'reverse' => 'reverzné', + 'short description' => 'krátky popis', + 'tax rules' => 'daňové pravidlá', + 'taxes' => 'dane', + 'title' => 'titul', + 'tracking reference' => 'Sledovanie zásielky', + 'version' => 'Verzia', + 'warning' => 'upozornenie', +]; diff --git a/templates/backOffice/default/I18n/tr_TR.php b/templates/backOffice/default/I18n/tr_TR.php new file mode 100644 index 00000000..0a068c26 --- /dev/null +++ b/templates/backOffice/default/I18n/tr_TR.php @@ -0,0 +1,1225 @@ + ' (varsayılan)', + '%count more...' => '%count daha fazla...', + '%count shipping zone(s) are attached to this module: %zones. Click here to change' => '%count nakliye bölgelerini bu birime bağlı: %zones. Değiştirmek için burayı tıklatın', + '(edit)' => '(düzenle)', + 'Check the list of ISO 639-1 codes' => 'ISO 639-1 kodlarının listesini gözden geçirin', + '0 combinations' => ' 0 kombinasyonları', + 'Cannot translate all fields. According to your PHP configuration, forms cannot contains more than %current_max_input_vars input fields, but at least %required_max_input_vars are required. Please change the value of max_input_vars in your PHP configuration of change the translation file by hand.' => 'Tüm alanları tercüme edemem. Olamaz PHP yapılandırmanıza göre formları içeren %current_max_input_vars giriş alanları daha fazla, ama en azından %required_max_input_vars gereklidir. Lütfen max_input_vars PHP yapılandırmanızdaki değişim değerini Çeviri dosyası el ile değiştirin.', + 'Congratulations, all text is now translated !' => 'Tebrikler, tüm metni tercüme şimdi!', + 'Developer : to change the translations of the resource' => 'Geliştirici: çeviriler kaynağının adını değiştirmek için', + 'Did not found any text to translate. It\'s probably normal. If not, please be sure to use Smarty\'s "intl" function in templates, or the Translator::trans() method in PHP files.' => 'Herhangi bir metin çevirmek için bulunamadı. Muhtemelen normaldir. Eğer değilse, lütfen Smarty\'nın "Uluslararası" işlevinde şablonları veya Çevirmen:: trans() yöntemi PHP dosyalarında kullandığınızdan emin olun.', + 'User : to redefine the translations for your website' => 'Kullanıcı: Web sitesi çevirileri yeniden tanımlamak için', + 'Warning, an exchange rate was not found for at least one currency: %list' => 'Uyarı, bir döviz kuru bulunamadığı için en az bir para birimi: %list', + 'Warning, some of your countries are not included in any shipping zone:' => 'Uyarı, bazı ülkelerinizin nakliye her bölgesine dahil değildir:', + 'Warning, some of your shipping zones are not attached to any delivery module:' => 'Uyarı, bazı nakliye bölgelerinizi teslim modüllerde ekli değil:', + 'A content could be attached to more than one folder. Select here the additional folders for this content.' => 'Bir içerik birden fazla klasöre bağlı. Burada bu içerik için ek klasörleri seçin.', + 'A product could be attached to more than one category. Select here the additional categories for this product.' => 'Bir ürün için birden fazla kategori bağlı. Burada bu ürün için ek kategorileri seçin.', + 'API configuration' => 'API yapılandırma', + 'API list access' => 'API listesi erişim', + 'API users' => 'API kullanıcıları', + 'Accessory title' => 'Aksesuar başlık', + 'Action' => 'Eylem', + 'Actions' => 'Eylemler', + 'Activate this log destination' => 'Bu günlük hedef etkinleştirin', + 'Active' => 'Aktif', + 'Add' => 'Ekle', + 'Add a condition' => 'Bir koşulu ekleyin', + 'Add a module to a hook' => 'Bir kanca için bir modül Ekle', + 'Add a new Customer' => 'Yeni bir müşteri Ekle', + 'Add a new address' => 'Yeni Adres Ekle', + 'Add a new brand' => 'Yeni bir marka Ekle', + 'Add a new category' => 'Yeni kategori ekleme', + 'Add a new combination' => 'Yeni bir kombinasyonu eklemek', + 'Add a new content' => 'Yeni içerik ekle', + 'Add a new country' => 'Yeni bir ülke Ekle', + 'Add a new currency' => 'Yeni para birimi ekleme', + 'Add a new folder' => 'Yeni bir klasör ekle', + 'Add a new hook' => 'Yeni bir kanca Ekle', + 'Add a new language' => 'Yeni bir dil eklemek', + 'Add a new mailing template' => 'Yeni posta şablon ekleme', + 'Add a new module in a hook' => 'Bir kanca içinde yeni bir modül ekleyin', + 'Add a new module to this hook' => 'Bu kanca için yeni bir modül ekleyin', + 'Add a new product' => 'Yeni ürün ekleme', + 'Add a new product attribute' => 'Yeni bir ürün öznitelik ekleyin', + 'Add a new product feature' => 'Yeni ürün özellik ekleme', + 'Add a new product template' => 'Yeni bir ürün şablonu Ekle', + 'Add a new sale' => 'Yeni bir satış Ekle', + 'Add a new shipping zone' => 'Yeni bir sevkiyat bölge Ekle', + 'Add a new variable' => 'Yeni bir değişken eklemek', + 'Add document to your product.' => 'Belge, ürününüz için ekleyin.', + 'Add selected countries' => 'Seçilen ülkeler ekleme', + 'Add tax to this group' => 'Vergi bu gruba ekle', + 'Add this attribute to all product templates' => 'Bu öznitelik için tüm ürün şablonları ekleme', + 'Add this feature to all product templates' => 'Bu özellik için tüm ürün şablonları ekleme', + 'Add to all product templates' => 'Tüm ürün şablonları ekleme', + 'Add to selected categories' => 'Seçili Kategoriler\'e Ekle', + 'Additional Folders' => 'Ek klasörler', + 'Additional address' => 'Ek adres', + 'Additional categories' => 'Ek kategoriler', + 'Address' => 'Adres', + 'Administration logs' => 'Yönetim günlükleri', + 'Administration profiles' => 'Yönetim profilleri', + 'Administrators' => 'Yönetici', + 'Advanced configuration' => 'Gelişmiş yapılandırma', + 'Advanced configuration and tools' => 'Gelişmiş yapılandırma ve araçları', + 'All' => 'Hepsi', + 'All orders' => 'Tüm siparişler', + 'Amount' => 'Tutar', + 'Amount, e.g. 12.50' => 'Tutar, örneğin 12.50', + 'An error occured' => 'Bir hata meydana geldi', + 'An unexpected error occured' => 'Beklenmeyen bir hata oluştu', + 'An unknow error happend' => 'Bilinmeyen bir hata oluştu', + 'An unknown error occured, please try again.' => 'Bilinmeyen bir hata oluştu, lütfen tekrar deneyin.', + 'And' => 've', + 'Api' => 'API', + 'Api key' => 'Geliştirici Anahtarı', + 'Applies to attribute values :' => 'Öznitelik değerleri için geçerlidir:', + 'Applies to products :' => 'Ürünler için geçerlidir:', + 'Applies to products in categories :' => 'Kategoride ürün için geçerlidir:', + 'Apply' => 'Onayla', + 'Assigned modules' => 'Atanan modülleri', + 'Associate documents' => 'Ortak Belgeler', + 'Associate downloadable file' => 'Ortak yüklenebilir dosya', + 'Associate files to your combinations' => 'Kombinasyonlarınız için dosyaları ilişkilendirme', + 'Associate images' => 'Ortak resimler', + 'Associated' => 'İlişkili', + 'Associations' => 'İlişkilendirmeler', + 'Attribute' => 'Öznitelik', + 'Attribute %title' => 'Öznitelik %title', + 'Attribute Combinations' => 'Öznitelik kombinasyonları', + 'Attribute Name' => 'Öznitelik Adı', + 'Attribute information' => 'Öznitelik bilgisi', + 'Attribute title' => 'Öznitelik adı', + 'Attribute values' => 'Öznitelik değerleri', + 'Attributes' => 'Öznitelikler', + 'Attributes & Features' => 'Öznitelikleri ve özellikleri', + 'Auth Mode' => 'Kimlik doğrulama modu', + 'Auth Mode :' => 'Kimlik doğrulama modu:', + 'Author' => 'Oluşturan', + 'Available product categories' => 'Mevcut ürün kategorileri', + 'Back' => 'Geri', + 'Back Office' => 'Yönetim Paneli', + 'Back-office home' => 'Admin Paneli', + 'Back-office template you want to translate' => 'Çevirmek istediğiniz Admin Paneli Şablonu', + 'Back-office templates' => 'Admin Paneli Şablonları', + 'Back-office users' => 'Admin Paneli kullanıcıları', + 'Best taxed price' => 'En iyi Kdv li fiyat', + 'Block' => 'Blok', + 'Block :' => 'Blok :', + 'Brand created on %date_create. Last modification: %date_change' => 'Marka %date_create yaratılmıştır. Son değişiklik: %date_change', + 'Brands' => 'Markalar', + 'Browse files' => 'Dosyalara göz atın', + 'Browse this category' => 'Bu kategoriye Gözat', + 'Browse this folder' => 'Bu Klasöre Gözat', + 'By module' => 'Modülü tarafından', + 'By module:' => 'Modül:', + 'By status' => 'Duruma göre', + 'By type' => 'Türüne göre', + 'Can\'t load documents, please refresh this page.' => 'Lütfen bu sayfayı yenileyin.', + 'Can\'t load images, please refresh this page.' => 'Lütfen bu sayfayı yenileyin.', + 'Can\'t reorder documents, please refresh this page.' => 'Lütfen bu sayfayı yenileyin.', + 'Can\'t reorder images, please refresh this page.' => 'Lütfen bu sayfayı yenileyin.', + 'Cancel' => 'Vazgeç', + 'Cancel changes and revert to original value' => 'Değişiklikleri iptal etmek ve özgün değerine dönmek', + 'Cancel this order' => 'Bu siparişi iptal et', + 'Cart - Prices in %currency' => 'Sepet Tutarı %currency', + 'Catalog' => 'Katalog', + 'Categories' => 'Katogoriler', + 'Categories in %cat' => '%cat Kategorileri', + 'Category' => 'kategori', + 'Category created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan kategori. Son değişiklik: %date_change', + 'Category title' => 'Kategori başlığı', + 'Cellphone' => 'Cep telefonu', + 'Cellular phone' => 'Cep telefonu', + 'Cellular phone number' => 'Cep telefonu numarası', + 'Change sale configuration' => 'Değişiklik Satılık yapılandırma', + 'Change this administrator' => 'Bu yöneticiyi değiştir', + 'Change this api access' => 'Bu API erişimini değiştirme', + 'Change this attribute' => 'Bu özniteliği değiştir', + 'Change this brand' => 'Bu marka değiştirme', + 'Change this condition' => 'Bu durumu değiştir', + 'Change this country' => 'Bu ülkeyi değiştir', + 'Change this coupon' => 'Bu kuponu değiştir', + 'Change this currency' => 'Para birimini değiştir', + 'Change this feature' => 'Bu özelliği değiştir', + 'Change this hook' => 'Bu kanca değiştirmek', + 'Change this language' => 'Bu dili değiştir', + 'Change this mailing template' => 'Bu posta şablonunu değiştir', + 'Change this product attribute' => 'Bu ürün özniteliğini değiştir', + 'Change this product feature' => 'Bu ürün özelliğini değiştir', + 'Change this product template' => 'Bu ürün şablonunu değiştir', + 'Change this profile' => 'Bu profili değiştir', + 'Change this sale' => 'Bu satış değiştirmek', + 'Change this shipping zone' => 'Bu nakliye dilimini değiştir', + 'Change this tax' => 'Bu vergiyi değiştir', + 'Change this tax rule' => 'Bu vergi kuralını değiştir', + 'Change this template' => 'Bu şablonu değiştir', + 'Change this variable' => 'Bu değişkeni değiştir', + 'Chapo' => 'Chapo', + 'Check sale activation' => 'Satılık etkinleştirme denetimi', + 'Check the support of hooks.' => 'Kanca destek kontrol edin.', + 'Check this box if you want to add this attributes to all product templates' => 'Bu eklemek istiyorsanız, bu kutuyu tüm ürün şablonları için öznitelikleri kontrol', + 'Check this box if you want to add this features to all product templates' => 'Bu özellikler için tüm ürün şablonları eklemek istiyorsanız, bu onay kutusunu işaretleyin', + 'Choose a country' => 'Bir ülke seç', + 'City' => 'Şehir', + 'Classic modules' => 'Klasik modüller', + 'Click to view' => 'Görüntülemek için tıklatın', + 'Click to view details.' => 'Ayrıntılarını görüntülemek için tıklatın.', + 'Clone' => 'Klon', + 'Clone product' => 'Klon ürün', + 'Close' => 'Kapat', + 'Close administation session' => 'Yakın yönetim oturumu', + 'Code' => 'Kod', + 'Code:' => 'Kod:', + 'Combinable with other promotions' => 'Diğer promosyonlar ile kombine edilebilir', + 'Combination EAN Code' => 'Kombinasyon EAN kodu', + 'Combination builder' => 'Kombinasyon Oluşturucu', + 'Combination reference' => 'Kombinasyon referans', + 'Company' => 'Firma', + 'Condition category :' => 'Koşul kategorisi:', + 'Condition description' => 'Durum açıklaması', + 'Configuration' => 'Ayarlar', + 'Configuration mailing system' => 'Yapılandırma posta sistemi', + 'Configure' => 'Yapılandır', + 'Configure this module' => 'Bu modülü yapılandır', + 'Confirm' => 'Onayla', + 'Confirm changes' => 'Değişiklikleri Onayla', + 'Confirmation' => 'Onayla', + 'Content' => 'Içerik', + 'Content title' => 'İçerik başlığı', + 'Contents in %fold' => '%fold içeriği', + 'Copy all missing translations.' => 'Tüm eksik çeviriler kopyalayın.', + 'Copy all translations.' => 'Tüm çeviriler kopyalayın.', + 'Copy source text in input field' => 'Kaynak metni giriş alanına kopyala', + 'Countries' => 'Ülkeler', + 'Countries assigned to this zone' => 'Bu bölgeye atanan ülke', + 'Country' => 'Ülke', + 'Coupon' => 'Kupon', + 'Coupon code' => 'kupon kodu', + 'Coupon code * :' => 'Kupon kodu *:', + 'Coupon conditions' => 'Kupon koşulları', + 'Coupon type * :' => 'Kupon türü *:', + 'Coupons' => 'Kuponlar', + 'Create' => 'Oluştur', + 'Create a customer address' => 'Bir müşteri adresi oluştur', + 'Create a new API access' => 'Yeni bir API erişimi oluşturmak', + 'Create a new Hook' => 'Yeni bir kanca oluşturmak', + 'Create a new administrator' => 'Yeni bir Yönetici oluştur', + 'Create a new attribute' => 'Yeni bir öznitelik oluştur', + 'Create a new attribute value' => 'Yeni bir öznitelik değeri oluştur', + 'Create a new brand' => 'Yeni bir marka yaratmak', + 'Create a new category' => 'Yeni kategori Ekle', + 'Create a new combination' => 'Yeni bir kombinasyon oluştur', + 'Create a new content' => 'Yeni bir içerik oluştur', + 'Create a new country' => 'Yeni bir ülke oluştur', + 'Create a new coupon' => 'Bir yeni kupon oluştur', + 'Create a new currency' => 'Yeni bir para birimi oluştur', + 'Create a new customer' => 'Yeni bir müşteri oluştur', + 'Create a new feature' => 'Yeni bir özellik oluştur', + 'Create a new feature value' => 'Yeni bir özellik değeri oluştur', + 'Create a new folder' => 'Yeni bir Klasör Oluştur', + 'Create a new language' => 'Yeni bir dil oluştur', + 'Create a new mailing template' => 'Yeni posta şablonu oluştur', + 'Create a new product' => 'Yeni bir ürün oluştur', + 'Create a new product template' => 'Yeni bir ürün şablonu oluştur', + 'Create a new profile' => 'Yeni bir profil oluştur', + 'Create a new sale' => 'Yeni bir satış oluşturmak', + 'Create a new shipping zone' => 'Yeni bir sevkiyat bölgesi oluştur', + 'Create a new tax' => 'Yeni bir vergi oluştur', + 'Create a new tax rule' => 'Yeni bir vergi kuralı oluştur', + 'Create a new variable' => 'Yeni bir değişken oluştur', + 'Create combinations' => 'Birleşimleri oluştur', + 'Create coupon' => 'Kupon oluştur', + 'Create this address' => 'Adresi oluştur', + 'Create this attribute' => 'Özniteliği oluştur', + 'Create this brand' => 'Bu marka yaratmak', + 'Create this category' => 'Kategoriyi oluştur', + 'Create this combination' => 'Kombinasyonu oluştur', + 'Create this content' => 'İçeriği oluştur', + 'Create this country' => 'Ülkeyi oluştur', + 'Create this currency' => 'Para birimini oluştur', + 'Create this customer' => 'Müşteriyi oluştur', + 'Create this feature' => 'Özelliği oluştur', + 'Create this folder' => 'Klasörü oluştur', + 'Create this hook' => 'Bu kanca oluşturmak', + 'Create this hooks' => 'Bu kanca oluşturmak', + 'Create this language' => 'Dili oluştur', + 'Create this mailing template' => 'Posta şablonunu oluştur', + 'Create this product' => 'Ürün oluştur', + 'Create this product template' => 'Ürün şablonunu oluştur', + 'Create this sale' => 'Bu satış oluşturmak', + 'Create this shipping zone' => 'Nakliye bölgesini oluştur', + 'Create this value' => 'Değeri oluştur', + 'Create this variable' => 'Değişkeni oluştur', + 'Currencies' => 'Para birimleri', + 'Currency name' => 'Para birimi adı', + 'Currency rate' => 'Döviz Kuru', + 'Currency symbol' => 'Para Birimi Sembolü', + 'Current product template' => 'Geçerli ürün şablonu', + 'Current quantity' => 'Mevcut miktar', + 'Customer' => 'Customer', + 'Customer information' => 'Müşteri Bilgileri', + 'Customer informations' => 'Müşteri Bilgileri', + 'Customer is' => 'Müşteri', + 'Customers' => 'müşteriler', + 'Customers list' => 'Müşteriler listesi', + 'Cutomer Name' => 'Cutomer Name', + 'Date & Hour' => 'Tarih ve saat', + 'Date of last order' => 'Son sipariş tarihi', + 'Days before expiration' => 'Geçerliliği sona ermeden önce gün', + 'Deactivate %title module' => '%title modül devre dışı bırakma', + 'Deactivate hook' => 'Kanca devre dışı bırakma', + 'Deactivate this hooks' => 'Bu kanca devre dışı bırakma', + 'Decimal places' => 'Ondalık basamak', + 'Default' => 'Varsayılan', + 'Default address' => 'Varsayılan adres', + 'Define here this product\'s accessories' => 'Burada bu ürün aksesuarları tanımlamak', + 'Delete' => 'sil', + 'Delete a combination' => 'Bir arada silmek', + 'Delete a module' => 'Bir modül silme', + 'Delete a variable' => 'Bir değişkeni silmek', + 'Delete address' => 'Adresini Sil', + 'Delete administrator' => 'Yönetici silmek', + 'Delete also module data' => 'Ayrıca modül veri silmek', + 'Delete an order' => 'Bir siparişi sil', + 'Delete api access' => 'API erişimi silme', + 'Delete attribute' => 'Özniteliğini silin', + 'Delete attribute value' => 'Öznitelik değerini sil', + 'Delete brand' => 'Markayı Sil', + 'Delete category' => 'Kategoriyi sil', + 'Delete content' => 'İçeriği Sil', + 'Delete country' => 'Ülke silmek', + 'Delete coupon' => 'Kupon silmek', + 'Delete currency' => 'Para birimi silme', + 'Delete customer' => 'Müşteri Sil', + 'Delete feature' => 'Özellik Sil', + 'Delete feature value' => 'Özellik değeri silin', + 'Delete folder' => 'Klasörü sil', + 'Delete hook' => 'Kanca silmek', + 'Delete language' => 'Dil silmek', + 'Delete mailing template' => 'Posta şablonunu silme', + 'Delete product' => 'Ürün silinsin mi', + 'Delete profile' => 'Profili sil', + 'Delete sale' => 'Satılık silmek', + 'Delete selected countries' => 'Seçilen ülkeler silmek', + 'Delete shipping zone' => 'Nakliye bölgesi Sil', + 'Delete tax' => 'Kdv silmek', + 'Delete tax rule' => 'Kdv kuralı silme', + 'Delete template' => 'Şablon silme', + 'Delete this accessory' => 'Bu Aksesuar silmek', + 'Delete this administrator' => 'Bu yönetici silmek', + 'Delete this api access' => 'Bu API erişimi silme', + 'Delete this attribute' => 'Bu özniteliğini silin', + 'Delete this brand' => 'Bu markayı silmek', + 'Delete this category and all its contents' => 'Bu kategori ve tüm içeriğini silmek', + 'Delete this combination' => 'Bu kombinasyonu sil', + 'Delete this condition' => 'Bu koşulu Sil', + 'Delete this content' => 'Bu içeriği Sil', + 'Delete this country' => 'Bu ülkeyi silmek', + 'Delete this coupon' => 'Bu kupon silmek', + 'Delete this currency' => 'Bu para birimi sil', + 'Delete this customer address' => 'Bu müşteri adresini Sil', + 'Delete this customer and all his orders' => 'Bu müşteri ve onun siparişlerini sil', + 'Delete this feature' => 'Bu özelliği Sil', + 'Delete this folder' => 'Bu klasörü Sil', + 'Delete this folder and all its contents' => 'Bu klasörü ve tüm içeriğini sil', + 'Delete this hook' => 'Bu kanca silmek', + 'Delete this language' => 'Bu dili sil', + 'Delete this mailing template' => 'Bu posta şablonunu sil', + 'Delete this module' => 'Bu modülü sil', + 'Delete this product' => 'Bu ürünü sil', + 'Delete this product attribute' => 'Bu ürünün özniteliğini sil', + 'Delete this product feature' => 'Bu ürünün özelliğini Sil', + 'Delete this product template' => 'Bu ürün şablonunu sil', + 'Delete this profile' => 'Bu profili sil', + 'Delete this sale' => 'Bu satışı silmek', + 'Delete this shipping zone' => 'Bu nakliye bölgesini Sil', + 'Delete this tax' => 'Bu vergiyi sil', + 'Delete this tax rule' => 'Bu vergi kuralını sil', + 'Delete this value' => 'Bu değeri sil', + 'Delete this variable' => 'Bu değişkeni sil', + 'Delete this zone' => 'Bu bölgeyi sil', + 'Delivery' => 'Teslimat', + 'Delivery address' => 'Teslimat adresi', + 'Delivery module' => 'Teslimat modülü', + 'Delivery modules' => 'Teslimat modülleri', + 'Description' => 'Açıklama', + 'Destinations' => 'Hedefler', + 'Developer mode' => 'Geliştirici modu', + 'Disabled' => 'Devre Dışı', + 'Discount' => 'İndirim', + 'Discount amount' => 'İndirim Tutarı', + 'Discount percentage' => 'İndirim Yüzdesi', + 'Discover all our modules on Thelia Modules !' => ' Thelia modülleri tüm modülleri keşfedin!', + 'Do not use a product template' => 'Bir ürün şablonunu kullan', + 'Do this export' => 'Bu ihracatı yapmak', + 'Do this import' => 'Bu alımı yapmak', + 'Do you really want to add this attribute to all product templates ?' => 'Bu öznitelik için tüm ürün şablonları eklemek istiyor musunuz?', + 'Do you really want to add this feature to all product templates ?' => 'Bu özellik için tüm ürün şablonları eklemek istiyor musunuz?', + 'Do you really want to cancel this order ?' => 'Bu siparişi iptal etmek istiyor musunuz?', + 'Do you really want to delete this address ?' => 'Bu adresi silmek istiyor musunuz ?', + 'Do you really want to delete this administrator ?' => 'Bu yöneticiyi silmek istiyor musunuz?', + 'Do you really want to delete this api access ?' => 'Bu API erişimini silmek istiyor musunuz?', + 'Do you really want to delete this attribute ? It will be removed from all product templates.' => 'Bu özniteliği silmek istiyor musunuz? Tüm ürün şablonlarından kaldırılacak.', + 'Do you really want to delete this attribute value ?' => 'Bu öznitelik değerini silmek istiyor musunuz?', + 'Do you really want to delete this brand ?' => 'Bu markayı silmek istiyor musunuz?', + 'Do you really want to delete this category and all its content ?' => 'Bu kategoriyi ve tüm içeriğini silmek istiyor musunuz?', + 'Do you really want to delete this combination ?' => 'Bu kombinasyonları silmek istiyor musunuz?', + 'Do you really want to delete this condition ?' => 'Bu durumu silmek istiyor musunuz?', + 'Do you really want to delete this content ?' => 'Bu içeriği silmek istiyor musunuz?', + 'Do you really want to delete this country ?' => 'Bu ülkeyi silmek istiyor musunuz?', + 'Do you really want to delete this coupon ?' => 'Bu kuponu silmek istiyor musunuz?', + 'Do you really want to delete this currency ?' => 'Bu para birimini silmek istiyor musunuz?', + 'Do you really want to delete this customer ?' => 'Bu müşteriyi silmek istiyor musunuz?', + 'Do you really want to delete this document ?' => 'Bu içeriği silmek istiyor musunuz ?', + 'Do you really want to delete this element ?' => 'Bu öğeyi silmek istiyor musunuz?', + 'Do you really want to delete this feature ? It will be removed from all product templates.' => 'Bu özelliği silmek istiyor musunuz? Tüm ürün şablonlarından kaldırılacak.', + 'Do you really want to delete this feature value ?' => 'Bu özellik değerini silmek istiyor musunuz?', + 'Do you really want to delete this folder and all its content ?' => 'Gerçekten bu klasörü ve tüm içeriğini silmek istiyor musunuz?', + 'Do you really want to delete this hook ?' => 'Gerçekten bu kanca silmek istiyor musunuz?', + 'Do you really want to delete this image ?' => 'Bu resmi silmek istiyor musunuz?', + 'Do you really want to delete this language ?' => 'Bu dili silmek istiyor musunuz?', + 'Do you really want to delete this mailing template ?' => 'Bu posta şablonu silmek istiyor musunuz?', + 'Do you really want to delete this module ?' => 'Bu modül silmek istiyor musunuz?', + 'Do you really want to delete this product and all it\'s components (images, documents)?
    This can\'t be canceled.' => 'Bu ürün ve tüm silmek istiyor musunuz bu Dünün bileşenleri (resimler, belgeler)?
    Bu iptal edilemez.', + 'Do you really want to delete this profile ?' => 'Bu profili silmek istiyor musunuz?', + 'Do you really want to delete this sale ? All related products will no longer be on sale' => 'Bu satışı silmek istiyor musunuz? Tüm ilgili ürünler artık satışa sunulacak', + 'Do you really want to delete this shipping zone ?' => 'Bu nakliye bölgesini silmek istiyor musunuz?', + 'Do you really want to delete this tax ?' => 'Bu Kdv kuralını silmek istiyor musunuz?', + 'Do you really want to delete this tax rule ?' => 'Bu Kdv kuralını silmek istiyor musunuz?', + 'Do you really want to delete this template ? It will be removed from all products.' => 'Bu şablonu silmek istiyor musunuz? Tüm ürünler kaldırılacak.', + 'Do you really want to delete this variable ?' => 'Bu değişkeni silmek istiyor musunuz?', + 'Do you really want to remove the content from this folder ?' => 'İçeriği bu klasörden kaldırmak istiyor musunuz?', + 'Do you really want to remove the product from this category ?' => 'Ürün bu kategoriden kaldırmak istiyor musunuz?', + 'Do you really want to remove this accessory from the product ?' => 'Bu aksesuar ürün kaldırmak istiyor musunuz?', + 'Do you really want to remove this attribute from all product templates ? You\'ll loose all product related data for this attribute.' => 'Bu öznitelik tüm ürün şablonlardan kaldırmak istiyor musunuz? Tüm gevşek ürün ile ilgili bu öznitelik için veri.', + 'Do you really want to remove this attribute from the template ?' => 'Bu öznitelik şablondan kaldırmak istiyor musunuz?', + 'Do you really want to remove this country from this shipping zone ?' => 'Bu ülke bu nakliye bölgeden kaldırmak istiyor musunuz?', + 'Do you really want to remove this feature from all product templates ? You\'ll loose all product related data for this feature.' => 'Bu özellik tüm ürün şablonlardan kaldırmak istiyor musunuz? Tüm gevşek ürün ile ilgili veriler için bu özellik.', + 'Do you really want to remove this feature from the template ?' => 'Bu özellik şablondan kaldırmak istiyor musunuz?', + 'Do you really want to remove this module from this hook ?' => 'Bu modül bu kanca kaldırmak istiyor musunuz?', + 'Do you really want to remove this related content ?' => 'Bu ilgili içerik kaldırmak istiyor musunuz?', + 'Do you really want to remove this related content from the product ?' => 'Bu ilgili içerik ürün kaldırmak istiyor musunuz?', + 'Do you really want to remove this zone ?' => 'Bu bölgeyi kaldırmak istiyor musunuz?', + 'Do you really want to set this coupon available to everyone ?' => 'Bu kupon kullanılabilir herkes için ayarlamak istiyor musunuz?', + 'Do you really want to use this address by default ?' => 'Varsayılan olarak bu adresi kullanmak istiyor musunuz?', + 'Document informations' => 'Belge bilgileri', + 'Documents' => 'Dokümanlar', + 'Download invoice as PDF' => 'Fatura PDF olarak indir', + 'Download purchase order as PDF' => 'Satınalma siparişi PDF olarak indir', + 'Drop files to upload' => 'Bırak dosya yüklemek için', + 'Drop tax here to create a tax group' => 'Bir vergi grubu oluşturmak için vergi buraya bırakın', + 'Drop tax here to delete from group' => 'Gruptan silmek için vergi buraya bırakın', + 'E-mail' => 'E-posta', + 'E-mail template you want to translate' => 'Çevirmek istediğiniz e-posta şablonu', + 'E-mail templates' => 'E-posta şablonları', + 'EAN Code' => 'EAN kodu', + 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.' => 'Ecotax is a tax wich add a defined amount (throug a product feature) to the product price.', + 'Edit' => 'Düzenle', + 'Edit Prices' => 'Fiyatı Düzenle', + 'Edit a country' => 'Bir ülke düzenleme', + 'Edit a currency' => 'Bir para birimi Düzenle', + 'Edit a customer' => 'Bir müşteri Düzenle', + 'Edit a customer address' => 'Bir müşteri adresi Düzenle', + 'Edit a document' => 'Bir belgeyi düzenlemek', + 'Edit a feature' => 'Bir özelliği düzenleme', + 'Edit a hook' => 'Bir kanca Düzenle', + 'Edit a language' => 'Bir dil Düzenle', + 'Edit a mailing template' => 'Bir posta şablonu Düzenle', + 'Edit a module' => 'Bir modülü Düzenle', + 'Edit a module hook' => 'Bir modülü kanca Düzenle', + 'Edit a profile' => 'Bir profili düzenlemek', + 'Edit a shipping configuration' => 'Bir nakliye yapılandırmasını Düzenle', + 'Edit a shipping zone' => 'Bir nakliye Bölge Düzenle', + 'Edit a system variable' => 'Sistem değişkeni Düzenle', + 'Edit a tax' => 'Vergiyi Düzenle', + 'Edit a tax rule' => 'Vergi kuralını düzenle', + 'Edit a template' => 'Şablonu Düzenle', + 'Edit an attribute' => 'Özniteliği Düzenle', + 'Edit an image' => 'Resmi düzenle', + 'Edit an order' => 'Siparişi düzenle', + 'Edit api access' => 'Düzenleme API erişimi', + 'Edit attribute "%name"' => 'Bu Özniteliği Düzenle "%name"', + 'Edit brand' => 'Markayı Düzenle', + 'Edit brand %title' => 'Marka %title Düzenle', + 'Edit category' => 'Kategoriyi düzenle', + 'Edit category %title' => 'Bu Kategoriyi Düzenle %title', + 'Edit content' => 'İçeriği düzenle', + 'Edit content %title' => 'İçerik %title \'i Düzenle', + 'Edit country "%name"' => 'Ülkeyi "%name"\'yi Düzenle', + 'Edit currency "%name"' => 'Para birimi "%name"\'i Düzenle', + 'Edit customer %firstname %lastname' => 'Müşteri %firstname %lastname \'yi Düzenle', + 'Edit customer %firstname %lastname (Ref : %ref)' => 'Müşteri %firstname %lastname Düzenle (Ref: %ref)', + 'Edit delivery address' => 'Teslimat adresini Düzenle', + 'Edit document "%name"' => 'Belgeyi "%name" Düzenle', + 'Edit feature "%name"' => 'Özellik "%name" Düzenle', + 'Edit folder' => 'Klasörü düzenle', + 'Edit folder %title' => 'Klasör %title Düzenle', + 'Edit hook "%name"' => 'Kanca "%name" Düzenle', + 'Edit image "%name"' => 'Resim "%name" Düzenle', + 'Edit information in %lng' => '%lng bilgileri düzenle', + 'Edit invoice address' => 'Fatura adresini Düzenle', + 'Edit mailing template "%name"' => 'Posta şablonu "%name" Düzenle', + 'Edit next category' => 'Sonraki Kategoriyi Düzenle', + 'Edit next content' => 'Sonraki içeriği düzenle', + 'Edit next folder' => 'Sonraki klasörü Düzenle', + 'Edit next product' => 'Sonraki ürünü Düzenle', + 'Edit order address' => 'Sipariş adresini Düzenle', + 'Edit previous category' => 'Önceki Kategoriyi Düzenle', + 'Edit previous content' => 'Önceki içeriği düzenle', + 'Edit previous folder' => 'Önceki klasörü Düzenle', + 'Edit previous product' => 'Önceki ürünü Düzenle', + 'Edit prices in %curr' => '%curr fiyatlarını düzenle', + 'Edit product' => 'Ürünü Düzenle', + 'Edit product %title' => 'Ürün %title Düzenle', + 'Edit template "%name"' => 'Şablon "%name" Düzenle', + 'Edit this address' => 'Bu adresi Düzenle', + 'Edit this brand' => 'Bu marka Düzenle', + 'Edit this category' => 'Bu kategoriyi düzenle', + 'Edit this content' => 'Bu içeriği düzenle', + 'Edit this customer' => 'Bu müşteriyi Düzenle', + 'Edit this delivery zone' => 'Bu teslim Bölgesini Düzenle', + 'Edit this folder' => 'Bu klasörü Düzenle', + 'Edit this module' => 'Bu modülü Düzenle', + 'Edit this order' => 'Bu siparişi düzenle', + 'Edit this product' => 'Bu ürünü Düzenle', + 'Edit variable %name' => 'Değişken %name Düzenle', + 'Editing %cat' => '%cat düzenliyor', + 'Editing %fold' => '%fold düzenleniyor', + 'Editing %title' => '%title düzenleme', + 'Editing attribute "%name"' => 'Öznitelik "%name" düzenleme', + 'Editing brand "%title"' => 'Marka "%title" düzenleme', + 'Editing country "%name"' => 'Ülke "%name" düzenleme', + 'Editing coupon "%title"' => 'Kupon "%title" düzenleme', + 'Editing currency "%name"' => 'Para birimi "%name" düzenleme', + 'Editing document "%name"' => 'Belge "%name" düzenleme', + 'Editing feature "%name"' => 'Özellik "%name" düzenleme', + 'Editing hook "%name"' => 'Kanca "%name" düzenleme', + 'Editing hook for module "%name"' => 'Kanca modülü "%name" için düzenleme', + 'Editing image "%name"' => 'Resim "%name" düzenleme', + 'Editing mailing template "%name"' => 'Posta şablonu "%name" düzenleme', + 'Editing module' => 'Modül düzenleme', + 'Editing profile' => 'Profil düzenleme', + 'Editing profile \'%name\'' => 'Düzenleme profili \'%name\'', + 'Editing shipping configuration for module "%name"' => 'Teslim yapılandırması modülü "%name" için düzenleme', + 'Editing shipping zone "%name"' => 'Nakliye bölgesi "%name" düzenleme', + 'Editing tax' => 'Kdv düzenleme', + 'Editing tax rule' => 'Kdv kuralını düzenleme', + 'Editing template "%name"' => 'Şablon "%name" düzenleme', + 'Editing variable "%name"' => 'Değişken "%name" düzenleme', + 'Email' => 'e-posta', + 'Email address' => 'Eposta adresi', + 'Email addresses' => 'E-posta adresleri', + 'Email confirmation address' => 'E-posta adresi onay', + 'Enable remote SMTP use : ' => 'Uzak SMTP kullanmayı etkinleştirme: ', + 'Enable/Disable' => 'Açık / Kapat', + 'Enabled' => 'Aktif', + 'Encryption' => 'Şifreleme', + 'Encryption :' => 'Şifreleme :', + 'End Date' => 'Son yayın Tarihi', + 'Enter here all possible attribute values.' => 'Burada tüm olası öznitelik değerleri girin.', + 'Enter here all possible feature values. To get a free text feature in product forms, don\'t add any value.' => 'Burada tüm olası özellik değerlerini girin. Serbest metin özelliği ürün formları için herhangi bir değer taşımayan.', + 'Enter here the attribute name in the default language (%language_name)' => 'Öznitelik adı varsayılan dili (%language_name) buraya girin', + 'Enter here the category name in the default language (%title)' => 'Varsayılan dili (%title) kategori adını buraya girin', + 'Enter here the content name in the default language (%title)' => 'Buraya girdiğiniz içerik adı varsayılan dili (%title)', + 'Enter here the currency name in the default language (%title)' => 'Burada varsayılan dili (%title) para birimi adı girin', + 'Enter here the feature name in the default language (%title)' => 'Buraya girdiğiniz içerik adı varsayılan dili (%title)', + 'Enter here the feature value as free text' => 'Burada özellik değeri boş metin olarak girin', + 'Enter here the folder name in the default language (%title)' => 'Burada varsayılan dili (%title) klasör adını girin', + 'Enter here the product name in the default language (%title)' => 'Burada girmek belgili tanımlık ürün ad varsayılan dili (%title)', + 'Enter here the product price in %title' => 'Burada %title içinde ürün fiyat girin', + 'Enter here the product reference' => 'Burada ürün başvurusunu girin', + 'Enter here the product stock' => 'Burada ürün stoğunu girin', + 'Enter here the product tax price in %title' => 'Burada %title içinde ürün Kdv li fiyat girin', + 'Enter here the product weight, in Kilogrammes' => 'Ürün ağırlığı kilogram buraya girin', + 'Enter here the template name in the default language (%title)' => 'Burada varsayılan dili (%title) şablonu adı girin', + 'Enter here the value in the current edit language (%language_name)' => 'Burada girmek belgili tanımlık değer geçerli düzen dilde (%language_name)', + 'Enter here the value in the current edit language (%title)' => 'Burada girmek belgili tanımlık değer geçerli düzen dilde (%title)', + 'Enter here the value in the default language (%title)' => 'Burada girmek belgili tanımlık değer varsayılan dili (%title)', + 'Enter information in the default language (%title)' => 'Varsayılan dili (%title) bilgilerini girin', + 'Enter new accessory position' => 'Yeni Aksesuar konumu girin', + 'Enter new attribute position' => 'Yeni öznitelik konumu girin', + 'Enter new brand position' => 'Yeni marka konumu girin', + 'Enter new category position' => 'Yeni Kategori konumu girin', + 'Enter new content position' => 'Yeni içerik konumu girin', + 'Enter new currency position' => 'Yeni para birimi konumu girin', + 'Enter new export category position' => 'Yeni ihracat Kategori konumu girin', + 'Enter new export position' => 'Yeni verme konumu girin', + 'Enter new feature position' => 'Yeni özelliği konumu girin', + 'Enter new folder position' => 'Yeni klasör konumu girin', + 'Enter new import category position' => 'Yeni ihracat Kategori konumu girin', + 'Enter new import position' => 'Yeni verme konumu girin', + 'Enter new module hook position' => 'Yeni modülü kanca konumu girin', + 'Enter new module position' => 'Yeni modül pozisyonu girin', + 'Enter new product position' => 'Yeni ürün konumu girin', + 'Enter new value position' => 'Yeni değer konumu girin', + 'Enter one or more IP V4 addresses separated by ";". Leave empty to display logs for all IP addresses' => 'Ayrılmış bir veya daha fazla IP V4 adresleri girin ";". Tüm IP adresleriyle ilgili günlüklerini görüntülemek için boş bırakın', + 'Enter one or more file names without path separated by ";". Use "!" before a file name to exclude it. Use "*" to activate logs for all files.' => 'Ayrılmış yol içermeyen bir veya daha fazla dosya adını girin ";". Kullanım "!" daha önce bu dışlamak için bir dosya adı. Kullanım "*" tüm dosyalar için günlükleri etkinleştirmek için.', + 'Enter quantity' => 'Miktarı girin', + 'Error' => 'Hata', + 'Errors' => 'Hatalar', + 'Example :' => 'Örnek :', + 'Exchange rate' => 'Döviz Kuru', + 'Existing combinations will be deleted. Do you want to continue ?' => 'Varolan kombinasyonları-ecek var olmak silmek. Devam etmek istiyor musunuz?', + 'Expiration date' => 'Son kullanma tarihi', + 'Expiration date * :' => 'Son kullanma tarihi *:', + 'Expired' => 'Süresi Bitmiş', + 'Export' => 'Dışa aktarma', + 'Exports' => 'dışa aktarır', + 'Failed to get converted prices. Please try again.' => 'Dönüştürülen fiyatlarla almak başarısız oldu. Lütfen yeniden deneyin.', + 'Failed to get prices. Please try again.' => 'Fiyatlarla almak başarısız oldu. Lütfen yeniden deneyin.', + 'Feature Name' => 'Özellik adı', + 'Feature information' => 'Özellik bilgileri', + 'Feature title' => 'Özellik başlığı', + 'Feature value' => 'Özellik değeri bilgileri', + 'Feature value for this product' => 'Bu ürün için özellik değeri', + 'Feature values' => 'Özellik değeri bilgileri', + 'Features' => 'Özellikler', + 'File' => 'Dosya', + 'File names' => 'Dosya adı', + 'Filename' => 'Dosya Adı', + 'Filter by hook name:' => 'Kanca isme göre filtreleyin:', + 'First Name' => 'Adı', + 'First name' => 'Adınız', + 'Firstname' => 'Adınız', + 'Flush the Thelia internal cache' => 'Thelia iç önbelleği temizle', + 'Flush the assets cache directory' => 'Floş varlıkları önbellek dizini', + 'Flush the images and documents cache' => 'Resim ve Belge Önbelleği Temizle', + 'Folder' => 'Klasör', + 'Folder created on %date_create. Last modification: %date_change' => 'Bir klasör %date_create üzerinde oluşturulur. Son değişiklik: %date_change', + 'Folder title' => 'Klasör Başlığı', + 'Folders' => 'klasör', + 'Folders in %fold' => '%fold klasörlerde', + 'For prices in %currency' => '%currency için fiyatları', + 'Format: %fmt' => 'Formatı: %fmt ', + 'Format: %fmt, e.g. %date' => 'Biçim: %fmt, örneğin %date', + 'Free shipping for methods :' => 'Ücretsiz nakliye yöntemleri için:', + 'Free shipping to countries :' => 'Ücretsiz ülkeye gönderim:', + 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.' => 'French 19.6% VAT is a tax which add a 19.6% tax to the product price.', + 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).' => 'French 19.6% VAT with ecotax is the applicance of the ecotax (on the product price) then the applicance of the 19.6% tax (on the product price + the ecotax amount).', + 'From' => 'Başlangıç Tarihi', + 'Front Office' => 'Ön Büro', + 'Front-office template you want to translate' => 'Çevirmek için ön büro şablonu', + 'Front-office templates' => 'Ön büro şablonları', + 'General' => 'Genel', + 'General configuration' => 'Genel Yapılandırma', + 'General description' => 'Genel açıklama', + 'General tools' => 'Genel Araçlar', + 'Get more information about this module' => 'Bu modül hakkında daha fazla bilgi almak', + 'Go to administration home' => 'Ana Sayfa Yönetimi\'ne git', + 'Go to first page' => 'İlk sayfaya git', + 'Go to last page' => 'Son sayfaya git', + 'Go to next page' => 'Sonraki sayfaya git', + 'Go to previous page' => 'Önceki sayfaya git', + 'H:i:s' => 'H:i:s', + 'HTML version of this message' => 'Bu ileti HTML sürümü', + 'Hide empty hook' => 'Boş kanca gizle', + 'Home' => 'Ana sayfa', + 'Hook positions' => 'Kanca pozisyonlar', + 'Hooks' => 'Kanca (modül)', + 'Host' => 'Ana bilgisayar', + 'Host :' => 'Ana bilgisayar:', + 'ID' => 'ID [Sıra No]', + 'IP Addresses' => 'IP adresleri', + 'ISO 4217 Code' => 'ISO 4217 kodu', + 'ISO 4217 code' => 'ISO 4217 kodu', + 'ISO 639 Code' => 'ISO 639 kod', + 'ISO Code' => 'ISO kodu', + 'If a translation is missing or incomplete :' => 'Bir çeviri eksik veya tamamlanmamış ise:', + 'If yes, redirections through Redirect::exec() will be displayed as links' => 'Evet, yönlendirmeler üzerinden yönlendirme:: exec() bağlantılar olarak görüntülenir', + 'If you change the template, all the prices will be reset and you have to configure them again.' => 'Şablonu değiştirirseniz, tüm fiyatlar sıfırlanır ve bunları yeniden yapılandırmanız gerekir.', + 'If you want to translate core components of Thelia : core, install, default modules or templates.' => 'Thelia temel bileşenleri çevirmek istiyorsanız: çekirdek, yüklemek, varsayılan ölçü birimi veya şablonlar.', + 'If your aim is just to translate text for your website, please use the user mode.
    ' => 'Eğer amacınız sadece metin için Web sitesi çevirme, lütfen kullanıcı modu kullanın.
    ', + 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.' => 'Il seems that this string contains a Smarty variable ($). If \'s the case, it cannot be transleted properly.', + 'Image information' => 'Resim bilgileri', + 'Image+file+not+found' => 'Resim + dosya + değil + bulundu', + 'Images' => 'Resim dosyası', + 'Import' => 'İçe aktarma', + 'Import this file' => 'Bu dosyayı almak', + 'Imports' => 'İthalat', + 'Impossible to change active flag. Please contact your administrator or try later' => 'Etkin bayrak değiştirmek mümkün değil. Lütfen yöneticinize başvurun veya daha sonra deneyin', + 'Impossible to change default country. Please contact your administrator or try later' => 'Varsayılan ülkeyi değiştirmek mümkün değil. Lütfen yöneticinize başvurun veya daha sonra deneyin', + 'Impossible to change default languages. Please contact your administrator or try later' => 'Varsayılan ülkeyi değiştirmek mümkün değil. Lütfen yöneticinize başvurun veya daha sonra deneyin', + 'Impossible to change official hook. Please contact your administrator or try later' => 'Resmi kanca değiştirmek mümkün değil. Lütfen yöneticinize başvurun veya daha sonra deneyin', + 'In order to manges your shop taxes you can manage' => 'In order to manges your shop taxes you can manage', + 'In page' => 'Sayfa içinde', + 'In pages:' => 'Sayfalar:', + 'Inactive' => 'Etkin olmayan', + 'Included countries' => 'Dahil ülkeler', + 'Information on this hook' => 'Bu kanca hakkında bilgi', + 'Install !' => 'Yükleyin!', + 'Install or update a module' => 'Yükleme veya bir modül güncelleme', + 'Invoice' => 'Fatura', + 'Invoice and Delivery' => 'Fatura ve teslimat', + 'Invoice date' => 'Fatura tarihi', + 'Invoice informations' => 'Fatura bilgileri', + 'Invoice reference' => 'Fatura referans', + 'It\'s strongly recommended to use our translation platform' => 'Kuvvetle bizim çeviri platformu kullanmak için tavsiye edilir', + 'Items to translate' => 'Öğeleri çevirmek için', + 'Keep attention that in translating you can override the resource translations.
    ' => 'Devam dikkat çeviri içinde kaynak çevirileri geçersiz kılabilirsiniz.
    ', + 'Kg' => 'Kg', + 'Label' => 'Etiket', + 'Language name' => 'Dil adı', + 'Language title' => 'Dil başlığı', + 'Languages' => 'Diller', + 'Languages & URLs' => 'Diller ve URL\'ler', + 'Languages management' => 'Diller yönetimi', + 'Last Name' => 'Soyadınız', + 'Last name' => 'Soyadı', + 'Last order amount' => 'Son sipariş miktarı', + 'Lastname' => 'Soyad', + 'Leave empty to keep current password' => 'Geçerli parola tutmak için boş bırakın', + 'Locale' => 'Bölgesel ayar', + 'Log lines format' => 'Günlük satırlarını biçimlendirmek', + 'Log lines header format. You may use the following variables: ' => 'Günlük satırlarını üstbilgi biçimi. Aşağıdaki değişkenleri kullanabilirsiniz: ', + 'Login' => 'Giriş yap', + 'Logout' => 'Oturum kapat', + 'Long description :' => 'Uzun Açıklama :', + 'Mailing system' => 'Posta sistemi', + 'Mailing templates' => 'E-posta şablonları', + 'Manage attributes included in this product template' => 'Bu ürün şablonun içerdiği öznitelikleri yönetmek', + 'Manage features included in this product template' => 'Bu ürün şablonun içerdiği özelliklerini yönetme', + 'Manage hooks' => 'Bağlantıları yönet', + 'Manage its hooks' => 'Modül ekleri yönetme', + 'Manage module rights' => 'Modül haklarını yönetme', + 'Manage modules' => 'Modüllerini yönetmek', + 'Manage modules attachements' => 'Modül ekleri yönetme', + 'Manage resource rights' => 'Kaynak haklarını yönetme', + 'Manage taxes' => 'Kdv yönetmek', + 'Manage the tax rule taxes appliance order' => 'Manage the tax rule taxes appliance order', + 'Maximum usage count :' => 'Maximum usage count :', + 'Message created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan profili. Son değişiklik: %date_change', + 'Message data' => 'İleti verileri', + 'Message level' => 'İleti düzeyi', + 'Messages which have a level greater or equal to the selected level will be added to the log destinations. ' => 'Seçili düzey ya da büyük bir seviye olan iletileri günlük hedeflere eklenecektir. ', + 'Minimum required Thelia version' => 'Minimum gerekli Thelia sürümü', + 'Module' => 'Modülller', + 'Module %mod: %error' => 'Modül %mod: %error', + 'Module access rights' => 'Modülü erişim hakları', + 'Module code' => 'Modül kodu', + 'Module component' => 'Modül bileşen', + 'Module created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan ürün. Son değişiklik: %date_change', + 'Module detailed information' => 'Modül ayrıntılı bilgi', + 'Module file' => 'Modül dosyası', + 'Module name' => 'Modül ismi', + 'Module type' => 'Modül türü', + 'Module you want to translate' => 'Çevirmek istediğiniz modülü', + 'Modules' => 'Modüller', + 'Modules attachments' => 'Modülleri ekler', + 'More information about ISO 4217' => 'ISO 4217 hakkında daha fazla bilgi', + 'More pages after' => 'Sonra daha fazla sayfa', + 'More pages before' => 'Önce daha fazla sayfa', + 'Name' => 'Ad', + 'Namespace of main class' => 'Namespace ana sınıfı', + 'New' => 'Yeni', + 'No' => 'Hayır', + 'No Folders found' => 'Hiçbir klasör bulunamadı', + 'No administration profile defined yet. Click the + button to create one.' => 'Henüz tanımlanmış yönetim profil yok. Tıklatın oluşturmak için + düğmesine.', + 'No area defined with this id' => 'Bu kimliği ile tanımlanan hiçbir alanı', + 'No attributes.' => 'Hiçbir Öznitelikleri.', + 'No available content in this folder' => 'Bu klasördeki mevcut içerik', + 'No available product in this category' => 'Bu kategorideki kullanılabilir hiçbir ürün', + 'No available value for this attribute' => 'Bu öznitelik için kullanılabilir bir değer', + 'No brand' => 'Hiçbir marka', + 'No brand has been created yet. Click the + button to create one.' => 'Hiçbir marka henüz oluşturulmamış . Tıklatın oluşturmak için + düğmesine.', + 'No categories found' => 'Bulunan kategori yok', + 'No country has been created yet. Click the + button to create one.' => 'Hiçbir marka henüz oluşturulmamış . Tıklatın oluşturmak için + düğmesine.', + 'No coupon is currently defined. Please use the (+) button above to create your first coupon.' => 'Hayır kupon geçerli olarak tanımlanmış. Lütfen kullanın (+) düğmesini ilk kupon oluşturmak için yukarıdaki.', + 'No currency has been created yet. Click the + button to create one.' => 'Hiçbir marka henüz oluşturulmamış . Tıklatın oluşturmak için + düğmesine.', + 'No description for this hook' => 'Bu kanca için hiç açıklama', + 'No document' => 'Belge yok', + 'No folders found' => 'Hiçbir klasör bulunamadı', + 'No hooks has been created yet. Click the + button to create one.' => 'Hiçbir marka henüz oluşturulmamış . Tıklatın oluşturmak için + düğmesine.', + 'No logo image' => 'Logo resim yok', + 'No mailing template has been created yet. Click the + button to create one.' => 'Posta şablon henüz oluşturulmamış demektir. Tıklatın oluşturmak için + düğmesine.', + 'No module of this type was found.' => 'Bu tip hiç bir modülü bulunamadı.', + 'No orders fo this customer.' => 'Hayır fo bu müşteri siparişleri.', + 'No product attribute has been created yet. Click the + button to create one.' => 'Ürün özniteliği yok henüz oluşturulmamış demektir. Tıklatın oluşturmak için + düğmesine.', + 'No product feature has been created yet. Click the + button to create one.' => 'Ürün özniteliği yok henüz oluşturulmamış demektir. Tıklatın oluşturmak için + düğmesine.', + 'No product template has been created yet. Click the + button to create one.' => 'Ürün özniteliği yok henüz oluşturulmamış demektir. Tıklatın oluşturmak için + düğmesine.', + 'No sale has been created yet. Click the + button to create one.' => 'Satış yok henüz oluşturulmamış demektir. Tıklatın oluşturmak için + düğmesine.', + 'No shipping zone attached to this module, click here to attach one' => 'Bir tane eklemek için buraya tıklayın bu birime bağlı hiçbir nakliye bölgesi', + 'No shipping zone defined yet. Click the + button to create one.' => 'Henüz tanımlanmış hiçbir nakliye bölgesi. Tıklatın oluşturmak için + düğmesine.', + 'No value has been created yet. Click the + button to create one.' => 'Hiçbir değer Henüz oluşturuldu. Bir tane oluşturmak için + düğmesine tıklayın.', + 'None' => 'Yok', + 'None defined' => 'Hiçbiri tanımlanan', + 'N° ISO' => 'N ° ISO', + 'OK' => 'TAMAM', + 'Official' => 'Ofis Resmi', + 'Online' => 'Çevrimiçi', + 'Oops! An Error Occurred' => 'Oops! Bir hata oluştu', + 'Or' => 'Veya', + 'Order %ref - ID %id' => '%ref - sipariş kimliği %id', + 'Order details' => 'Sipariş detayı', + 'Order n°' => 'Sipariş n °', + 'Order status:' => 'Sipariş Durumu:', + 'Ordered products' => 'Sipariş edilen ürünler', + 'Orders' => 'siparişler', + 'Originating file line number ' => 'Kaynak dosya satır numarası ', + 'Originating file name' => 'Kaynak dosya adı', + 'Originating function name ' => 'Kaynak işlev adı ', + 'Other addresses' => 'Diğer adresleri', + 'PDF template you want to translate' => 'Çevirmek istediğiniz PDF şablonu', + 'PDF templates' => 'PDF şablonları', + 'PDF | Invoice' => 'PDF | Fatura', + 'PDF | Purchase order' => 'PDF | Satınalma siparişi', + 'Page not found' => 'Hiçbir sayfa bulunamadı', + 'Parameters' => 'Parametreler', + 'Parse template' => 'Şablon ayrıştırma', + 'Password' => 'Parola', + 'Password :' => 'Şifre :', + 'Payment information' => 'Ödeme bilgileri', + 'Payment module' => 'Ödeme modülü', + 'Payment modules' => 'Ödeme modülü', + 'Percent Discount' => 'Yüzde indirim', + 'Period' => 'Dönem', + 'Phone' => 'Telefon', + 'Phone & Fax' => 'Telefon & Faks', + 'Phone number' => 'Telefon numarası', + 'Please enter the date using the %fmt format' => 'Bir tarih biçimi belirtmek için teşekkür ederiz %fmt', + 'Please retry' => 'Lütfen yeniden deneyin', + 'Please save this coupon first to define coupon conditions' => 'Lütfen ilk kupon koşulları tanımlamak için bu kupon kaydedin', + 'Please select a condition' => 'Lütfen bir koşul seçin', + 'Please select a coupon type' => 'Lütfen bir kupon türü seçin', + 'Please select another condition' => 'Lütfen başka bir koşul seçin', + 'Please select at least one category.' => 'Lütfen en az bir kategori seçin.', + 'Please select items to translate' => 'Lütfen çevirmek için öğeleri seçin', + 'Please select one or more categories which contains some products' => 'Lütfen bazı ürünleri içeren bir veya daha fazla kategori seçin', + 'Please select the B.O. template to translate' => 'Lütfen çevirmek için Bo şablon seçin', + 'Please select the E-mail template to translate' => 'Lütfen çevirmek için e-posta şablonu seçin', + 'Please select the F.O. template to translate' => 'Lütfen çevirmek için F.O. şablon seçin', + 'Please select the PDF template to translate' => 'Lütfen çevirmek için PDF şablonu seçin', + 'Please select the module component' => 'Lütfen modülü bileşeni seçin', + 'Please select the module to translate' => 'Lütfen çevirmek için modül seçin', + 'Please select your editing mode :' => 'Lütfen düzenleme modunuzu seçin:', + 'Please select...' => 'Lütfen seçiniz...', + 'Please wait, loading' => 'Yükleniyor lütfen bekleyin', + 'Please wait, loading products list' => 'Ürün listesi yükleniyor lütfen bekleyin', + 'Port' => 'Port', + 'Port :' => 'Port :', + 'Position' => 'Posizyon', + 'Postage' => 'Posta', + 'Postscriptum' => 'sonraki', + 'Preview' => 'önizleme', + 'Preview HTML' => 'Önizleme HTML', + 'Preview category page' => 'Önizleme kategori sayfası', + 'Preview folder page' => 'Önizleme klasörü sayfası', + 'Preview product page' => 'Önizleme ürün sayfası', + 'Preview text' => 'Önizleme metni', + 'Price' => 'Fiyat', + 'Price (%currency)
    w/ taxes' => 'Fiyat (%currency) < br / > w / Kdv', + 'Price (%currency)
    w/o taxes' => 'Fiyat (%currency) < br / > w / Kdv', + 'Price excl. taxes' => 'Kdv Hariç Fiyat', + 'Price incl. taxes' => 'Kdv Dahil Fiyat ', + 'Pricing' => 'fiyatlandırma', + 'Product' => 'ürün', + 'Product Attributes' => 'Ürün özellikleri', + 'Product EAN Code' => 'Ürün EAN kodu', + 'Product Features' => 'Ürün özellikleri', + 'Product accessories' => 'Ürün aksesuarları', + 'Product attribute selection' => 'Ürün özellik seçimi', + 'Product attributes' => 'Ürün özellikleri', + 'Product catalog configuration' => 'Ürün katalog yapılandırma', + 'Product created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan ürün. Son değişiklik: %date_change', + 'Product features' => 'Ürün özellikleri', + 'Product price' => 'Ürün fiyatı', + 'Product price including taxes' => 'Ürün Fiyatı kdv hariç', + 'Product stock' => 'Stok ürünler', + 'Product tax price' => 'Ürün Kdv fiyat', + 'Product templates' => 'Ürün şablonları', + 'Product title' => 'Ürün başlığı', + 'Product weight' => 'Ürün ağırlığı', + 'Product\'s attributes included in this sale operation' => 'Bu satış işlemi dahil ürün özellikleri', + 'Products' => 'ürün', + 'Products are :' => 'Ürünler şunlardır:', + 'Products in %cat' => '%cat ürünleri', + 'Products selection' => 'Ürün seçimi', + 'Profil' => 'Profil', + 'Profile' => 'Profil', + 'Profile code' => 'Profil kodu', + 'Profile created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan profili. Son değişiklik: %date_change', + 'Profiles' => 'Profiller', + 'Promotion' => 'Promosyon', + 'Provides free shipping' => 'Ücretsiz nakliye sağlar', + 'Published by OpenStudio' => 'OpenStudio tarafından Yayınlandı', + 'Purpose' => 'Amaç', + 'Put module in hook' => 'Modülü kanca koymak', + 'Quantity' => 'Adet', + 'Quickly create combinations using the combination builder' => 'Hızlı bir şekilde birlikte Oluşturucu\'yu kullanarak kombinezonları yaratın', + 'Rate' => 'Oranı', + 'Read module documentation' => 'Modülü belgelerini okuyun', + 'Read the documentation of this module' => 'Bu modül belgelerini okuyun', + 'Redefine the text globally. Every text will be translated with this translation, except if there is a translation for this resource.' => 'Metni genel olarak yeniden tanımlayın. Her metin ile bu kaynak için bir çeviri olup olmadığını dışında bu çeviri, tercüme edilecektir.', + 'Redefine the text only for this resource.' => 'Bu kaynak için yalnızca metin yeniden tanımlayın.', + 'Reference' => 'referans', + 'Registration date' => 'Kayıt tarihi', + 'Related content' => 'İlgili içerik', + 'Remove a module from a hook' => 'Bir modül bir kanca kaldırmak', + 'Remove an accessory' => 'Bir aksesuar kaldır', + 'Remove associated folder' => 'İlişkili klasör kaldırma', + 'Remove attribute' => 'Özniteliğini kaldırmak', + 'Remove country' => 'Ülke kaldırmak', + 'Remove feature' => 'Özellik kaldırma', + 'Remove from all product templates' => 'Tüm ürün şablonlardan kaldırmak', + 'Remove from category' => 'Kategoriden kaldırma', + 'Remove from selected categories' => 'Seçili kategorilerini kaldırma', + 'Remove related content' => 'İlgili içeriği kaldırma', + 'Remove selected values' => 'Seçili değerleri kaldırma', + 'Remove the product from this category' => 'Ürün bu kategoriden kaldırma', + 'Remove this attribute from all product templates' => 'Bu öznitelik tüm ürün şablonlardan kaldırmak', + 'Remove this feature from all product templates' => 'Bu özellik tüm ürün şablonlardan kaldırmak', + 'Remove zone' => 'Bölgeyi kaldırmak', + 'Required modules' => 'Gerekli modülleri', + 'Reset sale status for all products' => 'Tüm ürünler için satış durumu Sıfırla', + 'Resource' => 'Kaynak', + 'Resource access rights' => 'Kaynak erişim hakları', + 'Resources' => 'Kaynaklar', + 'Rights' => 'Haklar', + 'SEO' => 'S E O', + 'Sale' => 'Satış', + 'Sale configuration' => 'Satılık yapılandırma', + 'Sale created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan profili. Son değişiklik: %date_change', + 'Sale operation description' => 'Satış işlemi açıklama', + 'Sale operation features' => 'Satış işlemi özellikleri', + 'Sale price (%currency)
    w/ taxes' => 'Satış Fiyatı (%currency) < br / > w / vergi', + 'Sale price (%currency)
    w/o taxes' => 'Satış Fiyatı (%currency) < br / > w / vergi', + 'Sale price incl. taxes' => 'Satış fiyatı dahil Kdv', + 'Sales management' => 'Satış Yönetimi', + 'Save' => 'kaydet', + 'Save and close' => 'Kaydet ve kapat', + 'Save chages' => 'Save chages', + 'Save changes' => 'Save chages', + 'Save this address' => 'Bu adresi Kaydet', + 'Save this condition' => 'Bu koşulu kaydetmek', + 'Search' => 'Arama', + 'Search a module' => 'Bir modül arama', + 'Search for \'%term\'' => '\'%term\' için arama', + 'Search on Thelia Modules' => 'Arama Thelia modülleri', + 'Secure key' => 'Güvenli anahtar', + 'Select' => 'Seç', + 'Select a category and click (+) to add it to the additional category list' => 'Bir kategori seçin ve (+) ek Kategori listesine eklemek için tıklatın', + 'Select a category to get its products' => 'Ürünleri almak için bir kategori seçin', + 'Select a category...' => 'Bir kategori seç...', + 'Select a content and click (+) to add it to this category' => 'Bir içeriği seçin ve bu kategoriye eklemek için (+) tıklatın', + 'Select a content and click (+) to add it to this product' => 'Bir içeriği seçin ve bu ürün eklemek için (+) tıklatın', + 'Select a feature and click (+) to add it to this template' => 'Bir özellik seçin ve bu şablona eklemek için (+) tıklatın', + 'Select a feature...' => 'Bir özellik seçin...', + 'Select a folder and click (+) to add it to the additional folder list' => 'Bir klasör seçin ve (+) ek klasör listesine eklemek için tıklatın', + 'Select a folder content...' => 'Klasör içeriği seçin...', + 'Select a folder to get its content' => 'İçeriğini almak için bir klasör seçin', + 'Select a folder...' => 'Bir klasör seçin...', + 'Select a product and click (+) to add it as an accessory' => 'Bir ürün seçin ve aksesuar olarak eklemek için (+) tıklayın', + 'Select a product...' => 'Bir ürün seçin...', + 'Select a tax tule' => 'Kdv tule seçin', + 'Select a template' => 'Bir şablon seçin', + 'Select a value click (+) to add it to the combination' => 'Kasanın eklemek için bir değer seçin\'i tıklatın (+)', + 'Select an attribute and click (+) to add it to this template' => 'Bir öznitelik seçin ve bu şablona eklemek için (+) tıklatın', + 'Select an attribute and click (+) to view available values' => 'Bir öznitelik seçin ve (+) kullanılabilir değerleri görüntülemek için tıklatın', + 'Select an attribute value...' => 'Bir öznitelik değeri seçin...', + 'Select an attribute...' => 'Bir öznitelik seçin.', + 'Select attribute :' => 'Öznitelik seçin:', + 'Select attribute values to combine. You may enter a default value for some of the fields of the generated combinations.' => 'Birleştirmek için öznitelik değerleri seçin. Bazı alanları oluşturulan kombinasyon için varsayılan bir değer girebilirsiniz.', + 'Select here a template for this product' => 'Burada bu ürün için bir şablon seçin', + 'Select here the tax applicable to this product' => 'Burada bu ürün için uygun vergi seçin', + 'Select offered product :' => 'Seçin ürün teklif:', + 'Select offrered product category :' => 'Sunulan ürün kategorisi seçin:', + 'Select or deselect all products' => 'Seçin veya tümünün seçimini kaldırın', + 'Select product category :' => 'Ürün kategorisi seçin:', + 'Select the attributes values of "%title" that should be included in this sale operation.' => '"%title" Bu satış işleminde dahil edilmesi gereken öznitelikleri değerleri seçin.', + 'Select the products included in this sale operation. You can limit your selection to some product\'s attribute only, if required.' => 'Bu satış işlemi dahil ürünleri seçin. Gerekirse bazı ürün özniteliği yalnızca, seçiminize sınırlayabilirsiniz.', + 'Selected categories' => 'Seçili Kategoriler', + 'Send' => 'Gönder', + 'Send a mail to this customer' => 'Bu müşteri için bir posta göndermek', + 'Send files' => 'Dosyagönder', + 'Sequential number of log line' => 'Günlük satırı sıralı numarası', + 'Set as default tax rule' => 'Varsayılan Kdv kuralı olarak ayarla', + 'Sets the separator for the decimal point' => 'Ondalık ayırıcı ayarlar', + 'Sets the thousands separator.' => 'Kümeleri binler ayırıcısı.', + 'Shipping configuration' => 'Aktarma yapılandırması', + 'Shipping configuration of delivery module "%title"' => '"%title" teslim modülünün yapılandırmasını nakliye', + 'Shipping zone' => 'Nakliye bölgesi', + 'Shipping zone "%title"' => 'Bölge "%title" nakliye', + 'Shipping zones' => 'Nakliye bölgesi', + 'Shipping zones for this country' => 'Bu ülke için nakliye bölgeleri', + 'Shipping zones for this module' => 'Bu modül için nakliye bölgeleri', + 'Shipping zones management' => 'Nakliye bölgeleri yönetimi', + 'Short description' => 'Kısa açıklama', + 'Short description :' => 'Kısa açıklama :', + 'Show logs' => 'Göstermek günlükleri', + 'Some of your translations are not saved. Continue anyway ?' => 'Bazı çevirileriniz kaydedilmez. Yine de devam edilsin mi?', + 'Something goes wrong, please try again' => 'Bir hata oluştu, lütfen tekrar deneyin teşekkür ederim', + 'Something goes wrong, please try again.' => 'Bir hata oluştu, lütfen tekrar deneyin teşekkür ederim.', + 'Sorry, attribute ID=%id was not found.' => 'Üzgünüz, Kımlığı öznitelik =%id bulunamadı.', + 'Sorry, country ID=%id was not found.' => 'Üzgünüm, ülke kimliği =%id bulunamadı.', + 'Sorry, currency ID=%id was not found.' => 'Üzgünüz, para birimi kimliği =%id bulunamadı.', + 'Sorry, customer ID=%id was not found.' => 'Üzgünüz, müşteri kimliği =%id bulunamadı.', + 'Sorry, document ID=%id was not found.' => 'Üzgünüz, belge kimliği =%id bulunamadı.', + 'Sorry, feature ID=%id was not found.' => 'Üzgünüz, özellik kimliği =%id bulunamadı.', + 'Sorry, hook ID=%id was not found.' => 'Üzgünüz, hook ID =%id bulunamadı.', + 'Sorry, image ID=%id was not found.' => 'Üzgünüz, görüntü ID =%id bulunamadı.', + 'Sorry, message ID=%id was not found.' => 'Üzgünüz, ileti kimliği =%id bulunamadı.', + 'Sorry, module hook ID=%id was not found.' => 'Üzgünüz, modülü kanca ID =%id bulunamadı.', + 'Sorry, template ID=%id was not found.' => 'Üzgünüz, şablon kimliği =%id bulunamadı.', + 'Sorry, variable ID=%id was not found.' => 'Üzgünüm, değişken ID =%id bulunamadı.', + 'Source IP' => 'Kaynak IP', + 'Source IP :' => 'Kaynak IP :', + 'Stability' => 'İstikrar', + 'Start Date' => 'Başlangıç Yayın Tarihi', + 'Status' => 'Durum', + 'Stock' => 'Stok', + 'Store' => 'Sanal Mağaza', + 'Store address' => 'Mağaza Adresi', + 'Store configuration' => 'Mağaza Yapılandırması', + 'Street address' => 'Adresi', + 'Subtitle' => 'Alt Başlık', + 'Superadministrator' => 'Superadministrator', + 'Supported locales' => 'Desteklenen yerel ayarlar', + 'Symbol' => 'Sembol', + 'System Logs' => 'Sistem günlükleri', + 'System Logs configuration' => 'Sistem günlüklerini yapılandırma', + 'System logs' => 'Sistem günlükleri', + 'System parameters' => 'Sistem parametreleri', + 'System variables' => 'Sistem değişkenleri', + 'Tags' => 'Etiketler', + 'Tax' => 'Kdv', + 'Tax created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan profili. Son değişiklik: %date_change', + 'Tax rule created on %date_create. Last modification: %date_change' => '%date_create üzerinde oluşturulan profili. Son değişiklik: %date_change', + 'Tax rules' => 'Tax rules', + 'Tax rules are combination of different taxes.' => 'Tax rules are combination of different taxes.', + 'Taxed total' => 'Genel Toplam [Kdv dahil]', + 'Taxes' => 'Kdv', + 'Taxes define the amount of money which is added to a bought product.' => 'Taxes define the amount of money which is added to a bought product.', + 'Taxes rules' => 'Kdv kuralları', + 'Template name' => 'Tema Adı', + 'Template title' => 'Şablon Başlığı', + 'Template type' => 'Şablon Türü', + 'Templates' => 'Şablonlar', + 'Test your configuration' => 'Yapılandırmanızı sınama', + 'Text version of this message' => 'Bu ileti metin sürümü', + 'That way, Thelia community will benefit of your translations' => 'Bu şekilde, senin tercümelerin Thelia toplum yararına olacak', + 'The default pricing is used when no combination is defined.' => 'Yok kombinasyon tanımlandığında varsayılan fiyatlandırma kullanılır.', + 'The destinations processes logs to display, store or send them. You can select and configure zero, one or more destinations below.' => 'Hedefleri göstermek, saklamak ya da göndermek için günlüklerini işler. Seçin ve yapılandırın sıfır, bir veya daha fazla hedefler aşağıda.', + 'The detailed description.' => 'Ayrıntılı açıklama.', + 'The directory local/I18n does not exist or is not writable. Please fix this issue before.' => 'Dizin yerel/I18n yok veya yazılabilir değil. Lütfen önce bu sorunu düzelt.', + 'The following error message has been found: %msg' => 'Aşağıdaki hata iletisini buldu: %msg', + 'The hooks have been updated successfuly !' => 'Kanca başarıyla güncelleştirildi.', + 'The page you\'ve requested has a problem. Please contact the module developer if you were using one, or feel free to give the Thelia team a feedback on github: %url.' => 'İstediğiniz sayfada bir sorun var. Sen birini kullanıyorsanız modülü geliştiricisine başvurun ya da Thelia takım github üzerinde bir geribildirim vermek çekinmeyin: %url.', + 'The page you\'ve requested was not found. Please check the page address, and try again.' => 'İstediğiniz sayfa bulunamadı. Lütfen sayfanın adresini denetleyip yeniden deneyin.', + 'The rate from Euro (Price in Euro * rate = Price in this currency)' => 'Euro dan oranı (Euro fiyat * oranı = fiyat bu para biriminde)', + 'The selected categories :' => 'Seçili Kategoriler:', + 'The selected countries :' => 'Seçilen ülkeler:', + 'The selected customer :' => 'Seçili müşteri:', + 'The selected products :' => 'Seçili ürünleri:', + 'The server returned a "404 Not Found"' => 'Sunucu döndürülen bir "404 bulunamadı"', + 'The syntax used is identical to the PHP date() function' => 'PHP date() işlevi için kullanılan sözdizimi aynıdır', + 'Thelia Back Office' => 'Thelia Arka ofis', + 'Thelia Installation' => 'Thelia yükleme', + 'Thelia Languages' => 'Thelia dilleri', + 'Thelia Mailing System' => 'Thelia posta sistemi', + 'Thelia Mailing Templates' => 'Thelia e-posta şablonları', + 'Thelia Product Attributes' => 'Thelia ürün özellikleri', + 'Thelia Product Features' => 'Thelia ürün özellikleri', + 'Thelia Product Templates' => 'Thelia ürün şablonları', + 'Thelia Shipping configuration' => 'Thelia sevkiyat yapılandırma', + 'Thelia Shipping zones' => 'Thelia nakliye bölgeleri', + 'Thelia System Variables' => 'Thelia sistem değişkenleri', + 'Thelia caches flushing' => 'Reçeteye göre sarf Thelia önbellekleri', + 'Thelia contributions' => 'Thelia katkıları', + 'Thelia core' => 'Thelia çekirdek', + 'Thelia mailing templates' => 'Thelia e-posta şablonları', + 'Thelia product attributes' => 'Thelia ürün özellikleri', + 'Thelia product features' => 'Thelia ürün özellikleri', + 'Thelia product templates' => 'Thelia ürün şablonları', + 'Thelia support forum' => 'Thelia destek forumu', + 'Thelia system variables' => 'Thelia sistem değişkenleri', + 'There are no shipping zones attached to this module.' => 'Bu birime bağlı hiçbir nakliye bölge vardır.', + 'There is 2 kind of translations :' => '2 tür çevirileri vardır.', + 'There is currently no active module here.' => 'Hiçbir etkin modül bulunmuyor.', + 'There is currently no available attributes.' => 'There is currently no available attributes.', + 'There is currently no available features.' => 'There is currently no available features.', + 'There is no documents attached to this %type.' => 'There is no documents attached to this %type.', + 'There is no files to associate to your product. Only documents that are not visible can be selected !' => 'Orada hangi ürününüz için ilişkili olabilir dosyası yok. Yalnızca görünür olmayan belgeler seçilebilir!', + 'There is no images attached to this %type.' => 'There is no images attached to this %type.', + 'They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator.' => 'Onlar bu yöneticiye bağlı bazı yönetici vardır. Lütfen düzenleme/onları bu yönetici silmeden önce kaldırma.', + 'They are some administrator which are linked to this profile. Please edit/remove them before deleting this profile.' => 'Onlar bu profile bağlı bazı yönetici vardır. Lütfen düzenleme/onları bu profili silmeden önce kaldırma.', + 'This category contains no contents' => 'Bu kategoride hiçbir içeriği', + 'This category doesn\'t contains any products. To add a new product, click the + button above.' => 'Bu kategori herhangi bir ürün içerir değil. Yeni bir ürün eklemek için tıklatın + düğmesine yukarıda.', + 'This category has no sub-categories.' => 'Bu kategorinin alt kategorileri vardır.', + 'This category has no sub-categories. To create a new one, click the + button above.' => 'Bu kategorinin alt kategorileri vardır. Yeni bir tane oluşturmak için tıklatın + düğmesini yukarıda.', + 'This country is not included in any shipping zone' => 'Bu ülkenin her sevkiyat bölgesine dahil değildir', + 'This customer has not defined any delivery address' => 'Bu müşteri herhangi bir teslimat adresi tanımlı değil', + 'This customer has orders, and can\'t be deleted.' => 'Bu Müşterinin Siparişi Vardır Silinemez', + 'This delivery module handles all shipping zones.' => 'Bu teslim modülü tüm nakliye bölgeleri ele alır.', + 'This folder doesn\'t contains any contents. To add a new content, click the + button above.' => 'Bu klasörde herhangi bir içeriği değil var. Yeni içerik eklemek için tıklatın + düğmesine yukarıda.', + 'This folder has no sub-folders.' => 'Bu klasörün alt klasörü yok vardır.', + 'This folder has no sub-folders. To create a new one, click the + button above.' => 'Bu klasörün alt klasörü yok vardır. Yeni bir tane oluşturmak için tıklatın + düğmesini yukarıda.', + 'This is not a problem as long as you do not update this resources (Thelia, module, template).
    ' => 'Eğer güncelleme yapmak bu kaynakları (Thelia, modül, şablon) sürece bir sorun bu değil.
    ', + 'This is the code entered by your customers to use this coupon' => 'Bu kupon kullanmak için müşteriler tarafından girilen kodu budur', + 'This mailing template could not be changed.' => 'Bu posta şablonu değiştirilemedi.', + 'This module cannot be started, some files are probably missing.' => 'Bu modülü başlatılamıyor, bazı dosyalar muhtemelen kayıp.', + 'This page allows you to translate each resources of your website : Thelia, modules, templates.
    ' => 'Bu sayfa, Web sitenizin her kaynakları çevirmek izin verir: Thelia, modüller, şablonlar.
    ', + 'This product contains no accessories' => 'Bu ürün yok aksesuarları içerir', + 'This product contains no contents' => 'Bu ürünü hiçbir içeriği', + 'This product doesn\'t belong to any additional category.' => 'Bu ürün için ek herhangi bir kategoriye ait değil.', + 'This product doesn\'t belong to any additional folder.' => 'Bu ürün ek herhangi bir klasöre ait değil.', + 'This product has no combination. The default price is used. Click here to create a new combination.' => 'Bu ürün yok kombinasyon vardır. Varsayılan fiyatı kullanılır. yeni bir kombinasyon oluşturmak için burayı tıklatın.', + 'This product template does not contains any features' => 'Bu ürün şablonu özelliklerini içeren değil', + 'This shipping zone does not contains any country.' => 'Bu nakliye bölge herhangi bir ülkenin içerir değil.', + 'This template contains no attributes' => 'Bu şablon öznitelikleri içerir', + 'This template contains no features' => 'Bu şablonu herhangi özellikleri içerir', + 'This variable could not be changed.' => 'Bu değişken değiştirilemedi.', + 'This will reset the sale status of all products, and disable all active sales. Dou you really want to continue ?' => 'Bu tüm ürünler satış durumunu sıfırlamak ve tüm etkin satış devre dışı bırakın. Gerçekten devam etmek istiyor musunuz?', + 'Timeout' => 'Zaman Aşımı', + 'Timeout :' => 'Zaman aşımı:', + 'Title' => 'Başlık', + 'Title * :' => 'Başlık', + 'To' => 'Alıcı', + 'To create a new content, select an existing folder, or create a new one.' => 'Yeni içerik oluşturmak için varolan bir klasörü seçin veya yeni bir tane oluşturun.', + 'To create a new product, select an existing category, or create a new one.' => 'Yeni bir ürün yaratmak için varolan bir kategori seçin veya yeni bir tane oluşturun.', + 'To remove a value from the combination, select it and click "remove"' => 'Arada gelen bir değer kaldırmak için onu seçin ve "Kaldır" ı tıklatın', + 'To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration.' => 'Özellikleri veya öznitelikleri bu ürünü kullanmak için bir ürün şablonu seçin. \' Yönetim Yapılandırması bölümünde ürün şablonlarının tanımlayabilirsiniz.', + 'Toggle select all' => 'Tümünü seç değiştir', + 'Tools' => 'Araçlar', + 'Top level' => 'Üst düzey', + 'Top level Contents' => 'Üst düzey içeriği', + 'Top level Products' => 'Üst düzey ürünleri', + 'Top level categories' => 'Üst düzey kategoriler', + 'Top level folders' => 'Üst düzey klasörler', + 'Total' => 'Toplam', + 'Total including discount' => 'Dahil olmak üzere toplam iskonto', + 'Total without discount' => 'İndirim toplam', + 'Transaction reference' => 'İşlem başvurusu', + 'Translation' => 'Çeviri', + 'Translations' => 'Çeviri', + 'Type:' => 'Tür:', + 'Unit taxed price' => 'Birim kdv fiyatı', + 'Unit. price' => 'Birim Fiyatı', + 'Unlimited' => 'Sınırsız', + 'Unlimited number of uses' => 'Hadsiz sayı-in kullanır', + 'Unspecified' => 'Belirlenmemiş', + 'Unsupported field type \'%type\' in form-field.html' => 'Desteklenmeyen alan türü \'%type\' form-field.html', + 'Update' => 'Güncelle', + 'Update URL' => 'URL güncellemek', + 'Update an administrator' => 'Bir yöneticinin Güncelleştirmesi', + 'Update coupon' => 'Güncelleştirme kupon', + 'Update rates' => 'Güncelleme oranları', + 'Update tax rule taxes' => 'Kdv kuralı vergi güncelleştirmek', + 'Update this image' => 'Bu görüntüden güncelleştirme', + 'Usage count' => 'Usage count', + 'Usages left' => 'Usage count', + 'Use Ctrl+click to select (or deselect) more that one attribute value' => 'Daha o bir öznitelik değeri seçin (veya seçimini kaldırmak için) tıklatın + CTRL kullanın', + 'Use Ctrl+click to select (or deselect) more that one category' => 'Daha o bir kategori seçin (veya seçimini kaldırmak için) tıklatın + CTRL kullanın', + 'Use Ctrl+click to select (or deselect) more that one country' => 'Utiliser Ctrl + clic sélectionner (ou de-sélectionner) plusieurs öder dökün.', + 'Use Ctrl+click to select (or deselect) more that one item' => 'Daha o bir kategori seçin (veya seçimini kaldırmak için) tıklatın + CTRL kullanın', + 'Use Ctrl+click to select (or deselect) more that one product' => 'Daha o bir ürün seçin (veya seçimini kaldırmak için) tıklatın + CTRL kullanın', + 'Use Ctrl+click to select (or deselect) more that one shipping method' => 'Daha o bir nakliye yöntemi seçin (veya seçimini kaldırmak için) tıklatın + CTRL kullanın', + 'Use Ctrl+click to select more than one value. You can also clear selected values.' => 'Birden çok değer seçmek için tıklatın + CTRL kullanın. Ayrıca Seçili değerleri temizlemek olabilir.', + 'Use HTML message defined below' => 'Aşağıda tanımlanan kullanım HTML ileti', + 'Use Text message defined below' => 'Metin mesajı aşağıda tanımlanan kullanın', + 'Use address by default' => 'Varsayılan olarak adresini kullan', + 'Use default layout' => 'Varsayılan düzeni kullanma', + 'Use this address by default' => 'Varsayılan olarak bu adresi kullanmak', + 'User mode' => 'Kullanıcı modu', + 'Username' => 'Kullanıcı Adı', + 'Username :' => 'Kullanıcı adı :', + 'Using a domain or subdomain for each language' => 'Her dil için bir etki alanı veya alt etki alanı kullanma', + 'Valid on special offers' => 'Özel teklifler günleri geçerli', + 'Validity start date' => 'Geçerli başlangıç tarihi', + 'Value' => 'Fiyat', + 'Variable created on %date_create. Last modification: %date_change' => 'Marka %date_create yaratılmıştır. Son değişiklik: %date_change', + 'Variable name' => 'Değişken Adı', + 'Variable purpose' => 'Değişken amaç', + 'Variable value' => 'Değişken değeri', + 'Variables to inject' => 'Enjekte için değişkenleri', + 'Version %ver' => 'Sürüm %ver', + 'View' => 'Görüntüle', + 'View invoice PDF' => 'Görünüm fatura PDF', + 'View only missing translations.' => 'Sadece eksik çeviriler görüntüleyin.', + 'View purchase order as PDF' => 'PDF olarak satınalma siparişi görüntüle', + 'View shop' => 'Görünüm Dükkanı', + 'View site' => 'Siteyi Gör', + 'View this product in a new page' => 'Bu ürün yeni bir sayfa olarak görüntülemek', + 'Virtual product' => 'Sanal Ürün / Hizmet', + 'Visibility' => 'Görünütü', + 'Warning' => 'UYARI', + 'Web site' => 'Web sitesi', + 'Weight' => 'Ağırlık', + 'Weight
    (Kg)' => 'Ağırlık < br />(Kg)', + 'Welcome' => 'Hoşgeldiniz', + 'Welcome to Thelia administration !' => 'Thelia Yönetim için hoş geldiniz!', + 'Yes' => 'EVET', + 'You can attach here some content to this category' => 'İşte bu kategoriye bazı içerik eklemek', + 'You can attach here some content to this product' => 'Burada bu ürün için bazı içerik eklemek', + 'You can attach this product to more categories in the details tab.' => 'Daha fazla kategori Ayrıntılar sekmesinde bu ürün ekleyebilirsiniz.', + 'You can change attributes and their positions in the attributes configuration page.' => 'Öznitelikleri ve öznitelikleri yapılandırma sayfa konumlarını değiştirebilirsiniz.', + 'You can change feature and their positions in the features configuration page.' => 'Özellik ve konumlarını özellikleri yapılandırma sayfasında değiştirebilirsiniz.', + 'You can change template attributes and their positions in the template configuration page.' => 'Şablon öznitelikleri ve konumlarını şablonu yapılandırma sayfasında değiştirebilirsiniz.', + 'You can change templates features and their positions in the template configuration page.' => 'Şablon öznitelikleri ve konumlarını şablonu yapılandırma sayfasında değiştirebilirsiniz.', + 'You can change the default category (%title) in the "General" tab.' => '"Genel" sekmesinde varsayılan Kategori (%title) değiştirebilirsiniz.', + 'You can change the default folder (%title) in the "General" tab.' => '"Genel" sekmesinde varsayılan klasörü (%title) değiştirebilirsiniz.', + 'You can define here a specific price offset for each of the shop currencies, as a percentage or a constant amount, depending on the selected offset type.' => 'Her biri bir yüzde veya seçilen mahsup türüne bağlı olarak sabit bir tutar olarak dükkanı para birimleri için belirli fiyatı mahsup hesabı burada tanımlayabilirsiniz.', + 'You can\'t delete this administrator' => 'Bu yönetici silemezsiniz', + 'You can\'t delete this profile' => 'Sen cant\'silmek bu profili', + 'You don\'t have any export' => 'Herhangi bir ihracat yok', + 'You don\'t have any import' => 'Herhangi bir ihracat yok', + 'You have no orders for the moment.' => 'Şu an için hiçbir emir aldım.', + 'You have no registred customers for the moment.' => 'Şu an için hiçbir kayıtlı müşteriler var.', + 'You may also quickly create combinations from products attributes using the Combination Builder.' => 'Hızla Kombinasyonu Builder kullanarak ürünleri özniteliklerden kombinasyonları oluşturmak.', + 'Your current IP address is %ip' => 'Geçerli IP adresiniz %ip olduğunu', + 'Your email' => 'E-Posta adresiniz', + 'Your module should be packaged in a zip file.' => 'Modülünüzün bir ZIP dosya olarak paketlenmiş.', + 'Your search is too short' => 'Aramanız çok kısadır', + 'Your template define new hooks' => 'Şablonunuzu tanımlamak yeni kanca', + 'Your template does not support this hooks' => 'Şablonunuzu does değil çekmek bu kanca', + 'Your template is clean. No missing hooks and no new hooks.' => 'Şablonunuzu temizdir. Hiçbir eksik ve hiçbir yeni kancalar kanca.', + 'Zip code' => 'Posta Kodu', + 'Zone name' => 'Bölge adı', + 'activate' => 'etkinleştirmek', + 'activate %title module' => '%title modül devre dışı bırakma', + 'activate hook' => 'kanca etkinleştirmek', + 'activation' => 'etkinleştirme', + 'all' => 'tüm', + 'and' => 've', + 'caption' => 'resim yazısı', + 'classic modules' => 'Klasik modüller', + 'code' => 'kod', + 'company' => 'sirket', + 'customer ref' => 'Müşteri Ürün kodu', + 'd-m-Y' => 'd-m-Y', + 'date in yyyy-mm-dd format' => 'yyyy-aa-gg biçiminde tarih', + 'deactivate' => 'devre dışı', + 'deactivated' => 'devre dışı', + 'deactivation' => 'devre dışı bırakma', + 'delete document' => 'belgeyi sil', + 'delete image' => 'Resmi Sil', + 'download' => 'indirmek', + 'eg: . or ,' => 'Örneğin:. veya,', + 'email' => 'E-posta', + 'en_US' => 'en_US', + 'firstname & lastname' => 'firstname & lastname', + 'hour in hh:mm:ss format' => 'Saat snsn biçimde', + 'last order' => 'Son Sipariş', + 'long description' => 'Uzun Açıklama', + 'none' => 'hiçbiri', + 'ok' => 'Tamam', + 'on' => 'Açık', + 'or' => 'VEYA', + 'order amount' => 'sipariş miktarı', + 'orders for this customer' => 'Bu müşteri için sipariş', + 'pdf' => 'PDF', + 'permanent discount' => 'kalıcı indirim (yüzde) olarak', + 'profile' => 'profil', + 'ref.:' => 'Ref.:', + 'reverse' => 'geriye doğru', + 'short description' => 'Kısa açıklama', + 'tax rules' => 'Kdv kuralları', + 'taxes' => 'Kdv', + 'title' => 'Başlık', + 'tracking reference' => 'tracking reference', + 'version' => 'Sürüm', + 'warning' => 'uyarı', + 'you can combine taxes in tax rules and chose if they are applied one after the other or at the same time : it allows to apply taxes on an already taxed price or not.' => 'Bir vergi daha önceki vergi hesaplanması sonucu uygulanan vergilerin tek ürün fiyatına uygulanan vergi kuralları ve vergi kurallarını inşa edebilirsiniz', +]; diff --git a/templates/backOffice/default/I18n/uk_UA.php b/templates/backOffice/default/I18n/uk_UA.php new file mode 100644 index 00000000..fdb9c4c6 --- /dev/null +++ b/templates/backOffice/default/I18n/uk_UA.php @@ -0,0 +1,21 @@ + 'Активний', + 'An unknow error happend' => 'Сталася невідома помилка', + 'Associate documents' => 'Пов\'язані документи', + 'Associate images' => 'Повязані зображення', + 'Back Office' => 'Панель керування', + 'Brands' => 'Бренди', + 'Category' => 'Категорія', + 'Cellphone' => 'Мобільний телефон', + 'Content' => 'Контент', + 'Decimal places' => 'Десяткові розряди', + 'Delivery' => 'Доставка', + 'Disabled' => 'Відключено', + 'Errors' => 'Помилки', + 'First Name' => 'Ім\'я', + 'Folder' => 'Каталог', + 'Front Office' => 'Фронт-Офіс', + 'Hooks' => 'Хуки', +]; diff --git a/templates/backOffice/default/I18n/zh_CN.php b/templates/backOffice/default/I18n/zh_CN.php new file mode 100644 index 00000000..fa9e354f --- /dev/null +++ b/templates/backOffice/default/I18n/zh_CN.php @@ -0,0 +1,13 @@ + '默认', + '%count more...' => '%c更多', + '(edit)' => '(编辑)', + 'Action' => '动作', + 'Actions' => '执行', + 'Active' => '激活', + 'An unknow error happend' => '发生未知错误', + 'Associate documents' => '关联文档', + 'Associate images' => '关联图像', +]; diff --git a/templates/backOffice/default/LICENSE.txt b/templates/backOffice/default/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/templates/backOffice/default/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/templates/backOffice/default/Readme.md b/templates/backOffice/default/Readme.md new file mode 100644 index 00000000..1fdff669 --- /dev/null +++ b/templates/backOffice/default/Readme.md @@ -0,0 +1,18 @@ +Readme +====== + +## This is the repository of Thelia default backoffice template. All the pull requests on this repo will be ignored. +### If you want to create a project, please take a look at [thelia/thelia-project](https://github.com/thelia/thelia-project) +### If you want to contribute to Thelia, please take a look at [thelia/thelia](https://github.com/thelia/thelia) + +Thelia +------ +[![Build Status](https://travis-ci.org/thelia/thelia.png?branch=master)](https://travis-ci.org/thelia/thelia) [![License](https://poser.pugx.org/thelia/thelia/license.png)](https://packagist.org/packages/thelia/thelia) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/thelia/thelia/badges/quality-score.png?s=61e3e04a69bffd71c29b08e5392080317a546716)](https://scrutinizer-ci.com/g/thelia/thelia/) + +[Thelia](http://thelia.net/) is an open source tool for creating e-business websites and managing online content. This software is published under LGPL. + +This is the new major version of Thelia. + +You can download this version and have a try or take a look at the source code (or anything you wish, respecting LGPL). See http://thelia.net/ web site for more information. + +A repository containing all thelia modules is available at this address : https://github.com/thelia-modules diff --git a/templates/backOffice/default/admin-layout.tpl b/templates/backOffice/default/admin-layout.tpl new file mode 100644 index 00000000..34f23370 --- /dev/null +++ b/templates/backOffice/default/admin-layout.tpl @@ -0,0 +1,227 @@ +{* -- By default, check admin login ----------------------------------------- *} + +{block name="check-auth"} + {check_auth role="ADMIN" resource="{block name="check-resource"}{/block}" module="{block name="check-module"}{/block}" access="{block name="check-access"}{/block}" login_tpl="/admin/login"} +{/block} + +{block name="no-return-functions"}{/block} + +{* -- Define some stuff for Smarty ------------------------------------------ *} +{config_load file='variables.conf'} + +{* -- Declare assets directory, relative to template base directory --------- *} +{declare_assets directory='assets'} + +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + + + + + + + {block name="page-title"}Default Page Title{/block} - {intl l='Thelia Back Office'} + + + + + + + {block name="meta"}{/block} + + + {* -- Bootstrap CSS section --------------------------------------------- *} + + {block name="before-bootstrap-css"}{/block} + + + + {block name="after-bootstrap-css"}{/block} + + {* -- Admin CSS section ------------------------------------------------- *} + + {block name="before-admin-css"}{/block} + + {block name="after-admin-css"}{/block} + + {* Modules css are included here *} + + {hook name="main.head-css" location="head_css" } + + {* HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries *} + + + + +
    + + {* display top bar only if admin is connected *} + {loop name="top-bar-auth" type="auth" role="ADMIN"} + + {* -- Brand bar section ------------------------------------------------- *} + + {hook name="main.before-topbar" location="before_topbar" } + + + + +
    + +
    +
    +

    {block name="page-title"}{/block}

    +
    + +
    + + + {* -- Main page content section ----------------------------------------- *} + {hook name="main.before-content" location="before_content"} + +
    + {block name="main-content"}Put here the content of the template{/block} +
    + + {hook name="main.after-content" location="after_content"} + +
    + {/loop} + + {hook name="main.before-footer" location="before_footer" } + + + + {hook name="main.after-footer" location="after_footer" } +
    + + {* -- Javascript section ------------------------------------------------ *} + + {block name="before-javascript-include"}{/block} + + + + {block name="after-javascript-include"}{/block} + + {javascripts file='assets/js/bootstrap/bootstrap.js'} + + {/javascripts} + + {javascripts file='assets/js/libs/jquery.toolbar.min.js'} + + {/javascripts} + + {javascripts file='assets/js/libs/metis-menu.min.js'} + + {/javascripts} + + {block name="javascript-initialization"}{/block} + + {javascripts file='assets/js/main.js'} + + {/javascripts} + + {* Modules scripts are included now *} + {hook name='main.footer-js' location="footer_js"} + + {block name="javascript-last-call"}{/block} + + diff --git a/templates/backOffice/default/admin-logs.html b/templates/backOffice/default/admin-logs.html new file mode 100644 index 00000000..49415594 --- /dev/null +++ b/templates/backOffice/default/admin-logs.html @@ -0,0 +1,229 @@ +{extends file="admin-layout.tpl"} + +{block name="after-bootstrap-css"} + +{/block} + +{block name="no-return-functions"} + {$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl l='Administration logs'}{/block} + +{block name="check-resource"}admin.configuration.admin-logs{/block} +{block name="check-access"}view{/block} + +{block name="main-content"} +
    + +
    + + + + {hook name="admin-logs.top" location="admin_logs_top" } + +
    +
    +
    + +
    {intl l="Administration logs"}
    + +
    +
    + +
    +
    + + +
    +
    +

    {intl l='Period'} :

    +
    + +
    +
    +
    + {intl l='From'} + + + + +
    +
    +
    + +
    +
    +
    + {intl l='To'} + + + + +
    +
    +
    +
    + +
    +
    + +

    {intl l='Administrators'} :

    + +
    + {loop type="admin" name="admin-list" backend_context="1"} +
    + +
    + {if ($LOOP_COUNT)%4 == 0}
    {/if} + {/loop} +
    +
    +
    + +
    +
    +

    {intl l='Resources'} :

    + +
    + {loop type="resource" name="resources-list" backend_context="1"} +
    + +
    + {if ($LOOP_COUNT)%4 == 0}
    {/if} + {/loop} +
    + +
    +
    + +
    +
    +

    {intl l='Modules'} :

    + +
    + {loop type="module" name="modules-list" backend_context="1"} +
    + +
    + + {if ($LOOP_COUNT)%4 == 0}
    {/if} + {/loop} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + {hook name="admin-logs.bottom" location="admin_logs_bottom" } + +
    +
    +{/block} + +{block name="javascript-initialization"} + + + {javascripts file='assets/js/moment-with-locales.min.js'} + + {/javascripts} + + {javascripts file='assets/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js'} + + {/javascripts} + + +{/block} + +{block name="javascript-last-call"} + {hook name="admin-logs.js" location="admin-logs-js" } +{/block} \ No newline at end of file diff --git a/templates/backOffice/default/administrators.html b/templates/backOffice/default/administrators.html new file mode 100644 index 00000000..460be043 --- /dev/null +++ b/templates/backOffice/default/administrators.html @@ -0,0 +1,411 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} + {$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl l='Back-office users'}{/block} + +{block name="check-resource"}admin.configuration.administrator{/block} +{block name="check-access"}view{/block} + +{block name="main-content"} +
    + +
    + + + + {hook name="administrators.top" location="administrators_top" } + +
    +
    + +
    +
    + + + + + + + + + + + {hook name="administrators.header" location="administrator_list_header" } + + + + + + {loop type="admin" name="administrators" backend_context="1"} + + {* the current current admin can always update its own profile *} + {$can_update = $ID == {admin attr="id"}} + {loop type="auth" name="can_change" role="ADMIN" resource="admin.configuration.administrator" access="UPDATE"} + {$can_update = true} + {/loop} + + + + + + {* Do not display invalid emails *} + {if $EMAIL|strpos:'@'} + + {else} + + {/if} + + + {hook name="administrators.row" location="administrator_list_row" admin_id={$ID}} + + + + {/loop} + + +
    + {intl l="Administrators"} + {loop type="auth" name="can_create" role="ADMIN" resource="admin.administrator" access="CREATE"} + + + + {/loop} +
    {intl l="Login"}{intl l="First Name"}{intl l="Last Name"}{intl l="E-mail"}{intl l="Locale"}{intl l="Profile"}{intl l="Actions"}
    + {if $can_update} + {$LOGIN} + {else} + {$LOGIN} + {/if} + {$FIRSTNAME}{$LASTNAME}{$EMAIL} + {intl l="No email defined"} + {$LOCALE} + {if $PROFILE} + {loop type="profile" name="admin-profile" id={$PROFILE}} + {$TITLE} + {/loop} + {else} + {intl l='Superadministrator'} + {/if} + +
    + +
    + +
    +
    +
    + + +
    +
    + + {hook name="administrators.bottom" location="administrators_bottom" } + +
    +
    + +{* -- Add administrator confirmation dialog ----------------------------------- *} +{form name="thelia.admin.administrator.add"} + +{if $form_error_message} + {$administratorCreateError = true} +{else} + {$administratorCreateError = false} +{/if} + +{* Capture the dialog body, to pass it to the generic dialog *} +{capture "administrator_create_dialog"} + + {form_hidden_fields} + +
    +
    + {render_form_field field='login'} + {render_form_field field='email'} +
    +
    + {render_form_field field='firstname'} + {render_form_field field='lastname'} +
    +
    + + {form_field field='password_confirm'} + {$passwordError = $error} + {/form_field} + +
    +
    + {render_form_field field='password'} +
    +
    + {render_form_field field='password_confirm'} +
    +
    + +
    +
    + {custom_render_form_field field="locale"} + + {/custom_render_form_field} +
    +
    + {custom_render_form_field field="profile"} + + {/custom_render_form_field} +
    +
    + + {hook name="administrator.create-form" location="administrator_create_form" } +{/capture} + + {include + file = "includes/generic-create-dialog.html" + + dialog_id = "administrator_create_dialog" + dialog_title = {intl l="Create a new administrator"} + dialog_body = {$smarty.capture.administrator_create_dialog nofilter} + + dialog_ok_label = {intl l="Create"} + dialog_cancel_label = {intl l="Cancel"} + + form_action = {url path="/admin/configuration/administrators/add"} + form_enctype = {form_enctype} + form_error_message = $form_error_message + } + +{/form} + +{* -- Update administrator confirmation dialog ----------------------------------- *} +{form name="thelia.admin.administrator.update"} + +{if $form_error_message} + {$administratorUpdateError = true} +{else} + {$administratorUpdateError = false} +{/if} + +{* Capture the dialog body, to pass it to the generic dialog *} +{capture "administrator_update_dialog"} + + {form_hidden_fields} + + {if $show_email_change_notice} +
    + {intl l="From Thelia 2.3, you have to add an email address to your administrator profile. Please enter your email address below."} +
    + {/if} + +
    +
    + {render_form_field field='login' extra_classes='js-login'} + {render_form_field field='firstname' extra_classes='js-firstname'} + +
    +
    + {custom_render_form_field field='email'} + + {/custom_render_form_field} + {render_form_field field='lastname' extra_classes='js-lastname'} +
    +
    + + {form_field field='password_confirm'} + {$passwordError = $error} + {/form_field} + +
    +
    + {custom_render_form_field field='password'} + + {/custom_render_form_field} +
    +
    + {custom_render_form_field field='password_confirm'} + + {/custom_render_form_field} +
    +
    + +
    +
    + {custom_render_form_field field="locale"} + + {/custom_render_form_field} +
    +
    + {custom_render_form_field field="profile"} + + {/custom_render_form_field} +
    +
    + + {hook name="administrator.update-form" location="administrator_update_form" } +{/capture} + + {include + file = "includes/generic-create-dialog.html" + + dialog_id = "administrator_update_dialog" + dialog_title = {intl l="Update an administrator"} + dialog_body = {$smarty.capture.administrator_update_dialog nofilter} + + dialog_ok_label = {intl l="Update"} + dialog_cancel_label = {intl l="Cancel"} + + form_action = {url path="/admin/configuration/administrators/save"} + form_enctype = {form_enctype} + form_error_message = $form_error_message + } + +{/form} + +{* -- Delete administrator confirmation dialog ----------------------------------- *} + +{capture "administrator_delete_dialog"} + + + {hook name="administrator.delete-form" location="administrator_delete_form" } + +{/capture} + +{include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "administrator_delete_dialog" + dialog_title = {intl l="Delete administrator"} + dialog_message = {intl l="Do you really want to delete this administrator ?"} + + form_action = {token_url path='/admin/configuration/administrators/delete'} + form_content = {$smarty.capture.administrator_delete_dialog nofilter} +} + +{include + file = "includes/generic-warning-dialog.html" + + dialog_id = "administrator_cannot_delete_dialog" + dialog_title = {intl l="You can't delete this administrator"} + dialog_body = {intl l="They are some administrator which are linked to this administrator. Please edit/remove them before deleting this administrator."} +} + +{/block} + +{block name="javascript-initialization"} + +{javascripts file='assets/js/bootstrap-select/bootstrap-select.js'} + +{/javascripts} + + + +{/block} + +{block name="javascript-last-call"} + {hook name="administrators.js" location="administrators-js" } + + {if $show_update_dialog} + + {/if} +{/block} diff --git a/templates/backOffice/default/advanced-configuration.html b/templates/backOffice/default/advanced-configuration.html new file mode 100644 index 00000000..61feeea5 --- /dev/null +++ b/templates/backOffice/default/advanced-configuration.html @@ -0,0 +1,81 @@ +{extends file="admin-layout.tpl"} + +{block name="no-return-functions"} + {$admin_current_location = 'configuration'} +{/block} + +{block name="page-title"}{intl l='Advanced configuration'}{/block} + +{block name="check-resource"}admin.cache{/block} +{block name="check-access"}view{/block} + +{block name="main-content"} +
    + +
    + + + +
    + +
    + +
    +
    + {intl l='Thelia caches flushing'} +
    +
    + +
    +
    + {form name="thelia.cache.flush"} +
    + {form_hidden_fields} + +
    + +
    +
    + {/form} +
    + +
    + + {form name="thelia.assets.flush"} +
    + {form_hidden_fields} + +
    + +
    +
    + {/form} +
    + +
    + + {form name="thelia.images-and-documents-cache.flush"} +
    + {form_hidden_fields} + +
    + +
    +
    + {/form} +
    +
    + {hook name="advanced-configuration" location="advanced-configuration"} +
    +
    +
    +
    +{/block} + +{block name="javascript-last-call"} + {hook name="advanced-configuration.js" location="advanced-configuration-js" } +{/block} diff --git a/templates/backOffice/default/ajax/export-modal.html b/templates/backOffice/default/ajax/export-modal.html new file mode 100644 index 00000000..eb589d56 --- /dev/null +++ b/templates/backOffice/default/ajax/export-modal.html @@ -0,0 +1,44 @@ +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + +{loop type="export" name="export" id=$exportId} + {form name="thelia.export"} +
    + {form_hidden_fields} + + +
    + {/form} +{/loop} diff --git a/templates/backOffice/default/ajax/import-modal.html b/templates/backOffice/default/ajax/import-modal.html new file mode 100644 index 00000000..468099d8 --- /dev/null +++ b/templates/backOffice/default/ajax/import-modal.html @@ -0,0 +1,38 @@ +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + +{loop type="import" name="import" id=$importId} + {form name="thelia.import"} +
    + {form_hidden_fields} + + +
    + {/form} +{/loop} diff --git a/templates/backOffice/default/ajax/language-update-modal.html b/templates/backOffice/default/ajax/language-update-modal.html new file mode 100644 index 00000000..822c6042 --- /dev/null +++ b/templates/backOffice/default/ajax/language-update-modal.html @@ -0,0 +1,99 @@ +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + +{* Update an Address *} + +{form name="thelia.lang.update"} + +{* Capture the dialog body, to pass it to the generic dialog *} +{capture "edit_lang_dialog"} + + {form_hidden_fields} + + {form_field field='title'} +
    + + +
    + {/form_field} + + {form_field field='code'} +
    + + + {intl l='Check the list of ISO 639-1 codes'} +
    + {/form_field} + + {form_field field='locale'} +
    + + +
    + {/form_field} + + {form_field field='date_time_format'} +
    + + + {intl l='The syntax used is identical to the PHP date() function'} +
    + {/form_field} + + {form_field field='date_format'} +
    + + + {intl l='The syntax used is identical to the PHP date() function'} +
    + {/form_field} + + {form_field field='time_format'} +
    + + + {intl l='The syntax used is identical to the PHP date() function'} +
    + {/form_field} + {form_field field='decimal_separator'} +
    + + + {intl l='Sets the separator for the decimal point'} +
    + {/form_field} + {form_field field='thousands_separator'} +
    + + + {intl l='Sets the thousands separator.'} +
    + {/form_field} + {form_field field='decimals'} +
    + + + {intl l='Decimal places'} +
    + {/form_field} + + + +{/capture} + +{include + file = "includes/generic-create-dialog.html" + + dialog_id = "edit_lang_dialog" + dialog_title = {intl l="Edit a language"} + dialog_body = {$smarty.capture.edit_lang_dialog nofilter} + + dialog_ok_label = {intl l="Save changes"} + dialog_cancel_label = {intl l="Cancel"} + + form_action = {url path="/admin/configuration/languages/save/%id" id=$lang_id} + form_enctype = {form_enctype} + form_error_message = $form_error_message +} + +{/form} \ No newline at end of file diff --git a/templates/backOffice/default/ajax/logger.html b/templates/backOffice/default/ajax/logger.html new file mode 100644 index 00000000..f3c3a2d8 --- /dev/null +++ b/templates/backOffice/default/ajax/logger.html @@ -0,0 +1,11 @@ +
    +
      + {foreach $entries as $entry} +
    • + {$entry.head} {$entry.data} +
    • + {foreachelse} +
    • NO ENTRIES FOUND
    • + {/foreach} +
    +
    \ No newline at end of file diff --git a/templates/backOffice/default/ajax/module-information.html b/templates/backOffice/default/ajax/module-information.html new file mode 100644 index 00000000..2b9a3a87 --- /dev/null +++ b/templates/backOffice/default/ajax/module-information.html @@ -0,0 +1,128 @@ +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} +{$locale = {lang attr='locale'}} +{loop type="module" name="module-information" id=$moduleId lang=$locale} +

    {intl l="Module detailed information"}

    + + + {if $TITLE} + + + + + {/if} + + + + + + + + + + + + {if $CHAPO} + + + + + {/if} + + {if $DESCRIPTION} + + + + + {/if} + + {if $POSTSCRIPTUM} + + + + + {/if} + + {if $moduleData.tags.tag} + + + + + {/if} + + {if $moduleData.languages.language} + + + + + {/if} + + + + + + + + + + + + {if $moduleData.required.module} + + + + + {/if} + + + + + + + {if $moduleData.urlmiseajour} + + + + + {/if} + + {if $moduleData.updateurl} + + + + + {/if} + + + + + + + {if $moduleData.author.email} + + + + + {/if} + + {if $moduleData.author.website} + + + + + {/if} +
    {intl l="Title"}{$TITLE}
    {intl l="Module code"}{$CODE}
    {intl l="Module type"}{$moduleData.type}
    {intl l="Subtitle"}{$CHAPO}
    {intl l="Description"}{$DESCRIPTION nofilter}
    {intl l="Postscriptum"}{$POSTSCRIPTUM}
    {intl l="Tags"} + {foreach $moduleData.tags.tag as $label}{if $label@index > 0}, {/if}{$label}{/foreach} +
    {intl l="Supported locales"} + {foreach $moduleData.languages.language as $label}{if $label@index > 0}, {/if}{$label}{/foreach} +
    {intl l="Namespace of main class"}{$moduleData.fullnamespace}
    {intl l="Minimum required Thelia version"}{$moduleData.thelia}
    {intl l="Required modules"} +
      + {foreach $moduleData.required.module as $module} +
    • {$module}
    • + {/foreach} +
    +
    {intl l="Stability"}{$moduleData.stability}
    {intl l="Update URL"}{$moduleData.urlmiseajour}
    {intl l="Update URL"}{$moduleData.updateurl}
    {intl l="Author"} + {if $moduleData.author.name}{$moduleData.author.name}{else}{intl l='Unspecified'}{/if}{if $moduleData.author.company}, {$moduleData.author.company}{/if} +
    {intl l="E-mail"}{mailto address=$moduleData.author.email encode='hex'}
    {intl l="Web site"}{$moduleData.author.website}
    +{/loop} +{* fro debugging only
    {$moduleData|print_r}
    *} \ No newline at end of file diff --git a/templates/backOffice/default/ajax/product-attributes-tab.html b/templates/backOffice/default/ajax/product-attributes-tab.html new file mode 100644 index 00000000..6c85da90 --- /dev/null +++ b/templates/backOffice/default/ajax/product-attributes-tab.html @@ -0,0 +1,274 @@ +{config_load file='variables.conf'} + +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + +{loop name="product_edit" type="product" visible="*" id=$product_id backend_context="1" lang=$edit_language_id} +
    + +
    +
    +

    {* <---- FIXME Lame ! *} +
    + + + + +
    +
    +
    +

    {intl + l="To use features or attributes on this product, please select a product template. You can define product templates in the configuration section of the administration." + tpl_mgmt_url={url path='/admin/configuration/templates'} + } +

    + + + +
    + + + + + +
    +
    +
    +
    +
    +
    +
    + + {* Check if a product template is defined *} + +
    +
    + +
    + + + + + {include + file = "includes/inner-form-toolbar.html" + hide_submit_buttons = false + + page_url = "{url path='/admin/products/update' product_id=$ID}" + close_url = "{url path='/admin/categories' category_id=$DEFAULT_CATEGORY}" + } + + {* -- Begin attributes management ------------------------------- *} + +
    +
    +
    +
    +

    {intl l='Product Attributes'}

    + +

    + {if $TEMPLATE} + {intl + l="You can change template attributes and their positions in the template configuration page." + tpl_mgmt_url={url path='/admin/configuration/templates/update' template_id=$TEMPLATE} + } + {else} + {intl + l="You can change attributes and their positions in the attributes configuration page." + tpl_mgmt_url={url path='/admin/configuration/attributes'} + } + {/if} +

    + +
    + + + + + + + {hook name="product.attributes-table-header" location="product_attributes_table_header" } + + + + + {loop name="product-attributes" type="attribute" order="manual" product=$product_id backend_context="1" lang="$edit_language_id"} + + + + + + {hook name="product.attributes-table-row" location="product_attributes_table_row" } + + {/loop} + + {elseloop rel="product-attributes"} + + + + {/elseloop} + +
    {intl l='ID'}{intl l='Attribute Name'}
    {$ID}{$TITLE}
    +
    + {intl l="This product template does not contains any features"} +
    +
    +
    +
    +
    +
    +
    + + {* -- Begin features management ---------------------------------- *} + +
    +
    +
    +
    +

    {intl l='Product Features'}

    + +

    + {if $TEMPLATE} + {intl + l="You can change templates features and their positions in the template configuration page." + tpl_mgmt_url={url path='/admin/configuration/templates/update' template_id=$TEMPLATE} + } + {else} + {intl + l="You can change feature and their positions in the features configuration page." + tpl_mgmt_url={url path='/admin/configuration/features'} + } + {/if} +

    + +
    + + + + + + + + {hook name="product.features-table-header" location="product_features_table_header" } + + + + + + {loop name="product-features" type="feature" order="manual" product=$product_id backend_context="1" lang="$edit_language_id"} + + + + + + + + {hook name="product.features-table-row" location="product_features_table_row" } + + + {/loop} + + {elseloop rel="product-features"} + + + + {/elseloop} + +
    {intl l='ID'}{intl l='Feature Name'}{intl l='Feature value for this product'}
    {$ID}{$TITLE} + {* Multiple values *} + + {ifloop rel="product-features-av"} + + {* load all selected values in an array to speed up things a little *} + + {$selected = array()} + + {loop name="free-text-value" exclude_free_text="true" type="feature_value" product=$product_id feature=$ID backend_context="1" lang="$edit_language_id"} + {$selected[] = $FEATURE_AV_ID} + {/loop} + + {capture name="select_options"} + {loop name="product-features-av" type="feature-availability" feature=$ID order="manual" backend_context="1" lang="$edit_language_id"} + + + {$options_count = $LOOP_COUNT} {* LOOP_COUNT is only available inside the loop ! *} + {/loop} + + {if $options_count > #maximum_product_attribute_select_size#} + {$select_size = #maximum_product_attribute_select_size#} + {else} + {$select_size = $options_count} + {/if} + {/capture} + +
    + +
    + + + {intl l='Use Ctrl+click to select more than one value. You can also clear selected values.' id={$ID}} + + {/ifloop} + + {* Free text *} + + {elseloop rel="product-features-av"} + {* Get the free text value *} + {$feature_value=''} + + {loop name="free-text-value" type="feature_value" product=$product_id feature=$ID backend_context="1" lang="$edit_language_id"} + {if $IS_FREE_TEXT && $FREE_TEXT_VALUE != 1} + {$feature_value=$FREE_TEXT_VALUE} + {else} + {$feature_value=$TITLE} + {/if} + {/loop} + + + {/elseloop} +
    +
    + {intl l="This product template does not contains any features"} +
    +
    +
    +
    +
    +
    +
    + + {include + file = "includes/inner-form-toolbar.html" + hide_submit_buttons = false + hide_flags = true + + page_url = "{url path='/admin/products/update' product_id=$ID}" + close_url = "{url path='/admin/categories' category_id=$DEFAULT_CATEGORY}" + } + +
    +
    +
    + +
    +{/loop} + + diff --git a/templates/backOffice/default/ajax/product-related-tab.html b/templates/backOffice/default/ajax/product-related-tab.html new file mode 100644 index 00000000..a2dd5382 --- /dev/null +++ b/templates/backOffice/default/ajax/product-related-tab.html @@ -0,0 +1,575 @@ +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + +{loop name="product_edit" type="product" visible="*" id=$product_id backend_context="1" lang=$edit_language_id} +
    + + {include + file = "includes/inner-form-toolbar.html" + hide_submit_buttons = true + + page_url = "{url path='/admin/products/update' product_id=$ID}" + close_url = "{url path='/admin/categories' category_id=$DEFAULT_CATEGORY}" + } + +
    + + {* -- Begin related content management ------------------------------ *} + +
    +
    +
    + +
    + +
    + + + + + + + + + + {hook name="product.contents-table-header" location="product_contents_table_header" } + + + + + + + {loop name="assigned_contents" type="associated_content" visible="*" product="$product_id" backend_context="1" lang="$edit_language_id"} + + + + + + + + {hook name="product.contents-table-row" location="product_contents_table_row-bottom" } + + + + {/loop} + + {elseloop rel="assigned_contents"} + + + + {/elseloop} + +
    {intl l='ID'}{intl l='Content title'}{intl l='Position'}{intl l="Actions"}
    {$CONTENT_ID} + {$TITLE} + + {admin_position_block + resource="admin.product" + access="UPDATE" + path={url path='/admin/product/update-content-position' product_id=$product_id current_tab="related"} + url_parameter="content_id" + in_place_edit_class="contentPositionChange" + position=$POSITION + id=$ID + } + + {loop type="auth" name="can_create" role="ADMIN" resources="admin.product" access="UPDATE"} + + + + {/loop} +
    +
    + {intl l="This product contains no contents"} +
    +
    +
    +
    +
    + + {* -- End related content management -------------------------------- *} + + {* -- Begin accessories management ---------------------------------- *} + +
    +
    +
    +
    + +

    {intl l='Product accessories'}

    +

    {intl l='Define here this product\'s accessories'}

    + + + + + {ifloop rel="categories"} +
    + + + {intl l='Select a category to get its products'} +
    + +
    +
    + + + + +
    + + {intl l='Select a product and click (+) to add it as an accessory'} +
    + +
    +
    + {intl l="No available product in this category"} +
    +
    + + {/ifloop} + + {elseloop rel="categories"} +
    {intl l="No categories found"}
    + {/elseloop} + +
    +
    + +
    + + + + + + + + + + {hook name="product.accessories-table-header" location="product_accessories_table_header-bottom" } + + + + + + + {loop name="assigned_accessories" order="accessory" visible="*" type="accessory" product="$product_id" backend_context="1" lang="$edit_language_id" return_url=false} + + + + + + + + {hook name="product.accessories-table-row" location="product_accessories_table_row-bottom" } + + + + {/loop} + + {elseloop rel="assigned_accessories"} + + + + {/elseloop} + +
    {intl l='ID'}{intl l='Accessory title'}{intl l='Position'}{intl l="Actions"}
    {$ID} + {$TITLE} + + {admin_position_block + resource="admin.product" + access="UPDATE" + path={url path='/admin/product/update-accessory-position' product_id=$product_id current_tab="related"} + url_parameter="accessory_id" + in_place_edit_class="accessoryPositionChange" + position=$POSITION + id=$ID + } + + {loop type="auth" name="can_create" role="ADMIN" resources="admin.product" access="UPDATE"} + + + + {/loop} +
    +
    + {intl l="This product contains no accessories"} +
    +
    +
    +
    +
    + + {* -- End accessories management ------------------------------------ *} + +
    + +
    + + {* -- Begin categories management ----------------------------------- *} + +
    +
    +
    + +
    + +
    + + + + + + + + {hook name="product.categories-table-header" location="product_categories_table_header" } + + + + + + + {loop name="additional_categories" type="category" visible="*" product=$product_id exclude=$DEFAULT_CATEGORY backend_context="1" lang="$edit_language_id" return_url=false} + + + + + + {hook name="product.categories-table-row" location="product_categories_table_row" } + + + + {/loop} + + {elseloop rel="additional_categories"} + + + + {/elseloop} + +
    {intl l='ID'}{intl l='Category title'}{intl l="Actions"}
    {$ID} + {$TITLE} + + {loop type="auth" name="can_delete" role="ADMIN" resources="admin.product" access="UPDATE"} + + + + {/loop} +
    +
    + {intl l="This product doesn't belong to any additional category."} +
    +
    +
    +
    +
    + {* -- End categories management ------------------------------------- *} +
    + +
    + +{* Delete related content confirmation dialog *} + +{capture "delete_content_dialog"} + + + + + +{/capture} + +{include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "delete_content_dialog" + dialog_title = {intl l="Remove related content"} + dialog_message = {intl l="Do you really want to remove this related content from the product ?"} + + form_action = {token_url path='/admin/products/content/delete'} + form_content = {$smarty.capture.delete_content_dialog nofilter} +} + +{* Delete accessory confirmation dialog *} + +{capture "delete_accessory_dialog"} + + + + + +{/capture} + +{include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "delete_accessory_dialog" + dialog_title = {intl l="Remove an accessory"} + dialog_message = {intl l="Do you really want to remove this accessory from the product ?"} + + form_action = {token_url path='/admin/products/accessory/delete'} + form_content = {$smarty.capture.delete_accessory_dialog nofilter} +} + +{* Delete category confirmation dialog *} + +{capture "delete_category_dialog"} + + + + +{/capture} + +{include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "delete_category_dialog" + dialog_title = {intl l="Remove from category"} + dialog_message = {intl l="Do you really want to remove the product from this category ?"} + + form_action = {token_url path='/admin/products/category/delete'} + form_content = {$smarty.capture.delete_category_dialog nofilter} +} + + +{/loop} \ No newline at end of file diff --git a/templates/backOffice/default/ajax/pse-image-document-assoc-modal.html b/templates/backOffice/default/ajax/pse-image-document-assoc-modal.html new file mode 100644 index 00000000..62dfd57b --- /dev/null +++ b/templates/backOffice/default/ajax/pse-image-document-assoc-modal.html @@ -0,0 +1,93 @@ +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='bo.default'} + +