diff --git a/.gitignore b/.gitignore index 85bd82b7ff..d8cacc6b13 100644 --- a/.gitignore +++ b/.gitignore @@ -322,3 +322,6 @@ Kopie von* src/SmartStoreNET.Packager.sln Log.txt src/Presentation/SmartStore.Web/Themes/FlexMuseo/ + +# Used by SSL certificates management tools (e.g. Certify The Web). +/src/Presentation/SmartStore.Web/.well-known diff --git a/README.md b/README.md index 42ca308b5f..51e24bdf95 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,21 @@ -

- - Smartstore.NET - - - -
-
- -

- Smartstore.NET -

-

Ready. Sell. Grow.

- -

- GitHub release - GitHub All Releases - GitHub repo size - GitHub closed issues - GitHub commit activity - GitHub -

- -

- Try Online ∙ - Docs ∙ - Forum ∙ - Marketplace ∙ - Translations -

-
- -Smartstore is a free, open source, full-featured e-commerce solution for companies of any size. It is web standards compliant and incorporates the newest Microsoft web technology stack. - -**Smartstore includes all essential features to create multilingual and multi-currency stores** targeting desktop or mobile devices and enabling SEO optimized rich product catalogs with support for an unlimited number of products and categories, variants, bundles, datasheets, ESD, discounts, coupons and many more. +# Deprecation warning :warning: -A comprehensive set of tools for CRM & CMS, sales, marketing, payment & shipping handling, etc. makes Smartstore a powerful all-in-one solution fulfilling all your needs. +This repository is outdated and no longer being actively maintained by the Smartstore devs. +Users & developers are encouraged to check out the successor built on **ASP.NET Core**: +**Smartstore 5**. -
-

- Smartstore.NET Demoshop +

+ + Announcing Smartstore 5 +

-**Smartstore delivers a beautiful and configurable shop front-end out-of-the-box**, built with a design approach on the highest level, including components like `Bootstrap 4`, `Sass` and others. The supplied theme _Flex_ is modern, clean and fully responsive, giving buyers the best possible shopping experience on any device. - -The state-of-the-art architecture of Smartstore - with `ASP.NET 4.5` + `MVC 5`, `Entity Framework 6` and Domain Driven Design approach - makes it easy to extend, extremely flexible and essentially fun to work with ;-) - -* **Website:** [https://smartstore.com](https://smartstore.com) -* **Forum:** [http://community.smartstore.com](http://community.smartstore.com) -* **Marketplace:** [http://community.smartstore.com/marketplace](http://community.smartstore.com/marketplace) -* **Translations:** [http://translate.smartstore.com/](http://translate.smartstore.com/) -* **Documentation:** [Smartstore Documentation in English](http://docs.smartstore.com/display/SMNET/SmartStore.NET+Documentation+Home) -* **Developer Extension:** [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=SmartStoreAG.Smartstore) - -

 

- -## Highlights - -### Technology & Design - -* State of the art architecture thanks to `ASP.NET 4.5`, `ASP.NET MVC 5`, `Entity Framework 6` and Domain Driven Design -* Easy to extend and extremely flexible thanks to modular design -* Highly scalable thanks to full page caching and web farm support -* A powerful theming engine lets you create themes & skins with minimum effort thanks to theme inheritance -* Point&Click Theme configuration -* Highly professional search framework based on Lucene.NET, delivering ultra fast faceted search results -* Powerful and lightning-fast media manager -* Powerful rule system for visual business rule creation -* Consistent and sophisticated use of modern components such as `Bootstrap 4`, `Vue.js`, `jQuery` `Sass` & more in the front and back end. -* Easy shop management thanks to modern and clean UI - -### Features - -* NEW: Media Manager -* NEW: Rule Builder -* Unlimited number of products and categories -* Multi-Store support -* Product Bundles -* RESTful WebApi -* Multi-language and RTL support -* CMS Page Builder -* CMS Menu Builder -* Modern, clean, SEO-optimized and fully responsive Theme based on Bootstrap 4 -* Ultra fast search framework with faceted search support -* Extremely scalable thanks to output caching, REDIS & Microsoft Azure support -* NEW: Tree-based permission management (ACL) with inheritance support -* *Trusted Shops* precertification -* 100% compliant with German jurisdiction -* Sales-, Customer- & Inventory-management -* Comprehensive CRM features -* Powerful Discount System -* Powerful layered navigation in the shop -* Numerous Payment and Shipping Providers and options -* Sophisticated Marketing & Promotion capabilities (Gift cards, Reward Points, discounts of any type and more) -* Reviews & Ratings -* CMS (Blog, Forum, custom pages & HTML content etc.) -* and many more... - - - -## Project Status - -Smartstore V4.0.0 has been released on 25 June, 2020. The highlights are: - -* **Media Manager**: Powerful and lightning-fast explorer/manager for media files (commercial plugin exclusively bundled with Pro Edition) -* **Rule Builder**: Powerful rule system for visual business rule creation - * Dozens of predefined rules out-of-the-box - * Supports logical operators (AND/OR) and unlimited grouping/nesting - * Cart rules: can be applied to discounts, shipping and payment methods - * Customer rules: used to auto-assign customers to customer groups for 1-to-1 content targeting - * Product rules: used to auto-assign products to categories based on filter definitions (e.g. price, brand, color, stock etc.) -* **New permission (ACL) system**: Granular tree-based permission management based on customer groups. Supports inheritance to allow or deny entire permission ranges -* **Personalized product recommendations**: Replaces homepage products dynamically with personalized product recommendations based on customer interests. (commercial plugin) -* **Geo Blocker**: Restricts shop access based on visitor country or IP address ranges (commercial plugin) -* **Dashboard with charts**: New dashboard widgets display key data like orders, customers, bestsellers etc. in nice graphical charts. - - - -## Try it online - -We have set up a live online demo for you so you are able to test Smartstore without local installation. Get a first impression and test all available features in the front- and in the backend. Please keep in mind that the backend demo is shared and other testers can modify data at the same time. - -* [**Frontend**](https://demo.smartstore.com/frontend/en) (User: demo, PWD: 1234) -* [**Backend**](https://demo.smartstore.com/backend/en/login) (User: demo, PWD: 1234) - - - -## How to install - -* Download the latest stable release from the download tab and unzip it to your web folder -* Setup a website in IIS and point the file directory to your unzipped folder -* Fire up your browser and follow the installation instructions -* Enjoy ;-) - -NOTE: Smartstore 4 requires [Visual C++ Redistributable für Visual Studio 2015](https://www.microsoft.com/en-US/download/details.aspx?id=52685) which is already pre-installed on most systems. If, nevertheless, it is missing on your web server, just download and execute the installer or ask your hosting provider to do that for you. ### System requirements * IIS 7+ * ASP.NET 4.5+ * MS SQL Server 2008 Express (or higher) OR MS SQL Server Compact 4 -* Visual C++ Redistributable für Visual Studio 2015 ([Download](https://www.microsoft.com/en-US/download/details.aspx?id=52685)) +* Visual C++ Redistributable für Visual Studio 2015-2019 ([Download](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)) * Full Trust diff --git a/SmartStoreNET.Tasks.Targets b/SmartStoreNET.Tasks.Targets index 23217bbf80..f67aba4987 100644 --- a/SmartStoreNET.Tasks.Targets +++ b/SmartStoreNET.Tasks.Targets @@ -39,7 +39,7 @@ x86 $(BUILD_NUMBER) - 4.0.1 + 4.2.0 $(StageFolder) .$(Version) diff --git a/assets/ready.set.go.jpg b/assets/ready.set.go.jpg new file mode 100644 index 0000000000..e69e37758c Binary files /dev/null and b/assets/ready.set.go.jpg differ diff --git a/changelog.md b/changelog.md index 6846e51026..8ba63a78f8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,12 +1,81 @@ # Release Notes +## Smartstore 4.2.0 + +### New Features +**Dimension Pricing** (commercial plugin) + +* Freely configurable dimension templates +* Price calculation based on user input for predefined product dimensions +* Shipping rates based on dimension and weight calculation +* Freely configurable shipping formulas for irregular shapes + +**File Manager** (commercial plugin) + +* Freely configurable tabs for product detail pages +* Unlimited upload of documents for each product tab +* CSV Import + +**Digital Product Advisor** (commercial plugin) + +* Product presentation based on configurable questions and predefined answers +* Product filter based on rule builder rules + +### Improvements +* Web API: added RewardPointsHistory entity +* Added canonical HTML link for blog, forum and news page +* Better semaphore handling +* Several OpenTrans improvements +* BMEcat: use stream writer to write large xml files & fixed catalog structure + +### Bugfixes + +* #379 & #264 Login failed if login type is user and email and if both username and email are an email address and are not identical. +* #2197 Web API error "The specified type member 'MergedDataValues' is not supported in LINQ to Entities..." +* Web API: fixes OData Connected Service error when accessing MediaFiles and MediaFolders lists +* PayPal Express: fixed order may have been placed even if DoExpressCheckoutPayment failed +* Roxy Filemanager: icons were not displayed anymore +* Azure CloudBlockBlob stream throws on Length access. Fetch Position instead. +* Fixed the uploaded file of a product attribute is lost as soon as another attribute is selected +* Fixes display problem with uploaded media files which contain a + character + +## Smartstore 4.1.1 +### New Features +* **Page Builder** + * Added newsletter block to subscribe/unsubscribe to the newsletter. +* Rule Builder: added CartItemQuantity rule to specify conditions for the quantity per cart product. +* Added an option to display blog posts and news only for a certain language. +* #2171 Created SEO setting for ExtraAllows. + +### Improvements +* WebDAVModule is removed in Web.config because it disables PUT and DELETE requests (required by Web API). +* Newsletter subscriptions: added filter for customer roles in export profile and backend list. +* #2167 Added an activity log for order editing. +* Inherit ACL and store mappings into all sub-categories, not only into direct sub-categories. +* #2186 MegaMenu: link for background image had no effect. +* Added honeypot protection to blog post comments. + +### Bugfixes +* #2162 A plugin could not be uninstalled if it's the only one installed. +* Sometimes no picture was displayed when navigating in the product details' image gallery. +* Deactivated slugs were falsely always redirected without SSL. +* Selected products could not be deleted in the backend product list. +* Web-API: fixed "failed to serialize the response body" when uploading product images and missing product media file mapping if an equal image was found in catalog folder. +* Categories: fixed missing cache invalidation when inheriting ACL or stores into child categories and products. +* Link Builder: the selected media file was not applied. +* Selecting an attribute of type date caused an error on the product detail page. +* AmazonPay: fixed rare "client ID is a required parameter and is not set" when using the login function. +* Various fixes for anti forgery request handling. +* Used mediasettings value for picture rendering in MegaMenu (pictures weren't displayed in MegaMenu dropdowns). +* Mediamanager uploads were marked as being transient. + ## Smartstore 4.1.0 ### Highlights * **Web API:** now supports the widely extended version 4 of OData. New endpoints for uploading and managing media files have been added to the API. * (NEW) **Delivery dates:** product info now shows estimated delivery date (exact date, range, *Not before*, *Not later than*). Merchant can enter optional Min/Max delivery days and also specify business hours. * (DEV) [VS Extension](https://marketplace.visualstudio.com/items?itemName=SmartStoreAG.Smartstore) to create plugins. Helps developing plugins for Smartstore by creating the basic structure of a Smartstore plugin with all the required files. -* **OCI** provides connection to eprocurement systems via industry standard OCI (commercial plugin) -* **cXmlPunchout** provides connection to eprocurement systems via industry standard cXmlPunchout (commercial plugin) +* **OCI** provides connection to e-procurement systems via industry standard OCI (commercial plugin) +* **cXmlPunchout** provides connection to e-procurement systems via industry standard cXmlPunchout (commercial plugin) * **Video** support in product media gallery. * **Media Gallery** displays a multitude of media files in various styles as Page Builder block. * (PERF) **~10% faster page rendering** speed thanks to better eager loading & caching strategies @@ -25,6 +94,7 @@ Merging the contents of different languages must be done manually (migration is * #2036 Added block to display content slider. * #2035 Added block to display news. * #1729 Added option for title and intro inline background color. +* **PostFinance**: added new payment methods "Checkout All-in-one" and "Checkout Flex". * #1644 Graying out unavailable attribute combinations. * #1744 Added 'Orders' tab to the product editor to display all orders in which the product has been purchased. * #1735 Added a setting to open a product directly if the search term matches a SKU, MPN or GTIN. @@ -92,7 +162,8 @@ Merging the contents of different languages must be done manually (migration is * Google Analytics: Fixed script error in conjunction with CookieManager * #2085 RTL: searchbar button wasn't aligned correctly * #2068 RTL: Fixed Page Builder slider positioning, dropdown and other alignments -* #2019 OffCancas compare: hide horizontal scrollbar +* #2019 OffCancas compare: hide horizontal scrollbar +* #2146 LimitedToStores property was not set in a rare case. ## Smartstore 4.0.1 ### New Features diff --git a/src/AssemblyVersionInfo.cs b/src/AssemblyVersionInfo.cs index ee72bffeb5..9ca54df467 100644 --- a/src/AssemblyVersionInfo.cs +++ b/src/AssemblyVersionInfo.cs @@ -9,7 +9,7 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("4.0.1.0")] +[assembly: AssemblyVersion("4.2.0.0")] -[assembly: AssemblyFileVersion("4.0.1.0")] -[assembly: AssemblyInformationalVersion("4.0.1.0")] +[assembly: AssemblyFileVersion("4.2.0.0")] +[assembly: AssemblyInformationalVersion("4.2.0.0")] diff --git a/src/Libraries/SmartStore.Core/Domain/Blogs/BlogPost.cs b/src/Libraries/SmartStore.Core/Domain/Blogs/BlogPost.cs index fb1e3bcaf9..821d502963 100644 --- a/src/Libraries/SmartStore.Core/Domain/Blogs/BlogPost.cs +++ b/src/Libraries/SmartStore.Core/Domain/Blogs/BlogPost.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; using System.Runtime.Serialization; using SmartStore.Core.Domain.Localization; using SmartStore.Core.Domain.Media; @@ -162,12 +163,25 @@ public static IReadOnlyCollection GetVisibilityAffectingPropertyNames() [DataMember] public bool LimitedToStores { get; set; } + /// + /// Gets or sets a language identifier for which the blog post should be displayed. + /// + [DataMember] + [Index] + public int? LanguageId { get; set; } + /// /// Gets or sets the date and time of entity creation /// [DataMember] public virtual DateTime CreatedOnUtc { get; set; } + /// + /// Gets or sets the language. + /// + [DataMember] + public virtual Language Language { get; set; } + /// /// Gets or sets the blog comments /// diff --git a/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs b/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs index 45f0535f87..c0582bce24 100644 --- a/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs +++ b/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs @@ -247,6 +247,7 @@ public virtual ICollection Orders /// /// Gets or sets reward points history /// + [DataMember] public virtual ICollection RewardPointsHistory { get => _rewardPointsHistory ?? (_rewardPointsHistory = new HashSet()); diff --git a/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs b/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs index a0fdc20f1d..f4ce336430 100644 --- a/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs +++ b/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.Serialization; using SmartStore.Core.Domain.Orders; namespace SmartStore.Core.Domain.Customers @@ -6,46 +7,55 @@ namespace SmartStore.Core.Domain.Customers /// /// Represents a reward point history entry /// + [DataContract] public partial class RewardPointsHistory : BaseEntity { /// /// Gets or sets the customer identifier /// + [DataMember] public int CustomerId { get; set; } /// /// Gets or sets the points redeemed/added /// + [DataMember] public int Points { get; set; } /// /// Gets or sets the points balance /// + [DataMember] public int PointsBalance { get; set; } /// /// Gets or sets the used amount /// + [DataMember] public decimal UsedAmount { get; set; } /// /// Gets or sets the message /// + [DataMember] public string Message { get; set; } /// /// Gets or sets the date and time of instance creation /// + [DataMember] public DateTime CreatedOnUtc { get; set; } /// /// Gets or sets the order for which points were redeemed as a payment /// + [DataMember] public virtual Order UsedWithOrder { get; set; } /// /// Gets or sets the customer /// + [DataMember] public virtual Customer Customer { get; set; } } } diff --git a/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs b/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs index 49d790dcf3..ee8df7af19 100644 --- a/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs @@ -22,7 +22,7 @@ public LocalizationSettings() public bool UseImagesForLanguageSelection { get; set; } /// - /// A value indicating whether the browser user lannguage should be detected + /// A value indicating whether the browser user language should be detected /// public bool DetectBrowserUserLanguage { get; set; } @@ -42,6 +42,11 @@ public LocalizationSettings() /// /// This setting is ignored when SeoFriendlyUrlsForLanguagesEnabled is false public InvalidLanguageRedirectBehaviour InvalidLanguageRedirectBehaviour { get; set; } + + /// + /// Whether to display region/country name in language selector (e.g. "Deutsch (Deutschland)" instead of "Deutsch") + /// + public bool DisplayRegionInLanguageSelector { get; set; } } public enum DefaultLanguageRedirectBehaviour diff --git a/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs b/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs index db219751cb..83f2dfe962 100644 --- a/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs +++ b/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs @@ -33,5 +33,6 @@ public class MessageTemplateNames public const string BackInStockCustomer = "Customer.BackInStock"; public const string SystemCampaign = "System.Campaign"; public const string SystemContactUs = "System.ContactUs"; + public const string SystemGeneric = "System.Generic"; } } diff --git a/src/Libraries/SmartStore.Core/Domain/News/NewsItem.cs b/src/Libraries/SmartStore.Core/Domain/News/NewsItem.cs index 36377ce4fc..954961a9b2 100644 --- a/src/Libraries/SmartStore.Core/Domain/News/NewsItem.cs +++ b/src/Libraries/SmartStore.Core/Domain/News/NewsItem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; using SmartStore.Core.Domain.Localization; using SmartStore.Core.Domain.Media; using SmartStore.Core.Domain.Seo; @@ -126,6 +127,17 @@ public static IReadOnlyCollection GetVisibilityAffectingPropertyNames() /// public string MetaTitle { get; set; } + /// + /// Gets or sets a language identifier for which the news item should be displayed. + /// + [Index] + public int? LanguageId { get; set; } + + /// + /// Gets or sets the language. + /// + public virtual Language Language { get; set; } + /// /// Gets or sets the news comments /// diff --git a/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs b/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs index 1298c88f0b..d32337103c 100644 --- a/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs +++ b/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs @@ -498,6 +498,7 @@ protected virtual SortedDictionary ParseTaxRates(string taxRat /// /// Gets or sets the reward points history record /// + [DataMember] public virtual RewardPointsHistory RedeemedRewardPointsEntry { get; set; } /// diff --git a/src/Libraries/SmartStore.Core/Domain/Orders/OrderSettings.cs b/src/Libraries/SmartStore.Core/Domain/Orders/OrderSettings.cs index d2701f84c8..fce240153c 100644 --- a/src/Libraries/SmartStore.Core/Domain/Orders/OrderSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Orders/OrderSettings.cs @@ -34,14 +34,10 @@ public OrderSettings() public decimal? OrderTotalMaximum { get; set; } /// - /// Gets or sets a value indicating whether min/max order total is relating to order amount subtotal + /// Gets or sets a value indicating how customer group restrictions are applied with each other + /// true - lowest possible total amount span gets applied, false - highest possible total amount span gets applied /// - public bool ApplyToSubtotal { get; set; } - - /// - /// Gets or sets a value indicating how further customer group restriction are applied - /// - public bool OrderValueRestrictionType { get; set; } + public bool MultipleOrderTotalRestrictionsExpandRange { get; set; } /// /// Gets or sets a value indicating whether anonymous checkout allowed diff --git a/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs b/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs index a8301c4dcf..0c9fec1eca 100644 --- a/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs @@ -26,10 +26,11 @@ public ShoppingCartSettings() ShowBasePrice = true; DeliveryTimesInShoppingCart = DeliveryTimesPresentation.DateOnly; ShowShortDesc = true; - AllowAnonymousUsersToEmailWishlist = false; - } - - /// + AllowAnonymousUsersToEmailWishlist = false; + AddProductsToBasketInSinglePositions = false; + } + + /// /// Gets or sets a value indicating whether a custoemr should be redirected to the shopping cart page after adding a product to the cart/wishlist /// public bool DisplayCartAfterAddingProduct { get; set; } @@ -172,5 +173,10 @@ public ShoppingCartSettings() /// Gets or sets a value indicating whether to show the quantity of linked attribute value product /// public bool ShowLinkedAttributeValueQuantity { get; set; } + + /// + /// Gets or sets a value indicating whether to add products to the basket in single positions + /// + public bool AddProductsToBasketInSinglePositions { get; set; } } } \ No newline at end of file diff --git a/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs b/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs index 24f647ad1d..09c0ca7f5a 100644 --- a/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Seo/SeoSettings.cs @@ -9,6 +9,7 @@ public class SeoSettings : ISettings public SeoSettings() { ExtraRobotsDisallows = new List { "/blog/tag/", "/blog/month/", "/producttags/" }; + ExtraRobotsAllows = new List(); ReservedUrlRecordSlugs = new List { @@ -80,6 +81,8 @@ public SeoSettings() public List ExtraRobotsDisallows { get; set; } + public List ExtraRobotsAllows { get; set; } + /// /// A value indicating whether to load all URL records and active slugs on application startup /// diff --git a/src/Libraries/SmartStore.Core/Email/DefaultEmailSender.cs b/src/Libraries/SmartStore.Core/Email/DefaultEmailSender.cs index 018c96210f..8973a9f3c9 100644 --- a/src/Libraries/SmartStore.Core/Email/DefaultEmailSender.cs +++ b/src/Libraries/SmartStore.Core/Email/DefaultEmailSender.cs @@ -36,8 +36,8 @@ protected virtual MailMessage BuildMailMessage(EmailMessage original) if (original.AltText.HasValue()) { - msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(original.AltText, new ContentType("text/html"))); - msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(original.Body, new ContentType("text/plain"))); + msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(original.Body, new ContentType("text/html"))); + msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(original.AltText, new ContentType("text/plain"))); } else { diff --git a/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs b/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs index 7a2dcf0aca..e382cae1b3 100644 --- a/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs +++ b/src/Libraries/SmartStore.Core/Events/ConsumerInvoker.cs @@ -101,11 +101,11 @@ private void HandleException(Exception ex, ConsumerDescriptor descriptor) { if (ex is AggregateException ae) { - ae.InnerExceptions.Each(x => Logger.Error(x)); + ae.InnerExceptions.Each(x => Logger.Error(x, $"Error invoking event consumer '{descriptor}'.")); } else { - Logger.Error(ex); + Logger.Error(ex, $"Error invoking event consumer '{descriptor}'."); } if (!descriptor.FireForget) diff --git a/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs b/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs index cebbe01c4a..1449395774 100644 --- a/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs +++ b/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs @@ -54,7 +54,32 @@ public static IEnumerable EnumerateParentCultures(CultureInfo cultu } } + public static bool TryGetCultureInfoForLocale(string locale, out CultureInfo culture) + { + culture = null; + + try + { + culture = CultureInfo.GetCultureInfoByIetfLanguageTag(locale); + return culture != null; + } + catch + { + return false; + } + } + public static string GetLanguageNativeName(string locale) + { + if (TryGetCultureInfoForLocale(locale, out var culture)) + { + return culture.NativeName; + } + + return null; + } + + public static string GetLanguageNativeName(string locale, bool englishName, bool shortName = false) { try { @@ -62,14 +87,74 @@ public static string GetLanguageNativeName(string locale) { var info = CultureInfo.GetCultureInfoByIetfLanguageTag(locale); if (info != null) - return info.NativeName; + { + if (shortName) + { + info = info.Parent; + } + + if (englishName) + { + return info.EnglishName; + } + else + { + return info.NativeName; + } + + } } } - catch { } + catch + { + } return null; } + public static string NormalizeLanguageDisplayName(string languageName, bool stripRegion = false, CultureInfo culture = null) + { + if (string.IsNullOrEmpty(languageName) || languageName.Length == 0) + { + return languageName; + } + + // First char to upper. + if (char.IsLower(languageName[0])) + { + languageName = (culture ?? CultureInfo.InvariantCulture).TextInfo.ToTitleCase(languageName); + } + + var bracketIndex = languageName.IndexOfAny(new[] { '(', '[' }); + var hasRegion = bracketIndex > -1; + var endBracket = ')'; + + if (hasRegion) + { + if (languageName[bracketIndex] == '[') + { + endBracket = ']'; + } + + if (stripRegion) + { + languageName = languageName.Substring(0, bracketIndex).TrimEnd(); + } + } + + // Remove everything after ',' within Region part + if (hasRegion && !stripRegion) + { + var commaIndex = languageName.IndexOf(','); + if (commaIndex > -1) + { + languageName = languageName.Substring(0, commaIndex) + endBracket; + } + } + + return languageName; + } + public static string GetCurrencySymbol(string locale) { try diff --git a/src/Libraries/SmartStore.Core/Plugins/PluginFileParser.cs b/src/Libraries/SmartStore.Core/Plugins/PluginFileParser.cs index 7f07271fa6..1ac124939e 100644 --- a/src/Libraries/SmartStore.Core/Plugins/PluginFileParser.cs +++ b/src/Libraries/SmartStore.Core/Plugins/PluginFileParser.cs @@ -88,7 +88,7 @@ public static HashSet ParseInstalledPluginsFile(string filePath = null) public static void SaveInstalledPluginsFile(ICollection pluginSystemNames, string filePath = null) { - if (pluginSystemNames == null || pluginSystemNames.Count == 0) + if (pluginSystemNames == null) return; filePath = filePath ?? InstalledPluginsFilePath; diff --git a/src/Libraries/SmartStore.Core/Rules/Rendering/IRuleOptionsProvider.cs b/src/Libraries/SmartStore.Core/Rules/Rendering/IRuleOptionsProvider.cs index 00e3dcc4d8..001a020e31 100644 --- a/src/Libraries/SmartStore.Core/Rules/Rendering/IRuleOptionsProvider.cs +++ b/src/Libraries/SmartStore.Core/Rules/Rendering/IRuleOptionsProvider.cs @@ -22,5 +22,23 @@ public partial interface IRuleOptionsProvider /// Optional search term entered by user in select control. /// Rule options result. RuleOptionsResult GetOptions(RuleOptionsRequestReason reason, IRuleExpression expression, int pageIndex, int pageSize, string searchTerm); + + /// + /// Gets options for a rule. + /// + /// The reason for the request. + /// Rule descriptor. + /// Expression value. + /// Page index if provided options are paged. + /// Page size if provided options are paged. + /// Optional search term entered by user in select control. + /// Rule options result. + RuleOptionsResult GetOptions( + RuleOptionsRequestReason reason, + RuleDescriptor descriptor, + string value, + int pageIndex, + int pageSize, + string searchTerm); } } diff --git a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj index f2738cabc8..cd84ae4268 100644 --- a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj +++ b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj @@ -86,8 +86,8 @@ ..\..\packages\log4net.2.0.8\lib\net45-full\log4net.dll True - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll True @@ -96,8 +96,8 @@ ..\..\packages\Microsoft.Web.Xdt.3.0.0\lib\net40\Microsoft.Web.XmlTransform.dll - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll ..\..\packages\NuGet.Core.2.14.0\lib\net40-Client\NuGet.Core.dll @@ -118,13 +118,13 @@ - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Libraries/SmartStore.Core/SmartStoreVersion.cs b/src/Libraries/SmartStore.Core/SmartStoreVersion.cs index 9a2b475c10..b34a1f8625 100644 --- a/src/Libraries/SmartStore.Core/SmartStoreVersion.cs +++ b/src/Libraries/SmartStore.Core/SmartStoreVersion.cs @@ -47,7 +47,10 @@ public static class SmartStoreVersion new Version("3.2.1"), new Version("3.2.2"), new Version("4.0.0"), - new Version("4.0.1") + new Version("4.0.1"), + new Version("4.1.0"), + new Version("4.1.1"), + new Version("4.2.0") }; private const string HELP_BASEURL = "https://docs.smartstore.com/display/"; diff --git a/src/Libraries/SmartStore.Core/Utilities/Threading/KeyedLock.cs b/src/Libraries/SmartStore.Core/Utilities/Threading/KeyedLock.cs index 158dff77d1..adaaec5992 100644 --- a/src/Libraries/SmartStore.Core/Utilities/Threading/KeyedLock.cs +++ b/src/Libraries/SmartStore.Core/Utilities/Threading/KeyedLock.cs @@ -114,7 +114,12 @@ public void Dispose() _locks.TryRemove(_item.Key, out _); } - _item.Semaphore.Release(); + if (_item.Semaphore.CurrentCount == 0) + { + _item.Semaphore.Release(); + } + + //_item.Semaphore.Dispose(); _item = null; } } diff --git a/src/Libraries/SmartStore.Core/WebHelper.cs b/src/Libraries/SmartStore.Core/WebHelper.cs index abd0b44dd1..14a332af68 100644 --- a/src/Libraries/SmartStore.Core/WebHelper.cs +++ b/src/Libraries/SmartStore.Core/WebHelper.cs @@ -118,6 +118,11 @@ public virtual string GetCurrentIpAddress() break; } } + } + + if (!string.IsNullOrEmpty(result)) + { + break; } } } diff --git a/src/Libraries/SmartStore.Core/app.config b/src/Libraries/SmartStore.Core/app.config index 9657a5deb1..67916a0819 100644 --- a/src/Libraries/SmartStore.Core/app.config +++ b/src/Libraries/SmartStore.Core/app.config @@ -14,6 +14,18 @@ + + + + + + + + + + + + diff --git a/src/Libraries/SmartStore.Core/packages.config b/src/Libraries/SmartStore.Core/packages.config index 0c8d7ea5ba..efb4850fdf 100644 --- a/src/Libraries/SmartStore.Core/packages.config +++ b/src/Libraries/SmartStore.Core/packages.config @@ -9,13 +9,13 @@ - + - + - - + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Mapping/Blogs/BlogPostMap.cs b/src/Libraries/SmartStore.Data/Mapping/Blogs/BlogPostMap.cs index 0176add108..bca23be8d1 100644 --- a/src/Libraries/SmartStore.Data/Mapping/Blogs/BlogPostMap.cs +++ b/src/Libraries/SmartStore.Data/Mapping/Blogs/BlogPostMap.cs @@ -16,6 +16,11 @@ public BlogPostMap() Property(bp => bp.MediaFileId).HasColumnName("MediaFileId"); Property(bp => bp.PreviewMediaFileId).HasColumnName("PreviewMediaFileId"); + HasOptional(bp => bp.Language) + .WithMany() + .HasForeignKey(bp => bp.LanguageId) + .WillCascadeOnDelete(false); + HasOptional(bp => bp.MediaFile) .WithMany() .HasForeignKey(bp => bp.MediaFileId) diff --git a/src/Libraries/SmartStore.Data/Mapping/News/NewsItemMap.cs b/src/Libraries/SmartStore.Data/Mapping/News/NewsItemMap.cs index ecc6fec988..5e99db7272 100644 --- a/src/Libraries/SmartStore.Data/Mapping/News/NewsItemMap.cs +++ b/src/Libraries/SmartStore.Data/Mapping/News/NewsItemMap.cs @@ -17,6 +17,11 @@ public NewsItemMap() Property(x => x.MediaFileId).HasColumnName("MediaFileId"); Property(x => x.PreviewMediaFileId).HasColumnName("PreviewMediaFileId"); + HasOptional(x => x.Language) + .WithMany() + .HasForeignKey(x => x.LanguageId) + .WillCascadeOnDelete(false); + HasOptional(bp => bp.MediaFile) .WithMany() .HasForeignKey(bp => bp.MediaFileId) diff --git a/src/Libraries/SmartStore.Data/Migrations/202010121359446_RemoveBlogAndNewsLanguage.cs b/src/Libraries/SmartStore.Data/Migrations/202010121359446_RemoveBlogAndNewsLanguage.cs index 2d3ec0f116..53fcbb0cdc 100644 --- a/src/Libraries/SmartStore.Data/Migrations/202010121359446_RemoveBlogAndNewsLanguage.cs +++ b/src/Libraries/SmartStore.Data/Migrations/202010121359446_RemoveBlogAndNewsLanguage.cs @@ -39,8 +39,15 @@ public override void Up() public override void Down() { - AddColumn("dbo.News", "LanguageId", c => c.Int(nullable: false)); - AddColumn("dbo.BlogPost", "LanguageId", c => c.Int(nullable: false)); + var defaultLanguageId = 1; + + if (DataSettings.DatabaseIsInstalled()) + { + defaultLanguageId = new SmartObjectContext().Set().Select(x => x.Id).FirstOrDefault(); + } + + AddColumn("dbo.News", "LanguageId", c => c.Int(nullable: false, defaultValue: defaultLanguageId)); + AddColumn("dbo.BlogPost", "LanguageId", c => c.Int(nullable: false, defaultValue: defaultLanguageId)); CreateIndex("dbo.News", "LanguageId"); CreateIndex("dbo.BlogPost", "LanguageId"); AddForeignKey("dbo.News", "LanguageId", "dbo.Language", "Id", cascadeDelete: true); @@ -56,9 +63,7 @@ public void Seed(SmartObjectContext context) return; } - // Migrate URL records of BlogPost and NewsItem that are stored with primary language ID. Must be 0 for "Standard" now. - var defaultLangId = context.Set().AsNoTracking().OrderBy(x => x.DisplayOrder).First().Id; - + // URL records of BlogPost and NewsItem must now have 0 for "Standard" as language ID otherwise no link is created. using (var scope = new DbContextScope(ctx: context, validateOnSave: false, hooksEnabled: false, autoCommit: false)) { var urlRecords = context.Set(); @@ -84,7 +89,7 @@ public void Seed(SmartObjectContext context) if (!kvp.Value.Any(x => x.LanguageId == 0)) { // Migrate active and inactive slugs. - kvp.Value.Where(x => x.LanguageId == defaultLangId).Each(x => x.LanguageId = 0); + kvp.Value.Where(x => x.LanguageId != 0).Each(x => x.LanguageId = 0); } } diff --git a/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.Designer.cs b/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.Designer.cs new file mode 100644 index 0000000000..316f66a305 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.Designer.cs @@ -0,0 +1,29 @@ +// +namespace SmartStore.Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class V410Resources : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(V410Resources)); + + string IMigrationMetadata.Id + { + get { return "202011091154314_V410Resources"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.cs b/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.cs new file mode 100644 index 0000000000..34543f8e68 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.cs @@ -0,0 +1,857 @@ +namespace SmartStore.Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + using System.Linq; + using SmartStore.Core.Domain.Configuration; + using SmartStore.Core.Domain.Media; + using SmartStore.Core.Domain.Seo; + using SmartStore.Data.Setup; + using SmartStore.Utilities; + + public partial class V410Resources : DbMigration, ILocaleResourcesProvider, IDataSeeder + { + public override void Up() + { + } + + public override void Down() + { + } + + public bool RollbackOnFailure => false; + + public void Seed(SmartObjectContext context) + { + context.MigrateLocaleResources(MigrateLocaleResources); + MigrateSettings(context); + context.SaveChanges(); + } + + public void MigrateSettings(SmartObjectContext context) + { + var settings = context.Set(); + + // Add .ico extension to MediaSettings.ImageTypes + var name = TypeHelper.NameOf(y => y.ImageTypes, true); + var setting = settings.FirstOrDefault(x => x.Name == name); + if (setting != null) + { + var arr = setting.Value.EmptyNull() + .Replace(Environment.NewLine, " ") + .ToLower() + .Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); + + if (!arr.Contains("ico")) + { + setting.Value += " ico"; + } + } + + // Migrate old 'defaultSeoSettings' into new SeoSettings + // Old settings. + var defaultTitle = settings.FirstOrDefault(x => x.Name == "SeoSettings.DefaultTitle"); + var defaultMetaKeywords = settings.FirstOrDefault(x => x.Name == "SeoSettings.DefaultMetaKeywords"); + var defaultMetaDescription = settings.FirstOrDefault(x => x.Name == "SeoSettings.DefaultMetaDescription"); + + // New settings. + context.MigrateSettings(x => + { + x.Add(TypeHelper.NameOf(y => y.MetaTitle, true), defaultTitle != null && defaultTitle.Value.HasValue() ? defaultTitle.Value : ""); + x.Add(TypeHelper.NameOf(y => y.MetaDescription, true), defaultMetaDescription != null && defaultMetaDescription.Value.HasValue() ? defaultMetaDescription.Value : ""); + x.Add(TypeHelper.NameOf(y => y.MetaKeywords, true), defaultMetaKeywords != null && defaultMetaKeywords.Value.HasValue() ? defaultMetaKeywords.Value : ""); + }); + + if (defaultTitle != null) settings.Remove(defaultTitle); + if (defaultMetaDescription != null) settings.Remove(defaultMetaDescription); + if (defaultMetaKeywords != null) settings.Remove(defaultMetaKeywords); + } + + public void MigrateLocaleResources(LocaleResourcesBuilder builder) + { + builder.Delete( + "Admin.SalesReport.Bestsellers.RunReport", + "Admin.SalesReport.NeverSold.RunReport", + "Admin.Customers.Reports.RunReport", + "Admin.Customers.Reports.BestBy.BestByNumberOfOrders", + "Admin.Customers.Reports.BestBy.BestByNumberOfOrders"); + + builder.AddOrUpdate("Admin.Customers.Reports.BestCustomers", "Top customers", "Top Kunden"); + + builder.AddOrUpdate("Admin.Configuration.Settings.Search.SearchProductByIdentificationNumber", + "Open product directly at SKU, MPN or GTIN", + "Produkt bei SKU, MPN oder GTIN direkt öffnen", + "Specifies whether the product page should be opened directly if the search term matches a SKU, MPN or GTIN.", + "Legt fest, ob bei einer Übereinstimmung des Suchbegriffes mit einer SKU, MPN oder GTIN die Produktseite direkt geöffnet werden soll."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.PasswordMinLength", + "Minimum password length", + "Mindestlänge eines Passworts", + "Specifies the minimum length of a password.", + "Legt die minimale Länge eines Passworts fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.MinDigitsInPassword", + "Minimum digits in password", + "Mindestanzahl von Ziffern im Passwort", + "Specifies the minimum number of digits for a password.", + "Legt die Mindestanzahl von Ziffern eines Passworts fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.MinSpecialCharsInPassword", + "Minimum special characters in password", + "Mindestanzahl von Sonderzeichen im Passwort", + "Specifies the minimum number of special characters for a password.", + "Legt die Mindestanzahl von Sonderzeichen eines Passworts fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.MinUppercaseCharsInPassword", + "Minimum uppercase letters in password", + "Mindestanzahl von Großbuchstaben im Passwort", + "Specifies the minimum number of uppercase letters for a password.", + "Legt die Mindestanzahl von Großbuchstaben eines Passworts fest."); + + builder.AddOrUpdate("Account.Fields.Password.MustContainChars", + "The password must contain at least {0}.", + "Das Passwort muss mindestens {0} enthalten."); + builder.AddOrUpdate("Account.Fields.Password.Digits", "{0} digits", "{0} Ziffern"); + builder.AddOrUpdate("Account.Fields.Password.SpecialChars", "{0} special characters", "{0} Sonderzeichen"); + builder.AddOrUpdate("Account.Fields.Password.UppercaseChars", "{0} uppercase letters", "{0} Großbuchstaben"); + + builder.AddOrUpdate("Admin.Rules.FilterDescriptor.PaymentMethod", "Payment method", "Zahlart"); + builder.AddOrUpdate("Admin.Rules.FilterDescriptor.Group.BrowserUserAgent", "Browser User Agent", "Browser User-Agent"); + + builder.AddOrUpdate("Admin.Orders.NoOrdersSelected", + "No orders are selected. Please select the desired orders.", + "Es sind keine Aufträge ausgewählt. Bitte wählen Sie die gewünschten Aufträge aus."); + + builder.AddOrUpdate("Admin.Orders.ProcessSelectedOrders", + "There are {0} orders selected. Would you like to proceed?", + "Es sind {0} Aufträge ausgewählt. Möchten Sie fortfahren?"); + + builder.AddOrUpdate("Admin.Orders.ProcessingResult", + "
{0} of {1} orders were successfully processed.
{2} orders cannot be changed as desired due to their current status and were skipped.", + "
Es wurden {0} von {1} Aufträgen erfolgreich verarbeitet.
{2} Aufträge können aufgrund ihres aktuellen Status nicht wie gewünscht geändert werden und wurden übersprungen."); + + builder.AddOrUpdate("Admin.Configuration.Countries.Fields.DefaultCurrency", + "Default currency", + "Standardwährung", + "Specifies the default currency. Preselects the default currency in the shop according to the country to which the current IP address belongs.", + "Legt die Standardwährung fest. Bewirkt im Shop eine Vorauswahl der Standardwährung anhand des Landes, zu dem die aktuelle IP-Adresse gehört."); + + builder.AddOrUpdate("Admin.Catalog.Attributes.CheckoutAttributes.Values.Fields.MediaFile", + "Picture", + "Bild", + "Specifies an image to be displayed as the selection element for the attribute.", + "Legt ein Bild fest, welches als Auswahlelement für das Attribut angezeigt werden soll."); + + builder.AddOrUpdate("Admin.Catalog.Attributes.CheckoutAttributes.Values.Fields.Color", + "RGB color", + "RGB-Farbe", + "Specifies a color for the color squares control.", + "Legt eine Farbe für das Farbflächen-Steuerelement fest."); + + builder.AddOrUpdate("Common.Entity.CheckoutAttributeValue", "Checkout attribute option", "Checkout-Attribut-Option"); + + builder.AddOrUpdate("Checkout.MaxOrderSubtotalAmount", + "The maximum order value for the subtotal is {0}.", + "Der Höchstbestellwert für die Zwischensumme ist {0}."); + + builder.AddOrUpdate("Checkout.MaxOrderTotalAmount", + "The maximum order value for the total is {0}.", + "Der Höchstbestellwert der Gesamtsumme ist {0}."); + + builder.AddOrUpdate("Admin.Customers.CustomerRoles.Fields.MinOrderTotal", + "Minimum order total", + "Mindestbestellwert", + "Defines the minimum order total for customers in this group.", + "Legt den Mindestbestellwert für Kunden in dieser Gruppe fest."); + + builder.AddOrUpdate("Admin.Customers.CustomerRoles.Fields.MaxOrderTotal", + "Maximum order total", + "Höchstbestellwert", + "Defines the maximum order total for customers in this group.", + "Legt den Höchstbestellwert für Kunden in dieser Gruppe fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Order.MinOrderTotal", + "Minimum order total", + "Mindestbestellwert", + "Defines the default minimum order total for the shop. Overridden by customer group restrictions.", + "Legt den standardmäßigen Mindestbestellwert für den Shop fest. Wird von Beschränkungen in Kundengruppen überschrieben."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Order.MaxOrderTotal", + "Maximum order total", + "Höchstbestellwert", + "Defines the default maximum order total for the shop. Overridden by customer group restrictions.", + "Legt den standardmäßigen Höchstbestellwert für den Shop fest. Wird von Beschränkungen in Kundengruppen überschrieben."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Order.ApplyToSubtotal", + "Order total restriction in relation to subtotal", + "Beschränkung bezogen auf Zwischensumme", + "Determines whether the min/max order value refers to the order subtotal, otherwise it refers to the total amount.", + "Bestimmt, ob sich der Mindest-/Höchstbetrag auf die Auftragszwischensumme bezieht, andernfalls bezieht er sich auf den Gesamtbetrag."); + + builder.Delete("Admin.Configuration.Settings.Order.MaxOrderSubtotalAmount", + "Admin.Configuration.Settings.Order.MaxOrderSubtotalAmount.Hint", + "Admin.Configuration.Settings.Order.MaxOrderTotalAmount", + "Admin.Configuration.Settings.Order.MaxOrderTotalAmount.Hint", + "Admin.Configuration.Settings.Order.MinOrderSubtotalAmount", + "Admin.Configuration.Settings.Order.MinOrderSubtotalAmount.Hint", + "Admin.Configuration.Settings.Order.MinOrderTotalAmount", + "Admin.Configuration.Settings.Order.MinOrderTotalAmount.Hint"); + + builder.AddOrUpdate("Admin.Configuration.Settings.Order.OrderTotalRestrictionType", + "Restrictions in customer groups are cumulative", + "Beschränkungen in Kundengruppen sind kumulativ", + "Determines whether multiple order total restrictions are cumulated by customer group assignments.", + "Bestimmt, ob mehrfache Bestellwertbeschränkungen durch Kundengruppenzuordnungen kumuliert werden."); + + builder.Delete("Products.AskQuestion.Question.Text"); + + builder.AddOrUpdate("Products.AskQuestion.Sent", + "Thank you. Your inquiry has been sent successfully.", + "Vielen Dank. Ihre Anfrage wurde erfolgreich gesendet."); + + builder.AddOrUpdate("Products.AskQuestion.Question.GeneralInquiry", + "I have following questions concerning the product {0}:", + "Ich habe folgende Fragen zum Artikel {0}:"); + + builder.AddOrUpdate("Products.AskQuestion.Question.QuoteRequest", + "I would like to request price information on the following article: {0}", + "Ich bitte um Preisinformationen zu folgendem Artikel: {0}"); + + builder.AddOrUpdate("Products.AskQuestion.CallHotline", "or call directly", "oder rufen Sie direkt an"); + + builder.AddOrUpdate("Products.AskQuestion.TitleQuoteRequest", "Request for quotation", "Angebotsanfrage"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CustomerFormFields.Description", + "Manage form fields that are displayed during registration.
" + + "In order to ensure the address transfer from the registration form, " + + "it is necessary that the following fields are activated and filled in by the customer: " + + "
  • First name
  • Last name
  • E-mail
  • and all fields that are selected as required in the tab 'Addresses'
", + "Verwalten Sie Formularfelder, die während der Registrierung angezeigt werden.
" + + "Um die Adressübergabe aus dem Registrierungsformular zu gewährleisten, ist es notwending, " + + "dass folgende Felder aktiviert und vom Kunden ausgefüllt sind:" + + "
  • Vorname
  • Nachname
  • E-Mail
  • und alle Felder die im Tab \"Adressen\" als erforderlich ausgewählt sind
"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.AddCookieInfo.Title", + "Add new cookie information", + "Neue Cookie-Informationen hinzufügen"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.EditCookieInfo.Title", + "Edit new cookie information", + "Cookie-Informationen bearbeiten"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.Name", + "Name", + "Name", + "Specifies the display name of the cookie information.", + "Bestimmt den Anzeigenamen der Cookie-Information."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.Description", + "Description", + "Beschreibung", + "Specifies the description of the cookie information.", + "Bestimmt die Beschreibung der Cookie-Information."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.CookieType", + "Cookie type", + "Art des Cookies", + "Specifies the usage type of the cookie (Required, Analytics, ThirdParty).", + "Bestimmt die Verwendungsart des Cookies (Required, Analytics, ThirdParty)."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.SameSiteMode", + "'SameSite' mode", + "'SameSite' Modus"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.SameSiteMode.AdminInstruction", + @"
SameSite Mode
+

+ The SameSite setting for cookies specifies the level of security for cookies when they are requested by other sites (e.g. in a cross-site request or in an iframe). + The recommended setting is Lax, as cookies are sent with most secure actions. +
+ If the store should also be embedded in an iframe, it is necessary to select the setting None. Additionally SSL must be set up in the store. +

+
    +
  • Unspecified: No SameSite header is transmitted to requests.
  • +
  • None: No mode specified. This setting must be used if the store should also be embedded in an iframe (SSL must be set up).
  • +
  • Lax: Recommended setting. Cookies are sent at the highest level for requests on the same website and for cross-site requests.
  • +
  • Strict: Cookies are only sent to requests from the same website.
  • +
", + @"
SameSite Modus
+

+ Die SameSite-Einstellung für Cookies bestimmt, das Sicherheitslevel für Cookies, wenn diese von anderen Seiten (z.B. in einem Cross-Site-Request oder in einem IFrame) aufgerufen werden. + Die empfohlene Einstellung ist Lax, da hier Cookies bei den meisten gesicherten Aktionen mitgesendet werden. +
+ Soll der Shop auch in ein IFrame eingebettet werden, ist es notwendig die Einstellung None zu wählen. Zusätzlich muss SSL im Shop eingerichtet sein. +

+
    +
  • Unspecified: Es wird kein SameSite-Header an Requests übermittelt.
  • +
  • None: Kein Modus angegeben. Diese Einstellung muss verwendet werden, wenn der Shop auch in ein IFrame eingebettet werden soll (SSL muss eingerichtet sein).
  • +
  • Lax: Empfohlene Einstellung. Cookies werden bei Anfragen auf derselben Website und bei Cross-Site-Requests auf höchster Ebene gesendet.
  • +
  • Strict: Cookies werden nur an Anfragen derselben Website gesendet.
  • +
"); + + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.ModalCookieConsent", + "Modal Cookie Manager", + "Cookie-Manager modal anzeigen", + "Specifies whether the Cookie Manager is displayed in a modal dialog in the frontend. The modal mode requires a customer interaction with the dialog before the customer can navigate in the store.", + "Bestimmt, ob der Cookie-Manager im Frontend in einem modalen Dialog angezeigt wird. Der modale Modus macht eine Kundeninteraktion mit dem Dialog erfoderlich, bevor der Kunde im Shop navigieren kann."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.EnableCookieConsent", + "Enable Cookie Manager", + "Cookie-Manager aktivieren", + "Specifies whether the Cookie Manager will be displayed in the frontend.", + "Legt fest, ob ein Dialog für die Zustimmung zur Nutzung von Cookies im Frontend angezeigt wird."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.IsPluginInfo", + "System cookie", + "System-Cookie"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.CookieInfoNotFound", + "Cookie information wasn't found.", + "Cookie-Information wurde nicht gefunden."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.RegisterCookieInfo.Title", + "Register your own cookie information", + "Eigene Cookie-Informationen registrieren"); + + builder.AddOrUpdate("CookieManager.Dialog.Hide", + "Hide", + "Ausblenden"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.AdminInstruction", + @"

+ If you have included third-party scripts in your shop that use cookies and are not integrated into Smartstore via a plugin, + you can provide your own information about these cookies for the Cookie Manager in the following table. + The added information is displayed in the Cookie Manager of the front end, corresponding to the type. + Cookie information provided to the Cookie Manager by active plug-ins is displayed in this table, + but cannot be edited. The texts of this information can be edited using the language resources + Admin > Configuration > Regional Settings > Languages. +

", + @"

+ Wenn Sie Skripte von Drittanbietern in Ihren Shop eingebunden haben, die Cookies nutzen und die nicht über ein Plugin in Smartstore integriert sind, + können Sie in folgender Tabelle eigene Informationen über diese Cookies für den Cookie-Manager bereitstellen. + Die zugefügten Informationen werden, dem Typ entsprechend, im Cookie-Manager des Frontends angezeigt. + Cookie-Informationen, die dem Cookie-Manager von aktiven Plugins zur Verfügung gestellt werden, werden in dieser Tabelle angezeigt, + können aber nicht bearbeitet werden. Die Texte dieser Informationen können über die Sprachresourcen bearbeitet werden + Admin > Konfiguration > Regionale Einstellungen > Sprachen. +

"); + + builder.AddOrUpdate("Admin.Catalog.Products.StockQuantityNotChanged", + "The stock quantity has not been updated because the value has changed since the page was loaded (e.g. due to a placed order). Current value is {0}.", + "Der Lagerbestand wurde nicht aktualisiert, weil sich der Wert seit Laden der Seite geändert hat (z.B. durch einen Auftragseingang). Aktueller Wert ist {0}."); + + builder.AddOrUpdate("Admin.Configuration.SeoTab.Title", + "SEO settings", + "SEO-Einstellungen"); + + builder.AddOrUpdate("Admin.Configuration.Seo.MetaTitle", + "Title tag", + "Title-Tag", + "Defines the title of the page, which is displayed in search engine results. If possible, enter a unique, concise title here.", + "Bestimmt den Titel der Seite, der unter anderem in den Ergebnissen von Suchmaschinen angezeigt wird. Geben Sie hier nach Möglichkeit einen einzigartigen, prägnanten Titel an."); + + builder.AddOrUpdate("Admin.Configuration.Seo.MetaDescription", + "Meta description", + "Meta Description", + "Defines the meta description of the site. An extract of this description is displayed in search engine results below the title.", + "Bestimmt die Meta Desciption der Seite. Ein Auszug dieser Beschreibung wird in den Ergebnissen von Suchmaschinen unterhalb des Titels dargestellt."); + + builder.AddOrUpdate("Admin.Configuration.Seo.MetaKeywords", + "Meta keywords", + "Meta Keywords", + "Defines the meta keywords of the site. Enter the keywords as a comma separated list.", + "Bestimmt die Meta Keywords der Seite. Geben Sie die Keywords als kommagetrennte Liste an."); + + builder.AddOrUpdate("Admin.System.MetaInfos", + "Meta tags", + "Meta-Elemente"); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.HomepageTitle", + "Title tag (Homepage)", + "Title-Tag (Startseite)", + "Defines the title tag for the homepage, which is displayed in search engine results.", + "Legt das Title-Tag für die Startseite fest, das unter anderem in den Ergebnissen von Suchmaschinen angezeigt wird."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.HomepageMetaDescription", + "Meta description (Homepage)", + "Meta Description (Startseite)", + "Defines the meta description for the homepage. An extract of this description is displayed in search engine results below the title.", + "Legt die Meta Description für die Startseite fest. Ein Auszug dieser Beschreibung wird in den Ergebnissen von Suchmaschinen unterhalb des Titels dargestellt."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.HomepageMetaKeywords", + "Meta keywords (Homepage)", + "Meta Keywords (Startseite)", + "Defines the meta keywords for the homepage. Enter the keywords as a comma separated list.", + "Legt die Meta Keywords für die Startseite fest. Geben Sie die Keywords als kommagetrennte Liste an."); + + builder.AddOrUpdate("Admin.Configuration.DeliveryTimes.Fields.MinDays", + "Delivery not before (in days)", + "Lieferung frühestens (in Tagen)", + "Specifies the minimum number of days for the delivery.", + "Legt den frühesten Zeitpunkt der Lieferung in Tagen fest."); + + builder.AddOrUpdate("Admin.Configuration.DeliveryTimes.Fields.MaxDays", + "Delivery not later than (in days)", + "Lieferung spätestens (in Tagen)", + "Specifies the maximum number of days for the delivery.", + "Legt den spätesten Zeitpunkt der Lieferung in Tagen fest."); + + builder.AddOrUpdate("Products.DeliveryDate", "Arrives:", "Lieferung:"); + + builder.AddOrUpdate("DeliveryTimes.Dates.OnTomorrow", "Tomorrow", "Morgen"); // exactly tomorrow + builder.AddOrUpdate("DeliveryTimes.Dates.Tomorrow", "tomorrow", "Morgen"); // tomorrow + + builder.AddOrUpdate("DeliveryTimes.Dates.DeliveryOn", "{0}", "{0}"); // allow "on {0}" etc. + builder.AddOrUpdate("DeliveryTimes.Dates.NotBefore", "not before {0}", "frühestens {0}"); + builder.AddOrUpdate("DeliveryTimes.Dates.Until", "until {0}", "bis {0}"); + builder.AddOrUpdate("DeliveryTimes.Dates.Between", "{0} - {1}", "{0} - {1}"); // allow "{0} till {1}" etc. + + builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.None", "Do not display", "Nicht anzeigen"); + builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.DateOnly", "Date only (if possible)", "Nur Datum (sofern möglich)"); + builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.LabelOnly", "Label only", "Nur Label"); + builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.LabelAndDate", "Label and date", "Label und Datum"); + + builder.Delete( + "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductLists", + "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductLists.Hint", + "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductDetail", + "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductDetail.Hint", + "Admin.Configuration.Settings.ShoppingCart.ShowDeliveryTimes", + "Admin.Configuration.Settings.ShoppingCart.ShowDeliveryTimes.Hint"); + + builder.AddOrUpdate("Admin.Configuration.Settings.Catalog.DeliveryTimesInProductDetail", + "Presentation of delivery times", + "Darstellung von Lieferzeiten", + "Specifies the way delivery times are displayed on product detail pages.", + "Legt die Darstellungsart von Lieferzeiten auf Produktdetailseiten fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Catalog.DeliveryTimesInLists", + "Presentation of delivery times", + "Darstellung von Lieferzeiten", + "Specifies the way delivery times are displayed in product lists. Due to lack of space, the grid view does not show a date for the delivery time.", + "Legt die Darstellungsart von Lieferzeiten in Produktlisten fest. Aus Platzgründen wird in der Rasteransicht kein Datum zur Lieferzeit angezeigt."); + + builder.AddOrUpdate("Admin.Configuration.Settings.ShoppingCart.DeliveryTimesInShoppingCart", + "Presentation of delivery times", + "Darstellung von Lieferzeiten", + "Specifies the way delivery times are displayed in shopping cart.", + "Legt die Darstellungsart von Lieferzeiten im Warenkorb fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Shipping.TodayShipmentHour", + "Order before x o'clock for same day shipment", + "Bis x Uhr bestellt, heute verschickt", + "Specifies the hour by which the order will be shipped the same day.", + "Legt die Stunde fest, bis zu der die Bestellung noch am selben Tag verschickt wird."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Shipping.DeliveryOnWorkweekDaysOnly", + "Delivery on workweek days only", + "Lieferungen nur an Werktagen", + "Specifies whether delivery takes place only on workweek days.", + "Legt fest, ob Lieferungen nur an Werktagen stattfinden."); + + builder.AddOrUpdate("Admin.Configuration.Seo.SeName", + "URL alias", + "URL-Alias", + "Set a search engine friendly page name e.g. 'my-landing-page' to make the page URL 'http://www.yourStore.com/my-landing-page'. Leave empty to generate it automatically based on the name of the entity.", + "Legen Sie einen suchmaschinenfreundlichen Seitennamen fest, z.B. 'meine-landing-page', um die URL zu 'http://www.yourStore.com/meine-landing-page' zu machen. Lassen Sie das Feld leer, um den Pfad automatisch auf Basis des Namens der Entität zu generieren."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.PageTitleSeparator", + "Page title separator", + "Titel-Trennzeichen", + "Specify page title tag separator.", + "Legt das Trennzeichen für das Titel-Tag fest."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.PageTitleSeoAdjustment", + "Title tag order", + "Titel-Tag Reihenfolge", + "Select the page title order. The generated title tag can be (PAGE NAME | YOURSTORE.COM) or (YOURSTORE.COM | PAGE NAME).", + "Legen Sie hier die Seitentitel-Reihenfolge fest. Das erzeugte Title-Tag könnte z.B. (MEINSHOP.DE | SEITE NAME) oder (SEITE NAME | MEINSHOP.DE) lauten."); + + builder.Delete("Admin.Catalog.Categories.Fields.SeName", + "Admin.Catalog.Categories.Fields.SeName.Hint", + "Admin.Catalog.Manufacturers.Fields.SeName", + "Admin.Catalog.Manufacturers.Fields.SeName.Hint", + "Admin.Catalog.Products.Fields.SeName", + "Admin.Catalog.Products.Fields.SeName.Hint", + "Admin.ContentManagement.Blog.BlogPosts.Fields.SeName", + "Admin.ContentManagement.Blog.BlogPosts.Fields.SeName.Hint", + "Admin.ContentManagement.Forums.Forum.Fields.SeName", + "Admin.ContentManagement.Forums.Forum.Fields.SeName.Hint", + "Admin.ContentManagement.Forums.ForumGroup.Fields.SeName", + "Admin.ContentManagement.Forums.ForumGroup.Fields.SeName.Hint", + "Admin.ContentManagement.News.NewsItems.Fields.SeName", + "Admin.ContentManagement.News.NewsItems.Fields.SeName.Hint", + "Admin.ContentManagement.Topics.Fields.SeName", + "Admin.ContentManagement.Topics.Fields.SeName.Hint"); + + builder.Delete("Admin.Catalog.Categories.Fields.MetaTitle", + "Admin.Catalog.Categories.Fields.MetaTitle.Hint", + "Admin.Catalog.Manufacturers.Fields.MetaTitle", + "Admin.Catalog.Manufacturers.Fields.MetaTitle.Hint", + "Admin.Catalog.Products.Fields.MetaTitle", + "Admin.Catalog.Products.Fields.MetaTitle.Hint", + "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaTitle", + "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaTitle.Hint", + "Admin.ContentManagement.News.NewsItems.Fields.MetaTitle", + "Admin.ContentManagement.News.NewsItems.Fields.MetaTitle.Hint", + "Admin.ContentManagement.Topics.Fields.MetaTitle", + "Admin.ContentManagement.Topics.Fields.MetaTitle.Hint"); + + builder.Delete("Admin.Catalog.Categories.Fields.MetaDescription", + "Admin.Catalog.Categories.Fields.MetaDescription.Hint", + "Admin.Catalog.Manufacturers.Fields.MetaDescription", + "Admin.Catalog.Manufacturers.Fields.MetaDescription.Hint", + "Admin.Catalog.Products.Fields.MetaDescription", + "Admin.Catalog.Products.Fields.MetaDescription.Hint", + "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaDescription", + "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaDescription.Hint", + "Admin.ContentManagement.News.NewsItems.Fields.MetaDescription", + "Admin.ContentManagement.News.NewsItems.Fields.MetaDescription.Hint", + "Admin.ContentManagement.Topics.Fields.MetaDescription", + "Admin.ContentManagement.Topics.Fields.MetaDescription.Hint"); + + builder.Delete("Admin.Catalog.Categories.Fields.MetaKeywords", + "Admin.Catalog.Categories.Fields.MetaKeywords.Hint", + "Admin.Catalog.Manufacturers.Fields.MetaKeywords", + "Admin.Catalog.Manufacturers.Fields.MetaKeywords.Hint", + "Admin.Catalog.Products.Fields.MetaKeywords", + "Admin.Catalog.Products.Fields.MetaKeywords.Hint", + "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaKeywords", + "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaKeywords.Hint", + "Admin.ContentManagement.News.NewsItems.Fields.MetaKeywords", + "Admin.ContentManagement.News.NewsItems.Fields.MetaKeywords.Hint", + "Admin.ContentManagement.Topics.Fields.MetaKeywords", + "Admin.ContentManagement.Topics.Fields.MetaKeywords.Hint", + "Admin.ContentManagement.Blog.BlogPosts.Fields.Language", + "Admin.ContentManagement.News.NewsItems.Fields.Language"); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DefaultTitle", + "Default title tag", + "Standard-Titel-Tag", + "Defines the default title for pages in your store. You can override this for individual categories, products, manufacturer and topic pages.", + "Legt das Standard-Titel-Tag für Seiten im Shop fest. Es kann für Warengruppen, Produkte, Hersteller und Seiten individuell angegeben werden."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DefaultMetaDescription", + "Default meta description", + "Standard Meta Beschreibung", + "Defines the default meta description for pages in your store. You can override this for individual categories, products, manufacturer and topic pages.", + "Legt die Meta Beschreibung für Seiten im Shop fest. Diese kann für Warengruppen, Produkte, Hersteller und Seiten individuell angegeben werden."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DefaultMetaKeywords", + "Default meta keywords", + "Standard Meta Keywords", + "Defines the default meta keywords for pages in your store. You can override these for individual categories, products, manufacturer and topic pages.", + "Legt die Meta Keywords für Seiten im Shop fest. Für Warengruppen, Produkte, Hersteller und Seiten können diese individuell angegeben werden."); + + builder.AddOrUpdate("Admin.Configuration.Settings.Catalog.ShowDiscountSign", + "Show discount sign", + "Rabattzeichen anzeigen", + "Specifies whether a discount sign should be displayed on product pictures when discounts were applied.", + "Legt fest, ob ein Rabattzeichen auf dem Produktbild angezeigt werden soll, wenn Rabatte angewendet wurden."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StateProvinceRequired", + "'State/province' required", + "'Bundesland' erferderlich", + "Check the box if 'State/province' is required.", + "Legt fest, ob Angaben im Eingabefeld 'Adresszusatz' erforderlich sind."); + + builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Catalog.AttributeChoiceBehaviour.GrayOutUnavailable", + "Gray out unavailable attributes", + "Nicht verfügbare Attribute ausgrauen"); + builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Catalog.AttributeChoiceBehaviour.None", + "None", + "Keines"); + + builder.AddOrUpdate("Admin.Catalog.Products.Fields.AttributeChoiceBehaviour", + "Attribute choice behaviour", + "Attribut-Auswahlverhalten", + "Specifies the behaviour when selecting attributes.", + "Legt das Verhalten bei der Auswahl von Attributen fest."); + + builder.AddOrUpdate("Admin.Catalog.Products.ProductVariantAttributes.Attributes.Fields.CustomData", + "Custom data", + "Benutzerdefinierte Daten", + "Specifies user-defined data. For free usage, e.g. for individual shop extensions.", + "Legt benutzerdefinierte Daten fest. Zur freien Verwendung, z.B. bei individuellen Shop-Erweiterungen."); + + #region Media + + var mediaRoot = "Admin.Configuration.Settings.Media."; + + builder.AddOrUpdate(mediaRoot + "ImageSizes", "Image/thumbnail sizes", "Bild-/Thumbnailgrößen"); + + builder.AddOrUpdate(mediaRoot + "DefaultPictureZoomEnabled", + "Enable image zoom", + "Bildzoom aktivieren", + "Adds 'zoom on hover' functionality to product detail images.", + "Aktiviert 'Zoom bei Hover'-Funktion für Produktdetail-Bilder."); + + builder.AddOrUpdate(mediaRoot + "AssociatedProductPictureSize", "Associated (grouped) product", "Verknüpftes (Gruppen)-Produkt"); + builder.AddOrUpdate(mediaRoot + "AvatarPictureSize", "Customer avatar", "Kundenavatar"); + builder.AddOrUpdate(mediaRoot + "BundledProductPictureSize", "Bundle items", "Bundle Stückliste"); + builder.AddOrUpdate(mediaRoot + "CartThumbBundleItemPictureSize", "Bundle items in cart", "Bundle Stückliste im Warenkorb"); + builder.AddOrUpdate(mediaRoot + "CartThumbPictureSize", "Cart", "Warenkorb"); + builder.AddOrUpdate(mediaRoot + "CategoryThumbPictureSize", "Categories", "Warengruppen"); + builder.AddOrUpdate(mediaRoot + "ManufacturerThumbPictureSize", "Brands", "Marken"); + builder.AddOrUpdate(mediaRoot + "MessageProductThumbPictureSize", "Products in e-mails", "Produkte in E-Mails"); + builder.AddOrUpdate(mediaRoot + "MiniCartThumbPictureSize", "Mini cart", "Mini-Warenkorb"); + builder.AddOrUpdate(mediaRoot + "ProductDetailsPictureSize", "Product detail", "Produktdetail"); + builder.AddOrUpdate(mediaRoot + "ProductThumbPictureSize", "Product list", "Produktliste"); + builder.AddOrUpdate(mediaRoot + "ProductThumbPictureSizeOnProductDetailsPage", "Gallery thumbnail", "Gallerie-Thumbnail"); + + builder.Delete( + mediaRoot + "AssociatedProductPictureSize.Hint", + mediaRoot + "AvatarPictureSize.Hint", + mediaRoot + "BundledProductPictureSize.Hint", + mediaRoot + "CartThumbBundleItemPictureSize.Hint", + mediaRoot + "CartThumbPictureSize.Hint", + mediaRoot + "CategoryThumbPictureSize.Hint", + mediaRoot + "ManufacturerThumbPictureSize.Hint", + mediaRoot + "MessageProductThumbPictureSize.Hint", + mediaRoot + "MiniCartThumbPictureSize.Hint", + mediaRoot + "ProductDetailsPictureSize.Hint", + mediaRoot + "ProductThumbPictureSize.Hint", + mediaRoot + "ProductThumbPictureSizeOnProductDetailsPage.Hint"); + + #endregion + + #region Customer settings + + builder.Delete("Admin.Configuration.Settings.CustomerUser.AddressFormFields.TitleEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.TitleEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.StreetAddress2Enabled", + "Admin.Configuration.Settings.CustomerUser.StreetAddress2Enabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Enabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Enabled.Hint", + "Admin.Configuration.Settings.CustomerUser.StreetAddress2Required", + "Admin.Configuration.Settings.CustomerUser.StreetAddress2Required.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Required", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Required.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxRequired", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxRequired.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.SalutationEnabled", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.SalutationEnabled.Hint", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.Salutations", + "Admin.Configuration.Settings.CustomerUser.AddressFormFields.Salutations.Hint"); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.GenderEnabled", + "'Gender' enabled", + "\"Geschlecht\" aktiv", + "Defines whether the input of 'Gender' is enabled.", + "Legt fest, ob das Eingabefeld \"Geschlecht\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.TitleEnabled", + "'Title' enabled", + "\"Titel\" aktiv", + "Defines whether the input of 'Title' is enabled.", + "Legt fest, ob das Eingabefeld \"Titel\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CompanyEnabled", + "'Company' enabled", + "\"Firma\" aktiv", + "Defines whether the input of 'Company' is enabled.", + "Legt fest, ob das Eingabefeld \"Firma\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CompanyRequired", + "'Company' required", + "\"Firma\" ist erforderlich", + "Defines whether the input of 'Company' is required.", + "Legt fest, ob die Eingabe von \"Firma\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddressEnabled", + "'Street address' enabled", + "\"Straße\" aktiv", + "Defines whether the input of 'Street adress' is enabled.", + "Legt fest, ob das Eingabefeld \"Straße\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddressRequired", + "'Street address' required", + "\"Straße\" ist erforderlich", + "Defines whether the input of 'Street adress' is required.", + "Legt fest, ob die Eingabe von \"Straße\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddress2Enabled", + "'Street address addition' enabled", + "\"Adressszusatz\" aktiv", + "Defines whether the input of 'street address addition' is enabled.", + "Legt fest, ob das Eingabefeld \"Adressszusatz\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddress2Required", + "'Street address addition' required", + "\"Adressszusatz\" ist erforderlich", + "Defines whether the input of 'street address addition' is required.", + "Legt fest, ob die Eingabe von \"Adressszusatz\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.ZipPostalCodeEnabled", + "'Zip / postal code' enabled", + "\"Postleitzahl\" aktiv", + "Defines whether the input of 'Zip / postal code' is enabled.", + "Legt fest, ob das Eingabefeld \"Postleitzahl\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.ZipPostalCodeRequired", + "'Zip / postal code' required", + "\"Postleitzahl\" ist erforderlich", + "Defines whether the input of 'Zip / postal code' is required.", + "Legt fest, ob die Eingabe von \"Postleitzahl\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CityEnabled", + "'City' enabled", + "\"Stadt\" aktiv", + "Defines whether the input of 'City' is enabled.", + "Legt fest, ob das Eingabefeld \"Stadt\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CityRequired", + "'City' required", + "\"Stadt\" ist erforderlich", + "Defines whether the input of 'City' is required.", + "Legt fest, ob die Eingabe von \"Stadt\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CountryEnabled", + "'Country' enabled", + "\"Land\" aktiv", + "Defines whether the input of 'Country' is enabled.", + "Legt fest, ob das Eingabefeld \"Land\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CountryRequired", + "'Country' required", + "\"Land\" ist erforderlich", + "Defines whether the input of 'Country' is required.", + "Legt fest, ob die Eingabe von \"Land\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StateProvinceEnabled", + "'State / province' enabled", + "\"Bundesland\" aktiv", + "Defines whether the input of 'State / province' is enabled.", + "Legt fest, ob das Eingabefeld \"Bundesland\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StateProvinceRequired", + "'State / province' required", + "\"Bundesland\" ist erforderlich", + "Defines whether the input of 'State / province' is required.", + "Legt fest, ob die Eingabe von \"Bundesland\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.PhoneEnabled", + "'Phone number' enabled", + "\"Telefon\" aktiv", + "Defines whether the input of 'Phone number' is enabled.", + "Legt fest, ob das Eingabefeld \"Telefon\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.PhoneRequired", + "'Phone number' required", + "\"Telefon\" ist erforderlich", + "Defines whether the input of 'Phone number' is required.", + "Legt fest, ob die Eingabe von \"Telefon\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.FaxEnabled", + "'Fax number' enabled", + "\"Fax\" aktiv", + "Defines whether the input of 'Fax number' is enabled.", + "Legt fest, ob das Eingabefeld \"Fax\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.FaxRequired", + "'Fax number' required", + "\"Fax\" ist erforderlich", + "Defines whether the input of 'Fax number' is required.", + "Legt fest, ob die Eingabe von \"Fax\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.NewsletterEnabled", + "'Newsletter' enabled", + "\"Newsletter\" aktiv", + "Displays the newsletter registration form.", + "Zeigt das Newsletter Anmeldeformular an."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.SalutationEnabled", + "'Salutation' enabled", + "\"Anrede\" aktiv", + "Defines whether the input of 'Salutation' is enabled.", + "Legt fest, ob das Eingabefeld \"Anrede\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Salutations", + "Salutations", + "Anreden", + "Comma separated list of salutations (e.g. Mr., Mrs). Define the entries which will populate the dropdown list for salutation when entering addresses.", + "Komma getrennte Liste (z.B. Herr, Frau). Bestimmen Sie die Einträge für die Auswahl der Anrede, bei der Adresserfassung."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.DateOfBirthEnabled", + "'Date of birth' enabled", + "\"Geburtsdatum\" aktiv", + "Defines whether the input of 'Date of birth' is enabled.", + "Legt fest, ob das Eingabefeld \"Geburtsdatum\" aktiviert ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.LastNameRequired", + "'Last name' required", + "\"Nachname\" ist erforderlich", + "Defines whether the input of 'Last name' is required.", + "Legt fest, ob die Eingabe von \"Nachname\" erforderlich ist."); + + builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.FirstNameRequired", + "'First name' required", + "\"Vorname\" ist erforderlich", + "Defines whether the input of 'First name' is required.", + "Legt fest, ob die Eingabe von \"Vorname\" erforderlich ist."); + + #endregion Customer settings + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.FacebookAppId", + "Facebook App ID", + "Facebook App ID", + "A Facebook App ID is a unique number that identifies your application and connects it to your Facebook account. It is used when sharing products, category and manufacturer pages on Facebook.", + "Eine Facebook App ID ist eine eindeutige Nummer, die Ihre Anwendung identifiziert und mit Ihrem Facebook-Account verknüpft. Wird beim Teilen von Produkten, Warengruppen- und Herstellerseiten auf Facebook genutzt."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.TwitterSite", + "Twitter Username", + "Twitter-Benutzername", + "Twitter Username that gets displayed on Twitter cards when a product, category and manufacturer page is shared on Twitter. Starts with a '@'.", + "Twitter-Benutzername, der auf Twitter-Karten angezeigt wird, wenn ein Produkt, eine Kategorie oder eine Herstellerseite auf Twitter geteilt wird. Beginnt mit einem '@'."); + + builder.AddOrUpdate("Admin.ContentManagement.Topics.Validation.NoEmptyPassword", + "Password must have a value.", + "Passwort muss einen Wert haben."); + + builder.AddOrUpdate("Admin.ContentManagement.Topics.Validation.NoPasswordAllowed", + "HTML widgets cannot have a password protection.", + "HTML Widgets können keinen Passwortschutz haben."); + + builder.AddOrUpdate("Order.CompletePayment.Hint", + "Click 'Complete payment' if you have not yet paid and wish to start the payment process again.", + "Klicken Sie 'Zahlung veranlassen', falls Sie noch nicht gezahlt haben und den Zahlungsvorgang erneut starten möchten."); + + builder.AddOrUpdate("Admin.ContentManagement.Forums.ForumGroup.Updated") + .Value("de", "Die Forengruppe wurde erfolgreich aktualisiert."); + + builder.AddOrUpdate("Account.Login.NotRegisteredYet", + "Not registered yet?", + "Noch nicht registriert?"); + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.resx b/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.resx new file mode 100644 index 0000000000..aa24204390 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202011091154314_V410Resources.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.Designer.cs b/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.Designer.cs new file mode 100644 index 0000000000..05f0cd1fa7 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.Designer.cs @@ -0,0 +1,29 @@ +// +namespace SmartStore.Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class AddBlogAndNewsLanguage : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddBlogAndNewsLanguage)); + + string IMigrationMetadata.Id + { + get { return "202012051645539_AddBlogAndNewsLanguage"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.cs b/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.cs new file mode 100644 index 0000000000..0312293126 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.cs @@ -0,0 +1,28 @@ +namespace SmartStore.Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class AddBlogAndNewsLanguage : DbMigration + { + public override void Up() + { + AddColumn("dbo.BlogPost", "LanguageId", c => c.Int()); + AddColumn("dbo.News", "LanguageId", c => c.Int()); + CreateIndex("dbo.BlogPost", "LanguageId"); + CreateIndex("dbo.News", "LanguageId"); + AddForeignKey("dbo.BlogPost", "LanguageId", "dbo.Language", "Id"); + AddForeignKey("dbo.News", "LanguageId", "dbo.Language", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.News", "LanguageId", "dbo.Language"); + DropForeignKey("dbo.BlogPost", "LanguageId", "dbo.Language"); + DropIndex("dbo.News", new[] { "LanguageId" }); + DropIndex("dbo.BlogPost", new[] { "LanguageId" }); + DropColumn("dbo.News", "LanguageId"); + DropColumn("dbo.BlogPost", "LanguageId"); + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.resx b/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.resx new file mode 100644 index 0000000000..9e6a6c4fa3 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202012051645539_AddBlogAndNewsLanguage.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.Designer.cs b/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.Designer.cs new file mode 100644 index 0000000000..7c33223814 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.Designer.cs @@ -0,0 +1,29 @@ +// +namespace SmartStore.Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class V411Resources : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(V411Resources)); + + string IMigrationMetadata.Id + { + get { return "202101251149352_V411Resources"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.cs b/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.cs new file mode 100644 index 0000000000..fd19393cf6 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.cs @@ -0,0 +1,92 @@ +namespace SmartStore.Data.Migrations +{ + using System.Data.Entity.Migrations; + using SmartStore.Data.Setup; + + public partial class V411Resources : DbMigration, ILocaleResourcesProvider, IDataSeeder + { + public override void Up() + { + } + + public override void Down() + { + } + + public bool RollbackOnFailure => false; + + public void Seed(SmartObjectContext context) + { + context.MigrateLocaleResources(MigrateLocaleResources); + context.SaveChanges(); + } + + public void MigrateLocaleResources(LocaleResourcesBuilder builder) + { + builder.AddOrUpdate("Admin.Rules.FilterDescriptor.CartItemQuantity", + "Product quantity is in range", + "Produktmenge liegt in folgendem Bereich"); + + builder.AddOrUpdate("Newsletter.SubscriptionFailed", + "The subscription or unsubscription has failed.", + "Die Abonnierung bzw. Abbestellung ist fehlgeschlagen."); + + builder.AddOrUpdate("Common.UnsupportedBrowser", + "You are using an unsupported browser! Please consider switching to a modern browser such as Google Chrome, Firefox or Opera to fully enjoy your shopping experience.", + "Sie verwenden einen nicht unterstützten Browser! Bitte ziehen Sie in Betracht, zu einem modernen Browser wie Google Chrome, Firefox oder Opera zu wechseln, um Ihr Einkaufserlebnis in vollen Zügen genießen zu können."); + + builder.Delete("Admin.Configuration.Settings.Order.ApplyToSubtotal"); + builder.Delete("Checkout.MaxOrderTotalAmount"); + builder.Delete("Checkout.MinOrderTotalAmount"); + + builder.AddOrUpdate("Checkout.MaxOrderSubtotalAmount", + "Your maximum order total allowed is {0}.", + "Ihr zulässiger Höchstbestellwert beträgt {0}."); + + builder.AddOrUpdate("Checkout.MinOrderSubtotalAmount", + "Your minimum order total allowed is {0}.", + "Ihr zulässiger Mindestbestellwert beträgt {0}."); + + builder.Delete("Admin.Configuration.Settings.Order.OrderTotalRestrictionType"); + + builder.AddOrUpdate("Admin.Configuration.Settings.Order.MultipleOrderTotalRestrictionsExpandRange", + "Customer groups extend the value range", + "Kundengruppen erweitern den Wertebereich", + "Specifies whether multiple order total restrictions through customer group assignments extend the allowed order value range.", + "Legt fest, ob mehrfache Bestellwertbeschränkungen durch Kundengruppenzuordnungen den erlaubten Bestellwertbereich erweitern."); + + builder.AddOrUpdate("ActivityLog.EditOrder", + "Edited order {0}", + "Auftrag {0} bearbeitet"); + + builder.AddOrUpdate("Admin.ContentManagement.Blog.BlogPosts.Fields.Language", + "Regional relevance", + "Regionale Relevanz", + "Specifies the language for which the post is displayed. If limited to one language, blog contents need only be edited in that language (no multilingualism).", + "Legt fest, für welche Sprache der Beitrag angezeigt wird. Bei einer Begrenzung auf eine Sprache brauchen Blog-Inhalte nur in dieser Sprache eingegeben zu werden (keine Mehrsprachigkeit)."); + + builder.AddOrUpdate("Admin.ContentManagement.News.NewsItems.Fields.Language", + "Regional relevance", + "Regionale Relevanz", + "Specifies the language for which the news is displayed. If limited to one language, news contents need only be edited in that language (no multilingualism).", + "Legt fest, für welche Sprache die News angezeigt wird. Bei einer Begrenzung auf eine Sprache brauchen News-Inhalte nur in dieser Sprache eingegeben zu werden (keine Mehrsprachigkeit)."); + + builder.AddOrUpdate("Common.International", "International", "International"); + + builder.AddOrUpdate("Admin.Plugins.KnownGroup.B2B", "B2B", "B2B"); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.ReCaptchaTypeChangeWarning", + "When changing the reCAPTCHA type, the public and private key must also be changed.", + "Beim Ändern des reCAPTCHA Typs müssen auch die beiden Zugangsschlüssel (public\\private key) geändert werden."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.ExtraRobotsAllows", + "Extra Allows for robots.txt", + "Extra Allows für robots.txt", + "Enter additional paths that should be included as Allow entries in your robots.txt. Each entry has to be entered in a new line.", + "Geben Sie hier zusätzliche Pfade an, die als Allow-Einträge zur robots.txt hinzugefügt werden sollen. Jeder Eintrag muss in einer neuen Zeile erfolgen."); + + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DisplayAllows", "Show items for 'Allow'", "Einträge für 'Allow' anzeigen"); + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DisplayDisallows", "Show items for 'Disallow'", "Einträge für 'Disallow' anzeigen"); + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.resx b/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.resx new file mode 100644 index 0000000000..45481ac4d2 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202101251149352_V411Resources.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.Designer.cs b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.Designer.cs new file mode 100644 index 0000000000..db9463e650 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.Designer.cs @@ -0,0 +1,29 @@ +// +namespace SmartStore.Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class V420Resources : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(V420Resources)); + + string IMigrationMetadata.Id + { + get { return "202112171231491_V420Resources"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.cs b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.cs new file mode 100644 index 0000000000..9dae67f2b9 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.cs @@ -0,0 +1,46 @@ +namespace SmartStore.Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + using SmartStore.Core.Data; + using SmartStore.Data.Setup; + + public partial class V420Resources : DbMigration, ILocaleResourcesProvider, IDataSeeder + { + public override void Up() + { + } + + public override void Down() + { + } + + + public bool RollbackOnFailure => false; + + public void Seed(SmartObjectContext context) + { + context.MigrateLocaleResources(MigrateLocaleResources); + context.SaveChanges(); + + if (DataSettings.DatabaseIsInstalled()) + { + var logTypeMigrator = new ActivityLogTypeMigrator(context); + logTypeMigrator.AddActivityLogType("EditOrder", "Edit an order", "Auftrag bearbeitet"); + } + } + + public void MigrateLocaleResources(LocaleResourcesBuilder builder) + { + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.TwitterSite.Error", + "The Twitter username must begin with an '@'.", + "Der Twitter-Benutzername muss mit einem '@' beginnen."); + + builder.AddOrUpdate("Admin.Configuration.Settings.ShoppingCart.AddProductsToBasketInSinglePositions", + "Add products to cart in single positions", + "Produkte in einzelnen Positionen in den Warenkorb legen", + "Enable this option if you want products with different quantities to be added to the shopping cart in single position.", + "Aktivieren Sie diese Option, wenn Produkte mit verschiedenen Mengenangaben als Einzelpositionen in den Warenkorb gelegt werden sollen."); + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.resx b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.resx new file mode 100644 index 0000000000..a16bcc4ba7 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs index 967c381f4e..9afb1372cc 100644 --- a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs +++ b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs @@ -5,9 +5,6 @@ using System.Linq; using Setup; using SmartStore.Core.Data; - using SmartStore.Core.Domain.Configuration; - using SmartStore.Core.Domain.Media; - using SmartStore.Core.Domain.Seo; using SmartStore.Utilities; public sealed class MigrationsConfiguration : DbMigrationsConfiguration @@ -47,828 +44,16 @@ protected override void Seed(SmartObjectContext context) public void MigrateSettings(SmartObjectContext context) { - var settings = context.Set(); - // Add .ico extension to MediaSettings.ImageTypes - var name = TypeHelper.NameOf(y => y.ImageTypes, true); - var setting = settings.FirstOrDefault(x => x.Name == name); - if (setting != null) - { - var arr = setting.Value.EmptyNull() - .Replace(Environment.NewLine, " ") - .ToLower() - .Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); - - if (!arr.Contains("ico")) - { - setting.Value += " ico"; - } - } - - // Migrate old 'defaultSeoSettings' into new SeoSettings - // Old settings. - var defaultTitle = settings.FirstOrDefault(x => x.Name == "SeoSettings.DefaultTitle"); - var defaultMetaKeywords = settings.FirstOrDefault(x => x.Name == "SeoSettings.DefaultMetaKeywords"); - var defaultMetaDescription = settings.FirstOrDefault(x => x.Name == "SeoSettings.DefaultMetaDescription"); - - // New settings. - context.MigrateSettings(x => - { - x.Add(TypeHelper.NameOf(y => y.MetaTitle, true), defaultTitle != null && defaultTitle.Value.HasValue() ? defaultTitle.Value : ""); - x.Add(TypeHelper.NameOf(y => y.MetaDescription, true), defaultMetaDescription != null && defaultMetaDescription.Value.HasValue() ? defaultMetaDescription.Value : ""); - x.Add(TypeHelper.NameOf(y => y.MetaKeywords, true), defaultMetaKeywords != null && defaultMetaKeywords.Value.HasValue() ? defaultMetaKeywords.Value : ""); - }); - - if (defaultTitle != null) settings.Remove(defaultTitle); - if (defaultMetaDescription != null) settings.Remove(defaultMetaDescription); - if (defaultMetaKeywords != null) settings.Remove(defaultMetaKeywords); } public void MigrateLocaleResources(LocaleResourcesBuilder builder) { - builder.Delete( - "Admin.SalesReport.Bestsellers.RunReport", - "Admin.SalesReport.NeverSold.RunReport", - "Admin.Customers.Reports.RunReport", - "Admin.Customers.Reports.BestBy.BestByNumberOfOrders", - "Admin.Customers.Reports.BestBy.BestByNumberOfOrders"); - - builder.AddOrUpdate("Admin.Customers.Reports.BestCustomers", "Top customers", "Top Kunden"); - - builder.AddOrUpdate("Admin.Configuration.Settings.Search.SearchProductByIdentificationNumber", - "Open product directly at SKU, MPN or GTIN", - "Produkt bei SKU, MPN oder GTIN direkt öffnen", - "Specifies whether the product page should be opened directly if the search term matches a SKU, MPN or GTIN.", - "Legt fest, ob bei einer Übereinstimmung des Suchbegriffes mit einer SKU, MPN oder GTIN die Produktseite direkt geöffnet werden soll."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.PasswordMinLength", - "Minimum password length", - "Mindestlänge eines Passworts", - "Specifies the minimum length of a password.", - "Legt die minimale Länge eines Passworts fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.MinDigitsInPassword", - "Minimum digits in password", - "Mindestanzahl von Ziffern im Passwort", - "Specifies the minimum number of digits for a password.", - "Legt die Mindestanzahl von Ziffern eines Passworts fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.MinSpecialCharsInPassword", - "Minimum special characters in password", - "Mindestanzahl von Sonderzeichen im Passwort", - "Specifies the minimum number of special characters for a password.", - "Legt die Mindestanzahl von Sonderzeichen eines Passworts fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.MinUppercaseCharsInPassword", - "Minimum uppercase letters in password", - "Mindestanzahl von Großbuchstaben im Passwort", - "Specifies the minimum number of uppercase letters for a password.", - "Legt die Mindestanzahl von Großbuchstaben eines Passworts fest."); - - builder.AddOrUpdate("Account.Fields.Password.MustContainChars", - "The password must contain at least {0}.", - "Das Passwort muss mindestens {0} enthalten."); - builder.AddOrUpdate("Account.Fields.Password.Digits", "{0} digits", "{0} Ziffern"); - builder.AddOrUpdate("Account.Fields.Password.SpecialChars", "{0} special characters", "{0} Sonderzeichen"); - builder.AddOrUpdate("Account.Fields.Password.UppercaseChars", "{0} uppercase letters", "{0} Großbuchstaben"); - - builder.AddOrUpdate("Admin.Rules.FilterDescriptor.PaymentMethod", "Payment method", "Zahlart"); - builder.AddOrUpdate("Admin.Rules.FilterDescriptor.Group.BrowserUserAgent", "Browser User Agent", "Browser User-Agent"); - - builder.AddOrUpdate("Admin.Orders.NoOrdersSelected", - "No orders are selected. Please select the desired orders.", - "Es sind keine Aufträge ausgewählt. Bitte wählen Sie die gewünschten Aufträge aus."); - - builder.AddOrUpdate("Admin.Orders.ProcessSelectedOrders", - "There are {0} orders selected. Would you like to proceed?", - "Es sind {0} Aufträge ausgewählt. Möchten Sie fortfahren?"); - - builder.AddOrUpdate("Admin.Orders.ProcessingResult", - "
{0} of {1} orders were successfully processed.
{2} orders cannot be changed as desired due to their current status and were skipped.", - "
Es wurden {0} von {1} Aufträgen erfolgreich verarbeitet.
{2} Aufträge können aufgrund ihres aktuellen Status nicht wie gewünscht geändert werden und wurden übersprungen."); - - builder.AddOrUpdate("Admin.Configuration.Countries.Fields.DefaultCurrency", - "Default currency", - "Standardwährung", - "Specifies the default currency. Preselects the default currency in the shop according to the country to which the current IP address belongs.", - "Legt die Standardwährung fest. Bewirkt im Shop eine Vorauswahl der Standardwährung anhand des Landes, zu dem die aktuelle IP-Adresse gehört."); - - builder.AddOrUpdate("Admin.Catalog.Attributes.CheckoutAttributes.Values.Fields.MediaFile", - "Picture", - "Bild", - "Specifies an image to be displayed as the selection element for the attribute.", - "Legt ein Bild fest, welches als Auswahlelement für das Attribut angezeigt werden soll."); - - builder.AddOrUpdate("Admin.Catalog.Attributes.CheckoutAttributes.Values.Fields.Color", - "RGB color", - "RGB-Farbe", - "Specifies a color for the color squares control.", - "Legt eine Farbe für das Farbflächen-Steuerelement fest."); - - builder.AddOrUpdate("Common.Entity.CheckoutAttributeValue", "Checkout attribute option", "Checkout-Attribut-Option"); - - builder.AddOrUpdate("Checkout.MaxOrderSubtotalAmount", - "The maximum order value for the subtotal is {0}.", - "Der Höchstbestellwert für die Zwischensumme ist {0}."); - - builder.AddOrUpdate("Checkout.MaxOrderTotalAmount", - "The maximum order value for the total is {0}.", - "Der Höchstbestellwert der Gesamtsumme ist {0}."); - - builder.AddOrUpdate("Admin.Customers.CustomerRoles.Fields.MinOrderTotal", - "Minimum order total", - "Mindestbestellwert", - "Defines the minimum order total for customers in this group.", - "Legt den Mindestbestellwert für Kunden in dieser Gruppe fest."); - - builder.AddOrUpdate("Admin.Customers.CustomerRoles.Fields.MaxOrderTotal", - "Maximum order total", - "Höchstbestellwert", - "Defines the maximum order total for customers in this group.", - "Legt den Höchstbestellwert für Kunden in dieser Gruppe fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Order.MinOrderTotal", - "Minimum order total", - "Mindestbestellwert", - "Defines the default minimum order total for the shop. Overridden by customer group restrictions.", - "Legt den standardmäßigen Mindestbestellwert für den Shop fest. Wird von Beschränkungen in Kundengruppen überschrieben."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Order.MaxOrderTotal", - "Maximum order total", - "Höchstbestellwert", - "Defines the default maximum order total for the shop. Overridden by customer group restrictions.", - "Legt den standardmäßigen Höchstbestellwert für den Shop fest. Wird von Beschränkungen in Kundengruppen überschrieben."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Order.ApplyToSubtotal", - "Order total restriction in relation to subtotal", - "Beschränkung bezogen auf Zwischensumme", - "Determines whether the min/max order value refers to the order subtotal, otherwise it refers to the total amount.", - "Bestimmt, ob sich der Mindest-/Höchstbetrag auf die Auftragszwischensumme bezieht, andernfalls bezieht er sich auf den Gesamtbetrag."); - - builder.Delete("Admin.Configuration.Settings.Order.MaxOrderSubtotalAmount", - "Admin.Configuration.Settings.Order.MaxOrderSubtotalAmount.Hint", - "Admin.Configuration.Settings.Order.MaxOrderTotalAmount", - "Admin.Configuration.Settings.Order.MaxOrderTotalAmount.Hint", - "Admin.Configuration.Settings.Order.MinOrderSubtotalAmount", - "Admin.Configuration.Settings.Order.MinOrderSubtotalAmount.Hint", - "Admin.Configuration.Settings.Order.MinOrderTotalAmount", - "Admin.Configuration.Settings.Order.MinOrderTotalAmount.Hint"); - - builder.AddOrUpdate("Admin.Configuration.Settings.Order.OrderTotalRestrictionType", - "Restrictions in customer groups are cumulative", - "Beschränkungen in Kundengruppen sind kumulativ", - "Determines whether multiple order total restrictions are cumulated by customer group assignments.", - "Bestimmt, ob mehrfache Bestellwertbeschränkungen durch Kundengruppenzuordnungen kumuliert werden."); - - builder.Delete("Products.AskQuestion.Question.Text"); - - builder.AddOrUpdate("Products.AskQuestion.Sent", - "Thank you. Your inquiry has been sent successfully.", - "Vielen Dank. Ihre Anfrage wurde erfolgreich gesendet."); - - builder.AddOrUpdate("Products.AskQuestion.Question.GeneralInquiry", - "I have following questions concerning the product {0}:", - "Ich habe folgende Fragen zum Artikel {0}:"); - - builder.AddOrUpdate("Products.AskQuestion.Question.QuoteRequest", - "I would like to request price information on the following article: {0}", - "Ich bitte um Preisinformationen zu folgendem Artikel: {0}"); - - builder.AddOrUpdate("Products.AskQuestion.CallHotline", "or call directly", "oder rufen Sie direkt an"); - - builder.AddOrUpdate("Products.AskQuestion.TitleQuoteRequest", "Request for quotation", "Angebotsanfrage"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CustomerFormFields.Description", - "Manage form fields that are displayed during registration.
" + - "In order to ensure the address transfer from the registration form, " + - "it is necessary that the following fields are activated and filled in by the customer: " + - "
  • First name
  • Last name
  • E-mail
  • and all fields that are selected as required in the tab 'Addresses'
", - "Verwalten Sie Formularfelder, die während der Registrierung angezeigt werden.
" + - "Um die Adressübergabe aus dem Registrierungsformular zu gewährleisten, ist es notwending, " + - "dass folgende Felder aktiviert und vom Kunden ausgefüllt sind:" + - "
  • Vorname
  • Nachname
  • E-Mail
  • und alle Felder die im Tab \"Adressen\" als erforderlich ausgewählt sind
"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.AddCookieInfo.Title", - "Add new cookie information", - "Neue Cookie-Informationen hinzufügen"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.EditCookieInfo.Title", - "Edit new cookie information", - "Cookie-Informationen bearbeiten"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.Name", - "Name", - "Name", - "Specifies the display name of the cookie information.", - "Bestimmt den Anzeigenamen der Cookie-Information."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.Description", - "Description", - "Beschreibung", - "Specifies the description of the cookie information.", - "Bestimmt die Beschreibung der Cookie-Information."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.CookieType", - "Cookie type", - "Art des Cookies", - "Specifies the usage type of the cookie (Required, Analytics, ThirdParty).", - "Bestimmt die Verwendungsart des Cookies (Required, Analytics, ThirdParty)."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.SameSiteMode", - "'SameSite' mode", - "'SameSite' Modus"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.SameSiteMode.AdminInstruction", - @"
SameSite Mode
-

- The SameSite setting for cookies specifies the level of security for cookies when they are requested by other sites (e.g. in a cross-site request or in an iframe). - The recommended setting is Lax, as cookies are sent with most secure actions. -
- If the store should also be embedded in an iframe, it is necessary to select the setting None. Additionally SSL must be set up in the store. -

-
    -
  • Unspecified: No SameSite header is transmitted to requests.
  • -
  • None: No mode specified. This setting must be used if the store should also be embedded in an iframe (SSL must be set up).
  • -
  • Lax: Recommended setting. Cookies are sent at the highest level for requests on the same website and for cross-site requests.
  • -
  • Strict: Cookies are only sent to requests from the same website.
  • -
", - @"
SameSite Modus
-

- Die SameSite-Einstellung für Cookies bestimmt, das Sicherheitslevel für Cookies, wenn diese von anderen Seiten (z.B. in einem Cross-Site-Request oder in einem IFrame) aufgerufen werden. - Die empfohlene Einstellung ist Lax, da hier Cookies bei den meisten gesicherten Aktionen mitgesendet werden. -
- Soll der Shop auch in ein IFrame eingebettet werden, ist es notwendig die Einstellung None zu wählen. Zusätzlich muss SSL im Shop eingerichtet sein. -

-
    -
  • Unspecified: Es wird kein SameSite-Header an Requests übermittelt.
  • -
  • None: Kein Modus angegeben. Diese Einstellung muss verwendet werden, wenn der Shop auch in ein IFrame eingebettet werden soll (SSL muss eingerichtet sein).
  • -
  • Lax: Empfohlene Einstellung. Cookies werden bei Anfragen auf derselben Website und bei Cross-Site-Requests auf höchster Ebene gesendet.
  • -
  • Strict: Cookies werden nur an Anfragen derselben Website gesendet.
  • -
"); - - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.ModalCookieConsent", - "Modal Cookie Manager", - "Cookie-Manager modal anzeigen", - "Specifies whether the Cookie Manager is displayed in a modal dialog in the frontend. The modal mode requires a customer interaction with the dialog before the customer can navigate in the store.", - "Bestimmt, ob der Cookie-Manager im Frontend in einem modalen Dialog angezeigt wird. Der modale Modus macht eine Kundeninteraktion mit dem Dialog erfoderlich, bevor der Kunde im Shop navigieren kann."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.EnableCookieConsent", - "Enable Cookie Manager", - "Cookie-Manager aktivieren", - "Specifies whether the Cookie Manager will be displayed in the frontend.", - "Legt fest, ob ein Dialog für die Zustimmung zur Nutzung von Cookies im Frontend angezeigt wird."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.CookieInfo.IsPluginInfo", - "System cookie", - "System-Cookie"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.CookieInfoNotFound", - "Cookie information wasn't found.", - "Cookie-Information wurde nicht gefunden."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.RegisterCookieInfo.Title", - "Register your own cookie information", - "Eigene Cookie-Informationen registrieren"); - - builder.AddOrUpdate("CookieManager.Dialog.Hide", - "Hide", - "Ausblenden"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Privacy.Cookies.AdminInstruction", - @"

- If you have included third-party scripts in your shop that use cookies and are not integrated into Smartstore via a plugin, - you can provide your own information about these cookies for the Cookie Manager in the following table. - The added information is displayed in the Cookie Manager of the front end, corresponding to the type. - Cookie information provided to the Cookie Manager by active plug-ins is displayed in this table, - but cannot be edited. The texts of this information can be edited using the language resources - Admin > Configuration > Regional Settings > Languages. -

", - @"

- Wenn Sie Skripte von Drittanbietern in Ihren Shop eingebunden haben, die Cookies nutzen und die nicht über ein Plugin in Smartstore integriert sind, - können Sie in folgender Tabelle eigene Informationen über diese Cookies für den Cookie-Manager bereitstellen. - Die zugefügten Informationen werden, dem Typ entsprechend, im Cookie-Manager des Frontends angezeigt. - Cookie-Informationen, die dem Cookie-Manager von aktiven Plugins zur Verfügung gestellt werden, werden in dieser Tabelle angezeigt, - können aber nicht bearbeitet werden. Die Texte dieser Informationen können über die Sprachresourcen bearbeitet werden - Admin > Konfiguration > Regionale Einstellungen > Sprachen. -

"); - - builder.AddOrUpdate("Admin.Catalog.Products.StockQuantityNotChanged", - "The stock quantity has not been updated because the value has changed since the page was loaded (e.g. due to a placed order). Current value is {0}.", - "Der Lagerbestand wurde nicht aktualisiert, weil sich der Wert seit Laden der Seite geändert hat (z.B. durch einen Auftragseingang). Aktueller Wert ist {0}."); - - builder.AddOrUpdate("Admin.Configuration.SeoTab.Title", - "SEO settings", - "SEO-Einstellungen"); - - builder.AddOrUpdate("Admin.Configuration.Seo.MetaTitle", - "Title tag", - "Title-Tag", - "Defines the title of the page, which is displayed in search engine results. If possible, enter a unique, concise title here.", - "Bestimmt den Titel der Seite, der unter anderem in den Ergebnissen von Suchmaschinen angezeigt wird. Geben Sie hier nach Möglichkeit einen einzigartigen, prägnanten Titel an."); - - builder.AddOrUpdate("Admin.Configuration.Seo.MetaDescription", - "Meta description", - "Meta Description", - "Defines the meta description of the site. An extract of this description is displayed in search engine results below the title.", - "Bestimmt die Meta Desciption der Seite. Ein Auszug dieser Beschreibung wird in den Ergebnissen von Suchmaschinen unterhalb des Titels dargestellt."); - - builder.AddOrUpdate("Admin.Configuration.Seo.MetaKeywords", - "Meta keywords", - "Meta Keywords", - "Defines the meta keywords of the site. Enter the keywords as a comma separated list.", - "Bestimmt die Meta Keywords der Seite. Geben Sie die Keywords als kommagetrennte Liste an."); - - builder.AddOrUpdate("Admin.System.MetaInfos", - "Meta tags", - "Meta-Elemente"); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.HomepageTitle", - "Title tag (Homepage)", - "Title-Tag (Startseite)", - "Defines the title tag for the homepage, which is displayed in search engine results.", - "Legt das Title-Tag für die Startseite fest, das unter anderem in den Ergebnissen von Suchmaschinen angezeigt wird."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.HomepageMetaDescription", - "Meta description (Homepage)", - "Meta Description (Startseite)", - "Defines the meta description for the homepage. An extract of this description is displayed in search engine results below the title.", - "Legt die Meta Description für die Startseite fest. Ein Auszug dieser Beschreibung wird in den Ergebnissen von Suchmaschinen unterhalb des Titels dargestellt."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.HomepageMetaKeywords", - "Meta keywords (Homepage)", - "Meta Keywords (Startseite)", - "Defines the meta keywords for the homepage. Enter the keywords as a comma separated list.", - "Legt die Meta Keywords für die Startseite fest. Geben Sie die Keywords als kommagetrennte Liste an."); - - builder.AddOrUpdate("Admin.Configuration.DeliveryTimes.Fields.MinDays", - "Delivery not before (in days)", - "Lieferung frühestens (in Tagen)", - "Specifies the minimum number of days for the delivery.", - "Legt den frühesten Zeitpunkt der Lieferung in Tagen fest."); - - builder.AddOrUpdate("Admin.Configuration.DeliveryTimes.Fields.MaxDays", - "Delivery not later than (in days)", - "Lieferung spätestens (in Tagen)", - "Specifies the maximum number of days for the delivery.", - "Legt den spätesten Zeitpunkt der Lieferung in Tagen fest."); - - builder.AddOrUpdate("Products.DeliveryDate", "Arrives:", "Lieferung:"); - - builder.AddOrUpdate("DeliveryTimes.Dates.OnTomorrow", "Tomorrow", "Morgen"); // exactly tomorrow - builder.AddOrUpdate("DeliveryTimes.Dates.Tomorrow", "tomorrow", "Morgen"); // tomorrow - - builder.AddOrUpdate("DeliveryTimes.Dates.DeliveryOn", "{0}", "{0}"); // allow "on {0}" etc. - builder.AddOrUpdate("DeliveryTimes.Dates.NotBefore", "not before {0}", "frühestens {0}"); - builder.AddOrUpdate("DeliveryTimes.Dates.Until", "until {0}", "bis {0}"); - builder.AddOrUpdate("DeliveryTimes.Dates.Between", "{0} - {1}", "{0} - {1}"); // allow "{0} till {1}" etc. - - builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.None", "Do not display", "Nicht anzeigen"); - builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.DateOnly", "Date only (if possible)", "Nur Datum (sofern möglich)"); - builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.LabelOnly", "Label only", "Nur Label"); - builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Directory.DeliveryTimesPresentation.LabelAndDate", "Label and date", "Label und Datum"); - - builder.Delete( - "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductLists", - "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductLists.Hint", - "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductDetail", - "Admin.Configuration.Settings.Catalog.ShowDeliveryTimesInProductDetail.Hint", - "Admin.Configuration.Settings.ShoppingCart.ShowDeliveryTimes", - "Admin.Configuration.Settings.ShoppingCart.ShowDeliveryTimes.Hint"); - - builder.AddOrUpdate("Admin.Configuration.Settings.Catalog.DeliveryTimesInProductDetail", - "Presentation of delivery times", - "Darstellung von Lieferzeiten", - "Specifies the way delivery times are displayed on product detail pages.", - "Legt die Darstellungsart von Lieferzeiten auf Produktdetailseiten fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Catalog.DeliveryTimesInLists", - "Presentation of delivery times", - "Darstellung von Lieferzeiten", - "Specifies the way delivery times are displayed in product lists. Due to lack of space, the grid view does not show a date for the delivery time.", - "Legt die Darstellungsart von Lieferzeiten in Produktlisten fest. Aus Platzgründen wird in der Rasteransicht kein Datum zur Lieferzeit angezeigt."); - - builder.AddOrUpdate("Admin.Configuration.Settings.ShoppingCart.DeliveryTimesInShoppingCart", - "Presentation of delivery times", - "Darstellung von Lieferzeiten", - "Specifies the way delivery times are displayed in shopping cart.", - "Legt die Darstellungsart von Lieferzeiten im Warenkorb fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Shipping.TodayShipmentHour", - "Order before x o'clock for same day shipment", - "Bis x Uhr bestellt, heute verschickt", - "Specifies the hour by which the order will be shipped the same day.", - "Legt die Stunde fest, bis zu der die Bestellung noch am selben Tag verschickt wird."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Shipping.DeliveryOnWorkweekDaysOnly", - "Delivery on workweek days only", - "Lieferungen nur an Werktagen", - "Specifies whether delivery takes place only on workweek days.", - "Legt fest, ob Lieferungen nur an Werktagen stattfinden."); - - builder.AddOrUpdate("Admin.Configuration.Seo.SeName", - "URL alias", - "URL-Alias", - "Set a search engine friendly page name e.g. 'my-landing-page' to make the page URL 'http://www.yourStore.com/my-landing-page'. Leave empty to generate it automatically based on the name of the entity.", - "Legen Sie einen suchmaschinenfreundlichen Seitennamen fest, z.B. 'meine-landing-page', um die URL zu 'http://www.yourStore.com/meine-landing-page' zu machen. Lassen Sie das Feld leer, um den Pfad automatisch auf Basis des Namens der Entität zu generieren."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.PageTitleSeparator", - "Page title separator", - "Titel-Trennzeichen", - "Specify page title tag separator.", - "Legt das Trennzeichen für das Titel-Tag fest."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.PageTitleSeoAdjustment", - "Title tag order", - "Titel-Tag Reihenfolge", - "Select the page title order. The generated title tag can be (PAGE NAME | YOURSTORE.COM) or (YOURSTORE.COM | PAGE NAME).", - "Legen Sie hier die Seitentitel-Reihenfolge fest. Das erzeugte Title-Tag könnte z.B. (MEINSHOP.DE | SEITE NAME) oder (SEITE NAME | MEINSHOP.DE) lauten."); - - builder.Delete("Admin.Catalog.Categories.Fields.SeName", - "Admin.Catalog.Categories.Fields.SeName.Hint", - "Admin.Catalog.Manufacturers.Fields.SeName", - "Admin.Catalog.Manufacturers.Fields.SeName.Hint", - "Admin.Catalog.Products.Fields.SeName", - "Admin.Catalog.Products.Fields.SeName.Hint", - "Admin.ContentManagement.Blog.BlogPosts.Fields.SeName", - "Admin.ContentManagement.Blog.BlogPosts.Fields.SeName.Hint", - "Admin.ContentManagement.Forums.Forum.Fields.SeName", - "Admin.ContentManagement.Forums.Forum.Fields.SeName.Hint", - "Admin.ContentManagement.Forums.ForumGroup.Fields.SeName", - "Admin.ContentManagement.Forums.ForumGroup.Fields.SeName.Hint", - "Admin.ContentManagement.News.NewsItems.Fields.SeName", - "Admin.ContentManagement.News.NewsItems.Fields.SeName.Hint", - "Admin.ContentManagement.Topics.Fields.SeName", - "Admin.ContentManagement.Topics.Fields.SeName.Hint"); - - builder.Delete("Admin.Catalog.Categories.Fields.MetaTitle", - "Admin.Catalog.Categories.Fields.MetaTitle.Hint", - "Admin.Catalog.Manufacturers.Fields.MetaTitle", - "Admin.Catalog.Manufacturers.Fields.MetaTitle.Hint", - "Admin.Catalog.Products.Fields.MetaTitle", - "Admin.Catalog.Products.Fields.MetaTitle.Hint", - "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaTitle", - "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaTitle.Hint", - "Admin.ContentManagement.News.NewsItems.Fields.MetaTitle", - "Admin.ContentManagement.News.NewsItems.Fields.MetaTitle.Hint", - "Admin.ContentManagement.Topics.Fields.MetaTitle", - "Admin.ContentManagement.Topics.Fields.MetaTitle.Hint"); - - builder.Delete("Admin.Catalog.Categories.Fields.MetaDescription", - "Admin.Catalog.Categories.Fields.MetaDescription.Hint", - "Admin.Catalog.Manufacturers.Fields.MetaDescription", - "Admin.Catalog.Manufacturers.Fields.MetaDescription.Hint", - "Admin.Catalog.Products.Fields.MetaDescription", - "Admin.Catalog.Products.Fields.MetaDescription.Hint", - "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaDescription", - "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaDescription.Hint", - "Admin.ContentManagement.News.NewsItems.Fields.MetaDescription", - "Admin.ContentManagement.News.NewsItems.Fields.MetaDescription.Hint", - "Admin.ContentManagement.Topics.Fields.MetaDescription", - "Admin.ContentManagement.Topics.Fields.MetaDescription.Hint"); - - builder.Delete("Admin.Catalog.Categories.Fields.MetaKeywords", - "Admin.Catalog.Categories.Fields.MetaKeywords.Hint", - "Admin.Catalog.Manufacturers.Fields.MetaKeywords", - "Admin.Catalog.Manufacturers.Fields.MetaKeywords.Hint", - "Admin.Catalog.Products.Fields.MetaKeywords", - "Admin.Catalog.Products.Fields.MetaKeywords.Hint", - "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaKeywords", - "Admin.ContentManagement.Blog.BlogPosts.Fields.MetaKeywords.Hint", - "Admin.ContentManagement.News.NewsItems.Fields.MetaKeywords", - "Admin.ContentManagement.News.NewsItems.Fields.MetaKeywords.Hint", - "Admin.ContentManagement.Topics.Fields.MetaKeywords", - "Admin.ContentManagement.Topics.Fields.MetaKeywords.Hint", - "Admin.ContentManagement.Blog.BlogPosts.Fields.Language", - "Admin.ContentManagement.News.NewsItems.Fields.Language"); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DefaultTitle", - "Default title tag", - "Standard-Titel-Tag", - "Defines the default title for pages in your store. You can override this for individual categories, products, manufacturer and topic pages.", - "Legt das Standard-Titel-Tag für Seiten im Shop fest. Es kann für Warengruppen, Produkte, Hersteller und Seiten individuell angegeben werden."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DefaultMetaDescription", - "Default meta description", - "Standard Meta Beschreibung", - "Defines the default meta description for pages in your store. You can override this for individual categories, products, manufacturer and topic pages.", - "Legt die Meta Beschreibung für Seiten im Shop fest. Diese kann für Warengruppen, Produkte, Hersteller und Seiten individuell angegeben werden."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DefaultMetaKeywords", - "Default meta keywords", - "Standard Meta Keywords", - "Defines the default meta keywords for pages in your store. You can override these for individual categories, products, manufacturer and topic pages.", - "Legt die Meta Keywords für Seiten im Shop fest. Für Warengruppen, Produkte, Hersteller und Seiten können diese individuell angegeben werden."); - - builder.AddOrUpdate("Admin.Configuration.Settings.Catalog.ShowDiscountSign", - "Show discount sign", - "Rabattzeichen anzeigen", - "Specifies whether a discount sign should be displayed on product pictures when discounts were applied.", - "Legt fest, ob ein Rabattzeichen auf dem Produktbild angezeigt werden soll, wenn Rabatte angewendet wurden."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StateProvinceRequired", - "'State/province' required", - "'Bundesland' erferderlich", - "Check the box if 'State/province' is required.", - "Legt fest, ob Angaben im Eingabefeld 'Adresszusatz' erforderlich sind."); - - builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Catalog.AttributeChoiceBehaviour.GrayOutUnavailable", - "Gray out unavailable attributes", - "Nicht verfügbare Attribute ausgrauen"); - builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Catalog.AttributeChoiceBehaviour.None", - "None", - "Keines"); - - builder.AddOrUpdate("Admin.Catalog.Products.Fields.AttributeChoiceBehaviour", - "Attribute choice behaviour", - "Attribut-Auswahlverhalten", - "Specifies the behaviour when selecting attributes.", - "Legt das Verhalten bei der Auswahl von Attributen fest."); - - builder.AddOrUpdate("Admin.Catalog.Products.ProductVariantAttributes.Attributes.Fields.CustomData", - "Custom data", - "Benutzerdefinierte Daten", - "Specifies user-defined data. For free usage, e.g. for individual shop extensions.", - "Legt benutzerdefinierte Daten fest. Zur freien Verwendung, z.B. bei individuellen Shop-Erweiterungen."); - - #region Media - - var mediaRoot = "Admin.Configuration.Settings.Media."; - - builder.AddOrUpdate(mediaRoot + "ImageSizes", "Image/thumbnail sizes", "Bild-/Thumbnailgrößen"); - - builder.AddOrUpdate(mediaRoot + "DefaultPictureZoomEnabled", - "Enable image zoom", - "Bildzoom aktivieren", - "Adds 'zoom on hover' functionality to product detail images.", - "Aktiviert 'Zoom bei Hover'-Funktion für Produktdetail-Bilder."); - - builder.AddOrUpdate(mediaRoot + "AssociatedProductPictureSize", "Associated (grouped) product", "Verknüpftes (Gruppen)-Produkt"); - builder.AddOrUpdate(mediaRoot + "AvatarPictureSize", "Customer avatar", "Kundenavatar"); - builder.AddOrUpdate(mediaRoot + "BundledProductPictureSize", "Bundle items", "Bundle Stückliste"); - builder.AddOrUpdate(mediaRoot + "CartThumbBundleItemPictureSize", "Bundle items in cart", "Bundle Stückliste im Warenkorb"); - builder.AddOrUpdate(mediaRoot + "CartThumbPictureSize", "Cart", "Warenkorb"); - builder.AddOrUpdate(mediaRoot + "CategoryThumbPictureSize", "Categories", "Warengruppen"); - builder.AddOrUpdate(mediaRoot + "ManufacturerThumbPictureSize", "Brands", "Marken"); - builder.AddOrUpdate(mediaRoot + "MessageProductThumbPictureSize", "Products in e-mails", "Produkte in E-Mails"); - builder.AddOrUpdate(mediaRoot + "MiniCartThumbPictureSize", "Mini cart", "Mini-Warenkorb"); - builder.AddOrUpdate(mediaRoot + "ProductDetailsPictureSize", "Product detail", "Produktdetail"); - builder.AddOrUpdate(mediaRoot + "ProductThumbPictureSize", "Product list", "Produktliste"); - builder.AddOrUpdate(mediaRoot + "ProductThumbPictureSizeOnProductDetailsPage", "Gallery thumbnail", "Gallerie-Thumbnail"); - - builder.Delete( - mediaRoot + "AssociatedProductPictureSize.Hint", - mediaRoot + "AvatarPictureSize.Hint", - mediaRoot + "BundledProductPictureSize.Hint", - mediaRoot + "CartThumbBundleItemPictureSize.Hint", - mediaRoot + "CartThumbPictureSize.Hint", - mediaRoot + "CategoryThumbPictureSize.Hint", - mediaRoot + "ManufacturerThumbPictureSize.Hint", - mediaRoot + "MessageProductThumbPictureSize.Hint", - mediaRoot + "MiniCartThumbPictureSize.Hint", - mediaRoot + "ProductDetailsPictureSize.Hint", - mediaRoot + "ProductThumbPictureSize.Hint", - mediaRoot + "ProductThumbPictureSizeOnProductDetailsPage.Hint"); - - #endregion - - #region Customer settings - - builder.Delete("Admin.Configuration.Settings.CustomerUser.AddressFormFields.TitleEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.TitleEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CompanyRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddressRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.StreetAddress2Enabled", - "Admin.Configuration.Settings.CustomerUser.StreetAddress2Enabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Enabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Enabled.Hint", - "Admin.Configuration.Settings.CustomerUser.StreetAddress2Required", - "Admin.Configuration.Settings.CustomerUser.StreetAddress2Required.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Required", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StreetAddress2Required.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.ZipPostalCodeRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CityRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.CountryRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.StateProvinceRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.PhoneRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxRequired", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.FaxRequired.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.SalutationEnabled", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.SalutationEnabled.Hint", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.Salutations", - "Admin.Configuration.Settings.CustomerUser.AddressFormFields.Salutations.Hint"); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.GenderEnabled", - "'Gender' enabled", - "\"Geschlecht\" aktiv", - "Defines whether the input of 'Gender' is enabled.", - "Legt fest, ob das Eingabefeld \"Geschlecht\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.TitleEnabled", - "'Title' enabled", - "\"Titel\" aktiv", - "Defines whether the input of 'Title' is enabled.", - "Legt fest, ob das Eingabefeld \"Titel\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CompanyEnabled", - "'Company' enabled", - "\"Firma\" aktiv", - "Defines whether the input of 'Company' is enabled.", - "Legt fest, ob das Eingabefeld \"Firma\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CompanyRequired", - "'Company' required", - "\"Firma\" ist erforderlich", - "Defines whether the input of 'Company' is required.", - "Legt fest, ob die Eingabe von \"Firma\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddressEnabled", - "'Street address' enabled", - "\"Straße\" aktiv", - "Defines whether the input of 'Street adress' is enabled.", - "Legt fest, ob das Eingabefeld \"Straße\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddressRequired", - "'Street address' required", - "\"Straße\" ist erforderlich", - "Defines whether the input of 'Street adress' is required.", - "Legt fest, ob die Eingabe von \"Straße\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddress2Enabled", - "'Street address addition' enabled", - "\"Adressszusatz\" aktiv", - "Defines whether the input of 'street address addition' is enabled.", - "Legt fest, ob das Eingabefeld \"Adressszusatz\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StreetAddress2Required", - "'Street address addition' required", - "\"Adressszusatz\" ist erforderlich", - "Defines whether the input of 'street address addition' is required.", - "Legt fest, ob die Eingabe von \"Adressszusatz\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.ZipPostalCodeEnabled", - "'Zip / postal code' enabled", - "\"Postleitzahl\" aktiv", - "Defines whether the input of 'Zip / postal code' is enabled.", - "Legt fest, ob das Eingabefeld \"Postleitzahl\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.ZipPostalCodeRequired", - "'Zip / postal code' required", - "\"Postleitzahl\" ist erforderlich", - "Defines whether the input of 'Zip / postal code' is required.", - "Legt fest, ob die Eingabe von \"Postleitzahl\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CityEnabled", - "'City' enabled", - "\"Stadt\" aktiv", - "Defines whether the input of 'City' is enabled.", - "Legt fest, ob das Eingabefeld \"Stadt\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CityRequired", - "'City' required", - "\"Stadt\" ist erforderlich", - "Defines whether the input of 'City' is required.", - "Legt fest, ob die Eingabe von \"Stadt\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CountryEnabled", - "'Country' enabled", - "\"Land\" aktiv", - "Defines whether the input of 'Country' is enabled.", - "Legt fest, ob das Eingabefeld \"Land\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.CountryRequired", - "'Country' required", - "\"Land\" ist erforderlich", - "Defines whether the input of 'Country' is required.", - "Legt fest, ob die Eingabe von \"Land\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StateProvinceEnabled", - "'State / province' enabled", - "\"Bundesland\" aktiv", - "Defines whether the input of 'State / province' is enabled.", - "Legt fest, ob das Eingabefeld \"Bundesland\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.StateProvinceRequired", - "'State / province' required", - "\"Bundesland\" ist erforderlich", - "Defines whether the input of 'State / province' is required.", - "Legt fest, ob die Eingabe von \"Bundesland\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.PhoneEnabled", - "'Phone number' enabled", - "\"Telefon\" aktiv", - "Defines whether the input of 'Phone number' is enabled.", - "Legt fest, ob das Eingabefeld \"Telefon\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.PhoneRequired", - "'Phone number' required", - "\"Telefon\" ist erforderlich", - "Defines whether the input of 'Phone number' is required.", - "Legt fest, ob die Eingabe von \"Telefon\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.FaxEnabled", - "'Fax number' enabled", - "\"Fax\" aktiv", - "Defines whether the input of 'Fax number' is enabled.", - "Legt fest, ob das Eingabefeld \"Fax\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.FaxRequired", - "'Fax number' required", - "\"Fax\" ist erforderlich", - "Defines whether the input of 'Fax number' is required.", - "Legt fest, ob die Eingabe von \"Fax\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.NewsletterEnabled", - "'Newsletter' enabled", - "\"Newsletter\" aktiv", - "Displays the newsletter registration form.", - "Zeigt das Newsletter Anmeldeformular an."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.SalutationEnabled", - "'Salutation' enabled", - "\"Anrede\" aktiv", - "Defines whether the input of 'Salutation' is enabled.", - "Legt fest, ob das Eingabefeld \"Anrede\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.Salutations", - "Salutations", - "Anreden", - "Comma separated list of salutations (e.g. Mr., Mrs). Define the entries which will populate the dropdown list for salutation when entering addresses.", - "Komma getrennte Liste (z.B. Herr, Frau). Bestimmen Sie die Einträge für die Auswahl der Anrede, bei der Adresserfassung."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.DateOfBirthEnabled", - "'Date of birth' enabled", - "\"Geburtsdatum\" aktiv", - "Defines whether the input of 'Date of birth' is enabled.", - "Legt fest, ob das Eingabefeld \"Geburtsdatum\" aktiviert ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.LastNameRequired", - "'Last name' required", - "\"Nachname\" ist erforderlich", - "Defines whether the input of 'Last name' is required.", - "Legt fest, ob die Eingabe von \"Nachname\" erforderlich ist."); - - builder.AddOrUpdate("Admin.Configuration.Settings.CustomerUser.FirstNameRequired", - "'First name' required", - "\"Vorname\" ist erforderlich", - "Defines whether the input of 'First name' is required.", - "Legt fest, ob die Eingabe von \"Vorname\" erforderlich ist."); - - #endregion Customer settings - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.FacebookAppId", - "Facebook App ID", - "Facebook App ID", - "A Facebook App ID is a unique number that identifies your application and connects it to your Facebook account. It is used when sharing products, category and manufacturer pages on Facebook.", - "Eine Facebook App ID ist eine eindeutige Nummer, die Ihre Anwendung identifiziert und mit Ihrem Facebook-Account verknüpft. Wird beim Teilen von Produkten, Warengruppen- und Herstellerseiten auf Facebook genutzt."); - - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.TwitterSite", - "Twitter Username", - "Twitter-Benutzername", - "Twitter Username that gets displayed on Twitter cards when a product, category and manufacturer page is shared on Twitter. Starts with a '@'.", - "Twitter-Benutzername, der auf Twitter-Karten angezeigt wird, wenn ein Produkt, eine Kategorie oder eine Herstellerseite auf Twitter geteilt wird. Beginnt mit einem '@'."); - - builder.AddOrUpdate("Admin.ContentManagement.Topics.Validation.NoEmptyPassword", - "Password must have a value.", - "Passwort muss einen Wert haben."); - - builder.AddOrUpdate("Admin.ContentManagement.Topics.Validation.NoPasswordAllowed", - "HTML widgets cannot have a password protection.", - "HTML Widgets können keinen Passwortschutz haben."); - - builder.AddOrUpdate("Order.CompletePayment.Hint", - "Click 'Complete payment' if you have not yet paid and wish to start the payment process again.", - "Klicken Sie 'Zahlung veranlassen', falls Sie noch nicht gezahlt haben und den Zahlungsvorgang erneut starten möchten."); - - builder.AddOrUpdate("Admin.ContentManagement.Forums.ForumGroup.Updated") - .Value("de", "Die Forengruppe wurde erfolgreich aktualisiert."); - - builder.AddOrUpdate("Account.Login.NotRegisteredYet", - "Not registered yet?", - "Noch nicht registriert?"); + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DisplayRegionInLanguageSelector", + "Display region in language selector", + "Region in der Sprachauswahl anzeigen", + "Whether to display region/country name in language selector (e.g. 'Deutsch (Deutschland)' instead of 'Deutsch')", + "Zeigt den Namen der Region/des Landes in der Sprachauswahl an (z. B. 'Deutsch (Deutschland)' statt 'Deutsch')"); } } -} +} \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.ActivityLogTypes.cs b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.ActivityLogTypes.cs index fe50b4401d..44ae838d99 100644 --- a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.ActivityLogTypes.cs +++ b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.ActivityLogTypes.cs @@ -250,6 +250,12 @@ public IList ActivityLogTypes() Enabled = true, Name = "Edit theme variables" }, + new ActivityLogType + { + SystemKeyword = "EditOrder", + Enabled = true, + Name = "Edit an order" + }, new ActivityLogType { SystemKeyword = "ResetThemeVars", diff --git a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.Products.cs b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.Products.cs index d504ad951a..1886ae9f64 100644 --- a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.Products.cs +++ b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.Products.cs @@ -3597,7 +3597,7 @@ public IList Products() Sku = "Microsoft-xbox1s", Name = "Xbox One S 500 GB Konsole", ShortDescription = "Genieße über 100 Spiele, die es nur für die Konsole gibt, sowie eine ständig größer werdende Bibliothek an Xbox 360-Spielen auf der Xbox One S im neuen Design – der einzigen Konsole mit 4K Ultra HD Blu-ray, 4K-Videostreaming und HDR. Streame deine Lieblingsfilme und -sendungen in atemberaubendem 4K Ultra HD. Spiele Blockbuster wie Gears of War 4 und Battlefield 1 mit Freunden auf Xbox Live, dem schnellsten und zuverlässigsten Gaming-Netzwerk.", - FullDescription = "
  • Die ultimativen Spiele und 4K-Entertainment-System.
  • 40 % kompaktere Konsole
    Lasse dich nicht von der Größe täuschen. Mit integriertem Netzteil und bis zu 2 TB Speicherplatz ist die Xbox One S die fortschrittlichste Xbox überhaupt.
  • Der beste Controller - jetzt noch besser
    Der neue Xbox Wireless Controller bietet ein schlankes, optimiertes Design, texturierte Grip - Fläche und Bluetooth zum Spielen auf Windows 10 Geräten. Genieße individuelle Tastenbelegung und verbesserte drahtlose Reichweite und stecke jeden kompatiblen Kopfhörer mit der 3, 5 mm Stereo - Headset - Buchse ein.
", + FullDescription = "
  • Die ultimativen Spiele und 4K-Entertainment-System.
  • 40 % kompaktere Konsole
    Lasse dich nicht von der Größe täuschen. Mit integriertem Netzteil und bis zu 2 TB Speicherplatz ist die Xbox One S die fortschrittlichste Xbox überhaupt.
  • Der beste Controller - jetzt noch besser
    Der neue Xbox Wireless Controller bietet ein schlankes, optimiertes Design, texturierte Grip - Fläche und Bluetooth zum Spielen auf Windows 10 Geräten. Genieße individuelle Tastenbelegung und verbesserte drahtlose Reichweite und stecke jeden kompatiblen Kopfhörer mit der 3, 5 mm Stereo - Headset - Buchse ein.
", ProductTemplateId = productTemplate.Id, AllowCustomerReviews = true, Published = true, diff --git a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs index 9b0d787a88..8f1ac6d219 100644 --- a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs +++ b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs @@ -517,7 +517,7 @@ public IList Topics() RenderAsWidget = true, WidgetWrapContent = false, Title = "Welcome to our store", - Body = "

Online shopping is the process consumers go through to purchase products or services over the Internet. You can edit this in the admin site.

" + Body = "

Online shopping is the process consumers go through to purchase products or services over the Internet. You can edit this in the admin site.

" }, new Topic { @@ -553,7 +553,7 @@ public IList Topics() IncludeInSitemap = false, IsPasswordProtected = false, Title = "Imprint", - Body = @"

Put your imprint information here. YOu can edit this in the admin site.

" + Body = "

Put your imprint information here. You can edit this in the admin site.

" }, new Topic { diff --git a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj index 630742b375..fb594ed6a4 100644 --- a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj +++ b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj @@ -82,8 +82,8 @@ ..\..\packages\EntityFramework.SqlServerCompact.6.4.4\lib\net45\EntityFramework.SqlServerCompact.dll True
- - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll True @@ -97,8 +97,8 @@ True ..\..\packages\Microsoft.SqlServer.Scripting.11.0.2100.61\lib\Microsoft.SqlServer.Smo.dll - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll @@ -108,11 +108,11 @@ True ..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\lib\net40\System.Data.SqlServerCe.dll - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll @@ -529,6 +529,22 @@ 202010121359446_RemoveBlogAndNewsLanguage.cs + + + 202011091154314_V410Resources.cs + + + + 202012051645539_AddBlogAndNewsLanguage.cs + + + + 202101251149352_V411Resources.cs + + + + 202112171231491_V420Resources.cs + @@ -954,6 +970,18 @@ 202010121359446_RemoveBlogAndNewsLanguage.cs + + 202011091154314_V410Resources.cs + + + 202012051645539_AddBlogAndNewsLanguage.cs + + + 202101251149352_V411Resources.cs + + + 202112171231491_V420Resources.cs + diff --git a/src/Libraries/SmartStore.Data/Utilities/DataMigrator.cs b/src/Libraries/SmartStore.Data/Utilities/DataMigrator.cs index a3fd6a6c13..796f12c1fa 100644 --- a/src/Libraries/SmartStore.Data/Utilities/DataMigrator.cs +++ b/src/Libraries/SmartStore.Data/Utilities/DataMigrator.cs @@ -27,6 +27,7 @@ using SmartStore.Core.Domain.Shipping; using SmartStore.Core.Infrastructure; using SmartStore.Core.IO; +using SmartStore.Core.Logging; using SmartStore.Core.Security; using SmartStore.Rules; using SmartStore.Rules.Domain; @@ -1441,19 +1442,43 @@ void AddRuleSetsForDiscountRequirements() case "discountrequirement.purchasedallproducts": case "discountrequirement.purchasedoneproduct": var productIds = new HashSet(); + var failedRequirements = new List(); + foreach (var requirement in requirements[name].Where(x => x.RestrictedProductIds.HasValue())) { - productIds.AddRange(requirement.RestrictedProductIds.ToIntArray()); + try + { + productIds.AddRange(requirement.RestrictedProductIds.ToIntArray()); + } + catch + { + failedRequirements.Add(requirement); + } } - if (productIds.Any()) + if (!failedRequirements.Any()) { - ruleSet.Rules.Add(new RuleEntity + if (productIds.Any()) { - RuleType = name == "discountrequirement.hasallproducts" || name == "discountrequirement.hasoneproduct" ? "ProductInCart" : "CartPurchasedProduct", - Operator = name == "discountrequirement.hasallproducts" || name == "discountrequirement.purchasedallproducts" ? RuleOperator.Contains : RuleOperator.In, - Value = string.Join(",", productIds) - }); + ruleSet.Rules.Add(new RuleEntity + { + RuleType = name == "discountrequirement.hasallproducts" || name == "discountrequirement.hasoneproduct" ? "ProductInCart" : "CartPurchasedProduct", + Operator = name == "discountrequirement.hasallproducts" || name == "discountrequirement.purchasedallproducts" ? RuleOperator.Contains : RuleOperator.In, + Value = string.Join(",", productIds) + }); + } + } + else + { + var sb = PooledStringBuilder.Rent(); + sb.AppendLine($"Cannnot create a rule for '{name}'."); + sb.AppendLine($"Discount name: {discount.Name.NaIfEmpty()}"); + sb.AppendLine($"Discount ID: {discount.Id}"); + sb.AppendLine(); + sb.AppendLine("Unsupported expressions for restricted product IDs:"); + failedRequirements.Each(x => sb.AppendLine(x.RestrictedProductIds)); + + LogWarning($"Cannot migrate requirements for discount '{discount.Name.NaIfEmpty()}'.", sb.ToStringAndReturn()); } break; case "discountrequirement.store": @@ -1502,7 +1527,7 @@ void AddRuleSetsForDiscountRequirements() } break; default: - $"Cannot add rule set for unknown discount requirement type ({name}).".Dump(); + LogWarning($"Cannot add rule set for unknown discount requirement type ({name}).", null); break; } } @@ -1690,7 +1715,6 @@ void AddRuleSetsForPaymentFilters() } } - /*static*/ T GetExtraData(OldDiscountRequirement req, string name) { try @@ -1712,7 +1736,6 @@ T GetExtraData(OldDiscountRequirement req, string name) return default(T); } - /*static*/ PluginFilterConfigModel GetFilterData(Dictionary syncMappings, int entityId, string rootNodeName) { try @@ -1734,7 +1757,6 @@ PluginFilterConfigModel GetFilterData(Dictionary syncMappings, return null; } - /*static*/ void AddRulesForCommonFilters(SmartObjectContext _ctx, RuleSetEntity ruleSet, PluginFilterConfigModel model, string pluginSystemName) { // Store id (if plugin is limited to stores). @@ -1807,6 +1829,20 @@ void AddRulesForCommonFilters(SmartObjectContext _ctx, RuleSetEntity ruleSet, Pl } } } + + /*static*/ + static void LogWarning(string message, string fullDescription) + { + try + { + var logger = EngineContext.Current.Resolve().GetLogger(typeof(DataMigrator)); + if (logger != null) + { + logger.Warn(fullDescription.HasValue() ? new SmartException(fullDescription) : null, message); + } + } + catch { } + } } public class OldDiscountRequirement diff --git a/src/Libraries/SmartStore.Data/app.config b/src/Libraries/SmartStore.Data/app.config index 68a1994474..a625161735 100644 --- a/src/Libraries/SmartStore.Data/app.config +++ b/src/Libraries/SmartStore.Data/app.config @@ -14,6 +14,18 @@ + + + + + + + + + + + + diff --git a/src/Libraries/SmartStore.Data/packages.config b/src/Libraries/SmartStore.Data/packages.config index d2fafe90f4..bc852168b3 100644 --- a/src/Libraries/SmartStore.Data/packages.config +++ b/src/Libraries/SmartStore.Data/packages.config @@ -3,10 +3,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Services/Authentication/FormsAuthenticationService.cs b/src/Libraries/SmartStore.Services/Authentication/FormsAuthenticationService.cs index 096871bf47..626d002326 100644 --- a/src/Libraries/SmartStore.Services/Authentication/FormsAuthenticationService.cs +++ b/src/Libraries/SmartStore.Services/Authentication/FormsAuthenticationService.cs @@ -139,6 +139,7 @@ public virtual Customer GetAuthenticatedCustomerFromTicket(FormsAuthenticationTi return customerResolvers .Select(x => x.Invoke(usernameOrEmail)) + .Where(x => x != null) .FirstOrDefault(); } } diff --git a/src/Libraries/SmartStore.Services/Blogs/BlogService.cs b/src/Libraries/SmartStore.Services/Blogs/BlogService.cs index 7fec46db7b..1dc0977884 100644 --- a/src/Libraries/SmartStore.Services/Blogs/BlogService.cs +++ b/src/Libraries/SmartStore.Services/Blogs/BlogService.cs @@ -93,6 +93,7 @@ public virtual IPagedList GetAllBlogPosts( DateTime? dateTo, int pageIndex, int pageSize, + int languageId = 0, bool showHidden = false, DateTime? maxAge = null, string title = "", @@ -124,6 +125,11 @@ public virtual IPagedList GetAllBlogPosts( if (tag.HasValue()) query = query.Where(b => b.Tags.Contains(tag)); + if (languageId != 0) + { + query = query.Where(b => !b.LanguageId.HasValue || b.LanguageId == languageId); + } + if (!showHidden) { var utcNow = DateTime.UtcNow; @@ -160,13 +166,14 @@ public virtual IPagedList GetAllBlogPostsByTag( string tag, int pageIndex, int pageSize, + int languageId = 0, bool showHidden = false, DateTime? maxAge = null) { tag = tag.Trim(); - // We laod all records and only then filter them by tag. - var blogPostsAll = GetAllBlogPosts(storeId, null, null, 0, int.MaxValue, showHidden, maxAge); + // We load all records and only then filter them by tag. + var blogPostsAll = GetAllBlogPosts(storeId, null, null, 0, int.MaxValue, languageId, showHidden, maxAge); var taggedBlogPosts = new List(); foreach (var blogPost in blogPostsAll) @@ -185,11 +192,11 @@ public virtual IPagedList GetAllBlogPostsByTag( return result; } - public virtual IList GetAllBlogPostTags(int storeId, bool showHidden = false) + public virtual IList GetAllBlogPostTags(int storeId, int languageId = 0, bool showHidden = false) { var blogPostTags = new List(); - var blogPosts = GetAllBlogPosts(storeId, null, null, 0, int.MaxValue, showHidden); + var blogPosts = GetAllBlogPosts(storeId, null, null, 0, int.MaxValue, languageId, showHidden); foreach (var blogPost in blogPosts) { var tags = blogPost.ParseTags(); @@ -238,10 +245,11 @@ public override int GetTotalCount() public override IEnumerable Enlist() { - var topics = Query.Select(x => new { x.Id, x.CreatedOnUtc }).ToList(); - foreach (var x in topics) + var blogPosts = Query.Select(x => new { x.Id, x.CreatedOnUtc, x.LanguageId }).ToList(); + + foreach (var x in blogPosts) { - yield return new NamedEntity { EntityName = "BlogPost", Id = x.Id, LastMod = x.CreatedOnUtc }; + yield return new NamedEntity { EntityName = "BlogPost", Id = x.Id, LastMod = x.CreatedOnUtc, LanguageId = x.LanguageId }; } } diff --git a/src/Libraries/SmartStore.Services/Blogs/IBlogService.cs b/src/Libraries/SmartStore.Services/Blogs/IBlogService.cs index cf12019914..9e483667d7 100644 --- a/src/Libraries/SmartStore.Services/Blogs/IBlogService.cs +++ b/src/Libraries/SmartStore.Services/Blogs/IBlogService.cs @@ -49,6 +49,7 @@ public partial interface IBlogService /// Filter by created date; null if you want to get all records. /// Page index. /// Page size. + /// Filter by a language identifier. 0 to get all blog posts. /// A value indicating whether to show hidden records. /// The maximum age of returned blog posts. /// Search for a term or phrase in the title. @@ -62,7 +63,8 @@ IPagedList GetAllBlogPosts( DateTime? dateFrom, DateTime? dateTo, int pageIndex, - int pageSize, + int pageSize, + int languageId = 0, bool showHidden = false, DateTime? maxAge = null, string title = "", @@ -78,13 +80,15 @@ IPagedList GetAllBlogPosts( /// Tag. /// Page index. /// Page size. + /// Filter by a language identifier. 0 to get all blog posts. /// A value indicating whether to show hidden records. /// Blog posts. IPagedList GetAllBlogPostsByTag( int storeId, string tag, int pageIndex, - int pageSize, + int pageSize, + int languageId = 0, bool showHidden = false, DateTime? maxAge = null); @@ -92,8 +96,9 @@ IPagedList GetAllBlogPostsByTag( /// Gets all blog post tags. ///
/// The store identifier; pass 0 to load all records. + /// Filter by a language identifier. 0 to get all blog posts. /// A value indicating whether to show hidden records. /// Blog post tags. - IList GetAllBlogPostTags(int storeId, bool showHidden = false); + IList GetAllBlogPostTags(int storeId, int languageId = 0, bool showHidden = false); } } diff --git a/src/Libraries/SmartStore.Services/Cart/RenderingOrderTotalsEvent.cs b/src/Libraries/SmartStore.Services/Cart/RenderingOrderTotalsEvent.cs new file mode 100644 index 0000000000..907a20c53f --- /dev/null +++ b/src/Libraries/SmartStore.Services/Cart/RenderingOrderTotalsEvent.cs @@ -0,0 +1,15 @@ +using SmartStore.Core.Domain.Customers; + +namespace SmartStore.Services.Cart +{ + public class RenderingOrderTotalsEvent + { + public RenderingOrderTotalsEvent() + { + } + + public Customer Customer { get; set; } + + public int? StoreId { get; set; } + } +} \ No newline at end of file diff --git a/src/Libraries/SmartStore.Services/Cart/Rules/CartRuleProvider.cs b/src/Libraries/SmartStore.Services/Cart/Rules/CartRuleProvider.cs index 81027afa12..3fc46b2574 100644 --- a/src/Libraries/SmartStore.Services/Cart/Rules/CartRuleProvider.cs +++ b/src/Libraries/SmartStore.Services/Cart/Rules/CartRuleProvider.cs @@ -170,11 +170,30 @@ public IRule GetProcessor(RuleExpression expression) protected override IEnumerable LoadDescriptors() { var language = _services.WorkContext.WorkingLanguage; + var currencyCode = _services.StoreContext.CurrentStore.PrimaryStoreCurrency.CurrencyCode; var stores = _services.StoreService.GetAllStores() .Select(x => new RuleValueSelectListOption { Value = x.Id.ToString(), Text = x.Name }) .ToArray(); + var cartItemQuantity = new CartRuleDescriptor + { + Name = "CartItemQuantity", + DisplayName = T("Admin.Rules.FilterDescriptor.CartItemQuantity"), + RuleType = RuleType.String, + ProcessorType = typeof(CartItemQuantityRule), + Operators = new[] { RuleOperator.IsEqualTo } + }; + cartItemQuantity.Metadata["ValueTemplateName"] = "ValueTemplates/CartItemQuantity"; + cartItemQuantity.Metadata["ProductRuleDescriptor"] = new CartRuleDescriptor + { + Name = "CartItemQuantity-Product", + RuleType = RuleType.Int, + ProcessorType = typeof(CartItemQuantityRule), + Operators = new[] { RuleOperator.IsEqualTo }, + SelectList = new RemoteRuleValueSelectList("Product") + }; + var descriptors = new List { new CartRuleDescriptor @@ -281,6 +300,7 @@ protected override IEnumerable LoadDescriptors() RuleType = RuleType.Int, ProcessorType = typeof(CartProductCountRule) }, + cartItemQuantity, new CartRuleDescriptor { Name = "ProductInCart", @@ -443,7 +463,7 @@ protected override IEnumerable LoadDescriptors() descriptors .Where(x => x.RuleType == RuleType.Money) - .Each(x => x.Metadata["postfix"] = _services.StoreContext.CurrentStore.PrimaryStoreCurrency.CurrencyCode); + .Each(x => x.Metadata["postfix"] = currencyCode); return descriptors; } diff --git a/src/Libraries/SmartStore.Services/Cart/Rules/Impl/CartItemQuantityRule.cs b/src/Libraries/SmartStore.Services/Cart/Rules/Impl/CartItemQuantityRule.cs new file mode 100644 index 0000000000..b15f586972 --- /dev/null +++ b/src/Libraries/SmartStore.Services/Cart/Rules/Impl/CartItemQuantityRule.cs @@ -0,0 +1,95 @@ +using System; +using System.Linq; +using Newtonsoft.Json.Linq; +using SmartStore.Core.Domain.Orders; +using SmartStore.Core.Logging; +using SmartStore.Rules; +using SmartStore.Services.Orders; + +namespace SmartStore.Services.Cart.Rules.Impl +{ + public class CartItemQuantityRule : IRule + { + private readonly IShoppingCartService _shoppingCartService; + + public CartItemQuantityRule(IShoppingCartService shoppingCartService) + { + _shoppingCartService = shoppingCartService; + } + + public ILogger Logger { get; set; } = NullLogger.Instance; + + public bool Match(CartRuleContext context, RuleExpression expression) + { + int productId = 0; + int? minQuantity = null; + int? maxQuantity = null; + + try + { + var rawValue = expression.Value as string; + if (rawValue.HasValue()) + { + dynamic json = JObject.Parse(rawValue); + productId = ((string)json.ProductId).ToInt(); + + var str = (string)json.MinQuantity; + if (str.HasValue()) + { + minQuantity = str.ToInt(); + } + + str = (string)json.MaxQuantity; + if (str.HasValue()) + { + maxQuantity = str.ToInt(); + } + } + } + catch (Exception ex) + { + Logger.Error(ex); + } + + if (productId == 0) + { + return false; + } + + var cart = _shoppingCartService.GetCartItems(context.Customer, ShoppingCartType.ShoppingCart, context.Store.Id); + var items = cart.Where(x => x.Item.ProductId == productId); + if (!items.Any()) + { + return false; + } + + var quantity = items.Sum(x => x.Item.Quantity); + if (quantity == 0) + { + return false; + } + + if (minQuantity.HasValue && maxQuantity.HasValue) + { + if (minQuantity == maxQuantity) + { + return quantity == minQuantity; + } + else + { + return quantity >= minQuantity && quantity <= maxQuantity; + } + } + else if (minQuantity.HasValue) + { + return quantity >= minQuantity; + } + else if (maxQuantity.HasValue) + { + return quantity <= maxQuantity; + } + + return false; + } + } +} diff --git a/src/Libraries/SmartStore.Services/Cart/ValidatingCartEvent.cs b/src/Libraries/SmartStore.Services/Cart/ValidatingCartEvent.cs new file mode 100644 index 0000000000..b17f20784b --- /dev/null +++ b/src/Libraries/SmartStore.Services/Cart/ValidatingCartEvent.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Web.Mvc; +using SmartStore.Core.Domain.Customers; +using SmartStore.Core.Domain.Orders; + +namespace SmartStore.Services.Cart +{ + public class ValidatingCartEvent + { + public ValidatingCartEvent( + Customer customer, + IList warnings, + IList cart) + { + Customer = customer; + Warnings = warnings; + Cart = cart; + } + + public Customer Customer { get; set; } + + public IList Cart { get; set; } + + public IList Warnings { get; set; } + + public ActionResult Result { get; set; } + } +} \ No newline at end of file diff --git a/src/Libraries/SmartStore.Services/Catalog/CategoryService.cs b/src/Libraries/SmartStore.Services/Catalog/CategoryService.cs index 48e7dca678..e4f1c20899 100644 --- a/src/Libraries/SmartStore.Services/Catalog/CategoryService.cs +++ b/src/Libraries/SmartStore.Services/Catalog/CategoryService.cs @@ -20,6 +20,7 @@ using SmartStore.Utilities.ObjectPools; using SmartStore.Services.Seo; using SmartStore.Core.Domain.Seo; +using SmartStore.Data.Utilities; namespace SmartStore.Services.Catalog { @@ -116,85 +117,102 @@ public virtual void InheritAclIntoChildren( bool touchExistingAcls = false, bool categoriesOnly = false) { - var category = GetCategoryById(categoryId); - var subcategories = GetAllCategoriesByParentCategoryId(categoryId, true); var allCustomerRoles = _customerService.GetAllCustomerRoles(true); - var categoryCustomerRoles = _aclService.GetCustomerRoleIdsWithAccessTo(category); + var referenceCategory = GetCategoryById(categoryId); + var referenceRoleIds = _aclService.GetCustomerRoleIdsWithAccessTo(referenceCategory); - var categoryIds = new HashSet(subcategories.Select(x => x.Id)); - categoryIds.Add(categoryId); + using (var scope = new DbContextScope(ctx: _aclRepository.Context, autoDetectChanges: false, proxyCreation: false, validateOnSave: false, autoCommit: false)) + { + ProcessCategory(scope, referenceCategory); + } - var searchQuery = new CatalogSearchQuery() - .WithCategoryIds(null, categoryIds.ToArray()); + _cache.RemoveByPattern(AclService.ACL_SEGMENT_PATTERN); - var query = _catalogSearchService.PrepareQuery(searchQuery); - var products = query.OrderBy(p => p.Id).ToList(); - using (var scope = new DbContextScope(ctx: _aclRepository.Context, autoDetectChanges: false, proxyCreation: false, validateOnSave: false)) + void ProcessCategory(DbContextScope scope, Category c) { - _aclRepository.AutoCommitEnabled = false; + // Process sub-categories. + var subCategories = GetAllCategoriesByParentCategoryId(c.Id, true); - foreach (var subcategory in subcategories) + foreach (var subCategory in subCategories) { - if (subcategory.SubjectToAcl != category.SubjectToAcl) + if (subCategory.SubjectToAcl != referenceCategory.SubjectToAcl) { - subcategory.SubjectToAcl = category.SubjectToAcl; - _categoryRepository.Update(subcategory); + subCategory.SubjectToAcl = referenceCategory.SubjectToAcl; + _categoryRepository.Update(subCategory); } - var existingAclRecords = _aclService.GetAclRecords(subcategory).ToDictionarySafe(x => x.CustomerRoleId); - - foreach (var customerRole in allCustomerRoles) + var existingAclRecords = _aclService.GetAclRecords(subCategory).ToDictionarySafe(x => x.CustomerRoleId); + + foreach (var role in allCustomerRoles) { - if (categoryCustomerRoles.Contains(customerRole.Id)) + if (referenceRoleIds.Contains(role.Id)) { - if (!existingAclRecords.ContainsKey(customerRole.Id)) + if (!existingAclRecords.ContainsKey(role.Id)) { - _aclRepository.Insert(new AclRecord { CustomerRole = customerRole, CustomerRoleId = customerRole.Id, EntityId = subcategory.Id, EntityName = "Category" }); + _aclRepository.Insert(new AclRecord { CustomerRoleId = role.Id, EntityId = subCategory.Id, EntityName = "Category" }); } } - else + else if (existingAclRecords.TryGetValue(role.Id, out var aclRecordToDelete)) { - if (existingAclRecords.TryGetValue(customerRole.Id, out var aclRecordToDelete)) - { - _aclRepository.Delete(aclRecordToDelete); - } + _aclRepository.Delete(aclRecordToDelete); } } } - _aclRepository.Context.SaveChanges(); + scope.Commit(); - foreach (var product in products) + // Process products. + var categoryIds = new HashSet(subCategories.Select(x => x.Id)); + categoryIds.Add(c.Id); + + var searchQuery = new CatalogSearchQuery().WithCategoryIds(null, categoryIds.ToArray()); + var productsQuery = _catalogSearchService.PrepareQuery(searchQuery); + var productsPager = new FastPager(productsQuery, 500); + + while (productsPager.ReadNextPage(out var products)) { - if (product.SubjectToAcl != category.SubjectToAcl) + foreach (var product in products) { - product.SubjectToAcl = category.SubjectToAcl; - _productRepository.Update(product); - } + if (product.SubjectToAcl != referenceCategory.SubjectToAcl) + { + product.SubjectToAcl = referenceCategory.SubjectToAcl; + _productRepository.Update(product); + } - var existingAclRecords = _aclService.GetAclRecords(product).ToDictionarySafe(x => x.CustomerRoleId); + var existingAclRecords = _aclService.GetAclRecords(product).ToDictionarySafe(x => x.CustomerRoleId); - foreach (var customerRole in allCustomerRoles) - { - if (categoryCustomerRoles.Contains(customerRole.Id)) + foreach (var role in allCustomerRoles) { - if (!existingAclRecords.ContainsKey(customerRole.Id)) + if (referenceRoleIds.Contains(role.Id)) { - _aclRepository.Insert(new AclRecord { CustomerRole = customerRole, CustomerRoleId = customerRole.Id, EntityId = product.Id, EntityName = "Product" }); + if (!existingAclRecords.ContainsKey(role.Id)) + { + _aclRepository.Insert(new AclRecord { CustomerRoleId = role.Id, EntityId = product.Id, EntityName = "Product" }); + } } - } - else - { - if (existingAclRecords.TryGetValue(customerRole.Id, out var aclRecordToDelete)) + else if (existingAclRecords.TryGetValue(role.Id, out var aclRecordToDelete)) { _aclRepository.Delete(aclRecordToDelete); } } } + + scope.Commit(); } - _aclRepository.Context.SaveChanges(); + scope.Commit(); + + try + { + scope.DbContext.DetachEntities(x => x is Product || x is Category || x is AclRecord, false); + } + catch { } + + foreach (var subCategory in subCategories) + { + ProcessCategory(scope, subCategory); + } } } @@ -204,85 +222,102 @@ public virtual void InheritStoresIntoChildren( bool touchExistingAcls = false, bool categoriesOnly = false) { - var category = GetCategoryById(categoryId); - var subcategories = GetAllCategoriesByParentCategoryId(categoryId, true); var allStores = _storeService.GetAllStores(); - var categoryStoreMappings = _storeMappingService.GetStoresIdsWithAccess(category); - - var categoryIds = new HashSet(subcategories.Select(x => x.Id)); - categoryIds.Add(categoryId); + var referenceCategory = GetCategoryById(categoryId); + var referenceStoreMappings = _storeMappingService.GetStoresIdsWithAccess(referenceCategory); - var searchQuery = new CatalogSearchQuery() - .WithCategoryIds(null, categoryIds.ToArray()); + using (var scope = new DbContextScope(ctx: _storeMappingRepository.Context, autoDetectChanges: false, proxyCreation: false, validateOnSave: false, autoCommit: false)) + { + ProcessCategory(scope, referenceCategory); + } - var query = _catalogSearchService.PrepareQuery(searchQuery); - var products = query.OrderBy(p => p.Id).ToList(); + _cache.RemoveByPattern(StoreMappingService.STOREMAPPING_SEGMENT_PATTERN); - using (var scope = new DbContextScope(ctx: _storeMappingRepository.Context, autoDetectChanges: false, proxyCreation: false, validateOnSave: false)) + + void ProcessCategory(DbContextScope scope, Category c) { - _storeMappingRepository.AutoCommitEnabled = false; + // Process sub-categories. + var subCategories = GetAllCategoriesByParentCategoryId(c.Id, true); - foreach (var subcategory in subcategories) + foreach (var subCategory in subCategories) { - if (subcategory.LimitedToStores != category.LimitedToStores) + if (subCategory.LimitedToStores != referenceCategory.LimitedToStores) { - subcategory.LimitedToStores = category.LimitedToStores; - _categoryRepository.Update(subcategory); + subCategory.LimitedToStores = referenceCategory.LimitedToStores; + _categoryRepository.Update(subCategory); } - var existingStoreMappingsRecords = _storeMappingService.GetStoreMappings(subcategory).ToDictionary(x => x.StoreId); + var existingStoreMappingsRecords = _storeMappingService.GetStoreMappings(subCategory).ToDictionary(x => x.StoreId); foreach (var store in allStores) { - if (categoryStoreMappings.Contains(store.Id)) + if (referenceStoreMappings.Contains(store.Id)) { if (!existingStoreMappingsRecords.ContainsKey(store.Id)) { - _storeMappingRepository.Insert(new StoreMapping { StoreId = store.Id, EntityId = subcategory.Id, EntityName = "Category" }); + _storeMappingRepository.Insert(new StoreMapping { StoreId = store.Id, EntityId = subCategory.Id, EntityName = "Category" }); } } - else + else if (existingStoreMappingsRecords.TryGetValue(store.Id, out var storeMappingToDelete)) { - if (existingStoreMappingsRecords.TryGetValue(store.Id, out var storeMappingToDelete)) - { - _storeMappingRepository.Delete(storeMappingToDelete); - } + _storeMappingRepository.Delete(storeMappingToDelete); } } } - _storeMappingRepository.Context.SaveChanges(); + scope.Commit(); + + // Process products. + var categoryIds = new HashSet(subCategories.Select(x => x.Id)); + categoryIds.Add(c.Id); - foreach (var product in products) + var searchQuery = new CatalogSearchQuery().WithCategoryIds(null, categoryIds.ToArray()); + var productsQuery = _catalogSearchService.PrepareQuery(searchQuery); + var productsPager = new FastPager(productsQuery, 500); + + while (productsPager.ReadNextPage(out var products)) { - if (product.LimitedToStores != category.LimitedToStores) + foreach (var product in products) { - product.LimitedToStores = category.LimitedToStores; - _productRepository.Update(product); - } + if (product.LimitedToStores != referenceCategory.LimitedToStores) + { + product.LimitedToStores = referenceCategory.LimitedToStores; + _productRepository.Update(product); + } - var existingStoreMappingsRecords = _storeMappingService.GetStoreMappings(product).ToDictionary(x => x.StoreId); + var existingStoreMappingsRecords = _storeMappingService.GetStoreMappings(product).ToDictionary(x => x.StoreId); - foreach (var store in allStores) - { - if (categoryStoreMappings.Contains(store.Id)) + foreach (var store in allStores) { - if (!existingStoreMappingsRecords.ContainsKey(store.Id)) + if (referenceStoreMappings.Contains(store.Id)) { - _storeMappingRepository.Insert(new StoreMapping { StoreId = store.Id, EntityId = product.Id, EntityName = "Product" }); + if (!existingStoreMappingsRecords.ContainsKey(store.Id)) + { + _storeMappingRepository.Insert(new StoreMapping { StoreId = store.Id, EntityId = product.Id, EntityName = "Product" }); + } } - } - else - { - if (existingStoreMappingsRecords.TryGetValue(store.Id, out var storeMappingToDelete)) + else if (existingStoreMappingsRecords.TryGetValue(store.Id, out var storeMappingToDelete)) { _storeMappingRepository.Delete(storeMappingToDelete); } } } + + scope.Commit(); } - _storeMappingRepository.Context.SaveChanges(); + scope.Commit(); + + try + { + scope.DbContext.DetachEntities(x => x is Product || x is Category || x is StoreMapping, false); + } + catch { } + + foreach (var subCategory in subCategories) + { + ProcessCategory(scope, subCategory); + } } } diff --git a/src/Libraries/SmartStore.Services/Catalog/CategoryTreeChangeHandler.cs b/src/Libraries/SmartStore.Services/Catalog/CategoryTreeChangeHandler.cs index d30e8f4ccc..df7cd1a0af 100644 --- a/src/Libraries/SmartStore.Services/Catalog/CategoryTreeChangeHandler.cs +++ b/src/Libraries/SmartStore.Services/Catalog/CategoryTreeChangeHandler.cs @@ -48,7 +48,7 @@ public class CategoryTreeChangeHook : IDbSaveHook, IConsumer // Visibility affecting category prop names private static readonly string[] _a = new string[] { "LimitedToStores", "SubjectToAcl" }; // Data affecting category prop names - private static readonly string[] _d = new string[] { "Name", "Alias", "ExternalLink", "PictureId", "BadgeText", "BadgeStyle" }; + private static readonly string[] _d = new string[] { "Name", "Alias", "ExternalLink", "MediaFileId", "BadgeText", "BadgeStyle" }; private static readonly HashSet _candidateTypes = new HashSet { diff --git a/src/Libraries/SmartStore.Services/Catalog/Importer/CategoryImporter.cs b/src/Libraries/SmartStore.Services/Catalog/Importer/CategoryImporter.cs index f263625290..0e7e928198 100644 --- a/src/Libraries/SmartStore.Services/Catalog/Importer/CategoryImporter.cs +++ b/src/Libraries/SmartStore.Services/Catalog/Importer/CategoryImporter.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Linq.Expressions; using SmartStore.Core.Async; +using SmartStore.Core.Caching; using SmartStore.Core.Data; using SmartStore.Core.Domain.Catalog; using SmartStore.Core.Domain.DataExchange; @@ -26,6 +27,7 @@ public class CategoryImporter : EntityImporterBase private readonly IFolderService _folderService; private readonly ILocalizedEntityService _localizedEntityService; private readonly FileDownloadManager _fileDownloadManager; + private readonly ICacheManager _cache; private static readonly Dictionary>> _localizableProperties = new Dictionary>> { @@ -44,7 +46,8 @@ public CategoryImporter( IMediaService mediaService, IFolderService folderService, ILocalizedEntityService localizedEntityService, - FileDownloadManager fileDownloadManager) + FileDownloadManager fileDownloadManager, + ICacheManager cache) { _categoryRepository = categoryRepository; _categoryTemplateService = categoryTemplateService; @@ -52,6 +55,7 @@ public CategoryImporter( _folderService = folderService; _localizedEntityService = localizedEntityService; _fileDownloadManager = fileDownloadManager; + _cache = cache; } protected override void Import(ImportExecuteContext context) @@ -175,6 +179,9 @@ protected override void Import(ImportExecuteContext context) } } } + + // Hooks are disabled but category tree may have changed. + _cache.Clear(); } protected virtual int ProcessPictures(ImportExecuteContext context, IEnumerable> batch) @@ -199,6 +206,11 @@ protected virtual int ProcessPictures(ImportExecuteContext context, IEnumerable< } var image = CreateDownloadImage(context, imageUrl, 1); + if (image == null) + { + continue; + } + if (image.Url.HasValue() && !image.Success.HasValue) { AsyncRunner.RunSync(() => _fileDownloadManager.DownloadAsync(DownloaderContext, new FileDownloadManagerItem[] { image })); diff --git a/src/Libraries/SmartStore.Services/Catalog/Importer/ProductImporter.cs b/src/Libraries/SmartStore.Services/Catalog/Importer/ProductImporter.cs index 4b87cd58c2..7da3f102c3 100644 --- a/src/Libraries/SmartStore.Services/Catalog/Importer/ProductImporter.cs +++ b/src/Libraries/SmartStore.Services/Catalog/Importer/ProductImporter.cs @@ -868,12 +868,15 @@ protected virtual void ProcessProductPictures(ImportExecuteContext context, IEnu foreach (var row in batch) { - var imageUrls = row.GetDataValue>("ImageUrls"); - if (imageUrls.IsNullOrEmpty()) + var rawImageUrls = row.GetDataValue("ImageUrls"); + + // Force pipe symbol as separator because file names can contain commas or semicolons. + var imageUrls = rawImageUrls.SplitSafe("|"); + if (imageUrls.Length == 0) { continue; } - + var productId = row.Entity.Id; var imageNumber = 0; var displayOrder = -1; @@ -884,12 +887,13 @@ protected virtual void ProcessProductPictures(ImportExecuteContext context, IEnu foreach (var urlOrPath in imageUrls) { var image = CreateDownloadImage(context, urlOrPath, ++imageNumber); - if (image != null) + { imageFiles.Add(image); - if (imageFiles.Count >= numberOfPictures) - break; + if (imageFiles.Count >= numberOfPictures) + break; + } } // Download images. diff --git a/src/Libraries/SmartStore.Services/Catalog/Modelling/ProductVariantQueryFactory.cs b/src/Libraries/SmartStore.Services/Catalog/Modelling/ProductVariantQueryFactory.cs index 771093c047..c7cb504693 100644 --- a/src/Libraries/SmartStore.Services/Catalog/Modelling/ProductVariantQueryFactory.cs +++ b/src/Libraries/SmartStore.Services/Catalog/Modelling/ProductVariantQueryFactory.cs @@ -41,7 +41,6 @@ protected Multimap QueryItems if (_httpContext.Request?.Unvalidated != null) { var form = _httpContext.Request.Unvalidated.Form; - if (form != null) { foreach (var key in form.AllKeys) @@ -54,7 +53,6 @@ protected Multimap QueryItems } var query = _httpContext.Request.Unvalidated.QueryString; - if (query != null) { foreach (var key in query.AllKeys) @@ -141,8 +139,18 @@ public ProductVariantQuery CreateFromQuery() // Convert from three form controls. var dateKey = key.Replace("-year", ""); year = value.ToInt(); - month = QueryItems[dateKey + "-month"].FirstOrDefault()?.ToInt() ?? 0; - day = QueryItems[dateKey + "-day"].FirstOrDefault()?.ToInt() ?? 0; + + if (QueryItems.ContainsKey(dateKey + "-month")) + { + var str = QueryItems[dateKey + "-month"].FirstOrDefault(); + month = str?.ToInt() ?? 0; + } + + if (QueryItems.ContainsKey(dateKey + "-day")) + { + var str = QueryItems[dateKey + "-day"].FirstOrDefault(); + day = str?.ToInt() ?? 0; + } } if (year > 0 && month > 0 && day > 0) @@ -151,7 +159,9 @@ public ProductVariantQuery CreateFromQuery() { return new DateTime(year, month, day); } - catch { } + catch + { + } } return null; diff --git a/src/Libraries/SmartStore.Services/Catalog/PriceCalculationService.cs b/src/Libraries/SmartStore.Services/Catalog/PriceCalculationService.cs index 1c1c86a845..e0454c592a 100644 --- a/src/Libraries/SmartStore.Services/Catalog/PriceCalculationService.cs +++ b/src/Libraries/SmartStore.Services/Catalog/PriceCalculationService.cs @@ -1035,7 +1035,7 @@ public virtual decimal GetProductVariantAttributeValuePriceAdjustment(ProductVar if (linkedProduct != null) { - var productPrice = GetFinalPrice(linkedProduct, true) * attributeValue.Quantity; + var productPrice = GetFinalPrice(linkedProduct, false) * attributeValue.Quantity; return productPrice; } } diff --git a/src/Libraries/SmartStore.Services/Catalog/ProductAttributeFormatter.cs b/src/Libraries/SmartStore.Services/Catalog/ProductAttributeFormatter.cs index 2877c4800f..8e54c8d8a1 100644 --- a/src/Libraries/SmartStore.Services/Catalog/ProductAttributeFormatter.cs +++ b/src/Libraries/SmartStore.Services/Catalog/ProductAttributeFormatter.cs @@ -145,7 +145,7 @@ public string FormatAttributes( if (allowHyperlinks) { - var downloadLink = string.Format("{0}download/getfileupload/?downloadId={1}", _webHelper.GetStoreLocation(false), download.DownloadGuid); + var downloadLink = string.Format("{0}download/getfileupload/?downloadId={1}", _webHelper.GetStoreLocation(), download.DownloadGuid); attributeText = string.Format("{1}", downloadLink, fileName); } else diff --git a/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs b/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs index d6de776ade..6fb44522a1 100644 --- a/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs +++ b/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs @@ -180,6 +180,11 @@ public virtual void ClearCachedAttributeValues() } public virtual Multimap DeserializeProductVariantAttributes(string attributesXml) + { + return DeserializeAttributesXml(attributesXml, null); + } + + private Multimap DeserializeAttributesXml(string attributesXml, int[] includeAttributesIds = null) { var attrs = new Multimap(); if (String.IsNullOrEmpty(attributesXml)) @@ -195,7 +200,8 @@ public virtual Multimap DeserializeProductVariantAttributes(string string sid = node1.Attribute("ID").Value; if (sid.HasValue()) { - if (int.TryParse(sid, out var id)) + if (int.TryParse(sid, out var id) && + (includeAttributesIds == null || includeAttributesIds.Contains(id))) { // ProductVariantAttributeValue/Value foreach (var node2 in node1.Descendants("Value")) @@ -326,6 +332,11 @@ public virtual bool AreProductAttributesEqual(string attributeXml1, string attri var attributes1 = DeserializeProductVariantAttributes(attributeXml1); var attributes2 = DeserializeProductVariantAttributes(attributeXml2); + return AreProductAttributesEqual(attributes1, attributes2); + } + + private bool AreProductAttributesEqual(Multimap attributes1, Multimap attributes2) + { if (attributes1.Count != attributes2.Count) return false; @@ -383,9 +394,14 @@ public virtual ProductVariantAttributeCombination FindProductVariantAttributeCom if (combinations.Count == 0) return null; + var listTypeValues = ParseProductVariantAttributeValues(attributesXml); + var listTypeAttributesIds = listTypeValues.Select(x => x.ProductVariantAttributeId).ToArray(); + var listTypeAttributesMap = DeserializeAttributesXml(attributesXml, listTypeAttributesIds); + foreach (var combination in combinations) { - bool attributesEqual = AreProductAttributesEqual(combination.AttributesXml, attributesXml); + var combinationAttributesMap = DeserializeProductVariantAttributes(combination.AttributesXml); + bool attributesEqual = AreProductAttributesEqual(combinationAttributesMap, listTypeAttributesMap); if (attributesEqual) return _productAttributeService.GetProductVariantAttributeCombinationById(combination.Id); } diff --git a/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs b/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs index 52ffd8cd80..8ecf7912c0 100644 --- a/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs +++ b/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs @@ -377,7 +377,7 @@ public static string GetBasePriceInfo(this Product product, { var value = Convert.ToDecimal((productPrice / product.BasePriceAmount) * product.BasePriceBaseAmount); var valueFormatted = priceFormatter.FormatPrice(value, true, currency); - var amountFormatted = Math.Round(product.BasePriceAmount.Value, 2).ToString("G29"); + var amountFormatted = product.BasePriceAmount.Value.ToString("G29"); var infoTemplate = localizationService.GetResource("Products.BasePriceInfo"); var result = infoTemplate.FormatInvariant( diff --git a/src/Libraries/SmartStore.Services/Catalog/ProductService.cs b/src/Libraries/SmartStore.Services/Catalog/ProductService.cs index aba3d28a20..622f9c56c6 100644 --- a/src/Libraries/SmartStore.Services/Catalog/ProductService.cs +++ b/src/Libraries/SmartStore.Services/Catalog/ProductService.cs @@ -978,7 +978,7 @@ public virtual void DeleteProductPicture(ProductMediaFile productPicture) private void UnassignDeletedPictureFromVariantCombinations(ProductMediaFile productPicture) { - var picId = productPicture.Id; + var picId = productPicture.MediaFileId; bool touched = false; var combinations = diff --git a/src/Libraries/SmartStore.Services/Catalog/RecentlyViewedProductsService.cs b/src/Libraries/SmartStore.Services/Catalog/RecentlyViewedProductsService.cs index fc47f54a93..e7c26224f7 100644 --- a/src/Libraries/SmartStore.Services/Catalog/RecentlyViewedProductsService.cs +++ b/src/Libraries/SmartStore.Services/Catalog/RecentlyViewedProductsService.cs @@ -128,8 +128,7 @@ public virtual void AddProductToRecentlyViewedList(int productId) maxProducts = 8; } - var skip = Math.Max(0, newProductIds.Count - maxProducts); - newProductIds.Skip(skip).Take(maxProducts).Each(x => + newProductIds.Take(maxProducts).Each(x => { recentlyViewedCookie.Values.Add("RecentlyViewedProductIds", x.ToString()); }); diff --git a/src/Libraries/SmartStore.Services/Customers/CustomerService.cs b/src/Libraries/SmartStore.Services/Customers/CustomerService.cs index fe5b00bad9..10c842935b 100644 --- a/src/Libraries/SmartStore.Services/Customers/CustomerService.cs +++ b/src/Libraries/SmartStore.Services/Customers/CustomerService.cs @@ -447,7 +447,7 @@ public virtual Customer FindGuestCustomerByClientIdent(string clientIdent = null IQueryable query; if (DataSettings.Current.IsSqlServer) { - query = from a in _gaRepository.TableUntracked + query = from a in _gaRepository.Table join c in _customerRepository.Table on a.EntityId equals c.Id into Customers from c in Customers.DefaultIfEmpty() where c.LastActivityDateUtc >= dateFrom @@ -460,7 +460,7 @@ from c in Customers.DefaultIfEmpty() } else { - query = from a in _gaRepository.TableUntracked + query = from a in _gaRepository.Table join c in _customerRepository.Table on a.EntityId equals c.Id into Customers from c in Customers.DefaultIfEmpty() where c.LastActivityDateUtc >= dateFrom diff --git a/src/Libraries/SmartStore.Services/Customers/GdprTool.cs b/src/Libraries/SmartStore.Services/Customers/GdprTool.cs index 2b6fa43a63..45fecf45a6 100644 --- a/src/Libraries/SmartStore.Services/Customers/GdprTool.cs +++ b/src/Libraries/SmartStore.Services/Customers/GdprTool.cs @@ -279,6 +279,10 @@ public virtual void AnonymizeCustomer(Customer customer, bool pseudomyzeContent) AnonymizeData(customer, x => x.Username, IdentifierDataType.UserName, language); AnonymizeData(customer, x => x.Email, IdentifierDataType.EmailAddress, language); AnonymizeData(customer, x => x.LastIpAddress, IdentifierDataType.IpAddress, language); + AnonymizeData(customer, x => x.FirstName, IdentifierDataType.Name, language); + AnonymizeData(customer, x => x.LastName, IdentifierDataType.Name, language); + AnonymizeData(customer, x => x.BirthDate, IdentifierDataType.DateTime, language); + if (pseudomyzeContent) { AnonymizeData(customer, x => x.AdminComment, IdentifierDataType.LongText, language); diff --git a/src/Libraries/SmartStore.Services/Customers/Importer/CustomerImporter.cs b/src/Libraries/SmartStore.Services/Customers/Importer/CustomerImporter.cs index 6c4366eb76..ce9703ed4d 100644 --- a/src/Libraries/SmartStore.Services/Customers/Importer/CustomerImporter.cs +++ b/src/Libraries/SmartStore.Services/Customers/Importer/CustomerImporter.cs @@ -606,6 +606,11 @@ protected virtual int ProcessAvatars( } var image = CreateDownloadImage(context, urlOrPath, 1); + if (image == null) + { + continue; + } + if (image.Url.HasValue() && !image.Success.HasValue) { AsyncRunner.RunSync(() => _fileDownloadManager.DownloadAsync(DownloaderContext, new FileDownloadManagerItem[] { image })); diff --git a/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs b/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs index 57d852324c..076b161bf9 100644 --- a/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs +++ b/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs @@ -334,12 +334,20 @@ x is ProductMediaFile || x is ProductTag || x is ProductSpecificationAttribute | ctx.CustomerExportContext.Clear(); } - if (ctx.Request.Provider.Value.EntityType == ExportEntityType.ShoppingCartItem) + switch (ctx.Request.Provider.Value.EntityType) { - _dbContext.DetachEntities(x => - { - return x is ShoppingCartItem || x is Customer || x is Product || x is ProductVariantAttributeCombination; - }); + case ExportEntityType.ShoppingCartItem: + _dbContext.DetachEntities(x => + { + return x is ShoppingCartItem || x is Customer || x is Product || x is ProductVariantAttributeCombination; + }); + break; + case ExportEntityType.NewsLetterSubscription: + _dbContext.DetachEntities(x => + { + return x is NewsLetterSubscription || x is Customer; + }); + break; } } catch (Exception ex) @@ -1217,12 +1225,12 @@ private IQueryable GetCustomerQuery(DataExporterContext ctx, int? skip if (ctx.Filter.BillingCountryIds != null && ctx.Filter.BillingCountryIds.Any()) { - query = query.Where(x => x.BillingAddress != null && ctx.Filter.BillingCountryIds.Contains(x.BillingAddress.Id)); + query = query.Where(x => x.BillingAddress != null && ctx.Filter.BillingCountryIds.Contains(x.BillingAddress.CountryId ?? 0)); } if (ctx.Filter.ShippingCountryIds != null && ctx.Filter.ShippingCountryIds.Any()) { - query = query.Where(x => x.ShippingAddress != null && ctx.Filter.ShippingCountryIds.Contains(x.ShippingAddress.Id)); + query = query.Where(x => x.ShippingAddress != null && ctx.Filter.ShippingCountryIds.Contains(x.ShippingAddress.CountryId ?? 0)); } if (ctx.Filter.LastActivityFrom.HasValue) @@ -1322,16 +1330,26 @@ private IQueryable GetNewsLetterSubscriptionQuery(DataEx skipValue = Math.Max(ctx.Request.Profile.Offset, 0); } - var query = _subscriptionRepository.Value.TableUntracked; + var customerQuery = _customerRepository.Value.TableUntracked.Where(x => !x.Deleted); + + var query = + from ns in _subscriptionRepository.Value.TableUntracked + join c in customerQuery on ns.Email equals c.Email into customers + from c in customers.DefaultIfEmpty() + select new NewsletterSubscriber + { + Subscription = ns, + Customer = c + }; if (storeId > 0) { - query = query.Where(x => x.StoreId == storeId); + query = query.Where(x => x.Subscription.StoreId == storeId); } if (ctx.Filter.IsActiveSubscriber.HasValue) { - query = query.Where(x => x.Active == ctx.Filter.IsActiveSubscriber.Value); + query = query.Where(x => x.Subscription.Active == ctx.Filter.IsActiveSubscriber.Value); } if (ctx.Filter.WorkingLanguageId != null && ctx.Filter.WorkingLanguageId != 0) @@ -1341,32 +1359,37 @@ private IQueryable GetNewsLetterSubscriptionQuery(DataEx if (isDefaultLanguage) { - query = query.Where(x => x.WorkingLanguageId == 0 || x.WorkingLanguageId == ctx.Filter.WorkingLanguageId); + query = query.Where(x => x.Subscription.WorkingLanguageId == 0 || x.Subscription.WorkingLanguageId == ctx.Filter.WorkingLanguageId); } else { - query = query.Where(x => x.WorkingLanguageId == ctx.Filter.WorkingLanguageId); + query = query.Where(x => x.Subscription.WorkingLanguageId == ctx.Filter.WorkingLanguageId); } } if (ctx.Filter.CreatedFrom.HasValue) { var createdFrom = _services.DateTimeHelper.ConvertToUtcTime(ctx.Filter.CreatedFrom.Value, _services.DateTimeHelper.CurrentTimeZone); - query = query.Where(x => createdFrom <= x.CreatedOnUtc); + query = query.Where(x => createdFrom <= x.Subscription.CreatedOnUtc); } if (ctx.Filter.CreatedTo.HasValue) { var createdTo = _services.DateTimeHelper.ConvertToUtcTime(ctx.Filter.CreatedTo.Value, _services.DateTimeHelper.CurrentTimeZone); - query = query.Where(x => createdTo >= x.CreatedOnUtc); + query = query.Where(x => createdTo >= x.Subscription.CreatedOnUtc); + } + + if (ctx.Filter.CustomerRoleIds != null && ctx.Filter.CustomerRoleIds.Any()) + { + query = query.Where(x => x.Customer.CustomerRoleMappings.Select(y => y.CustomerRoleId).Intersect(ctx.Filter.CustomerRoleIds).Any()); } if (ctx.Request.EntitiesToExport.Any()) { - query = query.Where(x => ctx.Request.EntitiesToExport.Contains(x.Id)); + query = query.Where(x => ctx.Request.EntitiesToExport.Contains(x.Subscription.Id)); } - query = query.OrderBy(x => x.Id); + query = query.OrderBy(x => x.Subscription.Id); if (skipValue > 0) { @@ -1374,7 +1397,7 @@ private IQueryable GetNewsLetterSubscriptionQuery(DataEx } else if (ctx.LastId > 0) { - query = query.Where(x => x.Id > ctx.LastId); + query = query.Where(x => x.Subscription.Id > ctx.LastId); } if (take != int.MaxValue) @@ -1382,7 +1405,7 @@ private IQueryable GetNewsLetterSubscriptionQuery(DataEx query = query.Take(() => take); } - return query; + return query.Select(x => x.Subscription); } private List GetNewsLetterSubscriptions(DataExporterContext ctx) @@ -1692,6 +1715,7 @@ private void ExportCoreInner(DataExporterContext ctx, Store store) var publicDeployment = profile.Deployments.FirstOrDefault(x => x.DeploymentType == ExportDeploymentType.PublicFolder); ctx.Store = store; + ctx.LastId = 0; context.FileIndex = 0; context.Store = ToDynamic(ctx, ctx.Store); context.MaxFileNameLength = dataExchangeSettings.MaxFileNameLength; @@ -2037,8 +2061,11 @@ public DataExportPreviewResult Preview(DataExportRequest request, int pageIndex) var cancellation = new CancellationTokenSource(TimeSpan.FromMinutes(5.0)); var ctx = new DataExporterContext(request, cancellation.Token, true); - var unused = Init(ctx); - var skip = Math.Max(ctx.Request.Profile.Offset, 0) + (pageIndex * PageSize); + Init(ctx); + + var limit = Math.Max(request.Profile.Limit, 0); + var take = limit > 0 && limit < PageSize ? limit : PageSize; + var skip = Math.Max(ctx.Request.Profile.Offset, 0) + (pageIndex * take); if (!HasPermission(ctx)) { @@ -2051,43 +2078,43 @@ public DataExportPreviewResult Preview(DataExportRequest request, int pageIndex) { case ExportEntityType.Product: { - var items = GetProductQuery(ctx, skip, PageSize).ToList(); + var items = GetProductQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; case ExportEntityType.Order: { - var items = GetOrderQuery(ctx, skip, PageSize).ToList(); + var items = GetOrderQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; case ExportEntityType.Category: { - var items = GetCategoryQuery(ctx, skip, PageSize).ToList(); + var items = GetCategoryQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; case ExportEntityType.Manufacturer: { - var items = GetManufacturerQuery(ctx, skip, PageSize).ToList(); + var items = GetManufacturerQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; case ExportEntityType.Customer: { - var items = GetCustomerQuery(ctx, skip, PageSize).ToList(); + var items = GetCustomerQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; case ExportEntityType.NewsLetterSubscription: { - var items = GetNewsLetterSubscriptionQuery(ctx, skip, PageSize).ToList(); + var items = GetNewsLetterSubscriptionQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; case ExportEntityType.ShoppingCartItem: { - var items = GetShoppingCartItemQuery(ctx, skip, PageSize).ToList(); + var items = GetShoppingCartItemQuery(ctx, skip, take).ToList(); items.Each(x => result.Data.Add(ToDynamic(ctx, x))); } break; diff --git a/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs b/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs index 14cc1d7b56..946769b317 100644 --- a/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs +++ b/src/Libraries/SmartStore.Services/DataExchange/Export/DynamicEntityHelper.cs @@ -353,7 +353,7 @@ private dynamic ToDynamic(DataExporterContext ctx, Address address) dynamic sp = new DynamicEntity(address.StateProvince); var translations = ctx.Translations[nameof(StateProvince)]; - sp.Name = translations.GetValue(ctx.LanguageId, address.StateProvince.Id, nameof(StateProvince)) ?? address.StateProvince.Name; + sp.Name = translations.GetValue(ctx.LanguageId, address.StateProvince.Id, nameof(StateProvince.Name)) ?? address.StateProvince.Name; sp._Localized = GetLocalized(ctx, translations, null, address.StateProvince, x => x.Name); result.StateProvince = sp; @@ -728,8 +728,14 @@ private dynamic ToDynamic(DataExporterContext ctx, Product product, bool isParen product.MergeWithCombination(productContext.Combination); var numberOfPictures = ctx.Projection.NumberOfMediaFiles ?? int.MaxValue; - var productDetailsPictureSize = ctx.Projection.PictureSize > 0 ? ctx.Projection.PictureSize : _mediaSettings.Value.ProductDetailsPictureSize; - var imageQuery = ctx.Projection.PictureSize > 0 ? new ProcessImageQuery { MaxWidth = ctx.Projection.PictureSize } : null; + var productDetailsPictureSize = _mediaSettings.Value.ProductDetailsPictureSize; + ProcessImageQuery imageQuery = null; + + if (ctx.Projection.PictureSize > 0) + { + productDetailsPictureSize = _mediaSettings.Value.GetNextValidThumbnailSize(ctx.Projection.PictureSize); + imageQuery = new ProcessImageQuery { MaxWidth = productDetailsPictureSize }; + } IEnumerable productPictures = ctx.ProductExportContext.ProductPictures.GetOrLoad(product.Id); var productManufacturers = ctx.ProductExportContext.ProductManufacturers.GetOrLoad(product.Id); diff --git a/src/Libraries/SmartStore.Services/DataExchange/Import/EntityImporterBase.cs b/src/Libraries/SmartStore.Services/DataExchange/Import/EntityImporterBase.cs index ecdbc349e4..e33149ae8e 100644 --- a/src/Libraries/SmartStore.Services/DataExchange/Import/EntityImporterBase.cs +++ b/src/Libraries/SmartStore.Services/DataExchange/Import/EntityImporterBase.cs @@ -91,52 +91,61 @@ protected void Initialize(ImportExecuteContext context) public FileDownloadManagerItem CreateDownloadImage(ImportExecuteContext context, string urlOrPath, int displayOrder) { - var item = new FileDownloadManagerItem + try { - Id = displayOrder, - DisplayOrder = displayOrder - }; - - if (urlOrPath.IsWebUrl()) - { - // We append quality to avoid importing of image duplicates. - item.Url = context.Services.WebHelper.ModifyQueryString(urlOrPath, "q=100", null); - - if (DownloadedItems.ContainsKey(urlOrPath)) + var item = new FileDownloadManagerItem { - // URL has already been downloaded. - item.Success = true; - item.FileName = DownloadedItems[urlOrPath]; - } - else + Id = displayOrder, + DisplayOrder = displayOrder + }; + + if (urlOrPath.IsWebUrl()) { - var localPath = string.Empty; + // We append quality to avoid importing of image duplicates. + item.Url = context.Services.WebHelper.ModifyQueryString(urlOrPath, "q=100", null); - try + if (DownloadedItems.ContainsKey(urlOrPath)) { - // Exclude query string parts! - localPath = new Uri(urlOrPath).LocalPath; + // URL has already been downloaded. + item.Success = true; + item.FileName = DownloadedItems[urlOrPath]; + } + else + { + var localPath = string.Empty; + + try + { + // Exclude query string parts! + localPath = new Uri(urlOrPath).LocalPath; + } + catch { } + + item.FileName = Path.GetFileName(localPath).ToValidFileName().NullEmpty() ?? Path.GetRandomFileName(); } - catch { } - item.FileName = Path.GetFileName(localPath).ToValidFileName().NullEmpty() ?? Path.GetRandomFileName(); + item.Path = Path.Combine(ImageDownloadFolder, item.FileName); } + else + { + item.Success = true; + item.FileName = Path.GetFileName(urlOrPath).ToValidFileName().NullEmpty() ?? Path.GetRandomFileName(); - item.Path = Path.Combine(ImageDownloadFolder, item.FileName); + item.Path = Path.IsPathRooted(urlOrPath) + ? urlOrPath + : Path.Combine(ImageFolder, urlOrPath); + } + + item.MimeType = MimeTypes.MapNameToMimeType(item.FileName); + + return item; } - else + catch { - item.Success = true; - item.FileName = Path.GetFileName(urlOrPath).ToValidFileName().NullEmpty() ?? Path.GetRandomFileName(); + context.Result.AddWarning($"Failed to prepare image download for '{urlOrPath.NaIfEmpty()}'. Skipping file."); - item.Path = Path.IsPathRooted(urlOrPath) - ? urlOrPath - : Path.Combine(ImageFolder, urlOrPath); + return null; } - - item.MimeType = MimeTypes.MapNameToMimeType(item.FileName); - - return item; } public void Succeeded(FileDownloadManagerItem item) diff --git a/src/Libraries/SmartStore.Services/Discounts/DiscountService.cs b/src/Libraries/SmartStore.Services/Discounts/DiscountService.cs index 7a30a49f39..5ab5f8a1f9 100644 --- a/src/Libraries/SmartStore.Services/Discounts/DiscountService.cs +++ b/src/Libraries/SmartStore.Services/Discounts/DiscountService.cs @@ -103,29 +103,25 @@ public virtual Discount GetDiscountById(int discountId) public virtual IEnumerable GetAllDiscounts(DiscountType? discountType, string couponCode = "", bool showHidden = false) { - int? discountTypeId = null; - if (discountType.HasValue) - discountTypeId = (int)discountType.Value; - - // we load all discounts, and filter them by passed "discountType" parameter later - // we do it because we know that this method is invoked several times per HTTP request with distinct "discountType" parameter - // that's why we access the database only once - string key = string.Format(DISCOUNTS_ALL_KEY, showHidden, couponCode); + var discountTypeId = discountType.HasValue ? (int)discountType.Value : 0; + + // We load all discounts and filter them by passed "discountType" parameter later because + // this method is invoked several times per HTTP request with distinct "discountType" parameter. + var key = string.Format(DISCOUNTS_ALL_KEY, showHidden, couponCode); var result = _requestCache.Get(key, () => { var query = _discountRepository.Table; if (!showHidden) { - // The function 'CurrentUtcDateTime' is not supported by SQL Server Compact. - // That's why we pass the date value - var nowUtc = DateTime.UtcNow.Date; + var utcNow = DateTime.UtcNow; + query = query.Where(d => - (!d.StartDateUtc.HasValue || d.StartDateUtc <= nowUtc) - && (!d.EndDateUtc.HasValue || d.EndDateUtc >= nowUtc)); + (!d.StartDateUtc.HasValue || d.StartDateUtc <= utcNow) && + (!d.EndDateUtc.HasValue || d.EndDateUtc >= utcNow)); } - if (!String.IsNullOrWhiteSpace(couponCode)) + if (!string.IsNullOrWhiteSpace(couponCode)) { couponCode = couponCode.Trim(); query = query.Where(d => d.CouponCode == couponCode); @@ -143,7 +139,7 @@ public virtual IEnumerable GetAllDiscounts(DiscountType? discountType, if (discountTypeId > 0) { - return result[discountTypeId.Value]; + return result[discountTypeId]; } return result.SelectMany(x => x.Value); diff --git a/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs b/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs index b5a92c3263..2371b71bc7 100644 --- a/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs +++ b/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs @@ -218,6 +218,7 @@ protected virtual LocalizedPropertyCollection GetLocalizedPropertyCollectionInte where x.LocaleKeyGroup == localeKeyGroup select x; + var splitEntityIds = false; var requestedSet = entityIds; if (entityIds != null && entityIds.Length > 0) @@ -243,7 +244,15 @@ protected virtual LocalizedPropertyCollection GetLocalizedPropertyCollectionInte else { requestedSet = entityIds; - query = query.Where(x => entityIds.Contains(x.EntityId)); + + if (entityIds.Length > 5000) + { + splitEntityIds = true; + } + else + { + query = query.Where(x => entityIds.Contains(x.EntityId)); + } } } @@ -252,7 +261,20 @@ protected virtual LocalizedPropertyCollection GetLocalizedPropertyCollectionInte query = query.Where(x => x.LanguageId == languageId); } - return new LocalizedPropertyCollection(localeKeyGroup, requestedSet, query.ToList()); + if (splitEntityIds) + { + var items = new List(); + foreach (var chunk in entityIds.Slice(5000)) + { + items.AddRange(query.Where(x => chunk.Contains(x.EntityId)).ToList()); + } + + return new LocalizedPropertyCollection(localeKeyGroup, requestedSet, items); + } + else + { + return new LocalizedPropertyCollection(localeKeyGroup, requestedSet, query.ToList()); + } } } diff --git a/src/Libraries/SmartStore.Services/Media/DownloadService.cs b/src/Libraries/SmartStore.Services/Media/DownloadService.cs index e1ab3bc6ad..89297b15b0 100644 --- a/src/Libraries/SmartStore.Services/Media/DownloadService.cs +++ b/src/Libraries/SmartStore.Services/Media/DownloadService.cs @@ -60,13 +60,26 @@ public virtual IList GetDownloadsFor(int entityId, string entityName, if (entityId > 0) { var downloads = (from x in _downloadRepository.Table.Expand(x => x.MediaFile) - where x.EntityId == entityId && x.EntityName == entityName && (!string.IsNullOrEmpty(x.FileVersion) && versionedFilesOnly) + where x.EntityId == entityId && x.EntityName == entityName select x).ToList(); + if (versionedFilesOnly) + { + downloads = downloads.Where(x => !string.IsNullOrEmpty(x.FileVersion)).ToList(); + } + if (downloads.Any()) { var idsOrderedByVersion = downloads - .Select(x => new { x.Id, Version = new SemanticVersion(x.FileVersion.HasValue() ? x.FileVersion : "1.0.0.0") }) + .Select(x => + { + if (SemanticVersion.TryParse(x.FileVersion.HasValue() ? x.FileVersion : "1.0.0.0", out var version)) + { + return new { x.Id, Version = version }; + } + + return new { x.Id, Version = new SemanticVersion(0, 0, 0, 0) }; + }) .OrderByDescending(x => x.Version) .Select(x => x.Id); @@ -175,7 +188,7 @@ public virtual bool IsDownloadAllowed(OrderItem orderItem) return false; var product = orderItem.Product; - if (product == null || !product.IsDownload) + if (product == null || product.Deleted || !product.IsDownload) return false; //payment status diff --git a/src/Libraries/SmartStore.Services/Media/Imaging/DefaultImageProcessor.cs b/src/Libraries/SmartStore.Services/Media/Imaging/DefaultImageProcessor.cs index 2d4ed37c15..503fccb3bf 100644 --- a/src/Libraries/SmartStore.Services/Media/Imaging/DefaultImageProcessor.cs +++ b/src/Libraries/SmartStore.Services/Media/Imaging/DefaultImageProcessor.cs @@ -152,21 +152,20 @@ protected virtual void ProcessImageCore(ProcessImageQuery query, IProcessableIma // Format if (query.Format != null) { - var format = query.Format as IImageFormat; + var requestedFormat = query.Format as IImageFormat; - if (format == null && query.Format is string) + if (requestedFormat == null && query.Format is string) { - var requestedFormat = ((string)query.Format).ToLowerInvariant(); - format = Factory.GetImageFormat(requestedFormat); + requestedFormat = Factory.GetImageFormat(((string)query.Format).ToLowerInvariant()); } - if (format != null) + if (requestedFormat != null && requestedFormat.DefaultMimeType != image.Format.DefaultMimeType) { - transformer.Format(format); + transformer.Format(requestedFormat); } } - // QUality + // Quality if (query.Quality.HasValue) { transformer.Quality(query.Quality.Value); diff --git a/src/Libraries/SmartStore.Services/Media/Imaging/IImage.cs b/src/Libraries/SmartStore.Services/Media/Imaging/IImage.cs index 794fa000fb..f5d573a31c 100644 --- a/src/Libraries/SmartStore.Services/Media/Imaging/IImage.cs +++ b/src/Libraries/SmartStore.Services/Media/Imaging/IImage.cs @@ -44,4 +44,4 @@ public interface IImage : IImageInfo, IDisposable /// The current . IImage Save(string path); } -} +} \ No newline at end of file diff --git a/src/Libraries/SmartStore.Services/Media/Imaging/ImageWrapper.cs b/src/Libraries/SmartStore.Services/Media/Imaging/ImageWrapper.cs index 88ee824ee1..622b2db499 100644 --- a/src/Libraries/SmartStore.Services/Media/Imaging/ImageWrapper.cs +++ b/src/Libraries/SmartStore.Services/Media/Imaging/ImageWrapper.cs @@ -71,6 +71,11 @@ public IImage Save(Stream stream) stream.Position = 0; } + if (InStream.CanSeek) + { + InStream.Position = 0; + } + return this; } diff --git a/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs b/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs index b066c0d2ac..1c754697e7 100644 --- a/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs +++ b/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs @@ -5,8 +5,6 @@ using System.Collections.Specialized; using SmartStore.Collections; using System.Drawing; -using ImageProcessor.Imaging.Formats; -using System.Windows.Input; namespace SmartStore.Services.Media.Imaging { @@ -150,7 +148,7 @@ public string BackgroundColor public override QueryString Add(string name, string value, bool isUnique) { // Keep away invalid tokens from underlying query - if (_supportedTokens.TryGetValue(name, out var validator) && validator(name, value)) + if (name != null && _supportedTokens.TryGetValue(name, out var validator) && validator(name, value)) { return base.Add(name, value, isUnique); } @@ -219,13 +217,13 @@ public string GetResultExtension() { return null; } - else if (Format is ISupportedImageFormat) + else if (Format is IImageFormat imageFormat) { - return ((ISupportedImageFormat)Format).DefaultExtension; + return imageFormat.DefaultExtension; } - else if (Format is string) + else if (Format is string str) { - return (string)Format; + return str; } return null; diff --git a/src/Libraries/SmartStore.Services/Media/MediaService.Folder.cs b/src/Libraries/SmartStore.Services/Media/MediaService.Folder.cs index 4cc3e95f51..37cf4491b0 100644 --- a/src/Libraries/SmartStore.Services/Media/MediaService.Folder.cs +++ b/src/Libraries/SmartStore.Services/Media/MediaService.Folder.cs @@ -1,15 +1,13 @@ using System; using System.Collections.Generic; +using System.Data.Entity; using System.IO; using System.Linq; -using System.Linq.Expressions; using System.Linq.Dynamic.Core; -using SmartStore.Core.Data; -using SmartStore.Core.Domain.Media; using System.Runtime.CompilerServices; using SmartStore.Collections; -using SmartStore.Core.Localization; -using System.Data.Entity; +using SmartStore.Core.Data; +using SmartStore.Core.Domain.Media; namespace SmartStore.Services.Media { @@ -31,7 +29,7 @@ public MediaFolderInfo CreateFolder(string path) ValidateFolderPath(path, "CreateFolder", nameof(path)); var dupe = _folderService.GetNodeByPath(path); - if (_folderService.GetNodeByPath(path) != null) + if (dupe != null) { throw _exceptionFactory.DuplicateFolder(path, dupe.Value); } @@ -77,7 +75,7 @@ public MediaFolderInfo CreateFolder(string path) } } } - + return new MediaFolderInfo(_folderService.GetNodeById(folderId)); } diff --git a/src/Libraries/SmartStore.Services/Media/MediaServiceFileSystemAdapter.cs b/src/Libraries/SmartStore.Services/Media/MediaServiceFileSystemAdapter.cs index 6e3b61f2b3..c19f699cc1 100644 --- a/src/Libraries/SmartStore.Services/Media/MediaServiceFileSystemAdapter.cs +++ b/src/Libraries/SmartStore.Services/Media/MediaServiceFileSystemAdapter.cs @@ -205,7 +205,6 @@ public IFile GetFile(string path) MimeType = MimeTypes.MapNameToMimeType(path), FolderId = _folderService.GetNodeByPath(Fix(Path.GetDirectoryName(path)))?.Value.Id }; - _mediaService.ConvertMediaFile(mediaFile); file = _mediaService.ConvertMediaFile(mediaFile); } diff --git a/src/Libraries/SmartStore.Services/Media/MediaTypes/MediaType.cs b/src/Libraries/SmartStore.Services/Media/MediaTypes/MediaType.cs index d79d5a67af..ed885caf94 100644 --- a/src/Libraries/SmartStore.Services/Media/MediaTypes/MediaType.cs +++ b/src/Libraries/SmartStore.Services/Media/MediaTypes/MediaType.cs @@ -8,7 +8,7 @@ public class MediaType : IEquatable { private readonly static IDictionary _defaultExtensionsMap = new Dictionary { - ["image"] = new[] { "png", "jpg", "jpeg", "gif", "webp", "bmp", "svg", "ico" }, + ["image"] = new[] { "png", "jpg", "jpeg", "jfif", "gif", "webp", "bmp", "svg", "ico" }, ["video"] = new[] { "mp4", "m4v", "mkv", "wmv", "avi", "asf", "mpg", "mpeg", "webm", "flv", "ogv", "mov", "3gp" }, ["audio"] = new[] { "mp3", "wav", "wma", "aac", "flac", "oga", "wav", "m4a", "ogg" }, ["document"] = new[] { "pdf", "doc", "docx", "ppt", "pptx", "pps", "ppsx", "docm", "odt", "ods", "dot", "dotx", "dotm", "psd", "xls", "xlsx", "rtf" }, diff --git a/src/Libraries/SmartStore.Services/Media/Storage/FileSystemMediaStorageProvider.cs b/src/Libraries/SmartStore.Services/Media/Storage/FileSystemMediaStorageProvider.cs index 481408d04c..232c3c0aee 100644 --- a/src/Libraries/SmartStore.Services/Media/Storage/FileSystemMediaStorageProvider.cs +++ b/src/Libraries/SmartStore.Services/Media/Storage/FileSystemMediaStorageProvider.cs @@ -280,8 +280,8 @@ public void OnCompleted(MediaMoverContext context, bool succeeded) if ((!toFileSystem && succeeded) || (toFileSystem && !succeeded)) { - // FS > DB sucessful OR DB > FS failed: delete all physical files - // run a background task for the deletion of files (fire & forget) + // FS > DB sucessful OR DB > FS failed/aborted: delete all physical files. + // Run a background task for the deletion of files (fire & forget) Task.Factory.StartNew(state => { diff --git a/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs b/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs index 8a8951add8..9fb06c72a4 100644 --- a/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs +++ b/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs @@ -33,6 +33,20 @@ public Stream SourceStream public abstract void SaveTo(Stream stream, MediaFile mediaFile); public abstract Task SaveToAsync(Stream stream, MediaFile mediaFile); + protected static int GetLength(Stream stream) + { + if (stream.CanSeek) + { + return (int)stream.Length; + } + else if (stream.Position > 0) + { + return (int)stream.Position; + } + + return 0; + } + public virtual void Dispose() { if (_sourceStream != null) @@ -82,13 +96,13 @@ protected override Stream GetSourceStream() public override void SaveTo(Stream stream, MediaFile mediaFile) { _image.Save(stream); - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); } public override Task SaveToAsync(Stream stream, MediaFile mediaFile) { _image.Save(stream); - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); return Task.CompletedTask; } } @@ -121,7 +135,7 @@ public override void SaveTo(Stream stream, MediaFile mediaFile) stream.Position = 0; } - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); } public override async Task SaveToAsync(Stream stream, MediaFile mediaFile) @@ -138,7 +152,7 @@ public override async Task SaveToAsync(Stream stream, MediaFile mediaFile) stream.Position = 0; } - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); } } diff --git a/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs b/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs index aa657d8b32..7c2ab26c7b 100644 --- a/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs +++ b/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs @@ -515,6 +515,14 @@ public virtual object[] GetTestModels(MessageContext messageContext) ["Address"] = "VatAddress" }); break; + case MessageTemplateNames.SystemGeneric: + result.Add(new NamedModelPart("Generic") + { + ["Email"] = "john@doe.com", + ["Subject"] = "Subject", + ["Body"] = LoremIpsum + }); + break; } } diff --git a/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs b/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs index 6fb1b6a323..37045b041f 100644 --- a/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs +++ b/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs @@ -1152,7 +1152,7 @@ private TreeNode BuildModelTreePart(string modelName, object in return node; } - private IEnumerable> BuildModelTreePartForClass(object instance) + private IEnumerable> BuildModelTreePartForClass(object instance, HashSet instanceLookup = null) { var type = instance?.GetType(); @@ -1177,11 +1177,25 @@ private IEnumerable> BuildModelTreePartForClass(object { yield return new TreeNode(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Collection }); } - else + else if (pi.PropertyType.IsClass) { - var node = new TreeNode(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Complex }); - node.AppendRange(BuildModelTreePartForClass(prop.GetValue(instance))); - yield return node; + if (instanceLookup == null) + { + instanceLookup = new HashSet(ReferenceEqualityComparer.Default) { instance }; + } + + var childInstance = prop.GetValue(instance); + if (childInstance != null) + { + if (!instanceLookup.Contains(childInstance)) + { + instanceLookup.Add(childInstance); + + var node = new TreeNode(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Complex }); + node.AppendRange(BuildModelTreePartForClass(childInstance, instanceLookup)); + yield return node; + } + } } } } diff --git a/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs b/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs index 26d9f53c5e..ee5e0689ad 100644 --- a/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs +++ b/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs @@ -145,7 +145,8 @@ public virtual MessageTemplate CopyMessageTemplate(MessageTemplate messageTempla Body = messageTemplate.Body, IsActive = messageTemplate.IsActive, EmailAccountId = messageTemplate.EmailAccountId, - LimitedToStores = messageTemplate.LimitedToStores + LimitedToStores = messageTemplate.LimitedToStores, + ModelTypes = messageTemplate.ModelTypes // INFO: we do not copy attachments }; diff --git a/src/Libraries/SmartStore.Services/News/INewsService.cs b/src/Libraries/SmartStore.Services/News/INewsService.cs index ce1564bc32..76652ed2ce 100644 --- a/src/Libraries/SmartStore.Services/News/INewsService.cs +++ b/src/Libraries/SmartStore.Services/News/INewsService.cs @@ -51,9 +51,10 @@ public partial interface INewsService /// /// Gets all news. /// - /// Store identifier; 0 if you want to get all records. + /// Store identifier. 0 to get all news items. /// Page index. /// Page size. + /// Filter by a language identifier. 0 to get all news items. /// A value indicating whether to show hidden records. /// The maximum age of returned news. /// Search for a term or phrase in the title. @@ -65,6 +66,7 @@ IPagedList GetAllNews( int storeId, int pageIndex, int pageSize, + int languageId = 0, bool showHidden = false, DateTime? maxAge = null, string title = "", diff --git a/src/Libraries/SmartStore.Services/News/NewsService.cs b/src/Libraries/SmartStore.Services/News/NewsService.cs index b6e7ff0a26..f4c50f8865 100644 --- a/src/Libraries/SmartStore.Services/News/NewsService.cs +++ b/src/Libraries/SmartStore.Services/News/NewsService.cs @@ -101,6 +101,7 @@ public virtual IPagedList GetAllNews( int storeId, int pageIndex, int pageSize, + int languageId = 0, bool showHidden = false, DateTime? maxAge = null, string title = "", @@ -116,15 +117,20 @@ public virtual IPagedList GetAllNews( } if (title.HasValue()) { - query = query.Where(b => b.Title.Contains(title)); + query = query.Where(n => n.Title.Contains(title)); } if (intro.HasValue()) { - query = query.Where(b => b.Short.Contains(intro)); + query = query.Where(n => n.Short.Contains(intro)); } if (full.HasValue()) { - query = query.Where(b => b.Full.Contains(full)); + query = query.Where(n => n.Full.Contains(full)); + } + + if (languageId != 0) + { + query = query.Where(n => !n.LanguageId.HasValue || n.LanguageId == languageId); } if (!showHidden) @@ -183,10 +189,11 @@ public override int GetTotalCount() public override IEnumerable Enlist() { - var topics = Query.Select(x => new { x.Id, x.CreatedOnUtc }).ToList(); - foreach (var x in topics) + var newsItems = Query.Select(x => new { x.Id, x.CreatedOnUtc, x.LanguageId }).ToList(); + + foreach (var x in newsItems) { - yield return new NamedEntity { EntityName = "NewsItem", Id = x.Id, LastMod = x.CreatedOnUtc }; + yield return new NamedEntity { EntityName = "NewsItem", Id = x.Id, LastMod = x.CreatedOnUtc, LanguageId = x.LanguageId }; } } diff --git a/src/Libraries/SmartStore.Services/Orders/IOrderProcessingService.cs b/src/Libraries/SmartStore.Services/Orders/IOrderProcessingService.cs index 96b6f07843..0801067fd1 100644 --- a/src/Libraries/SmartStore.Services/Orders/IOrderProcessingService.cs +++ b/src/Libraries/SmartStore.Services/Orders/IOrderProcessingService.cs @@ -59,7 +59,6 @@ IList GetOrderPlacementWarnings( /// The order void DeleteOrder(Order order); - /// /// Process next recurring psayment /// @@ -80,10 +79,6 @@ IList GetOrderPlacementWarnings( /// value indicating whether a customer can cancel recurring payment bool CanCancelRecurringPayment(Customer customerToValidate, RecurringPayment recurringPayment); - - - - /// /// Send a shipment /// @@ -98,8 +93,6 @@ IList GetOrderPlacementWarnings( /// True to notify customer void Deliver(Shipment shipment, bool notifyCustomer); - - /// /// Gets a value indicating whether cancel is allowed /// @@ -120,7 +113,6 @@ IList GetOrderPlacementWarnings( /// Context parameters void AutoUpdateOrderDetails(AutoUpdateOrderItemContext context); - /// /// Gets a value indicating whether order can be marked as authorized /// @@ -134,7 +126,6 @@ IList GetOrderPlacementWarnings( /// Order void MarkAsAuthorized(Order order); - /// /// Gets a value indicating whether the order can be marked as completed /// @@ -148,7 +139,6 @@ IList GetOrderPlacementWarnings( /// Order void CompleteOrder(Order order); - /// /// Gets a value indicating whether capture from admin panel is allowed /// @@ -176,8 +166,6 @@ IList GetOrderPlacementWarnings( /// Order void MarkOrderAsPaid(Order order); - - /// /// Gets a value indicating whether refund from admin panel is allowed /// @@ -236,8 +224,6 @@ IList GetOrderPlacementWarnings( /// Amount to refund void PartiallyRefundOffline(Order order, decimal amountToRefund); - - /// /// Gets a value indicating whether void from admin panel is allowed /// @@ -265,9 +251,6 @@ IList GetOrderPlacementWarnings( /// Order void VoidOffline(Order order); - - - /// /// Place order items in current user shopping cart. /// @@ -284,7 +267,7 @@ IList GetOrderPlacementWarnings( /// /// Valdiate minimum order amount. /// Gets min order amount from customer role. - /// When no min order amount is defined in customer role, default order settings are used as fallback. + /// When no min order amount is defined in customer role, default order settings are used as fallback if present. /// /// Shopping cart /// true - OK; false - minimum order amount is not reached @@ -293,21 +276,12 @@ IList GetOrderPlacementWarnings( /// /// Valdiate maximum order amount. /// Gets max order amount from customer role. - /// When no max order amount is defined in customer role, default order settings are used as fallback. + /// When no max order amount is defined in customer role, default order settings are used as fallback if present. /// /// Shopping cart, customer role ids /// true - OK; false - maximum order amount is exceeded (bool valid, decimal orderTotalMaximum) IsBelowOrderTotalMaximum(IList cart, int[] customerRoleIds); - /// - /// Valdiate minimum and maximum order amount. - /// Gets min/max order amount from customer role. - /// When no min or max order amount is defined in customer role, default order settings are used as fallback. - /// - /// Shopping cart, customer role ids - /// true - OK; false - minimum amount is not reached or maximum amount is exceeded - bool IsInOrderTotalsRange(IList cart, int[] customerRoleIds); - /// /// Adds a shipment to an order. /// diff --git a/src/Libraries/SmartStore.Services/Orders/IShoppingCartService.cs b/src/Libraries/SmartStore.Services/Orders/IShoppingCartService.cs index 40563cf31d..924a63437b 100644 --- a/src/Libraries/SmartStore.Services/Orders/IShoppingCartService.cs +++ b/src/Libraries/SmartStore.Services/Orders/IShoppingCartService.cs @@ -89,7 +89,8 @@ IList GetStandardWarnings( Product product, string selectedAttributes, decimal customerEnteredPrice, - int quantity); + int quantity, + int storeId = 0); /// /// Validates shopping cart item attributes diff --git a/src/Libraries/SmartStore.Services/Orders/OrderProcessingService.cs b/src/Libraries/SmartStore.Services/Orders/OrderProcessingService.cs index 79b6064855..bc58b098d2 100644 --- a/src/Libraries/SmartStore.Services/Orders/OrderProcessingService.cs +++ b/src/Libraries/SmartStore.Services/Orders/OrderProcessingService.cs @@ -70,7 +70,6 @@ public partial class OrderProcessingService : IOrderProcessingService private readonly INewsLetterSubscriptionService _newsLetterSubscriptionService; private readonly IDownloadService _downloadService; - private readonly PaymentSettings _paymentSettings; private readonly RewardPointsSettings _rewardPointsSettings; private readonly OrderSettings _orderSettings; private readonly TaxSettings _taxSettings; @@ -114,7 +113,6 @@ public OrderProcessingService( IGenericAttributeService genericAttributeService, INewsLetterSubscriptionService newsLetterSubscriptionService, IDownloadService downloadService, - PaymentSettings paymentSettings, RewardPointsSettings rewardPointsSettings, OrderSettings orderSettings, TaxSettings taxSettings, @@ -153,20 +151,16 @@ public OrderProcessingService( _genericAttributeService = genericAttributeService; _newsLetterSubscriptionService = newsLetterSubscriptionService; _downloadService = downloadService; - _paymentSettings = paymentSettings; _rewardPointsSettings = rewardPointsSettings; _orderSettings = orderSettings; _taxSettings = taxSettings; _localizationSettings = localizationSettings; _shoppingCartSettings = shoppingCartSettings; _catalogSettings = catalogSettings; - - T = NullLocalizer.Instance; - Logger = NullLogger.Instance; } - public Localizer T { get; set; } - public ILogger Logger { get; set; } + public Localizer T { get; set; } = NullLocalizer.Instance; + public ILogger Logger { get; set; } = NullLogger.Instance; #endregion @@ -540,10 +534,7 @@ public virtual IList GetOrderPlacementWarnings( orderTotalMinimum, _workContext.WorkingCurrency); - var msg = _orderSettings.ApplyToSubtotal - ? T("Checkout.MinOrderSubtotalAmount", _priceFormatter.FormatPrice(orderTotalMinimum, true, false)) - : T("Checkout.MinOrderTotalAmount", _priceFormatter.FormatPrice(orderTotalMinimum, true, false)); - + var msg = T("Checkout.MinOrderSubtotalAmount", _priceFormatter.FormatPrice(orderTotalMinimum, true, false)); warnings.Add(msg); return warnings; } @@ -556,10 +547,7 @@ public virtual IList GetOrderPlacementWarnings( orderTotalMaximum, _workContext.WorkingCurrency); - var msg = _orderSettings.ApplyToSubtotal - ? T("Checkout.MaxOrderSubtotalAmount", _priceFormatter.FormatPrice(orderTotalMaximum, true, false)) - : T("Checkout.MaxOrderTotalAmount", _priceFormatter.FormatPrice(orderTotalMaximum, true, false)); - + var msg = T("Checkout.MaxOrderSubtotalAmount", _priceFormatter.FormatPrice(orderTotalMaximum, true, false)); warnings.Add(msg); return warnings; } @@ -1535,7 +1523,7 @@ public virtual PlaceOrderResult PlaceOrder( } } } - + // Uncomment this line to support transactions. //scope.Complete(); @@ -2685,11 +2673,12 @@ public virtual bool IsReturnRequestAllowed(Order order) public virtual (bool valid, decimal orderTotalMinimum) IsAboveOrderTotalMinimum(IList cart, int[] customerRoleIds) { - var query = _customerService.GetAllCustomerRoles().SourceQuery; - var customerRole = query - .Where(x => x.OrderTotalMinimum > decimal.Zero && customerRoleIds.Contains(x.Id)) - .OrderByDescending(x => x.OrderTotalMinimum) - .FirstOrDefault(); + var query = _customerService.GetAllCustomerRoles().SourceQuery + .Where(x => x.OrderTotalMinimum > decimal.Zero && customerRoleIds.Contains(x.Id)); + + var customerRole = _orderSettings.MultipleOrderTotalRestrictionsExpandRange + ? query.OrderBy(x => x.OrderTotalMinimum).FirstOrDefault() + : query.OrderByDescending(x => x.OrderTotalMinimum).FirstOrDefault(); var minimumOrderTotal = customerRole == null ? _orderSettings.OrderTotalMinimum : customerRole.OrderTotalMinimum; @@ -2698,7 +2687,7 @@ public virtual (bool valid, decimal orderTotalMinimum) IsAboveOrderTotalMinimum( } /// - /// Valdiate order total minimum. + /// Validate order total minimum. /// /// Shopping cart, minimum order total /// true - OK; false - minimum order total is not reached @@ -2709,20 +2698,11 @@ public virtual (bool valid, decimal orderTotalMinimum) IsAboveOrderTotalMinimum( if (cart.Count > 0 && minimumOrderTotal > decimal.Zero) { - if (_orderSettings.ApplyToSubtotal) - { - _orderTotalCalculationService.GetShoppingCartSubTotal( - cart, out _, out _, out var cartSubtotal, out _); + _orderTotalCalculationService.GetShoppingCartSubTotal( + cart, out _, out _, out var cartSubtotal, out _); - if (cartSubtotal < minimumOrderTotal) - return (false, minimumOrderTotal); - } - else - { - decimal? cartTotal = _orderTotalCalculationService.GetShoppingCartTotal(cart); - if (cartTotal.HasValue && cartTotal.Value < minimumOrderTotal) - return (false, minimumOrderTotal); - } + if (cartSubtotal < minimumOrderTotal) + return (false, minimumOrderTotal); } return (true, minimumOrderTotal); @@ -2730,11 +2710,12 @@ public virtual (bool valid, decimal orderTotalMinimum) IsAboveOrderTotalMinimum( public virtual (bool valid, decimal orderTotalMaximum) IsBelowOrderTotalMaximum(IList cart, int[] customerRoleIds) { - var query = _customerService.GetAllCustomerRoles().SourceQuery; - var customerRole = query - .Where(x => x.OrderTotalMaximum > decimal.Zero && customerRoleIds.Contains(x.Id)) - .OrderBy(x => x.OrderTotalMaximum) - .FirstOrDefault(); + var query = _customerService.GetAllCustomerRoles().SourceQuery + .Where(x => x.OrderTotalMaximum > decimal.Zero && customerRoleIds.Contains(x.Id)); + + var customerRole = _orderSettings.MultipleOrderTotalRestrictionsExpandRange + ? query.OrderByDescending(x => x.OrderTotalMaximum).FirstOrDefault() + : query.OrderBy(x => x.OrderTotalMaximum).FirstOrDefault(); var maximumOrderTotal = customerRole == null ? _orderSettings.OrderTotalMaximum : customerRole.OrderTotalMaximum; @@ -2743,7 +2724,7 @@ public virtual (bool valid, decimal orderTotalMaximum) IsBelowOrderTotalMaximum( } /// - /// Valdiate order total maximum. + /// Validate order total maximum. /// /// Shopping cart, maximum order total /// true - OK; false - maximum order total is exceeded @@ -2754,31 +2735,16 @@ public virtual (bool valid, decimal orderTotalMaximum) IsBelowOrderTotalMaximum( if (cart.Count > 0 && maximumOrderTotal > decimal.Zero) { - if (_orderSettings.ApplyToSubtotal) - { - _orderTotalCalculationService.GetShoppingCartSubTotal( - cart, out _, out _, out var cartSubtotal, out _); + _orderTotalCalculationService.GetShoppingCartSubTotal( + cart, out _, out _, out var cartSubtotal, out _); - if (cartSubtotal > maximumOrderTotal) - return (false, maximumOrderTotal); - } - else - { - decimal? cartTotal = _orderTotalCalculationService.GetShoppingCartTotal(cart); - if (cartTotal.HasValue && cartTotal.Value > maximumOrderTotal) - return (false, maximumOrderTotal); - } + if (cartSubtotal > maximumOrderTotal) + return (false, maximumOrderTotal); } return (true, maximumOrderTotal); } - public virtual bool IsInOrderTotalsRange(IList cart, int[] customerRoleIds) - { - return IsAboveOrderTotalMinimum(cart, customerRoleIds).valid - && IsBelowOrderTotalMaximum(cart, customerRoleIds).valid; - } - public virtual Shipment AddShipment( Order order, string trackingNumber, diff --git a/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs b/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs index 2c697f414e..66041200a3 100644 --- a/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs +++ b/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs @@ -361,11 +361,17 @@ public virtual IList GetStandardWarnings( Product product, string selectedAttributes, decimal customerEnteredPrice, - int quantity) + int quantity, + int storeId = 0) { Guard.NotNull(customer, nameof(customer)); Guard.NotNull(product, nameof(product)); + if (storeId == 0) + { + storeId = _storeContext.CurrentStore.Id; + } + var warnings = new List(); // deleted? @@ -401,7 +407,7 @@ public virtual IList GetStandardWarnings( } // Store mapping - if (!_storeMappingService.Authorize(product, _storeContext.CurrentStore.Id)) + if (!_storeMappingService.Authorize(product, storeId)) { warnings.Add(T("ShoppingCart.ProductUnpublished")); } @@ -471,7 +477,7 @@ public virtual IList GetStandardWarnings( break; case ManageInventoryMethod.ManageStock: { - if ((BackorderMode)product.BackorderMode == BackorderMode.NoBackorders) + if (product.BackorderMode == BackorderMode.NoBackorders) { if (product.StockQuantity < quantity) { @@ -833,7 +839,7 @@ public virtual IList GetShoppingCartItemWarnings( // standard properties if (getStandardWarnings) - warnings.AddRange(GetStandardWarnings(customer, shoppingCartType, product, selectedAttributes, customerEnteredPrice, quantity)); + warnings.AddRange(GetStandardWarnings(customer, shoppingCartType, product, selectedAttributes, customerEnteredPrice, quantity, storeId)); // selected attributes if (getAttributesWarnings) @@ -1093,7 +1099,7 @@ public virtual List AddToCart( existingCartItem = FindShoppingCartItemInTheCart(cart, cartType, product, selectedAttributes, customerEnteredPrice); } - if (existingCartItem != null) + if (existingCartItem != null && !_shoppingCartSettings.AddProductsToBasketInSinglePositions) { // update existing shopping cart item int newQuantity = existingCartItem.Item.Quantity + quantity; diff --git a/src/Libraries/SmartStore.Services/Orders/ValidatingCartEventConsumer.cs b/src/Libraries/SmartStore.Services/Orders/ValidatingCartEventConsumer.cs new file mode 100644 index 0000000000..9dfcbc0f81 --- /dev/null +++ b/src/Libraries/SmartStore.Services/Orders/ValidatingCartEventConsumer.cs @@ -0,0 +1,62 @@ +using SmartStore.Core; +using SmartStore.Core.Events; +using SmartStore.Services.Cart; +using SmartStore.Services.Catalog; +using SmartStore.Services.Directory; +using SmartStore.Services.Localization; + +namespace SmartStore.Services.Orders +{ + public class ValidatingCartEventConsumer : IConsumer + { + private readonly IOrderProcessingService _orderProcessingService; + private readonly ILocalizationService _localizationService; + private readonly ICurrencyService _currencyService; + private readonly IPriceFormatter _priceFormatter; + private readonly IWorkContext _workContext; + + public ValidatingCartEventConsumer( + IOrderProcessingService orderProcessingService, + ILocalizationService localizationService, + ICurrencyService currencyService, + IPriceFormatter priceFormatter, + IWorkContext workContext) + { + _orderProcessingService = orderProcessingService; + _localizationService = localizationService; + _currencyService = currencyService; + _priceFormatter = priceFormatter; + _workContext = workContext; + } + + public void HandleEvent(ValidatingCartEvent message) + { + // Default Order Totals restriction + var roleIds = _workContext.OriginalCustomerIfImpersonated?.GetRoleIds() ?? message.Customer.GetRoleIds(); + + // Minimum order totals validation + var (isAboveMin, min) = _orderProcessingService.IsAboveOrderTotalMinimum(message.Cart, roleIds); + if (!isAboveMin) + { + min = _currencyService.ConvertFromPrimaryStoreCurrency(min, _workContext.WorkingCurrency); + message.Warnings.Add(string.Format( + _localizationService.GetResource("Checkout.MinOrderSubtotalAmount"), + _priceFormatter.FormatPrice(min, true, false)) + ); + + return; + } + + // Maximum order totals validation + var (isBelowMax, max) = _orderProcessingService.IsBelowOrderTotalMaximum(message.Cart, roleIds); + if (!isBelowMax) + { + max = _currencyService.ConvertFromPrimaryStoreCurrency(max, _workContext.WorkingCurrency); + message.Warnings.Add(string.Format( + _localizationService.GetResource("Checkout.MaxOrderSubtotalAmount"), + _priceFormatter.FormatPrice(max, true, false)) + ); + } + } + } +} \ No newline at end of file diff --git a/src/Libraries/SmartStore.Services/Payments/PaymentService.cs b/src/Libraries/SmartStore.Services/Payments/PaymentService.cs index ba2fa667e4..c6d32257e2 100644 --- a/src/Libraries/SmartStore.Services/Payments/PaymentService.cs +++ b/src/Libraries/SmartStore.Services/Payments/PaymentService.cs @@ -188,10 +188,12 @@ public virtual IEnumerable> LoadAllPaymentMethods(int s if (providers.Any() && !QuerySettings.IgnoreMultiStore && storeId > 0) { - var paymentMethods = GetAllPaymentMethods(storeId); + var unauthorizedMethods = _paymentMethodRepository.TableUntracked + .Where(x => x.LimitedToStores) + .ToList(); - var unauthorizedMethodNames = paymentMethods.Values - .Where(x => x.LimitedToStores && !_storeMappingService.Authorize(x, storeId)) + var unauthorizedMethodNames = unauthorizedMethods + .Where(x => !_storeMappingService.Authorize(x, storeId)) .Select(x => x.PaymentMethodSystemName) .ToList(); diff --git a/src/Libraries/SmartStore.Services/Rules/DefaultRuleOptionsProvider.cs b/src/Libraries/SmartStore.Services/Rules/DefaultRuleOptionsProvider.cs index a5e88730cc..dda9ef39d8 100644 --- a/src/Libraries/SmartStore.Services/Rules/DefaultRuleOptionsProvider.cs +++ b/src/Libraries/SmartStore.Services/Rules/DefaultRuleOptionsProvider.cs @@ -112,17 +112,29 @@ public virtual RuleOptionsResult GetOptions( string searchTerm) { Guard.NotNull(expression, nameof(expression)); - Guard.NotNull(expression.Descriptor, nameof(expression.Descriptor)); + + return GetOptions(reason, expression.Descriptor, expression.RawValue, pageIndex, pageSize, searchTerm); + } + + public virtual RuleOptionsResult GetOptions( + RuleOptionsRequestReason reason, + RuleDescriptor descriptor, + string value, + int pageIndex, + int pageSize, + string searchTerm) + { + Guard.NotNull(descriptor, nameof(descriptor)); var result = new RuleOptionsResult(); - if (!(expression.Descriptor.SelectList is RemoteRuleValueSelectList list)) + if (!(descriptor.SelectList is RemoteRuleValueSelectList list)) { return result; } var language = _services.WorkContext.WorkingLanguage; - var byId = expression.Descriptor.RuleType == RuleType.Int || expression.Descriptor.RuleType == RuleType.IntArray; + var byId = descriptor.RuleType == RuleType.Int || descriptor.RuleType == RuleType.IntArray; List options = null; switch (list.DataSource) @@ -130,7 +142,7 @@ public virtual RuleOptionsResult GetOptions( case "Product": if (reason == RuleOptionsRequestReason.SelectedDisplayNames) { - options = _productService.Value.GetProductsByIds(expression.RawValue.ToIntArray()) + options = _productService.Value.GetProductsByIds(value.ToIntArray()) .Select(x => new RuleValueSelectListOption { Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false), Hint = x.Sku }) .ToList(); } @@ -174,13 +186,13 @@ public virtual RuleOptionsResult GetOptions( case "TargetGroup": if (reason == RuleOptionsRequestReason.SelectedDisplayNames) { - options = _ruleStorage.Value.GetRuleSetsByIds(expression.RawValue.ToIntArray(), false) + options = _ruleStorage.Value.GetRuleSetsByIds(value.ToIntArray(), false) .Select(x => new RuleValueSelectListOption { Value = x.Id.ToString(), Text = x.Name }) .ToList(); } else { - var ruleSets = _ruleStorage.Value.GetAllRuleSets(false, false, expression.Descriptor.Scope, pageIndex, pageSize, false, true); + var ruleSets = _ruleStorage.Value.GetAllRuleSets(false, false, descriptor.Scope, pageIndex, pageSize, false, true); result.IsPaged = true; result.HasMoreData = ruleSets.HasNextPage; @@ -192,7 +204,7 @@ public virtual RuleOptionsResult GetOptions( case "Category": if (reason == RuleOptionsRequestReason.SelectedDisplayNames) { - options = _categoryService.Value.GetCategoriesByIds(expression.RawValue.ToIntArray()) + options = _categoryService.Value.GetCategoriesByIds(value.ToIntArray()) .Select(x => new RuleValueSelectListOption { Value = x.Id.ToString(), Text = x.GetCategoryPath(_categoryService.Value).NullEmpty() ?? x.Name }) .ToList(); } @@ -237,7 +249,7 @@ public virtual RuleOptionsResult GetOptions( case "VariantValue": if (reason == RuleOptionsRequestReason.SelectedDisplayNames) { - var ids = expression.RawValue.ToIntArray(); + var ids = value.ToIntArray(); var variantValues = _variantValueRepository.Value.TableUntracked .Where(x => ids.Contains(x.Id)) .ToList(); @@ -246,7 +258,7 @@ public virtual RuleOptionsResult GetOptions( .Select(x => new RuleValueSelectListOption { Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false) }) .ToList(); } - else if (expression.Descriptor.Metadata.TryGetValue("ParentId", out var objParentId)) + else if (descriptor.Metadata.TryGetValue("ParentId", out var objParentId)) { options = new List(); var pIndex = -1; @@ -264,13 +276,13 @@ public virtual RuleOptionsResult GetOptions( while (true) { var variantValues = PagedList.Create(query, ++pIndex, 500); - foreach (var value in variantValues) + foreach (var variantValue in variantValues) { - var name = value.GetLocalized(x => x.Name, language, true, false); + var name = variantValue.GetLocalized(x => x.Name, language, true, false); if (!existingValues.Contains(name)) { existingValues.Add(name); - options.Add(new RuleValueSelectListOption { Value = value.Id.ToString(), Text = name }); + options.Add(new RuleValueSelectListOption { Value = variantValue.Id.ToString(), Text = name }); } } if (!variantValues.HasNextPage) @@ -283,7 +295,7 @@ public virtual RuleOptionsResult GetOptions( case "AttributeOption": if (reason == RuleOptionsRequestReason.SelectedDisplayNames) { - var ids = expression.RawValue.ToIntArray(); + var ids = value.ToIntArray(); var attributeOptions = _attrOptionRepository.Value.TableUntracked .Where(x => ids.Contains(x.Id)) .ToList(); @@ -292,7 +304,7 @@ public virtual RuleOptionsResult GetOptions( .Select(x => new RuleValueSelectListOption { Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false) }) .ToList(); } - else if (expression.Descriptor.Metadata.TryGetValue("ParentId", out var objParentId)) + else if (descriptor.Metadata.TryGetValue("ParentId", out var objParentId)) { var query = _attrOptionRepository.Value.TableUntracked .Where(x => x.SpecificationAttributeId == (int)objParentId) @@ -317,9 +329,9 @@ public virtual RuleOptionsResult GetOptions( if (reason == RuleOptionsRequestReason.SelectedDisplayNames) { // Get display names of selected options. - if (expression.RawValue.HasValue()) + if (value.HasValue()) { - var selectedValues = expression.RawValue.SplitSafe(","); + var selectedValues = value.SplitSafe(","); result.Options.AddRange(options.Where(x => selectedValues.Contains(x.Value))); } } diff --git a/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs b/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs index 6d14641314..6310fbbfa4 100644 --- a/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs +++ b/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs @@ -144,14 +144,20 @@ private void AddFacet( switch (kind) { case FacetGroupKind.Forum: + if (_searchSettings.ForumDisabled) + return; fieldName = "forumid"; displayOrder = _searchSettings.ForumDisplayOrder; break; case FacetGroupKind.Customer: + if (_searchSettings.CustomerDisabled) + return; fieldName = "customerid"; displayOrder = _searchSettings.CustomerDisplayOrder; break; case FacetGroupKind.Date: + if (_searchSettings.DateDisabled) + return; fieldName = "createdon"; displayOrder = _searchSettings.DateDisplayOrder; break; diff --git a/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs b/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs index b8231ef5db..2a723529ee 100644 --- a/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs +++ b/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs @@ -70,7 +70,7 @@ private void ValidateCacheState() protected override void OnClearCache() { - _cacheManager.Remove(URLRECORD_ALL_PATTERN); + _cacheManager.RemoveByPattern(URLRECORD_ALL_PATTERN); } public virtual void DeleteUrlRecord(UrlRecord urlRecord) diff --git a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj index 3b7d6587fe..377945466a 100644 --- a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj +++ b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj @@ -104,8 +104,8 @@ ..\..\packages\MaxMind.GeoIP2.3.2.0\lib\net45\MaxMind.GeoIP2.dll - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll @@ -119,8 +119,8 @@ ..\..\packages\ncrontab.3.3.0\lib\net35\NCrontab.dll True - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll ..\..\packages\NReco.PdfGenerator.1.2.0\lib\net45\NReco.PdfGenerator.dll @@ -144,14 +144,14 @@ ..\..\packages\System.Linq.Dynamic.Core.1.2.1\lib\net46\System.Linq.Dynamic.Core.dll - - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll @@ -189,6 +189,7 @@ Properties\AssemblyVersionInfo.cs + @@ -214,6 +215,8 @@ + + @@ -456,6 +459,7 @@ + diff --git a/src/Libraries/SmartStore.Services/Stores/StoreMappingService.cs b/src/Libraries/SmartStore.Services/Stores/StoreMappingService.cs index de7523e900..07f903029b 100644 --- a/src/Libraries/SmartStore.Services/Stores/StoreMappingService.cs +++ b/src/Libraries/SmartStore.Services/Stores/StoreMappingService.cs @@ -14,7 +14,7 @@ public partial class StoreMappingService : IStoreMappingService /// 0 = segment (EntityName.IdRange) /// const string STOREMAPPING_SEGMENT_KEY = "storemapping:range-{0}"; - const string STOREMAPPING_SEGMENT_PATTERN = "storemapping:range-*"; + internal const string STOREMAPPING_SEGMENT_PATTERN = "storemapping:range-*"; private readonly IRepository _storeMappingRepository; private readonly IStoreContext _storeContext; @@ -87,10 +87,15 @@ public virtual void SaveStoreMappings(T entity, int[] selectedStoreIds) where { var existingStoreMappings = GetStoreMappings(entity); var allStores = _storeService.GetAllStores(); + var selectedIds = selectedStoreIds ?? Array.Empty(); + + entity.LimitedToStores = selectedIds.Length == 1 && selectedIds[0] == 0 + ? false + : selectedIds.Any(); foreach (var store in allStores) { - if (selectedStoreIds != null && selectedStoreIds.Contains(store.Id)) + if (selectedIds.Contains(store.Id)) { if (!existingStoreMappings.Any(x => x.StoreId == store.Id)) InsertStoreMapping(entity, store.Id); @@ -102,6 +107,8 @@ public virtual void SaveStoreMappings(T entity, int[] selectedStoreIds) where DeleteStoreMapping(storeMappingToDelete); } } + + _storeMappingRepository.Context.SaveChanges(); } public virtual void InsertStoreMapping(StoreMapping storeMapping) diff --git a/src/Libraries/SmartStore.Services/app.config b/src/Libraries/SmartStore.Services/app.config index 252642d5ed..446c32df9a 100644 --- a/src/Libraries/SmartStore.Services/app.config +++ b/src/Libraries/SmartStore.Services/app.config @@ -34,7 +34,19 @@ - + + + + + + + + + + + + + diff --git a/src/Libraries/SmartStore.Services/packages.config b/src/Libraries/SmartStore.Services/packages.config index 79508508e8..4046ac6a7f 100644 --- a/src/Libraries/SmartStore.Services/packages.config +++ b/src/Libraries/SmartStore.Services/packages.config @@ -14,17 +14,17 @@ - + - + - - + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.AmazonPay/Description.txt b/src/Plugins/SmartStore.AmazonPay/Description.txt index 653a4d3ae4..937624a4ec 100644 --- a/src/Plugins/SmartStore.AmazonPay/Description.txt +++ b/src/Plugins/SmartStore.AmazonPay/Description.txt @@ -1,8 +1,8 @@ FriendlyName: Login and Pay with Amazon SystemName: SmartStore.AmazonPay Group: Payment -Version: 4.0.1 -MinAppVersion: 4.0.1 +Version: 4.2.0 +MinAppVersion: 4.2.0 Author: SmartStore AG DisplayOrder: 1 FileName: SmartStore.AmazonPay.dll diff --git a/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs b/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs index 62cf3c4726..88d41c6aad 100644 --- a/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs +++ b/src/Plugins/SmartStore.AmazonPay/Services/AmazonPayService.cs @@ -954,7 +954,7 @@ public bool SetOrderReferenceDetails( .WithStoreName(store.Name); var paymentRequest = _httpContext.Session["OrderPaymentInfo"] as ProcessPaymentRequest; - if (paymentRequest != null) + if (paymentRequest != null && paymentRequest.OrderGuid != Guid.Empty) { setOrderRequest = setOrderRequest.WithSellerOrderId(paymentRequest.OrderGuid.ToString()); } @@ -1665,7 +1665,7 @@ public AuthorizeState Authorize(string returnUrl, bool? verifyResponse = null) if (accessToken.HasValue()) { - var settings = _services.Settings.LoadSetting(); + var settings = _services.Settings.LoadSetting(_services.StoreContext.CurrentStore.Id); var client = CreateClient(settings); var jsonString = client.GetUserInfo(accessToken); if (jsonString.HasValue()) diff --git a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj index aa30c693c3..90e38591eb 100644 --- a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj +++ b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj @@ -93,9 +93,8 @@ ..\..\packages\Common.Logging.2.0.0\lib\2.0\Common.Logging.dll True - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - False + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll @@ -105,22 +104,19 @@ ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll False - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - False + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - False + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - False + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Plugins/SmartStore.AmazonPay/packages.config b/src/Plugins/SmartStore.AmazonPay/packages.config index 36f4b6da90..bfadbe9d06 100644 --- a/src/Plugins/SmartStore.AmazonPay/packages.config +++ b/src/Plugins/SmartStore.AmazonPay/packages.config @@ -7,10 +7,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.AmazonPay/web.config b/src/Plugins/SmartStore.AmazonPay/web.config index 46a5771064..e3e561e6ca 100644 --- a/src/Plugins/SmartStore.AmazonPay/web.config +++ b/src/Plugins/SmartStore.AmazonPay/web.config @@ -62,7 +62,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -160,6 +160,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -167,4 +187,4 @@ - \ No newline at end of file + diff --git a/src/Plugins/SmartStore.Clickatell/Description.txt b/src/Plugins/SmartStore.Clickatell/Description.txt index 8e43756f29..ed2cde9ffe 100644 --- a/src/Plugins/SmartStore.Clickatell/Description.txt +++ b/src/Plugins/SmartStore.Clickatell/Description.txt @@ -1,8 +1,8 @@ FriendlyName: Clickatell SMS Provider SystemName: SmartStore.Clickatell Group: Mobile -Version: 4.0.1 -MinAppVersion: 4.0.1 +Version: 4.2.0 +MinAppVersion: 4.2.0 DisplayOrder: 1 FileName: SmartStore.Clickatell.dll ResourceRootKey: Plugins.Sms.Clickatell \ No newline at end of file diff --git a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj index 6913511e9e..a7ccb144e0 100644 --- a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj +++ b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj @@ -93,9 +93,8 @@ ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll False - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - False + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll diff --git a/src/Plugins/SmartStore.Clickatell/packages.config b/src/Plugins/SmartStore.Clickatell/packages.config index 362bbd54e5..0470997544 100644 --- a/src/Plugins/SmartStore.Clickatell/packages.config +++ b/src/Plugins/SmartStore.Clickatell/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/src/Plugins/SmartStore.Clickatell/web.config b/src/Plugins/SmartStore.Clickatell/web.config index 1ae1189cd0..06bf37d3c2 100644 --- a/src/Plugins/SmartStore.Clickatell/web.config +++ b/src/Plugins/SmartStore.Clickatell/web.config @@ -1,9 +1,9 @@ - + - - + + - - + + - - + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + - + - \ No newline at end of file + diff --git a/src/Plugins/SmartStore.OfflinePayment/Description.txt b/src/Plugins/SmartStore.OfflinePayment/Description.txt index 232969f941..680ab03804 100644 --- a/src/Plugins/SmartStore.OfflinePayment/Description.txt +++ b/src/Plugins/SmartStore.OfflinePayment/Description.txt @@ -2,8 +2,8 @@ Description: Contains common offline payment methods like Direct Debit, Invoice, Prepayment etc. Group: Payment SystemName: SmartStore.OfflinePayment -Version: 4.0.1 -MinAppVersion: 4.0.1 +Version: 4.2.0 +MinAppVersion: 4.2.0 DisplayOrder: 0 FileName: SmartStore.OfflinePayment.dll ResourceRootKey: Plugins.SmartStore.OfflinePayment diff --git a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj index 752242a26f..b392fe891f 100644 --- a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj +++ b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj @@ -93,9 +93,8 @@ ..\..\packages\FluentValidation.7.4.0\lib\net45\FluentValidation.dll False - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - False + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll @@ -105,21 +104,18 @@ ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll False - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - False + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - False + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - False + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Plugins/SmartStore.OfflinePayment/packages.config b/src/Plugins/SmartStore.OfflinePayment/packages.config index d772d4d4ca..1e0b785b88 100644 --- a/src/Plugins/SmartStore.OfflinePayment/packages.config +++ b/src/Plugins/SmartStore.OfflinePayment/packages.config @@ -5,10 +5,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.OfflinePayment/web.config b/src/Plugins/SmartStore.OfflinePayment/web.config index 1ae1189cd0..06bf37d3c2 100644 --- a/src/Plugins/SmartStore.OfflinePayment/web.config +++ b/src/Plugins/SmartStore.OfflinePayment/web.config @@ -1,9 +1,9 @@ - + - - + + - - + + - @if (brand != null) - { -
- - @if (brand.Picture != null && brand.Picture.ImageUrl.HasValue() && brand.Picture.PictureId != 0) + @if (Model.Sku.HasValue()) + { + + } + + @if (Model.Gtin.HasValue()) + { + + } + + @if (Model.ManufacturerPartNumber.HasValue()) + { + + } + + @if (brand != null) + { + + } + + +
+

+ @if (Model.IsAssociatedProduct && Model.VisibleIndividually) { - @brand.Picture.AlternateText + @Model.Name } else { - @brand.Name + @Model.Name } - - - - @if (Model.Sku.HasValue()) - { - - } - - @if (Model.Gtin.HasValue()) - { - - } - - @if (Model.ManufacturerPartNumber.HasValue()) - { - - } +

- } - - -
-

- @if (Model.IsAssociatedProduct && Model.VisibleIndividually) - { - @Model.Name - } - else - { - @Model.Name - } -

-
- - @if (Model.ShortDescription.Value.HasValue()) - { -
- @Html.Raw(Model.ShortDescription) -
- } + + @if (Model.ShortDescription.Value.HasValue()) + { +
+ @Html.Raw(Model.ShortDescription) +
+ }
diff --git a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml index fa1c08e954..988f78cd63 100644 --- a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml @@ -15,7 +15,7 @@
- +
@(Html.SmartStore().FileUploader() .Name(clientId) diff --git a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextArea.cshtml b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextArea.cshtml index bb7680ffc0..9a32a18a77 100644 --- a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextArea.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextArea.cshtml @@ -7,4 +7,4 @@ var placeholder = Model.Description.RemoveHtml().TrimSafe(); } - \ No newline at end of file + \ No newline at end of file diff --git a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextBox.cshtml b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextBox.cshtml index e47ee49ec4..84fe5ef6ec 100644 --- a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextBox.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.TextBox.cshtml @@ -7,4 +7,4 @@ var placeholder = Model.Description.RemoveHtml().TrimSafe(); } - \ No newline at end of file + \ No newline at end of file diff --git a/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml b/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml index 694a1a0788..41d0b05cdb 100644 --- a/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml @@ -118,7 +118,7 @@ @if (allowedTypes.Contains(LinkType.File)) { @if (Model.IsEditable) diff --git a/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml b/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml index 5f37575b07..ca4ebd86c6 100644 --- a/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml +++ b/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml @@ -103,6 +103,8 @@ }
} + + @{ Html.RenderWidget("offcanvas_cartitem_desc_after", item.Id); }
@@ -180,23 +182,29 @@ diff --git a/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OrderSummary.cshtml b/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OrderSummary.cshtml index 3c451c5a0d..0ec3574612 100644 --- a/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OrderSummary.cshtml +++ b/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OrderSummary.cshtml @@ -106,7 +106,7 @@
-
+
-} - @if (Model.ShowConfirmOrderLegalHint && !Model.IsEditable) {